Timas
Зарегистрирован: 29.08.2005 Сообщения: 5
|
Добавлено: Пт Сен 02 2005 13:30 Заголовок сообщения: |
|
|
Итак, немного исследовав вопрос я выяснил следующее:
При загрузке операционная система Windows создаёт дерево устройств (device tree) в узлах которого стоят, так называемые devnode. В этом дереве узлы не являющиеся листьями соответствуют bus устройствам (bus device), к которым присоединяются физические, логические и виртуальные устройства. Таким образом, любому устройству в системе соответствует свой devnode. У devnode есть аттрибут status. Он может быть получен при помощи функции CM_Get_DevNode_Status из Windows DDK. Бит DN_NO_SHOW_IN_DM аттрибута status и отвечает за то, будет считать Device Manager устройство скрытым или нет.
Здесь вроде всё понятно, только вот мне необходимо узнать о скрытости устройства на удалённой машине, в идеале из реестра удалённой машины. Есть ли связь devnode status с каким-нибудь ключом реестра? Другие варианты тоже рассматриваются.
Помогите разобраться, пожалуйста. |
|
4u3u
Зарегистрирован: 24.01.2003 Сообщения: 997 Откуда: Moscow
|
Добавлено: Пт Сен 02 2005 17:43 Заголовок сообщения: |
|
|
Timas писал(а): | Бит DN_NO_SHOW_IN_DM аттрибута status и отвечает за то, будет считать Device Manager устройство скрытым или нет.
|
Не только. Скрытыми так же являются устройства, принадлежащие к скрытым классам, т.е. классам, имеющим папаметр NoDisplayClass=1 в реестре (HKLM\SYSTEM\CurrentControlSet\Control\Class\*\NoDisplayClass)
Еще один тип скрытых устройств - те, которые физически в системе остутствуют, но драйвера для них установлены. Например, при смене сетевой скарты (если перед сменой не удалить ее в Device Manager'е) старая становится скрытым устройством.
http://msdn.microsoft.com/library/en-us/install/hh/install/troubleshoot_320c5562-06cb-4220-9c51-bd5733321279.xml.asp |
|
Timas
Зарегистрирован: 29.08.2005 Сообщения: 5
|
Добавлено: Сб Сен 03 2005 14:39 Заголовок сообщения: |
|
|
Написал программку, которая без параметров выводит список всех сетевых адаптеров, а с параметрами только не скрытых для машины Computer.
В случае если запускается на локальной машине всё ок, при обращении к удалённой машине CM_Get_DevNode_Status_Ex возвращает ошибку CR_INVALID_DEVINST. Хотя вроде всё должно быть ок. В MSDN пишут что:
dnDevInst
Caller-supplied device instance handle, obtained from the SP_DEVINFO_DATA structure that is used with the device installation functions.
я вроде его оттуда и взял, с чего это он вдруг invalid.
Вот полный код:
Код: |
#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 = 0;
ULONG Problem = 0;
LPSTR pBuffer = 0;
ULONG Length = 0;
HMACHINE hMachine = 0;
PCTSTR MachineName = "\\\\Computer";
if (argc > 1)
bShowHidden = FALSE;
if (CR_SUCCESS != CM_Connect_Machine(MachineName, &hMachine))
{
printf("CM_Connect_Machine() error\n");
return;
}
HDEVINFO DeviceInfoSet = SetupDiGetClassDevsEx(
(LPGUID) &GUID_DEVCLASS_NET,
NULL,
NULL,
DIGCF_PRESENT,
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++;
CONFIGRET nError = CM_Get_DevNode_Status_Ex(&Status, &Problem, DeviceInfoData.DevInst,0, hMachine);
if (CR_SUCCESS != nError)
{
printf("Error occured: %u\n", nError);
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);
}
}
|
|
|