Здравствуйте, Sergeant_BY, Вы писали:
S_B>А откуда уверенность что этот devnode status обязательно должен быть в реестре?
Уверенности нет. Есть большая надежда, что я смогу его там найти. Может кто-то про это что-нибудь знает.
S_B>CM_Get_DevNode_Status_Ex?
Написал следующую программку:
#define _WIN32_WINNT 0x0501
#define WINVER 0x0501
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <setupapi.h>
#include <devguid.h>
#include <cfgmgr32.h>
BOOL GetRegistryProperty(HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData,
ULONG Property,
LPTSTR* Buffer,
PULONG Length)
{
while (!SetupDiGetDeviceRegistryProperty(
DeviceInfoSet,
DeviceInfoData,
Property,
NULL,
(PBYTE)(*Buffer),
*Length,
Length
))
{
int nError = GetLastError();
if (nError == ERROR_INSUFFICIENT_BUFFER) {
if (*(LPTSTR *)Buffer)
LocalFree(*(LPTSTR *)Buffer);
*Buffer = (LPTSTR)LocalAlloc(LPTR, *Length);
}else {
return FALSE;
}
}
return TRUE;
}
void main(int argc, char* argv[]) {
BOOL bShowHidden = TRUE;
DWORD MemberIndex = 0;
SP_DEVINFO_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
ULONG Status;
ULONG Problem;
LPSTR pBuffer = 0;
ULONG Length = 0;
if (argc > 1)
bShowHidden = FALSE;
//PCTSTR MachineName = "\\MyComputer";
HDEVINFO DeviceInfoSet = SetupDiGetClassDevsEx(
(LPGUID) &GUID_DEVCLASS_NET,
NULL,
NULL,
DIGCF_PRESENT,
NULL,
NULL, // MachineName
NULL);
if (INVALID_HANDLE_VALUE == DeviceInfoSet)
{
int nError = GetLastError();
LPVOID lpMsgBuf;
if (!FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
nError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL ))
{
// Handle the error.
printf("Error: unknown error. Code: %u\n", nError);
return;
}
// Display the string.
printf("Error: %s\n", (LPCTSTR)lpMsgBuf);
// Free the buffer.
LocalFree( lpMsgBuf );
return;
}
while (SetupDiEnumDeviceInfo(DeviceInfoSet, MemberIndex, &DeviceInfoData))
{
MemberIndex++;
if (CR_SUCCESS != CM_Get_DevNode_Status(&Status, &Problem,
DeviceInfoData.DevInst,0))
{
continue;
}
if (!bShowHidden && (Status & DN_NO_SHOW_IN_DM))
{
continue;
}
if (!GetRegistryProperty(DeviceInfoSet,
&DeviceInfoData,
SPDRP_FRIENDLYNAME,
&pBuffer,
&Length))
{
if (!GetRegistryProperty(DeviceInfoSet,
&DeviceInfoData,
SPDRP_DEVICEDESC,
&pBuffer,
&Length))
{
continue;
}
}
printf("%d. %s\n", MemberIndex, pBuffer);
}
}
При запуске без параметров она выводит на экран список всех сетевых адаптеров на локальной машине. При запуске с любыми параметрами выводит только не скрытые сетевые адаптеры. При переходе от локальной машины к удалённой, возникла проблема.
Функция SetupDiGetClassDevsEx при имени машины отличном от NULL возвращает ошибку. GetLastError даёт какой-то непонятный номер. В чём проблема ума не приложу.