Определить способ подключения накопителя

Тема в разделе "WASM.NT.KERNEL", создана пользователем prus, 28 мар 2009.

  1. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Всем привет!

    Помогите плз решить проблему.
    Нужно по букве диска (например C:, G:) получить STORAGE_DEVICE_DESCRIPTOR.

    Делаю так:

    Код (Text):
    1. ...
    2.     ntStatus = IoGetDeviceObjectPointer(pusDriveName, FILE_READ_ATTRIBUTES, &FileObject, &DeviceObject); // pusDriveName = \??\C:
    3.     if( !NT_SUCCESS(ntStatus) )
    4.         goto END;
    5.  
    6.     KeInitializeEvent(&Event, NotificationEvent, FALSE);
    7.  
    8.     RtlZeroMemory(&sddQuery, sizeof(STORAGE_PROPERTY_QUERY));
    9.     RtlZeroMemory(&sdd, sizeof(STORAGE_DEVICE_DESCRIPTOR));
    10.  
    11.     sddQuery.QueryType  = PropertyStandardQuery;
    12.     sddQuery.PropertyId = StorageDeviceProperty;
    13.  
    14.     pIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY,
    15.                                          DeviceObject,
    16.                                          &sddQuery,
    17.                                          sizeof(STORAGE_PROPERTY_QUERY),
    18.                                          &sdd,
    19.                                          sizeof(STORAGE_DEVICE_DESCRIPTOR),
    20.                                          TRUE,
    21.                                          &Event,
    22.                                          &ioStatus);
    23.  
    24.     if( pIrp == NULL )
    25.         goto END;
    26.  
    27.     ntStatus = IoCallDriver(DeviceObject, pIrp);
    28.  
    29.     if( ntStatus == STATUS_PENDING ) {
    30. #ifdef DEBUG_PRINT
    31.         DbgPrint("IoCallDriver Waiting...");
    32. #endif
    33.         KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
    34.     }
    35.     else if( !NT_SUCCESS(ntStatus) ){
    36. #ifdef DEBUG_PRINT
    37.         DbgPrint("IoCallDriver error [0x%08X]", ntStatus);
    38. #endif
    39.         goto END;
    40.     }
    41. ...
    IoCallDriver постоянно возвращает STATUS_INVALID_DEVICE_REQUEST (0xC0000010). Какое же объект-устройство в данном случае нужно и как его получить?

    И еще по какой причине, если в IoGetDeviceObjectPointer указываю флаги отличные от FILE_READ_ATTRIBUTES (например FILE_ALL_ACCESS), то система зависает полностью?

    Заранее благодарен!
     
  2. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    pusDriveName == ?
     
  3. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    pusDriveName == \??\C:
     
  4. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    Через \DosDevices\C: не пробовали?
     
  5. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    и, если че не помню, но разве в IoGetDeviceObjectPointer() не GENERIC_??? вместо FILE_??? нужно использовать?
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    \??\C: и \DosDevices\C: - это одно и то же.
     
  7. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    x64
    кому, как ни вам знать, что не совсем и не всегда одно и то же)
     
  8. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    ok, рассказывай. При чём в контексте топика.
     
  9. ams007

    ams007 New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2007
    Сообщения:
    86
    x64, в контексте топика это оффтоп, звиняйте...
     
  10. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Слабая отмазка, не убедительная.