Пытаюсь прочитать адрес первого обработчика в IDT Постоянно вылетаю с синим экраном Что не так - подскажите, прямо мистика какая-то Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntifs.inc include \masm32\include\w2k\ntoskrnl.inc includelib \masm32\lib\w2k\ntoskrnl.lib include \masm32\Macros\Strings.mac .data DIDTR STRUCT ;IDTR Limit WORD ? Base DWORD ? DIDTR ENDS idt DIDTR <> .code DriverEntry proc pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING cli sidt idt mov ecx, idt.Base mov ebx,[ecx+4] ; Получаем в EBX старшее и... mov bx, [ecx+0] ; младшее слово адреса обработчика sti invoke DbgPrint, $CTA0("INT - 0: Vector 0x%08X"),ebx mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry endp end DriverEntry
_animaTOR_ Закомментируй "invoke DbgPrint, $CTA0("INT - 0: Vector 0x%08X"),ebx" и посмотри, будет ли bsod.
может быть сделать uses какие-нить регистры, ecx например add: вот только что проверил, без push pop edi bsod
twgt Закомментируй "invoke DbgPrint ... да без этого не падает спасибо. defaultplayer ... да ты прав, надо писать так Код: Код (Text): DriverEntry proc Uses EBX ECX ESI EDI pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING так работает даже с invoke DbgPrint спасибо.
_animaTOR_ cinvoke - значит что стек восстанавливает функция, которая вызывает. В частном случае равносильно Код (Text): invoke DbgPrint, $CTA0("INT - 0: Vector 0x%08X"),ebx add esp,0x08
twgt как Вы отлаживаете код драйвера. Я тут прочитал, что все делается на вирт. машине с подключенным windbg. Вот и я - запускаю на вирт. машине XP в ржиме отладчика - подключаюсь windbg - а у XP - виснет и мышь и клава. так и надо ? а как тогда драйвер запустить на WM? Где вообще почитать про команды этого windbg на русском?
_animaTOR_ У меня на VmWare стоит отладчик Syser. Довольно удобно. Просто выбираю драйвер и жму Load. А windbg не пользовался никогда, но тут на форуме он обсуждался.
twgt У меня работает так Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntifs.inc include \masm32\include\w2k\ntoskrnl.inc includelib \masm32\lib\w2k\ntoskrnl.lib include \masm32\Macros\Strings.mac .data DIDTR STRUCT ;IDTR Limit WORD ? Base DWORD ? DIDTR ENDS IDTENTRY STRUCT LowOffset WORD ? Selector WORD ? Access WORD ? HiOffset WORD ? IDTENTRY ENDS idt DIDTR <> .code DriverEntry proc Uses EBX ECX EDX ESI EDI pDriverObject:PDRIVER_OBJECT, pusRegistryPath:PUNICODE_STRING xor edx,edx xor ecx,ecx cli sidt idt sti mov edx, idt.Base assume edx:ptr IDTENTRY .while cx != 256 cli movzx eax,word ptr [edx].LowOffset movzx ebx,word ptr [edx].HiOffset sti shl ebx, 16 or eax, ebx push ecx push edx invoke DbgPrint, $CTA0("INT - %d: Vector 0x%08X\n"), ecx, eax pop edx pop ecx add edx,8; = sizeof IDTENTRY inc ecx .endw assume edx:nothing mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry endp end DriverEntry
twgt Странно, сам Syser выдал таблицу IDT так как и пример от FourF Пример из "Д.Колесниченко. Руткиты под Windows" ... и этот на asm-е выдают одно и тоже Чувствуется что прав Syser и FourF. Тогда что не так в этом верхнем примере?