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:
		
							parent
							
								
									ac54a2ed45
								
							
						
					
					
						commit
						5a87d814cf
					
				
					 2 changed files with 20 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -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)
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -996,6 +996,10 @@ main (int argc, char *argv[])
 | 
			
		|||
	int i;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
	HRESULT coinit_result;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	srand ((unsigned int) time (NULL)); /* CL: do this only once! */
 | 
			
		||||
 | 
			
		||||
	/* We must check for the config dir parameter, otherwise load_config() will behave incorrectly.
 | 
			
		||||
| 
						 | 
				
			
			@ -1058,6 +1062,14 @@ main (int argc, char *argv[])
 | 
			
		|||
	libproxy_factory = px_proxy_factory_new();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
	coinit_result = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);
 | 
			
		||||
	if (SUCCEEDED (coinit_result))
 | 
			
		||||
	{
 | 
			
		||||
		CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	fe_init ();
 | 
			
		||||
 | 
			
		||||
	/* This is done here because cfgfiles.c is too early in
 | 
			
		||||
| 
						 | 
				
			
			@ -1085,6 +1097,13 @@ main (int argc, char *argv[])
 | 
			
		|||
 | 
			
		||||
	fe_main ();
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
	if (SUCCEEDED (coinit_result))
 | 
			
		||||
	{
 | 
			
		||||
		CoUninitialize ();
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef USE_LIBPROXY
 | 
			
		||||
	px_proxy_factory_free(libproxy_factory);
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue