Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Как узнать скрыто устройство или нет?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Windows
Предыдущая тема :: Следующая тема  
Автор Сообщение
Timas



Зарегистрирован: 29.08.2005
Сообщения: 5

СообщениеДобавлено: Вт Авг 30 2005 09:14    Заголовок сообщения: Как узнать скрыто устройство или нет? Ответить с цитатой

Доброго времени суток.

В Windows Device Manager есть возможность показать/скрыть hidden девайсы. Подскажите пожалуйста, какой флаг реестра отвечает за то является девайс скрытым или нет.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Timas



Зарегистрирован: 29.08.2005
Сообщения: 5

СообщениеДобавлено: Сб Сен 03 2005 10:36    Заголовок сообщения: Ответить с цитатой

Спасибо за дополнение. Как узнать из реестра устройства у которых весь класс скрыт понятно. Появился еще один вопрос: как узнать из реестра, что устройство отключено? Также попрежнему не понятно где в реестре взять devnode status.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
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);
   }
}
 
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Windows Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...