Не пойму почему... Вот код драйвера #include <winnt\ntoskrnl.h> Код (Text): NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { __asm { nop nop nop }; return 0; }; Вот настройки линкера в VC6 Вот настройка компилятора Почему не грузится дров..?
Еще глюк... Если не импортировать ntdll.lib - все прекрасно запускается... что это может быть? глюк? И может ли кто-то выложить тут ntdll.lib ?
пиплы, у меня скоро паника начнется. Нужно импортировать несколько функций из ntdll.dll Когда в линкере прописываю ntdll.lib , драйвер просто отказывается грузится, хотя если те же операции проделать в асме, - никаких сложностей. Все запускается. Блин. В студии в настройках что-то не так. но что?? Под дизасемблером все окей. точка входа тоже указывает на нужное место. Но StartService возвращает ошибку.!!!
Пока будешь линковать юзер-модную либу, твой драйвер не запустится. Убери её, все необходимое есть в ntoskrnl
cresta NtEnumerateKey остутствует в ядре. Есть только Zw. Тогда Как перехватить функцию?? Рекурсия получается... :\
А что по твоему есть NtEnumerateKey ? Всего лишь оболочка для ZwEnumerateKey. Как перехватить? Способов много. Например заменить указатель в таблице KeServiceDescriptorTable, соответствующий ZwEnumerateKey на твой обработчик.
Хм. А как же буффер? Ведь для вызова оригинала прийдется входные данные куда-то копировать, или я не прав..?
ХХХххххххххххххааааааа!!!!!!!!!!!!! Тема закрыта. ЗЫ: cresta Уважуха. Респект и Уважуха. Я на форуме Майкрософт этот же вопрос задал... И там всю неделю никто по сути ответить не мог, гадали, в чем же дело.... Блин ))))) А тут так все просто...
Зачем их копировать? Они пусть лежат себе там, где и лежали - в стеке. Когда из своего обработчика вызываешь настоящую ZwEnumerateKey, запихиваешь эти параметры опять же в стек. На примере ZwOpenFile: Код (Text): NTSTATUS NewZwOpenFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock, ULONG ShareAccess, ULONG OpenOptions){ NTSTATUS Status=STATUS_OBJECT_NAME_NOT_FOUND; PVOID eProcess; if (g_Trusded){ eProcess = IoGetCurrentProcess(); if (g_Trusded == *((ULONG*)((PCHAR)eProcess+g_pidOffset))) goto _call; } if (g_Suspend) goto _call; if (ToHide_1(ObjectAttributes->ObjectName)){ IoStatusBlock->Information = FILE_DOES_NOT_EXIST; *(FileHandle)=0; return Status; } _call: //вот тут входные параметры из стека снова прописываются в стек. //для передачи в оригинальную функцию _asm { push dword ptr [ebp+28] push dword ptr [ebp+24] push dword ptr [ebp+20] push dword ptr [ebp+16] push dword ptr [ebp+12] push dword ptr [ebp+8] call dword ptr [TrueZwOpenFile] mov [Status],eax } return Status; }