Почитав первые статьи из цикла "Драйверы режима ядра" (http://wasm.ru/series.php?sid=9), решил попровать сделать что-нибудь сам. Так вот, мой драйвер не пищит, а просто остаётся висеть в системе. Подскажите, пожалуйста, где ошибка. Спасибо. Код (Text): ;@echo off ;goto make .586 .MODEL flat, stdcall option casemap: none include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc ;include \masm32\include\w2k\ntdef.inc includelib wdm.lib KeDelayExecutionThread PROTO STDCALL :KPROCESSOR_MODE, :BOOLEAN, :PLARGE_INTEGER SPINLOCK_FREE EQU 0 SPINLOCK_BUSY EQU 1 TIMER_FREQUENCY = 1193167 c1 EQU 130 d1 EQU 147 e1 EQU 165 f1 EQU 175 g1 EQU 197 a1 EQU 220 b1 EQU 247 c2 EQU 262 d2 EQU 294 e2 EQU 330 .code MakeBeepE PROC Tone: DWORD LOCAL Spinlock: BYTE lea edi, Spinlock mov edx, SPINLOCK_BUSY cli wait_cycle: lock xchg [edi], edx cmp edx, SPINLOCK_FREE jne wait_cycle mov al, 0B6h out 43h, al mov eax, Tone out 42h, al mov al, ah out 42h, al in al, 61h or al, 3 out 61h, al mov DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart, ebx mov DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart + 4 , 0 invoke KeDelayExecutionThread, KernelMode, FALSE, esi in al, 61h and al, 0FCh out 61h, al lea edi, Spinlock mov edx, SPINLOCK_FREE lock xchg [edi], edx sti ret MakeBeepE ENDP DriverEntry PROC pDriverObject: PDRIVER_OBJECT, pusRegistryPath: PUNICODE_STRING LOCAL DelayTime: LARGE_INTEGER lea esi, DelayTime mov ebx, 10000*250 invoke MakeBeepE, (TIMER_FREQUENCY / g1) mov ebx, 10000*750 invoke MakeBeepE, (TIMER_FREQUENCY / c2) mov ebx, 10000*500 invoke MakeBeepE, (TIMER_FREQUENCY / g1) mov ebx, 10000*250 invoke MakeBeepE, (TIMER_FREQUENCY / a1) mov ebx, 10000*750 invoke MakeBeepE, (TIMER_FREQUENCY / b1) mov ebx, 10000*500 invoke MakeBeepE, (TIMER_FREQUENCY / e1) mov ebx, 10000*250 invoke MakeBeepE, (TIMER_FREQUENCY / c1) mov ebx, 10000*750 invoke MakeBeepE, (TIMER_FREQUENCY / a1) mov ebx, 10000*500 invoke MakeBeepE, (TIMER_FREQUENCY / g1) mov ebx, 10000*250 invoke MakeBeepE, (TIMER_FREQUENCY / f1) mov ebx, 10000*750 invoke MakeBeepE, (TIMER_FREQUENCY / g1) mov ebx, 10000*500 invoke MakeBeepE, (TIMER_FREQUENCY / c1) mov DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart, 50*10000 mov DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart + 4 , 0 invoke KeDelayExecutionThread, KernelMode, FALSE, ADDR DelayTime mov ebx, 10000*375 invoke MakeBeepE, (TIMER_FREQUENCY / c1) mov ebx, 10000*750 invoke MakeBeepE, (TIMER_FREQUENCY / d1) mov ebx, 10000*375 invoke MakeBeepE, (TIMER_FREQUENCY / d1) mov ebx, 10000*375 invoke MakeBeepE, (TIMER_FREQUENCY / c1) mov ebx, 10000*750 invoke MakeBeepE, (TIMER_FREQUENCY / f1) mov ebx, 10000*375 invoke MakeBeepE, (TIMER_FREQUENCY / f1) mov ebx, 10000*375 invoke MakeBeepE, (TIMER_FREQUENCY / g1) mov ebx, 10000*750 invoke MakeBeepE, (TIMER_FREQUENCY / a1) mov ebx, 10000*375 invoke MakeBeepE, (TIMER_FREQUENCY / b1) mov ebx, 10000*375 invoke MakeBeepE, (TIMER_FREQUENCY / c2) mov ebx, 10000*1000 invoke MakeBeepE, (TIMER_FREQUENCY / d2) mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry ENDP END DriverEntry :make J:\masm32\bin\ml.exe /c /coff drv.bat J:\masm32\bin\link.exe /driver /base:0x10000 /align:32 /out:drv.sys /subsystem:native drv.obj pause
Ну хорошо, написал так: Код (Text): wait_cycle: lock xchg [edi], edx cmp edx, SPINLOCK_BUSY je wait_cycle Теперь показывается BSOD. Кстати, ещё подправил: Код (Text): cli mov DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart, ebx mov DWORD PTR (LARGE_INTEGER PTR [esi]).QuadPart + 4 , 0 invoke KeDelayExecutionThread, KernelMode, FALSE, esi sti Но это тоже не помогло.
Извините, что так долго меня не было. Переписал код, запустил под VMware (в вирт. системе 1 процессор), посмотрел отладчиком. Новый код: Код (Text): ;@echo off ;goto make .586p .MODEL flat, stdcall option casemap: none include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\include\w2k\ntoskrnl.inc ;include \masm32\include\w2k\ntdef.inc includelib wdm.lib ;KeDelayExecutionThread PROTO STDCALL :KPROCESSOR_MODE, :BOOLEAN, :PLARGE_INTEGER TIMER_FREQUENCY = 1193167 c1 EQU 130 d1 EQU 147 e1 EQU 165 f1 EQU 175 g1 EQU 197 a1 EQU 220 b1 EQU 247 c2 EQU 262 d2 EQU 294 e2 EQU 330 .code DelayTime: dd ? dd 0 MakeBeepE PROC cli mov al, 0B6h out 43h, al mov eax, edx out 42h, al mov al, ah out 42h, al in al, 61h or al, 3 out 61h, al sti push esi mov DWORD PTR [esi], ebx invoke KeDelayExecutionThread, KernelMode, FALSE, esi pop esi cli in al, 61h and al, 0FCh out 61h, al sti ret MakeBeepE ENDP DriverEntry PROC pDriverObject: PDRIVER_OBJECT, pusRegistryPath: PUNICODE_STRING invoke DbgBreakPoint lea esi, DelayTime mov ebx, 10000*250 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / c2) invoke MakeBeepE mov ebx, 10000*500 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*250 mov edx, (TIMER_FREQUENCY / a1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / b1) invoke MakeBeepE mov ebx, 10000*500 mov edx, (TIMER_FREQUENCY / e1) invoke MakeBeepE mov ebx, 10000*250 mov edx, (TIMER_FREQUENCY / c1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / a1) invoke MakeBeepE mov ebx, 10000*500 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*250 mov edx, (TIMER_FREQUENCY / f1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*500 mov edx, (TIMER_FREQUENCY / c1) invoke MakeBeepE mov DWORD PTR [DelayTime], 50*10000 invoke KeDelayExecutionThread, KernelMode, FALSE, OFFSET DelayTime mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / c1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / d1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / d1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / c1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / f1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / f1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / a1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / b1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / c2) invoke MakeBeepE mov ebx, 10000*1000 mov edx, (TIMER_FREQUENCY / d2) invoke MakeBeepE mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry ENDP END DriverEntry :make \masm32\bin\ml.exe /c /coff xxxx.bat \masm32\bin\link.exe /driver /base:0x10000 /align:32 /out:xxxx.sys /subsystem:native xxxx.obj pause Отладчик показал, что ошибка возникла при выгрузке драйвера по адресу nt!IopLoadDriver+0x68c. Из-за чего это?
Переписал по-нормальному (раньше не хотел собираться с сегментом данных): Код (Text): ;@echo off ;goto make .586p .MODEL flat, stdcall option casemap: none include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\include\w2k\ntoskrnl.inc ;include \masm32\include\w2k\ntdef.inc includelib wdm.lib ;KeDelayExecutionThread PROTO STDCALL :KPROCESSOR_MODE, :BOOLEAN, :PLARGE_INTEGER TIMER_FREQUENCY = 1193167 c1 EQU 130 d1 EQU 147 e1 EQU 165 f1 EQU 175 g1 EQU 197 a1 EQU 220 b1 EQU 247 c2 EQU 262 d2 EQU 294 e2 EQU 330 .data DelayTime DD ? DD ? .code MakeBeepE PROC cli mov al, 0B6h out 43h, al mov eax, edx out 42h, al mov al, ah out 42h, al in al, 61h or al, 3 out 61h, al sti mov esi, OFFSET DelayTime mov DWORD PTR [esi], ebx mov DWORD PTR [esi+4], 0 invoke KeDelayExecutionThread, KernelMode, FALSE, esi cli in al, 61h and al, 0FCh out 61h, al sti ret MakeBeepE ENDP DriverEntry PROC pDriverObject: PDRIVER_OBJECT, pusRegistryPath: PUNICODE_STRING invoke DbgBreakPoint pushad xor esi, esi mov ebx, 10000*250 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / c2) invoke MakeBeepE mov ebx, 10000*500 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*250 mov edx, (TIMER_FREQUENCY / a1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / b1) invoke MakeBeepE mov ebx, 10000*500 mov edx, (TIMER_FREQUENCY / e1) invoke MakeBeepE mov ebx, 10000*250 mov edx, (TIMER_FREQUENCY / c1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / a1) invoke MakeBeepE mov ebx, 10000*500 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*250 mov edx, (TIMER_FREQUENCY / f1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*500 mov edx, (TIMER_FREQUENCY / c1) invoke MakeBeepE mov esi, OFFSET DelayTime mov DWORD PTR [esi], 50*10000 mov DWORD PTR [esi+4], 0 invoke KeDelayExecutionThread, KernelMode, FALSE, esi mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / c1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / d1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / d1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / c1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / f1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / f1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / g1) invoke MakeBeepE mov ebx, 10000*750 mov edx, (TIMER_FREQUENCY / a1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / b1) invoke MakeBeepE mov ebx, 10000*375 mov edx, (TIMER_FREQUENCY / c2) invoke MakeBeepE mov ebx, 10000*1000 mov edx, (TIMER_FREQUENCY / d2) invoke MakeBeepE popad mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry ENDP END DriverEntry :make \masm32\bin\ml.exe /c /coff xxxxx.bat \masm32\bin\link.exe /driver /base:0x10000 /align:32 /out:xxxxx.sys /subsystem:native xxxxx.obj pause В отладчике работает, в нормальных условиях нет - не работает задержка KeDelayExecutionThread. Подскажите, в чём дело?
n0name, благодарю. Странно вообще, что интервал - число отрицательное. Когда читал про KeDelayExecutionThread даже не обратил внимания. Вот окончательный вариант: Код (Text): ;@echo off ;goto make .586p .MODEL flat, stdcall option casemap: none include \masm32\include\w2k\ntstatus.inc include \masm32\include\w2k\ntddk.inc include \masm32\include\w2k\ntoskrnl.inc includelib wdm.lib TIMER_FREQUENCY = 1193167 c1 EQU 130 d1 EQU 147 e1 EQU 165 f1 EQU 175 g1 EQU 197 a1 EQU 220 b1 EQU 247 c2 EQU 262 d2 EQU 294 e2 EQU 330 MakeBeepX MACRO tone, duration cli mov al, 0B6h out 43h, al mov eax, (TIMER_FREQUENCY / tone) out 42h, al mov al, ah out 42h, al in al, 61h or al, 3 out 61h, al sti mov DWORD PTR [esi], -10000*duration invoke KeDelayExecutionThread, KernelMode, FALSE, esi cli in al, 61h and al, 0FCh out 61h, al sti ENDM .data DelayTime DD ? DD ? .code DriverEntry PROC pDriverObject: PDRIVER_OBJECT, pusRegistryPath: PUNICODE_STRING pushad mov esi, OFFSET DelayTime mov DWORD PTR [esi+4], -1 MakeBeepX g1, 250 MakeBeepX c2, 750 MakeBeepX g1, 500 MakeBeepX a1, 250 MakeBeepX b1, 750 MakeBeepX e1, 500 MakeBeepX c1, 250 MakeBeepX a1, 750 MakeBeepX g1, 500 MakeBeepX f1, 250 MakeBeepX g1, 750 MakeBeepX c1, 500 mov DWORD PTR [esi], -50*10000 invoke KeDelayExecutionThread, KernelMode, FALSE, esi MakeBeepX c1, 375 MakeBeepX d1, 750 MakeBeepX d1, 375 MakeBeepX c1, 375 MakeBeepX f1, 750 MakeBeepX f1, 375 MakeBeepX g1, 375 MakeBeepX a1, 750 MakeBeepX b1, 375 MakeBeepX c2, 375 MakeBeepX d2, 1000 popad mov eax, STATUS_DEVICE_CONFIGURATION_ERROR ret DriverEntry ENDP END DriverEntry :make \masm32\bin\ml.exe /c /coff xxxxx.bat \masm32\bin\link.exe /driver /base:0x10000 /align:32 /out:xxxxx.sys /subsystem:native xxxxx.obj pause