diff --git a/xpmgr.cpp b/xpmgr.cpp new file mode 100644 index 0000000..f6f2237 --- /dev/null +++ b/xpmgr.cpp @@ -0,0 +1,231 @@ +#define STRICT +#define UNICODE +#define _UNICODE + +#include +#include +#include +#include +#include +#include + +#pragma comment(lib, "comsuppw.lib") +#pragma comment(lib, "kernel32.lib") + +static wchar_t strings[14][256]; + +static CLSID licdllCLSID = { 0xACADF079, 0xCBCD, 0x4032, {0x83, 0xF2, 0xFA, 0x47, 0xC4, 0xDB, 0x09, 0x6F} }; +static IID licenseAgentIID = { 0xB8CBAD79, 0x3F1F, 0x481A, {0xBB, 0x0C, 0xE7, 0xBB, 0xD7, 0x7B, 0xDD, 0xD1} }; +//IID for ICOMLicenseAgent2, with three extra functions +//static IID licenseAgentIID2 = {0x6A07C5A3, 0x9C67, 0x4BB6, {0xB0, 0x20, 0xEC, 0xBE, 0x7F, 0xDF, 0xD3, 0x26}}; + +#undef INTERFACE +#define INTERFACE ICOMLicenseAgent +DECLARE_INTERFACE_(ICOMLicenseAgent, IDispatch) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID * ppvObj) PURE; + STDMETHOD_(ULONG, AddRef)(THIS) PURE; + STDMETHOD_(ULONG, Release)(THIS) PURE; + + /*** IDispatch methods ***/ + STDMETHOD(GetTypeInfoCount)(THIS_ UINT FAR * pctinfo) PURE; + STDMETHOD(GetTypeInfo)(THIS_ UINT itinfo, LCID lcid, ITypeInfo FAR * FAR * pptinfo) PURE; + STDMETHOD(GetIDsOfNames)(THIS_ REFIID riid, OLECHAR FAR * FAR * rgszNames, UINT cNames, LCID lcid, DISPID FAR * rgdispid) PURE; + STDMETHOD(Invoke)(THIS_ DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR * pdispparams, VARIANT FAR * pvarResult, EXCEPINFO FAR * pexcepinfo, UINT FAR * puArgErr) PURE; + + /*** ICOMLicenseAgent methods ***/ + STDMETHOD(Initialize)(THIS_ ULONG dwBPC, ULONG dwMode, BSTR bstrLicSource, ULONG * pdwRetCode) PURE; + STDMETHOD(GetFirstName)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetFirstName)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetLastName)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetLastName)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetOrgName)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetOrgName)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetEmail)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetEmail)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetPhone)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetPhone)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetAddress1)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetAddress1)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetCity)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetCity)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetState)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetState)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetCountryCode)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetCountryCode)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetCountryDesc)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetCountryDesc)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetZip)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetZip)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetIsoLanguage)(THIS_ ULONG * pdwVal) PURE; + STDMETHOD(SetIsoLanguage)(THIS_ ULONG dwNewVal) PURE; + STDMETHOD(GetMSUpdate)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetMSUpdate)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetMSOffer)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetMSOffer)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetOtherOffer)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetOtherOffer)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(GetAddress2)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(SetAddress2)(THIS_ BSTR bstrNewVal) PURE; + STDMETHOD(AsyncProcessHandshakeRequest)(THIS_ LONG bReviseCustInfo) PURE; + STDMETHOD(AsyncProcessNewLicenseRequest)(THIS) PURE; + STDMETHOD(AsyncProcessReissueLicenseRequest)(THIS) PURE; + STDMETHOD(AsyncProcessReviseCustInfoRequest)(THIS) PURE; + STDMETHOD(GetAsyncProcessReturnCode)(THIS_ ULONG * pdwRetCode) PURE; + STDMETHOD(AsyncProcessDroppedLicenseRequest)(THIS) PURE; + STDMETHOD(GenerateInstallationId)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(DepositConfirmationId)(THIS_ BSTR bstrVal, ULONG * pdwRetCode) PURE; + STDMETHOD(GetExpirationInfo)(THIS_ ULONG * pdwWPALeft, ULONG * pdwEvalLeft) PURE; + STDMETHOD(AsyncProcessRegistrationRequest)(THIS) PURE; + STDMETHOD(ProcessHandshakeRequest)(THIS_ LONG bReviseCustInfo) PURE; + STDMETHOD(ProcessNewLicenseRequest)(THIS) PURE; + STDMETHOD(ProcessDroppedLicenseRequest)(THIS) PURE; + STDMETHOD(ProcessReissueLicenseRequest)(THIS) PURE; + STDMETHOD(ProcessReviseCustInfoRequest)(THIS) PURE; + STDMETHOD(EnsureInternetConnection)(THIS) PURE; + STDMETHOD(SetProductKey)(THIS_ LPWSTR pszNewProductKey) PURE; + STDMETHOD(GetProductID)(THIS_ BSTR * pbstrVal) PURE; + STDMETHOD(VerifyCheckDigits)(THIS_ BSTR bstrCIDIID, LONG * pbValue) PURE; +}; + +static BOOL ComInitialized = FALSE; +static ICOMLicenseAgent* LicenseAgent = NULL; + +static BOOL LoadLicenseManager() +{ + if (!ComInitialized) { + HRESULT status = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + if (FAILED(status)) { + std::cout << "An error occurred at CoInitializeEx: ", status; + return FALSE; + } + ComInitialized = TRUE; + } + if (!LicenseAgent) { + HRESULT status = CoCreateInstance(licdllCLSID, NULL, CLSCTX_INPROC_SERVER, licenseAgentIID, (void**)&LicenseAgent); + int good = 0; + if (SUCCEEDED(status)) { + ULONG dwRetCode; + status = LicenseAgent->Initialize(0xC475, 3, 0, &dwRetCode); + if (SUCCEEDED(status) && dwRetCode == 0) { + good = 1; + } + else { + LicenseAgent->Release(); + LicenseAgent = NULL; + } + } + if (!good) { + std::cout << "An error occurred at CoCreateInstance: " + status; + return FALSE; + } + } + ULONG dwWPALeft = 0, dwEvalLeft = 0; + HRESULT status = LicenseAgent->GetExpirationInfo(&dwWPALeft, &dwEvalLeft); + if (FAILED(status)) { + std::cout << "An error occurred at GetExpirationInfo: " + status; + LicenseAgent->Release(); + LicenseAgent = NULL; + return FALSE; + } + if (dwWPALeft == 0x7FFFFFFF) { + std::cout << "An error occurred: dwWPALeft is 0x7FFFFFFF"; + LicenseAgent->Release(); + LicenseAgent = NULL; + return FALSE; + } + return TRUE; +} + +static BSTR SetConfirmationID(BSTR confirmationID) { + if (!LoadLicenseManager()) { + return SysAllocString(L"Failed to load license manager"); + } + + ULONG dwRetCode; + HRESULT status = LicenseAgent->DepositConfirmationId(confirmationID, &dwRetCode); + if (FAILED(status) || dwRetCode) { + std::cout << "An error occurred at DepositConfirmationId: " + status + dwRetCode; + return SysAllocString(L"Failed to set confirmation ID"); + } + return SysAllocString(L"Successfully set confirmation ID"); +} + +static BSTR GetInstallationID() { + if (!LoadLicenseManager()) { + return SysAllocString(L"Failed to load license manager"); + } + + BSTR installationID = NULL; + HRESULT status = LicenseAgent->GenerateInstallationId(&installationID); + if (FAILED(status) || !installationID) { + std::cout << "An error occurred at GenerateInstallationId: " + status; + return SysAllocString(L"Failed to get installation ID"); + } + else { + return installationID; + } +} + +static BSTR SetProductKey(LPWSTR productKey) { + if (!LoadLicenseManager()) { + return SysAllocString(L"Failed to load license manager"); + } + + HRESULT status = LicenseAgent->SetProductKey(productKey); + if (FAILED(status)) { + std::cout << "An error occurred at SetProductKey: " + status; + return SysAllocString(L"Failed to set product key"); + } + else { + return SysAllocString(L"Successfully set product key"); + } +} + +static BSTR GetProductID() { + if (!LoadLicenseManager()) { + return SysAllocString(L"Failed to load license manager"); + } + + BSTR productID = NULL; + + HRESULT status = LicenseAgent->GetProductID(&productID); + if (FAILED(status)) { + std::cout << "An error occurred at GetProductID: " + status; + return SysAllocString(L"Failed to get product ID"); + } + else { + return productID; + } +} + +wchar_t* convertCharArrayToLPCWSTR(const char* charArray) +{ + wchar_t* wString = new wchar_t[4096]; + MultiByteToWideChar(CP_ACP, 0, charArray, -1, wString, 4096); + return wString; +} + +int main(int argc, char* argv[]) +{ + if (std::string(argv[1]) == "--GetInstallationID") { + std::cout << _com_util::ConvertBSTRToString(GetInstallationID()); + return 0; + } + else if (std::string(argv[1]) == "--SetConfirmationID") { + std::cout << _com_util::ConvertBSTRToString(SetConfirmationID(_com_util::ConvertStringToBSTR(argv[2]))); + return 0; + } + else if (std::string(argv[1]) == "--SetProductKey") { + std::cout << _com_util::ConvertBSTRToString(SetProductKey(convertCharArrayToLPCWSTR(argv[2]))); + return 0; + } + else if (std::string(argv[1]) == "--GetProductID") { + std::cout << _com_util::ConvertBSTRToString(GetProductID()); + } + else { + std::cout << "Please put in arguments"; + return 0; + } +} \ No newline at end of file diff --git a/xpmgr.sln b/xpmgr.sln new file mode 100644 index 0000000..29d5ea9 --- /dev/null +++ b/xpmgr.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33723.286 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xpmgr", "xpmgr.vcxproj", "{F76E79ED-B941-49F6-A040-F560AA2B9E09}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F76E79ED-B941-49F6-A040-F560AA2B9E09}.Debug|x64.ActiveCfg = Debug|x64 + {F76E79ED-B941-49F6-A040-F560AA2B9E09}.Debug|x64.Build.0 = Debug|x64 + {F76E79ED-B941-49F6-A040-F560AA2B9E09}.Debug|x86.ActiveCfg = Debug|Win32 + {F76E79ED-B941-49F6-A040-F560AA2B9E09}.Debug|x86.Build.0 = Debug|Win32 + {F76E79ED-B941-49F6-A040-F560AA2B9E09}.Release|x64.ActiveCfg = Release|x64 + {F76E79ED-B941-49F6-A040-F560AA2B9E09}.Release|x64.Build.0 = Release|x64 + {F76E79ED-B941-49F6-A040-F560AA2B9E09}.Release|x86.ActiveCfg = Release|Win32 + {F76E79ED-B941-49F6-A040-F560AA2B9E09}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {92A0AD49-0BA8-4EFD-9F27-F8EA47684B07} + EndGlobalSection +EndGlobal diff --git a/xpmgr.vcxproj b/xpmgr.vcxproj new file mode 100644 index 0000000..ab1e6af --- /dev/null +++ b/xpmgr.vcxproj @@ -0,0 +1,137 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {f76e79ed-b941-49f6-a040-f560aa2b9e09} + xpmgr + 10.0 + + + + Application + true + v141_xp + Unicode + + + Application + false + v141_xp + true + Unicode + + + Application + true + v141_xp + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreadedDebug + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + MultiThreaded + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + \ No newline at end of file diff --git a/xpmgr.vcxproj.filters b/xpmgr.vcxproj.filters new file mode 100644 index 0000000..9c0fe04 --- /dev/null +++ b/xpmgr.vcxproj.filters @@ -0,0 +1,22 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + \ No newline at end of file