Доброго времени суток! Мне нужно получить указатель на объект устройства (PDEVICE_OBJECT) по его имени. Если в момент вызова IoGetDeviceObjectPointer() устройство открыто функцией CreateFile() из приложения, то функция падает с кодом 0xC0000022L (STATUS_ACCESS_DENIED). Можно как-нибуть иначе получить этот указатель?
ObReferenceObjectByName(). В качестве типа объекта передать *IoDeviceObjectType (NULL передавать нельзя, это обязательный аргумент). По окончании работы с объектом необходимо вызвать ObDereferenceObject() для него.
ObReferenceObjectByName() с параметром *IoDeviceObjectType для различных девайсов возвращает ошибку 0xC0000024 (STATUS_OBJECT_TYPE_MISMATCH). В то же время, ссылку на объект драйвера (параметр *IoDriverObjectType) получаю нормально. В чем может быть ошибка? Код (Text): NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { NTSTATUS Status = STATUS_SUCCESS; UNICODE_STRING OurDeviceName; PDEVICE_OBJECT pDeviceObject = NULL; DriverObject->DriverUnload = DrvUnload; RtlInitUnicodeString(&OurDeviceName, L"\\Device\\Ndis"); Status = ObReferenceObjectByName(&OurDeviceName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDeviceObjectType, KernelMode, NULL, (PVOID*)&pDeviceObject); if(!NT_SUCCESS(Status)) { return Status; } ObDereferenceObject(pDeviceObject); return Status; } p.s. указатель *IoDeviceObjectType выглядит валидным.
Нашел обсуждение моей проблемы тут: http://www.ntndis.com/forum/viewtopic.php?f=1&t=168&p=610 Выходит ObReferenceObjectByName(*IoDeviceObjectType) никак не заставить работать. Буду реализовывать один из следующих вариантов: Может все же есть более простое решение?