Аналог IoGetDeviceObjectPointer()

Discussion in 'WASM.NT.KERNEL' started by SlyBit, Apr 9, 2009.

  1. SlyBit

    SlyBit New Member

    Blog Posts:
    0
    Joined:
    Jul 4, 2008
    Messages:
    43
    Доброго времени суток!

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

    x64 New Member

    Blog Posts:
    0
    Joined:
    Jul 29, 2008
    Messages:
    1,370
    Location:
    Россия
    ObReferenceObjectByName(). В качестве типа объекта передать *IoDeviceObjectType (NULL передавать нельзя, это обязательный аргумент). По окончании работы с объектом необходимо вызвать ObDereferenceObject() для него.
     
  3. SlyBit

    SlyBit New Member

    Blog Posts:
    0
    Joined:
    Jul 4, 2008
    Messages:
    43
    x64

    Спасибо!
     
  4. SlyBit

    SlyBit New Member

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

    Code (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

    Blog Posts:
    0
    Joined:
    Jul 4, 2008
    Messages:
    43
    Нашел обсуждение моей проблемы тут: http://www.ntndis.com/forum/viewtopic.php?f=1&t=168&p=610

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

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

    prorok New Member

    Blog Posts:
    0
    Joined:
    Jan 25, 2009
    Messages:
    25
    Я пребераю все дрова и их девайсы.
    все работает.
     
  7. SlyBit

    SlyBit New Member

    Blog Posts:
    0
    Joined:
    Jul 4, 2008
    Messages:
    43
    Да понятно, что это работает. Думал есть экспортируемая функция в ядре. На нет и суда нет.