Как имея FILE_OBJECT от файла на диске, получить HardwareID диска

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

  1. pinya

    pinya New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2007
    Сообщения:
    30
    Задача:

    Получиться информацию о диске с которого читается файл.
    Т.е.
    Есть FileHandle, от например \Device\HarddiskVolume2\Documents and Settings\p\Desktop\dbgview.log..

    PFILE_OBJECT obj;
    NTSTATUS status=ObReferenceObjectByHandle(handle,0,0,KernelMode,(PVOID*)&obj,NULL);

    далее сую этот obj в
    int GetParameter(IN PDEVICE_OBJECT pDeviceObject)
    {
    WCHAR* buff2;
    ULONG len = 0;
    PDEVICE_OBJECT pPDO;



    if(GetTargetDevicePdo(pDeviceObject,&pPDO) != STATUS_SUCCESS)
    {
    DbgPrint("\n\nError IoGetDeviceProperty: \n");
    return -1;
    }

    //try to get name
    IoGetDeviceProperty(pPDO,
    DevicePropertyFriendlyName ,
    0,
    NULL,
    &len);
    if(len > 0)
    {
    buff2 = (WCHAR*)malloc_np(len);

    if(IoGetDeviceProperty(pPDO,
    DevicePropertyFriendlyName ,
    len,
    buff2,
    &len) == STATUS_SUCCESS)
    {
    DbgPrint("Property: %S\n\n",buff2);
    }

    free(buff2);
    }

    ObDereferenceObject(pPDO);

    return 0;

    }

    GetTargetDevicePdo - это из пирмера DDK либо пробовал пробегая по AttachedTo (тут на форуме GetNextLowerDeviceObject). Результат тот же.

    Проблема в том, это этот PDO говорит что он STORAGE, а не реальный диск. Приче для CDROM работает хорошо, для жесткого диска - нет.

    Смотрел в дереве DeviceTree, и действительно это другая ветка, насколько я понимаю связанная с драйверами файльвой системы. Как связаны обекты этой ветки с другой, где реальный диск, со всеми параметрами я не понял...

    Объясните плиз.. оо великие войны дзена:)
     
  2. pinya

    pinya New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2007
    Сообщения:
    30
    Добрался в юзер моде через CM_Get_DevNode_Registry_Property и SetupDi... функции.
    по коду выдно, что тыкался уже наугад...

    Код (Text):
    1.     guid = GUID_DEVINTERFACE_VOLUME;
    2.  
    3.    
    4.     // Get device Information handle for Volume interface
    5.     hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL,
    6.                             DIGCF_DEVICEINTERFACE |
    7.                             DIGCF_PRESENT);
    8.  
    9.      if(hDevInfo == INVALID_HANDLE_VALUE)
    10.     {
    11.          printf("Error - SetupDiGetClassDevs failed\n");                       
    12.         return 0;
    13.     }
    14.  
    15.      // Loop until device interfaces are found.
    16.     for(dwIndex = 0; ;dwIndex ++)
    17.      {     
    18.         ZeroMemory(&devInterfaceData, sizeof(devInterfaceData));
    19.          devInterfaceData.cbSize = sizeof(devInterfaceData);
    20.  
    21.         // Get device Interface data.
    22.  
    23.         if(!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid,
    24. dwIndex,&devInterfaceData))
    25.         {
    26.             break;
    27.         }
    28.  
    29.         ZeroMemory(&devInfoData, sizeof(devInfoData));
    30.          devInfoData.cbSize = sizeof(devInfoData);
    31.        
    32.          pDevDetail         = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
    33.          pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
    34.  
    35.         // Get device interface detail data to get
    36.         //  Device Instance from SP_DEVINFO_DATA and
    37.         //  Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA
    38.  
    39.         SetupDiGetDeviceInterfaceDetail(hDevInfo,
    40.                         &devInterfaceData,
    41.                         pDevDetail,         // SP_DEVICE_INTERFACE_DETAIL_DATA
    42.                         BUFFER_SIZE,
    43.                         &dwRequiredSize,
    44.                         &devInfoData);      // SP_DEVINFO_DATA
    45.  
    46.         // Get the device instance of parent. This points to USBSTOR.
    47.         //CM_Get_Child(&devInstParent,devInfoData.DevInst, 0);
    48.  
    49.         // Get the device instance of grand parent. This points to USB root.
    50.         CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0);
    51.         //CM_Get_Parent(&devInstParent,devInstParent,0);
    52.         //CM_Get_Parent(&devInstParent,devInstParent,0);
    53.         //CM_Get_Parent(&devInstParent,devInstParent,0);
    54.         CM_Get_Parent(&devInstParent,devInstParent,0);
    55.  
    56.         // Get the device ID of the USB root.
    57.         //CM_Get_Device_ID(devInstParent, buf, BUFFER_SIZE,0);
    58.  
    59.         CM_Get_Device_ID(devInfoData.DevInst, buf, BUFFER_SIZE,0);
    60.  
    61.         WCHAR buff2[1000];
    62.         ULONG len = 1000;
    63.         memset(buff2,0,100);
    64.         CM_Get_DevNode_Registry_Property(
    65.                             devInfoData.DevInst,//devInstParent,
    66.                             CM_DRP_HARDWAREID,
    67.                             NULL,
    68.                             buff2,
    69.                             &len,
    70.                             0);
    То же саоме. Для CDRom таже нода возврашает FriendlyName и HardwareID, для флешки парент, для диска ненашел...

    Как то же его можно выковырять.....????
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    план порабощения вселенной такой:
    1) ObReferenceObjectByHandle
    2) Получаем из FileObject->DeviceObject
    3) ObQueryNameString - имеем имя девайса
    4) Затем простым перебором линков \??\A, \??\B , \??\C .. получаем из них имена девайсов и сверяем с нашим

    код не дам, жадный я
     
  4. pinya

    pinya New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2007
    Сообщения:
    30
    И таким образом я получу, что мой девайс есть, скажем диск с:. Это получается без проблем, но из этого девайса я не могу получить информацию FriendlyName и HardwareId, т.е. он говорит что он STORAGE\Volume...
    а мне нужно получить зависимость типа
    C: - ST980811AS
    D: - HL-DT-ST DVDRAM GSA-T10N
    F: - JetFlash TS2GJF130 USB Device

    Для CDRom и флешки я могу получить это выше указанными способами, а для жесткого диска нет. Т.к. дерево девайсов для жесткого диска устроено иначе.
     
  5. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    а неправильно тебя понял
    но похожея и я зря мучался, смотрим в ZwQueryVolumeInformationFile в DDK
     
  6. pinya

    pinya New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2007
    Сообщения:
    30
    посмотрел, ее похоже нету для w2k и возвращает она вот это:
    Код (Text):
    1. typedef struct _FILE_FS_VOLUME_INFORMATION {
    2.  
    3.   LARGE_INTEGER           VolumeCreationTime;
    4.   ULONG                   VolumeSerialNumber;
    5.   ULONG                   VolumeLabelLength;
    6.   BOOLEAN                 SupportsObjects;
    7.   WCHAR                   VolumeLabel[1];
    8.  
    9. } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
    я не вижу тут нужной мне инфы.. можно подробнее плиз..

    ....
    мне кажется, что тут нужно каким-то хитрым образом ползать по дереву устройств, найти нужный PDO и спросить у него что нужно. Проблема в том, что непонятно каким образом перейти от PDO который STORAGE\Volume к тому PDO который знает все про физический девайс (т.е. у которого можно спросить IoGetDeviceProperty и он ответить что нужно).
    Наверное, можно как-то использовать инфу в реестре, но я ковырялся и тоже болд..:dntknw:
     
  7. pinya

    pinya New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2007
    Сообщения:
    30
    Вот например, есть такая вещь
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum

    и

    Код (Text):
    1. bool GetPhysicalDrive(const WCHAR* logicaldevice, DWORD& disknr)
    2. {
    3.     DWORD cb;
    4.     HANDLE fh= CreateFile(logicaldevice, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
    5.     if (fh==NULL || fh==INVALID_HANDLE_VALUE)
    6.     {
    7.         return false;
    8.     }
    9.     STORAGE_DEVICE_NUMBER devnr;
    10.  
    11.     if (!DeviceIoControl(fh, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &devnr, sizeof(STORAGE_DEVICE_NUMBER), &cb, NULL))
    12.         return false;
    13.     if (devnr.DeviceType!=FILE_DEVICE_DISK)
    14.         return false;
    15.     disknr= devnr.DeviceNumber;
    16.     return true;
    17. }
    соотв. я сязываю драйв леттер и строку в реестре. По этой строке из реестра, в том же реестре можно найти соотв. запись со всей инфой.

    только мне кажется, что это как-то через анус и я не уверен насчет DeviceNumber...

    ....
    и есче! почему тогда там нет сдрома, он уже не диск оказываца..

    фсе пайду курить.....
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    попробуй это IRP_MN_QUERY_CAPABILITIES, IRP_MN_QUERY_ID может чем поможет я и сам толком не знаю разбиратся щас неполучается