В драйвере использую CmRegisterCallback чтобы установить коллбек для операций с реестром. Все проходит нормально, но мне надо узнать имя ключа с которым производится некая операция. Для этого из структуры (например REG_SET_VALUE_KEY_INFORMATION) достаю указатель на объект и пытаюсь получить его имя с помощью фу-ии ObQueryNameString. Вот код: Код (Text): NTSTATUS GetObjectName( PUNICODE_STRING ObjectName, PVOID Object ) { NTSTATUS st = STATUS_SUCCESS; ULONG ReturnLength; UCHAR Buffer[sizeof(OBJECT_NAME_INFORMATION)+(256*sizeof(WCHAR))]; POBJECT_NAME_INFORMATION ObjectNameInfo = (POBJECT_NAME_INFORMATION)Buffer; RtlZeroMemory( &Buffer, sizeof(Buffer) ); st = ObQueryNameString( Object, ObjectNameInfo, sizeof(Buffer), &ReturnLength ); if(!NT_SUCCESS(st)) { DbgPrint("ObQueryNameString failed with status %08x", st); return st; } RtlCopyUnicodeString( ObjectName, &ObjectNameInfo->Name ); return st; } Но ObQueryNameString падает, в дебаге это Код (Text): Access violation - code c0000005 (!!! second chance !!!) nt!CmpCheckRecursionAndRecordThreadInfo+0x25: 806108f9 397208 cmp dword ptr [edx+8],esi В чем может быть проблема?
Nouzui что за вид объекта сам незнаю... вроде как объект для ключа реестра. ObQueryName вызвать тоже можно, т.к. нашел упоминание об этом на одном из забугорных форумах, вроде даже на микрософтовском...
Nouzui вот пост с проблемой http://www.archivum.info/microsoft.public.development.device.drivers/2006-03/msg00489.html, а ответ на него как раз и говорит о том что можно юзать ObQueryNameString. Может есть другое решение как получить имя объекта имея указатель на этот объект
В коде явная ошибка - в бъекте ObjectNameInfo все поля пробиты нулями - причина падения. POBJECT_NAME_INFORMATION просто враппер для объекта типа UNICODE_STRING, поля которого дожны быть соотв. образом проинициализированы перед передачей в ObQueryNameString. Удачи.