Реестр виндовс и скрытые устройства
От: Timas  
Дата: 30.08.05 06:45
Оценка:
Всем привет.

Подскажите пожалуйста, какой ключ реестра использует Windows Device Manager, чтобы понять, что устройство является скрытым.
Re: Реестр виндовс и скрытые устройства
От: bo Россия  
Дата: 30.08.05 07:02
Оценка: -1
Здравствуйте, Timas, Вы писали:

здесь
В человечишке все должно быть прекрасненьким: и одёжка, и душенка, и мордочка, и мыслишки.
Re: Реестр виндовс и скрытые устройства
От: Sergeant_BY Беларусь  
Дата: 30.08.05 08:42
Оценка: +1
Здравствуйте, Timas, Вы писали:

T>Подскажите пожалуйста, какой ключ реестра использует Windows Device Manager, чтобы понять, что устройство является скрытым.

Device Manager lists the devices that are installed on the machine. By default, certain devices are not shown in the list. These "hidden" devices include devices that have the devnode status bit DN_NO_SHOW_IN_DM set and devices that are part of a setup class that is marked as a NoDisplayClass in the registry (for example, printers and non-PnP drivers).

Re: Реестр виндовс и скрытые устройства
От: Timas  
Дата: 02.09.05 10:31
Оценка:
Итак, немного исследовав вопрос я выяснил следующее:

При загрузке операционная система 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 с каким-нибудь ключом реестра? Другие варианты тоже рассматриваются.

Помогите разобраться, пожалуйста.
Re[2]: Реестр виндовс и скрытые устройства
От: Timas  
Дата: 02.09.05 10:39
Оценка:
Здравствуйте, bo

К сожалению, это не то что мне нужно. Там пишут про то, что если Вам необходимо чтобы Device Manger показывал устройства не подсоединённые к компьютеру в настоящий момент необходимо добавить переменную окружения devmgr_show_nonpresent_devices = 1.

Мне же необходимо узнать по какому принципу он вообще понимает, что устройство скрытое. Я уже немного продвинулся в этом вопросе. Прочитайте моё сообщение ниже.
Re[2]: Реестр виндовс и скрытые устройства
От: Timas  
Дата: 02.09.05 10:41
Оценка:
Здравствуйте, Sergeant_BY, Вы писали:

S_B>Device Manager lists the devices that are installed on the machine. By default, certain devices are not shown in the list. These "hidden" devices include devices that have the devnode status bit DN_NO_SHOW_IN_DM set and devices that are part of a setup class that is marked as a NoDisplayClass in the registry (for example, printers and non-PnP drivers).

S_B>

Спасибо, я это уже нашёл. Осталось найти в реестре devnode status.
Re[2]: Реестр виндовс и скрытые устройства
От: Sergeant_BY Беларусь  
Дата: 02.09.05 11:12
Оценка:
Здравствуйте, Timas, Вы писали:

T>Здесь вроде всё понятно, только вот мне необходимо узнать о скрытости устройства на удалённой машине, в идеале из реестра удалённой машины. Есть ли связь devnode status с каким-нибудь ключом реестра?

А откуда уверенность что этот devnode status обязательно должен быть в реестре?

T>Другие варианты тоже рассматриваются.

CM_Get_DevNode_Status_Ex?
Re[3]: Реестр виндовс и скрытые устройства
От: Timas  
Дата: 03.09.05 07:50
Оценка:
Здравствуйте, 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 даёт какой-то непонятный номер. В чём проблема ума не приложу.
Re[4]: Реестр виндовс и скрытые устройства
От: Timas  
Дата: 03.09.05 11:26
Оценка:
Разобрался. Просто я не правильно имя указал.
T> //PCTSTR MachineName = "\\MyComputer";
надо:
PCTSTR MachineName = "\\\\MyComputer";


Теперь другая проблема. 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);
   }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.