HRESULT service_pause_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT name, retval; IWbemClassObject *sig; HRESULT hr; TRACE("%p, %p, %p\n", obj, in, out); hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL ); if (hr != S_OK) return hr; hr = create_signature( class_serviceW, method_pauseserviceW, PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); return hr; } hr = IWbemClassObject_SpawnInstance( sig, 0, out ); if (hr != S_OK) { VariantClear( &name ); IWbemClassObject_Release( sig ); return hr; } hr = control_service( V_BSTR(&name), SERVICE_CONTROL_PAUSE, &retval ); if (hr != S_OK) goto done; hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 ); done: VariantClear( &name ); IWbemClassObject_Release( sig ); if (hr != S_OK) IWbemClassObject_Release( *out ); return hr; }
HRESULT reg_get_stringvalue( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT defkey, subkey, name, value, retval; IWbemClassObject *sig; HRESULT hr; TRACE("%p, %p\n", in, out); hr = IWbemClassObject_Get( in, param_defkeyW, 0, &defkey, NULL, NULL ); if (hr != S_OK) return hr; hr = IWbemClassObject_Get( in, param_subkeynameW, 0, &subkey, NULL, NULL ); if (hr != S_OK) return hr; hr = IWbemClassObject_Get( in, param_valuenameW, 0, &name, NULL, NULL ); if (hr != S_OK) return hr; hr = create_signature( class_stdregprovW, method_getstringvalueW, PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); VariantClear( &subkey ); return hr; } hr = IWbemClassObject_SpawnInstance( sig, 0, out ); if (hr != S_OK) { VariantClear( &name ); VariantClear( &subkey ); IWbemClassObject_Release( sig ); return hr; } VariantInit( &value ); hr = get_stringvalue( (HKEY)(INT_PTR)V_I4(&defkey), V_BSTR(&subkey), V_BSTR(&name), &value, &retval ); if (hr != S_OK) goto done; if (!V_UI4( &retval )) { hr = IWbemClassObject_Put( *out, param_valueW, 0, &value, CIM_STRING ); if (hr != S_OK) goto done; } hr = IWbemClassObject_Put( *out, param_returnvalueW, 0, &retval, CIM_UINT32 ); done: VariantClear( &name ); VariantClear( &subkey ); IWbemClassObject_Release( sig ); if (hr != S_OK) IWbemClassObject_Release( *out ); return hr; }
static void test_Win32_Service( IWbemServices *services ) { static const WCHAR returnvalueW[] = {'R','e','t','u','r','n','V','a','l','u','e',0}; static const WCHAR pauseserviceW[] = {'P','a','u','s','e','S','e','r','v','i','c','e',0}; static const WCHAR resumeserviceW[] = {'R','e','s','u','m','e','S','e','r','v','i','c','e',0}; static const WCHAR startserviceW[] = {'S','t','a','r','t','S','e','r','v','i','c','e',0}; static const WCHAR stopserviceW[] = {'S','t','o','p','S','e','r','v','i','c','e',0}; static const WCHAR stateW[] = {'S','t','a','t','e',0}; static const WCHAR stoppedW[] = {'S','t','o','p','p','e','d',0}; static const WCHAR serviceW[] = {'W','i','n','3','2','_','S','e','r','v','i','c','e','.', 'N','a','m','e','=','"','S','p','o','o','l','e','r','"',0 }; static const WCHAR emptyW[] = {0}; BSTR class = SysAllocString( serviceW ), empty = SysAllocString( emptyW ), method; IWbemClassObject *service, *out; VARIANT state, retval; CIMTYPE type; HRESULT hr; hr = IWbemServices_GetObject( services, class, 0, NULL, &service, NULL ); if (hr != S_OK) { win_skip( "Win32_Service not available\n" ); goto out; } type = 0xdeadbeef; VariantInit( &state ); hr = IWbemClassObject_Get( service, stateW, 0, &state, &type, NULL ); ok( hr == S_OK, "failed to get service state %08x\n", hr ); ok( V_VT( &state ) == VT_BSTR, "unexpected variant type 0x%x\n", V_VT( &state ) ); ok( type == CIM_STRING, "unexpected type 0x%x\n", type ); if (!lstrcmpW( V_BSTR( &state ), stoppedW )) { out = NULL; method = SysAllocString( startserviceW ); hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL ); ok( hr == S_OK, "failed to execute method %08x\n", hr ); SysFreeString( method ); VariantInit( &retval ); hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL ); ok( hr == S_OK, "failed to get return value %08x\n", hr ); ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) ); IWbemClassObject_Release( out ); }
static HRESULT exec_query( IWbemServices *services, const WCHAR *str, IEnumWbemClassObject **result ) { static const WCHAR captionW[] = {'C','a','p','t','i','o','n',0}; static const WCHAR descriptionW[] = {'D','e','s','c','r','i','p','t','i','o','n',0}; HRESULT hr; IWbemClassObject *obj; BSTR wql = SysAllocString( wqlW ), query = SysAllocString( str ); LONG flags = WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY; ULONG count; hr = IWbemServices_ExecQuery( services, wql, query, flags, NULL, result ); if (hr == S_OK) { trace("%s\n", wine_dbgstr_w(str)); for (;;) { VARIANT var; IEnumWbemClassObject_Next( *result, WBEM_INFINITE, 1, &obj, &count ); if (!count) break; if (IWbemClassObject_Get( obj, captionW, 0, &var, NULL, NULL ) == WBEM_S_NO_ERROR) { trace("caption: %s\n", wine_dbgstr_w(V_BSTR(&var))); VariantClear( &var ); } if (IWbemClassObject_Get( obj, descriptionW, 0, &var, NULL, NULL ) == WBEM_S_NO_ERROR) { trace("description: %s\n", wine_dbgstr_w(V_BSTR(&var))); VariantClear( &var ); } IWbemClassObject_Release( obj ); } } SysFreeString( wql ); SysFreeString( query ); return hr; }
HRESULT service_stop_service( IWbemClassObject *obj, IWbemClassObject *in, IWbemClassObject **out ) { VARIANT name, retval; IWbemClassObject *sig, *out_params = NULL; HRESULT hr; TRACE("%p, %p, %p\n", obj, in, out); hr = IWbemClassObject_Get( obj, prop_nameW, 0, &name, NULL, NULL ); if (hr != S_OK) return hr; hr = create_signature( class_serviceW, method_stopserviceW, PARAM_OUT, &sig ); if (hr != S_OK) { VariantClear( &name ); return hr; } if (out) { hr = IWbemClassObject_SpawnInstance( sig, 0, &out_params ); if (hr != S_OK) { VariantClear( &name ); IWbemClassObject_Release( sig ); return hr; } } hr = control_service( V_BSTR(&name), SERVICE_CONTROL_STOP, &retval ); if (hr != S_OK) goto done; if (out_params) hr = IWbemClassObject_Put( out_params, param_returnvalueW, 0, &retval, CIM_UINT32 ); done: VariantClear( &name ); IWbemClassObject_Release( sig ); if (hr == S_OK && out) { *out = out_params; IWbemClassObject_AddRef( out_params ); } if (out_params) IWbemClassObject_Release( out_params ); return hr; }
SysFreeString( method ); VariantInit( &retval ); hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL ); ok( hr == S_OK, "failed to get return value %08x\n", hr ); ok( !V_I4( &retval ), "unexpected error %u\n", V_UI4( &retval ) ); IWbemClassObject_Release( out ); } out = NULL; method = SysAllocString( pauseserviceW ); hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL ); ok( hr == S_OK, "failed to execute method %08x\n", hr ); SysFreeString( method ); VariantInit( &retval ); hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL ); ok( hr == S_OK, "failed to get return value %08x\n", hr ); ok( V_I4( &retval ), "unexpected success\n" ); IWbemClassObject_Release( out ); out = NULL; method = SysAllocString( resumeserviceW ); hr = IWbemServices_ExecMethod( services, class, method, 0, NULL, NULL, &out, NULL ); ok( hr == S_OK, "failed to execute method %08x\n", hr ); SysFreeString( method ); VariantInit( &retval ); hr = IWbemClassObject_Get( out, returnvalueW, 0, &retval, NULL, NULL ); ok( hr == S_OK, "failed to get return value %08x\n", hr ); ok( V_I4( &retval ), "unexpected success\n" ); IWbemClassObject_Release( out );
HRESULT SetupForIsXInputDevice() { IWbemLocator *pIWbemLocator = NULL; IEnumWbemClassObject *pEnumDevices = NULL; IWbemClassObject *pDevices[20] = {0}; IWbemServices *pIWbemServices = NULL; BSTR bstrNamespace = NULL; BSTR bstrDeviceID = NULL; BSTR bstrClassName = NULL; DWORD uReturned = 0; BOOL bIsXinputDevice = FALSE; UINT iDevice = 0; VARIANT var; HRESULT hr; hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); bCleanupCOM = SUCCEEDED(hr); // Create WMI hr = CoCreateInstance( &CLSID_WbemContext, NULL, CLSCTX_INPROC_SERVER, &IID_IWbemContext, (LPVOID*) &pIWbemLocator); if( FAILED(hr) || pIWbemLocator == NULL ) goto bail; bstrNamespace = SysAllocString( L"\\\\.\\root\\cimv2" );if( bstrNamespace == NULL ) goto bail; bstrClassName = SysAllocString( L"Win32_PNPEntity" ); if( bstrClassName == NULL ) goto bail; bstrDeviceID = SysAllocString( L"DeviceID" ); if( bstrDeviceID == NULL ) goto bail; // Connect to WMI hr = IWbemLocator_ConnectServer(pIWbemLocator, bstrNamespace, NULL, NULL, NULL, 0L, NULL, NULL, &pIWbemServices ); if( FAILED(hr) || pIWbemServices == NULL ) goto bail; // Switch security level to IMPERSONATE CoSetProxyBlanket( (IUnknown *)pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE ); hr = IWbemServices_CreateInstanceEnum( pIWbemServices, bstrClassName, 0, NULL, &pEnumDevices ); if( FAILED(hr) || pEnumDevices == NULL ) goto bail; // Loop over all devices for(;;) { // Get 20 at a time hr = IEnumWbemClassObject_Next( pEnumDevices, 10000, 20, pDevices, &uReturned ); if( FAILED(hr) || uReturned == 0 ) break; for( iDevice=0; iDevice<uReturned; iDevice++ ) { // For each device, get its device ID hr = IWbemClassObject_Get( pDevices[iDevice], bstrDeviceID, 0L, &var, NULL, NULL ); if( SUCCEEDED( hr ) && var.vt == VT_BSTR && var.bstrVal != NULL ) { // Check if the device ID contains "IG_". If it does, then it's an XInput device // This information can not be found from DirectInput if( wcsstr( var.bstrVal, L"IG_" ) ) { // If it does, then get the VID/PID from var.bstrVal DWORD dwPid = 0, dwVid = 0; WCHAR* strVid; WCHAR* strPid; DWORD dwVidPid; XINPUT_DEVICE_NODE* pNewNode; strVid = wcsstr( var.bstrVal, L"VID_" ); if( strVid && swscanf( strVid, L"VID_%4X", &dwVid ) != 1 ) dwVid = 0; strPid = wcsstr( var.bstrVal, L"PID_" ); if( strPid && swscanf( strPid, L"PID_%4X", &dwPid ) != 1 ) dwPid = 0; dwVidPid = MAKELONG( dwVid, dwPid ); // Add the VID/PID to a linked list pNewNode = malloc(sizeof(XINPUT_DEVICE_NODE)); if( pNewNode ) { pNewNode->dwVidPid = dwVidPid; pNewNode->pNext = (struct XINPUT_DEVICE_NODE *)g_pXInputDeviceList; g_pXInputDeviceList = pNewNode; } } } SAFE_RELEASE( pDevices[iDevice] ); } } bail: if(bstrNamespace) SysFreeString(bstrNamespace); if(bstrDeviceID) SysFreeString(bstrDeviceID); if(bstrClassName) SysFreeString(bstrClassName); for( iDevice=0; iDevice<20; iDevice++ ) SAFE_RELEASE( pDevices[iDevice] ); SAFE_RELEASE( pEnumDevices ); SAFE_RELEASE( pIWbemLocator ); SAFE_RELEASE( pIWbemServices ); return hr; }