| 19 | #endif |
| 20 | |
| 21 | HRESULT QueryWMIProperty(LPCWSTR query, LPCWSTR property, LPVARIANT value) { |
| 22 | IWbemLocator *locator = NULL; |
| 23 | IWbemServices *services = NULL; |
| 24 | IEnumWbemClassObject *enumerator = NULL; |
| 25 | IWbemClassObject *object = NULL; |
| 26 | BSTR server, wql, queryBstr, propBstr; |
| 27 | ULONG uReturn = 0; |
| 28 | |
| 29 | HRESULT hr = CoCreateInstance(our_CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, our_IID_IWbemLocator, (void **)&locator); |
| 30 | CHECK_HR_OR_GOTO_END(L"CoCreateInstance"); |
| 31 | |
| 32 | server = SysAllocString(L"ROOT\\CIMV2"); |
| 33 | hr = IWbemLocator_ConnectServer(locator, server, NULL, NULL, NULL, 0, NULL, NULL, &services); |
| 34 | SysFreeString(server); |
| 35 | CHECK_HR_OR_GOTO_END(L"ConnectServer"); |
| 36 | |
| 37 | hr = CoSetProxyBlanket((IUnknown *)services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE); |
| 38 | CHECK_HR_OR_GOTO_END(L"CoSetProxyBlanket"); |
| 39 | |
| 40 | wql = SysAllocString(L"WQL"); |
| 41 | queryBstr = SysAllocString(query); |
| 42 | hr = IWbemServices_ExecQuery(services, wql, queryBstr, WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &enumerator); |
| 43 | SysFreeString(wql); |
| 44 | SysFreeString(queryBstr); |
| 45 | CHECK_HR_OR_GOTO_END(L"ExecQuery"); |
| 46 | |
| 47 | uReturn = 0; |
| 48 | hr = IEnumWbemClassObject_Next(enumerator, (LONG)WBEM_INFINITE, 1, &object, &uReturn); |
| 49 | CHECK_HR_OR_GOTO_END(L"Next"); |
| 50 | |
| 51 | propBstr = SysAllocString(property); |
| 52 | hr = IWbemClassObject_Get(object, propBstr, 0, value, NULL, NULL); |
| 53 | SysFreeString(propBstr); |
| 54 | CHECK_HR_OR_GOTO_END(L"Get"); |
| 55 | |
| 56 | end: |
| 57 | if (object) { |
| 58 | IWbemClassObject_Release(object); |
| 59 | } |
| 60 | if (enumerator) { |
| 61 | IEnumWbemClassObject_Release(enumerator); |
| 62 | } |
| 63 | if (services) { |
| 64 | IWbemServices_Release(services); |
| 65 | } |
| 66 | if (locator) { |
| 67 | IWbemLocator_Release(locator); |
| 68 | } |
| 69 | |
| 70 | return hr; |
| 71 | } |