Message 1 of 6
About WMI query using COM under ARX
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
About WMI query using COM under ARX:
void XdDbUtils::InitializeCOM() {
adsout << "Initializing COM library...";
HRESULT hres = CoInitializeEx(0, COINIT_MULTITHREADED);
if (FAILED(hres)) {
adsout << "Failed to initialize COM library. Error code = 0x"; // << std::hex << hres;
exit(1); // Program termination
}
adsout << "COM library initialized successfully";
}
void XdDbUtils::InitializeSecurity() {
adsout << "Initializing security...";
HRESULT hres = CoInitializeSecurity(
NULL,
-1, // Number of COM authentication services
NULL, // COM authentication service list
NULL, // Reserved
RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation level
NULL, // Authentication information
EOAC_NONE, // Additional capabilities
NULL // Reserved
);
if (FAILED(hres)) {
adsout << "Failed to initialize security. Error code = 0x"; // << std::hex << hres;
CoUninitialize();
exit(1); // Program termination
}
adsout << "Security initialized successfully";
}
IWbemServices* XdDbUtils::InitializeWMI() {
adsout << "Creating IWbemLocator object...";
IWbemLocator* pLoc = NULL;
HRESULT hres = CoCreateInstance(
CLSID_WbemLocator,
0,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID*)&pLoc);
if (FAILED(hres)) {
adsout << "Failed to create IWbemLocator object. Error code = 0x"; // << std::hex << hres;
CoUninitialize();
exit(1); // Program termination
}
adsout << "IWbemLocator object created successfully";
adsout << "Connecting to WMI namespace...";
IWbemServices* pSvc = NULL;
hres = pLoc->ConnectServer(
_bstr_t(L"ROOT\\CIMV2"), // WMI namespace
NULL, // Username
NULL, // Password
0, // Locale
NULL, // Security flags
0, // Authority
0, // Context object
&pSvc // IWbemServices pointer
);
if (FAILED(hres)) {
adsout << "Could not connect to WMI namespace. Error code = 0x"; // << std::hex << hres;
pLoc->Release();
CoUninitialize();
return NULL; // Return NULL on failure
}
adsout << "Connected to WMI namespace successfully";
adsout << "Setting proxy blanket...";
hres = CoSetProxyBlanket(
pSvc, // Proxy
RPC_C_AUTHN_WINNT, // Authentication service
RPC_C_AUTHZ_NONE, // Authorization service
NULL, // Server principal name
RPC_C_AUTHN_LEVEL_CALL, // Authentication level
RPC_C_IMP_LEVEL_IMPERSONATE, // Impersonation level
NULL, // Client identity
EOAC_NONE // Additional capabilities
);
if (FAILED(hres)) {
adsout << "Could not set proxy blanket. Error code = 0x"; // << std::hex << hres;
pSvc->Release();
pLoc->Release();
CoUninitialize();
return NULL; // Return NULL on failure
}
adsout << "Proxy blanket set successfully";
pLoc->Release();
return pSvc;
}
std::string XdDbUtils::ExecuteQuery(IWbemServices* pSvc) {
adsout << "Executing WMI query...";
IEnumWbemClassObject* pEnumerator = NULL;
HRESULT hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_Processor"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres)) {
adsout << "WMI query failed. Error code = 0x"; // << std::hex << hres;
return "";
}
adsout << "WMI query executed successfully";
IWbemClassObject* pclsObj = NULL;
ULONG uReturn = 0;
std::string cpuModel;
while (pEnumerator) {
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (0 == uReturn) {
break;
}
VARIANT vtProp;
hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
if (SUCCEEDED(hr)) {
cpuModel = _bstr_t(vtProp.bstrVal);
adsout << "CPU Model found: " << cpuModel;
}
VariantClear(&vtProp);
pclsObj->Release();
}
pEnumerator->Release();
return cpuModel;
}
std::string XdDbUtils::QueryCPUModel() {
std::string cpuModel;
adsout << "Starting QueryCPUModel()";
InitializeCOM();
InitializeSecurity();
IWbemServices* pSvc = InitializeWMI();
if (pSvc) {
adsout << "WMI service initialized successfully";
cpuModel = ExecuteQuery(pSvc);
pSvc->Release();
} else {
adsout << "Failed to initialize WMI service";
}
CoUninitialize();
adsout << "\nQueryCPUModel() finished";
return cpuModel;
}
USE:
std::string CPU= XdDbUtils::QueryCPUModel();
ACAD crashes and exits,
After debugging, I found that the program crashed when it reached InitializeCOM().
Can you please tell me how to solve this problem?