Call CoInitialize, CoInitializeSecurity and CoUninitialize from the main process, not from a DLL.

They're process-level functions and aren't meant to be called from DLLs. CoInitSecurity in particular fails with RPC_E_TOO_LATE even if no other call to CoCreateInstance has been made yet.

Fixes sysinfo's WMI calls on Windows 8.1 and above.
This commit is contained in:
Arnavion
2015-02-10 22:14:22 -08:00
parent ac54a2ed45
commit 5a87d814cf
2 changed files with 20 additions and 15 deletions

View File

@ -235,21 +235,10 @@ static char *query_wmi (QueryWmiType type)
int i;
gboolean atleast_one_appended = FALSE;
hr = CoInitializeEx (0, COINIT_APARTMENTTHREADED);
if (FAILED (hr))
{
goto exit;
}
/* If this is called after some other call to CoCreateInstance somewhere else in the process, this will fail with RPC_E_TOO_LATE.
* However if not, it *is* required to be called, so call it here but ignore any error returned.
*/
CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
hr = CoCreateInstance (&CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, &IID_IWbemLocator, (LPVOID *) &locator);
if (FAILED (hr))
{
goto couninitialize;
goto exit;
}
namespaceName = SysAllocString (L"root\\CIMV2");
@ -369,9 +358,6 @@ release_locator:
locator->lpVtbl->Release (locator);
SysFreeString (namespaceName);
couninitialize:
CoUninitialize ();
exit:
if (result == NULL)
{