Получить информацию о диске по Device_object

Тема в разделе "WASM.NT.KERNEL", создана пользователем Marik, 10 мар 2007.

  1. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Дорого времени суток!!!
    Собственно весь вопрос в названии темы. Драйвер disk.sys для каждого логического диска создает свой Device_object для управления диском(на сколько я знаю, если не прав сильно не пинайте;)). Так вот как можно получить всякую полезную инфу о диске имея его Device_object.( конкретно интересует VID&PID)???
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Что это? Расшифрую. Если VID - Volume ID, то PID - что?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Может имелся в виду VolumeParameterBlock (VPB) Oo?
     
  4. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Под VID&PID я имел ввиду следующее:
    У каждого диска есть свой уникальный номер. Мне, конкретно, нужно узнавать уникальный номер съемного носителя - флэшки. В системе он выглядит (у моей флэшки) - USB\VID_058&PID_6387\XL19S8UG. Это как я понимаю уникальный номер который присваивает завод изготовитель. Так вот как я его могу получить по Device_object???
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    по теме не знаю
    могу дать сэмпл перебора дерева устройств, при желании его можно перенести в кернел. если это чем-нибудь поможет:
    Код (Text):
    1. #include "stdafx.h"
    2. #include "1.h"
    3. #include "tfile.h"
    4. #include "cfgmgr32.h"
    5.  
    6. #pragma comment(lib, "Setupapi.lib")
    7.  
    8. RETURN_TYPE error_code= CR_SUCCESS;
    9. void DumpNode(int level, HANDLE hFile, DEVINST nDevNode, HMACHINE hMachine);
    10. void DumpNodeInfo(int level, HANDLE hFile, DEVINST nDevNode, HMACHINE hMachine);
    11.  
    12. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    13. {
    14.     // TODO: Place code here.
    15.  
    16.     DEVINST nRootInst;
    17.     HMACHINE hLocalMachine;
    18.     HANDLE hFile= NULL;
    19.  
    20.     try
    21.     {
    22.         hFile= TCreateFile("devlist.txt", TRUE);
    23.    
    24.         hLocalMachine= (HMACHINE)NULL;
    25.  
    26.         error_code= CM_Locate_DevNode_Ex(&nRootInst, NULL, CM_LOCATE_DEVNODE_NORMAL, hLocalMachine);
    27.         if(error_code!=CR_SUCCESS)
    28.             throw "Cannot locate root devnode";
    29.  
    30.         DumpNodeInfo(0, hFile, nRootInst, hLocalMachine);
    31.  
    32.         DumpNode(0, hFile, nRootInst, hLocalMachine);
    33.     }
    34.     catch(char *str)
    35.     {
    36.         char errstr[1000];
    37.         sprintf(errstr, "%s, error code: %d", str, error_code);
    38.         MessageBox(NULL, errstr, "An error was occuired", 0);
    39.     }
    40.     catch(...)
    41.     {
    42.     }
    43.  
    44.     if(TCheckFileHandle(hFile))
    45.         TCloseFlie(hFile);
    46.  
    47.     return 0;
    48. }
    49.  
    50. void DumpNode(int level, HANDLE hFile, DEVINST nDevNode, HMACHINE hMachine)
    51. {
    52.     DEVINST nDevInst;
    53.  
    54.     error_code= CM_Get_Child_Ex(&nDevInst, nDevNode, 0, hMachine);
    55.     if(error_code!=CR_SUCCESS)
    56.         if(error_code!=CR_NO_SUCH_DEVNODE)
    57.             throw "Cannot locate child devnode";
    58.  
    59.     while(error_code==CR_SUCCESS)
    60.     {
    61.         DumpNodeInfo(level+1, hFile, nDevInst, hMachine);
    62.  
    63.         DumpNode(level+1, hFile, nDevInst, hMachine);
    64.  
    65.         error_code= CM_Get_Sibling_Ex(&nDevInst, nDevInst, 0, hMachine);
    66.         if(error_code!=CR_SUCCESS)
    67.             if(error_code!=CR_NO_SUCH_DEVNODE)
    68.                 throw "Cannot locate child devnode";
    69.     }
    70. }
    71.  
    72. void DumpNodeInfo(int level, HANDLE hFile, DEVINST nDevNode, HMACHINE hMachine)
    73. {
    74.     TCHAR tszDeviceId[0x1000];
    75.     TCHAR tszClassId[0x1000];
    76.     TCHAR tszNameId[0x1000];
    77.     TCHAR tszPhDevNameId[0x1000];
    78.     TCHAR tszNumber[0x10];
    79.     BOOL isName= TRUE;
    80.     BOOL isPhDevName= TRUE;
    81.     BOOL isClass= TRUE;
    82.     ULONG ulSize;
    83.     int i;
    84.  
    85.     error_code= CM_Get_Device_ID_Ex(nDevNode, tszDeviceId, sizeof(tszDeviceId), 0, hMachine);
    86.     if(error_code!=CR_SUCCESS)
    87.         throw "Cannot get device id";
    88.  
    89.     ulSize= sizeof(tszClassId);
    90.     error_code= CM_Get_DevNode_Registry_Property_Ex(nDevNode, CM_DRP_CLASS, NULL, tszClassId, &ulSize, 0, hMachine);
    91.     if(error_code!=CR_SUCCESS)
    92.     {
    93.         isClass= FALSE;
    94.         if(error_code!=CR_NO_SUCH_VALUE && error_code!=CR_BUFFER_SMALL)
    95.             throw "Cannot get device class";
    96.     }
    97.  
    98.     ulSize= sizeof(tszNameId);
    99.     error_code= CM_Get_DevNode_Registry_Property_Ex(nDevNode, CM_DRP_FRIENDLYNAME, NULL, tszNameId, &ulSize, 0, hMachine);
    100.     if(error_code!=CR_SUCCESS)
    101.     {
    102.         isName= FALSE;
    103.         if(error_code!=CR_NO_SUCH_VALUE && error_code!=CR_BUFFER_SMALL)
    104.             throw "Cannot get device friendly name";
    105.     }
    106.  
    107.     if(level)
    108.     {
    109.         ulSize= sizeof(tszPhDevNameId);
    110.         error_code= CM_Get_DevNode_Registry_Property_Ex(nDevNode, CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME, NULL, tszPhDevNameId, &ulSize, 0, hMachine);
    111.         if(error_code!=CR_SUCCESS)
    112.         {
    113.             isPhDevName= FALSE;
    114.             if(error_code!=CR_NO_SUCH_VALUE && error_code!=CR_BUFFER_SMALL)
    115.                 throw "Cannot get physical device object name";
    116.         }
    117.     }
    118.     else
    119.     {
    120.         isPhDevName= FALSE;
    121.     }
    122.  
    123.     for(i= 0; i<level; i++)
    124.         TWriteFile(hFile, _T("\t"), 0, (DWORD)_tcslen(_T("\t"))*sizeof(TCHAR), TRUE);
    125.     _stprintf(tszNumber, "%d. ", level);
    126.     TWriteFile(hFile, tszNumber, 0, (DWORD)_tcslen(tszNumber)*sizeof(TCHAR), TRUE);
    127.    
    128.     TWriteFile(hFile, tszDeviceId, 0, (DWORD)_tcslen(tszDeviceId)*sizeof(TCHAR), TRUE);
    129.     if(isName || isClass || isPhDevName)
    130.         TWriteFile(hFile, _T(" ("), 0, (DWORD)_tcslen(_T(" ("))*sizeof(TCHAR), TRUE);
    131.     if(isName)
    132.     {
    133.         TWriteFile(hFile, _T("\""), 0, (DWORD)_tcslen(_T("\""))*sizeof(TCHAR), TRUE);
    134.         TWriteFile(hFile, tszNameId, 0, (DWORD)_tcslen(tszNameId)*sizeof(TCHAR), TRUE);
    135.         TWriteFile(hFile, _T("\""), 0, (DWORD)_tcslen(_T("\""))*sizeof(TCHAR), TRUE);
    136.     }
    137.     if(isName && (isPhDevName || isClass))
    138.         TWriteFile(hFile, _T(", "), 0, (DWORD)_tcslen(_T(", "))*sizeof(TCHAR), TRUE);
    139.     if(isPhDevName)
    140.         TWriteFile(hFile, tszPhDevNameId, 0, (DWORD)_tcslen(tszPhDevNameId)*sizeof(TCHAR), TRUE);
    141.     if((isName || isPhDevName) && isClass)
    142.         TWriteFile(hFile, _T(", "), 0, (DWORD)_tcslen(_T(", "))*sizeof(TCHAR), TRUE);
    143.     if(isClass)
    144.         TWriteFile(hFile, tszClassId, 0, (DWORD)_tcslen(tszClassId)*sizeof(TCHAR), TRUE);
    145.     if(isName || isClass || isPhDevName)
    146.         TWriteFile(hFile, _T(")"), 0, (DWORD)_tcslen(_T(")"))*sizeof(TCHAR), TRUE);
    147.    
    148.     TWriteFile(hFile, _T("\r\n"), 0, (DWORD)_tcslen(_T("\r\n"))*sizeof(TCHAR), TRUE);
    149. }
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Если под Device_object имеется ввиду объект созданный disk.sys, то скорее всего никак. Для флешек создается три PnP-узла (device node).

    Код (Text):
    1. Запоминающее устройство для USB        PDO:usbhub  FDO:usbstor
    2.   Дисковый накопитель                  PDO:usbstor FDO:Disk
    3.     Универсальный том                  PDO:Disk    FDO:-
    В отладчике этот кусок PnP дерева для моей флешки выглядит так:

    Код (Text):
    1. kd> !DevNode 8119ff28 1
    2. DevNode 0x8119ff28 for PDO 0x811afe90
    3.   Parent 0x811a0d48   Sibling 0000000000   Child 0x8116ad68
    4.   InstancePath is "USB\Vid_0c76&Pid_0005\6&38c5a47&0&1"
    5.   ServiceName is "USBSTOR"
    6.   Flags (0x00040458)  DNF_PROCESSED, DNF_ENUMERATED,
    7.                       DNF_ADDED, DNF_NO_RESOURCE_REQUIRED,
    8.                       DNF_STARTED
    9.   CapabilityFlags (0x00000010)  Removable
    10.   DevNode 0x8116ad68 for PDO 0x8117aed0
    11.     Parent 0x8119ff28   Sibling 0000000000   Child 0x811c8aa8
    12.     InstancePath is "USBSTOR\Disk&Ven_JetFlash&Prod_TS128MJF2A&Rev_1.00\7&311ad6ac&0"
    13.     ServiceName is "disk"
    14.     Flags (0x00040458)  DNF_PROCESSED, DNF_ENUMERATED,
    15.                         DNF_ADDED, DNF_NO_RESOURCE_REQUIRED,
    16.                         DNF_STARTED
    17.     DevNode 0x811c8aa8 for PDO 0x8119bd90
    18.       Parent 0x8116ad68   Sibling 0000000000   Child 0000000000
    19.       InstancePath is "STORAGE\RemovableMedia\8&2aa6674d&0&RM"
    20.       TargetDeviceNotify List - f 0xe24f0c88  b 0xe24f0c88
    21.       Flags (0x00040458)  DNF_PROCESSED, DNF_ENUMERATED,
    22.                           DNF_ADDED, DNF_NO_RESOURCE_REQUIRED,
    23.                           DNF_STARTED
    24.       CapabilityFlags (0x00000180)  SilentInstall, RawDeviceOK
    А стеки этих нод вот:

    Код (Text):
    1. kd> !devstack 0x811afe90
    2.   !DevObj   !DrvObj            !DevExt   ObjectName
    3.   811e5bd0  \Driver\USBSTOR    811e5c88  00000023
    4. > 811afe90  \Driver\usbhub     811aff48  USBPDO-5
    5. !DevNode 8119ff28 :
    6.   DeviceInst is "USB\Vid_0c76&Pid_0005\6&38c5a47&0&1"
    7.   ServiceName is "USBSTOR"
    8.  
    9. kd> !devstack 0x8117aed0
    10.   !DevObj   !DrvObj            !DevExt   ObjectName
    11.   81164ca0  \Driver\Diskperf   81164d58
    12.   81164ea0  \Driver\PartMgr    81164f58
    13.   811debd0  \Driver\Disk       811dec88  DR4
    14. > 8117aed0  \Driver\USBSTOR    8117af88  00000024
    15. !DevNode 8116ad68 :
    16.   DeviceInst is "USBSTOR\Disk&Ven_JetFlash&Prod_TS128MJF2A&Rev_1.00\7&311ad6ac&0"
    17.   ServiceName is "disk"
    18.  
    19. kd> !devstack 0x8119bd90
    20.   !DevObj   !DrvObj            !DevExt   ObjectName
    21. > 8119bd90  \Driver\Disk       8119be48  DP(1)0-0+5
    22. !DevNode 811c8aa8 :
    23.   DeviceInst is "STORAGE\RemovableMedia\8&2aa6674d&0&RM"
    usbstor тут является "водоразделом". Всё что выше него к USB никак не относится. Он как раз и занимается переводом SCSI команд в URB. Поэтому все пакеты, которые гуляют во втором и третьем стеке к USB никакого отношения не имеют. А вот в первом стеке из-под usbstor уже идут USB-related пакеты.

    Поэтому если под Device_object имеется ввиду любой девайс из первого стека, то можно запросить у хаба дескриптор USB девайса. Конкретые IOCTL есть в исходниках DDK\src\wdm\usb\usbview. Их можно юзать и из драйвера. Если эти IOCTL пустить по второму/третьему стеку, то они просто их не поймут и возвратять ошибку.

    А VID и PID достается из дескриптора USB девайса.

    VID - Vendor ID. Покупается производителем у USB комитета на usb.org
    PID - Product ID. Самостоятельно присваивается производителем USB девайса.
    XL19S8UG в данном случае серийный номер флешки. Хранится в самом девайсе как строка, индекс которой в DeviceDescriptor.iSerialNumber.

    Для моей флешки UVCView выдает такой DeviceDescriptor.

    Код (Text):
    1. bLength:                           0x12
    2. bDescriptorType:                   0x01
    3. bcdUSB:                          0x0110
    4. bDeviceClass:                      0x00
    5. bDeviceSubClass:                   0x00
    6. bDeviceProtocol:                   0x00
    7. bMaxPacketSize0:                   0x40
    8. idVendor:                        0x0C76
    9. idProduct:                       0x0005
    10. bcdDevice:                       0x0100
    11. iManufacturer:                     0x01
    12. iProduct:                          0x02
    13. iSerialNumber:                     0x00 Лажёвая флешка без серийника, хотя по спецификации должен быть ;)
    14. bNumConfigurations:                0x01
    ЗЫ: Ух ну и запарился я всё это писАть :dntknw: Тут тебе надо много покурить разных доков. Тема сложная - курить придется долго. Начни с раздела по USB в DDK. Там, например есть диаграммы USB Driver Stack for Windows 2000 и USB Driver Stack for Windows XP and Later.
     
  7. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    МегаРеспект вам Four-F
    Запасусь бамбуком и буду раскуривать))))) Благодаря вашим вставкам возникла одна гениальная;)) идея. Если получиться обязательно отпишуся!!!!!!
     
  8. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Four-F
    Покурил, покурил.... вот только не гелче....(((
    Мне нужно итого получить строку вида USB\Vid_0c76&Pid_0005\6&38c5a47&0&1
    Код (Text):
    1. kd> !devstack 0x811afe90
    2.   !DevObj   !DrvObj            !DevExt   ObjectName
    3.   811e5bd0  \Driver\USBSTOR    811e5c88  00000023
    4. > 811afe90  \Driver\usbhub     811aff48  USBPDO-5
    5. !DevNode 8119ff28 :
    6.   DeviceInst is "USB\Vid_0c76&Pid_0005\6&38c5a47&0&1"
    7.   ServiceName is "USBSTOR"
    Я так понимаю мне нужна строка DeviceInst из команды DevNode. Но как ее получить ума не приложу......
    PS: через IoGetDeviceProperty с параметром DevicePropertyHardwareID могу получить строку вида
    USB\Vid_0c76&Pid_0005\Rev_0100 Только не то это......
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    а разве _stprintf format string не в TCHAR'e принимает? или Вы опять по памяти писали?
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    В ядре, к сожалению, никак. Документированного способа нет.


    Чтоб у нас не было разночтений в терминологии....

    "USB\Vid_0c76&Pid_0005\6&38c5a47&0&1" - Device instance ID

    http://msdn2.microsoft.com/en-us/library/ms791083.aspx#998b4565-9479-4d9d-b3d1-fd0c947829c5


    "USB\Vid_0c76&Pid_0005&Rev_0100" - Первая строка в Hardware IDs

    http://msdn2.microsoft.com/en-us/library/ms791083.aspx#df9964a2-fa06-4bf1-97c9-9fbc986816ec
     
  11. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Можешь попробовать поискать в конфе http://www.osronline.com/page.cfm?name=search смутно помню, что там это (получение device instance id), вроде, обсуждалось.
     
  12. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Пробую перехватывать IRP_MN_QUERY_ID. На выходе в случаи успеха в IoStatus.Information должен вернуться указатель на буфер с информацией.
    Код (Text):
    1. On success, a driver sets Irp->IoStatus.Information to a WCHAR pointer that points to the requested information. On error, a driver sets Irp->IoStatus.Information to zero.
    Возвращает например "00000190" вот только ни как не могу найти сам буфер с информацией. ((((((
     
  13. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Косячишь где-то.
     
  14. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    я хучу в DRIVER_OBJECT IRP_MJ_PNP отлавливаю IRP с IRP_MN_QUERY_ID передаю их дальше и смотрю что на выходе... Завершается IRP без ошибок вроде, все чики-пуки вот только буфер какой то странный((((
     
  15. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    д.б. нормальный буфер... как в доке прописано. думай.
     
  16. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Four-F
    Как всегда вы правы)))) помог все тотже softice.... Я обращался по видимому уже к завершенному irp.....
    Еще вопром по этой теме: с помощью IoGetDeviceProperty с параметром DevicePropertyDeviceDescription я получаю массив данных. В проге DeviceLock при занесении в базу флэшки по мимо VID&PID записывается еще и этот дескриптор устройства. Я так понимаю это тоже своего рода уникальный номер для каждого устройства??? Что вы думаете по этому поводу?
     
  17. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Это не "массив данных" и не "дескриптор устройства" и тем более не "своего рода уникальный номер". Это просто некая чисто описательная строка типа "Bluetooth 2.0 USB Device" или "USB PC Camera", которая по большому счёту вообще ничего не значит. Если DeviceLock её и запоминает, то только затем, чтоб показать юзеру. Больше ни на что она не годится.