wmi — C ++ Как узнать, с каким IRQNumber связано устройство?

Я пытаюсь определить, с каким IRQNumber связано конкретное устройство. Затем, когда у меня есть IRQNumber, я хочу перечислить все устройства, которые находятся в этом IRQ, чтобы увидеть, является ли конкретное устройство единственным в этом IRQ или оно разделяет его.

Благодаря диспетчеру периферийных устройств я знаю имя конкретного устройства и связанный номер IRQNumber, но я хочу выполнить описанную выше операцию в коде C ++.

Я нашел класс Win32_PnPAllocatedResource, но не могу выбрать устройство в запросе.

Запрос:

sprintf(szTemp, "SELECT * FROM Win32_PnPAllocatedResource Where Dependent LIKE '\\\\%ws\\root\\cimv2:Win32_PnPEntity.DeviceID=\"%s\"'", ComputerName, DriverIDm);
hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t(szTemp),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator2);
if (FAILED(hres))
{
cout << "Query for Win32_PnPAllocatedResource name failed."<< " Error code = 0x"<< hex << hres << endl;
pSvc2->Release();
pLoc2->Release();
CoUninitialize();
//return 1;               // Program has failed.
}

Для имени компьютера и идентификатора устройства, подобранного ранее:

IEnumWbemClassObject* pEnumerator = NULL;
IEnumWbemClassObject* pEnumerator2 = NULL;
char szTemp[1024];
char szTemp2[1024];
LPCTSTR DriverID;

//////////////////////////////////////////////////////////////////
//
//  DeviceID
//
//////////////////////////////////////////////////////////////////

hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_PnPEntity Where Name LIKE 'Name'"), //Name of the device find in the peripheral manager
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for PnPEntity name failed."<< " Error code = 0x"<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
//return 1;               // Program has failed.
}IWbemClassObject *pclsObj = NULL;
ULONG uReturn = 0;
HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);

if (0 == uReturn)
{
sprintf_s(szTemp, "Device not found !");
MessageBoxA(NULL, szTemp, "Error", MB_ICONERROR);
}
VARIANT vtProp;
hr = pclsObj->Get(L"DeviceID", 0, &vtProp, 0, 0);
wcout << " DeviceID : " << vtProp.bstrVal << endl;
DriverID = vtProp.bstrVal;
int size = 0, cpt = 0, cpt2 = 0;
sprintf(szTemp2, "%ws", DriverID);
size = strlen(szTemp2);
char DriverIDm[1024];

for (cpt = 0; cpt < size + 1; cpt++)
{
if (cpt == size )
{
DriverIDm[cpt2] = '\0';
break;
}
if (szTemp2[cpt] == '\\')
{
DriverIDm[cpt2] = szTemp2[cpt];
cpt2++;
DriverIDm[cpt2] = szTemp2[cpt];
cpt2++;
}
else
{
DriverIDm[cpt2] = szTemp2[cpt];
cpt2++;
}
}//////////////////////////////////////////////////////////////////
//
//  Computer Name
//
//////////////////////////////////////////////////////////////////

LPCTSTR ComputerName;

hres = pSvc->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_IRQResource"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);
if (FAILED(hres))
{
cout << "Query for IRQResource failed."<< " Error code = 0x"<< hex << hres << endl;
pSvc->Release();
pLoc->Release();
CoUninitialize();
//return 1;               // Program has failed.
}hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);

if (0 == uReturn)
{
sprintf_s(szTemp, "Error query !");
MessageBoxA(NULL, szTemp, "Error", MB_ICONERROR);
}

hr = pclsObj->Get(L"CSName", 0, &vtProp, 0, 0);
wcout << " CSName : " << vtProp.bstrVal << endl;
ComputerName = vtProp.bstrVal;

Имя компьютера и DeviceID подобраны без ошибок.

Теперь код, где происходит ошибка:

IWbemClassObject *pclsObj2 = NULL;

ULONG uReturn2 = 0;

while (pEnumerator2)
{
HRESULT hr2 = pEnumerator2->Next(WBEM_INFINITE, 1,
&pclsObj2, &uReturn2);
DWORD nError2 = GetLastError();
if (0 == uReturn2)
{
sprintf_s(szTemp, "Device not found !");
MessageBoxA(NULL, szTemp, "Error", MB_ICONERROR);
break;
}

Значение hr2 равно 0x80041017 (WBEM_E_INVALID_QUERY: запрос не был синтаксически верным.).
Возвращаемое GetLastError () значение равно 1008 (ERROR_NO_TOKEN: была сделана попытка сослаться на несуществующий токен).
И Return2 = 0.

В чем проблема?

Является ли Win32_PnPAllocatedResource правильным классом, чтобы узнать, какой IRQ является конкретным устройством?

Спасибо

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]