Аналог IoGetDeviceObjectPointer()

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

  1. SlyBit

    SlyBit New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2008
    Сообщения:
    43
    Доброго времени суток!

    Мне нужно получить указатель на объект устройства (PDEVICE_OBJECT) по его имени. Если в момент вызова IoGetDeviceObjectPointer() устройство открыто функцией CreateFile() из приложения, то функция падает с кодом 0xC0000022L (STATUS_ACCESS_DENIED). Можно как-нибуть иначе получить этот указатель?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    ObReferenceObjectByName(). В качестве типа объекта передать *IoDeviceObjectType (NULL передавать нельзя, это обязательный аргумент). По окончании работы с объектом необходимо вызвать ObDereferenceObject() для него.
     
  3. SlyBit

    SlyBit New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2008
    Сообщения:
    43
    x64

    Спасибо!
     
  4. SlyBit

    SlyBit New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2008
    Сообщения:
    43
    ObReferenceObjectByName() с параметром *IoDeviceObjectType для различных девайсов возвращает ошибку 0xC0000024 (STATUS_OBJECT_TYPE_MISMATCH). В то же время, ссылку на объект драйвера (параметр *IoDriverObjectType) получаю нормально. В чем может быть ошибка?

    Код (Text):
    1. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    2. {
    3.     NTSTATUS Status = STATUS_SUCCESS;
    4.     UNICODE_STRING OurDeviceName;
    5.     PDEVICE_OBJECT pDeviceObject = NULL;
    6.  
    7.     DriverObject->DriverUnload = DrvUnload;
    8.    
    9.     RtlInitUnicodeString(&OurDeviceName, L"\\Device\\Ndis");
    10.     Status = ObReferenceObjectByName(&OurDeviceName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDeviceObjectType, KernelMode, NULL, (PVOID*)&pDeviceObject);
    11.     if(!NT_SUCCESS(Status)) {
    12.         return Status;        
    13.     }
    14.    
    15.     ObDereferenceObject(pDeviceObject);
    16.  
    17.     return Status;
    18. }
    p.s. указатель *IoDeviceObjectType выглядит валидным.
     
  5. SlyBit

    SlyBit New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2008
    Сообщения:
    43
    Нашел обсуждение моей проблемы тут: http://www.ntndis.com/forum/viewtopic.php?f=1&t=168&p=610

    Выходит ObReferenceObjectByName(*IoDeviceObjectType) никак не заставить работать.

    Буду реализовывать один из следующих вариантов:
    Может все же есть более простое решение?
     
  6. prorok

    prorok New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    25
    Я пребераю все дрова и их девайсы.
    все работает.
     
  7. SlyBit

    SlyBit New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2008
    Сообщения:
    43
    Да понятно, что это работает. Думал есть экспортируемая функция в ядре. На нет и суда нет.