Вот простенький код - Код (Text): #include <ntddk.h> typedef NTSTATUS __stdcall _NtQueryPerformanceCounter(PLARGE_INTEGER, PLARGE_INTEGER); _NtQueryPerformanceCounter *pNtQueryPerformanceCounter = NULL; VOID OnUnload(IN PDRIVER_OBJECT pDriverObject) { DbgPrint("Driver unloaded..."); } NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegPath) { LARGE_INTEGER freq, count; pNtQueryPerformanceCounter = (_NtQueryPerformanceCounter *)0x7c90e102; //хардкорнутый адрес NtQueryPerformanceCounter pNtQueryPerformanceCounter(&count, &freq); DbgPrint("freq - %x, count - %x\n", freq.LowPart, count.LowPart); pDriverObject->DriverUnload = OnUnload; return STATUS_SUCCESS; } При старте дрова получаю BSOD 0x000000E9, то бишь, как понял, прекращение рабочего потока без его надлежащего завершения вот анализ крашдампа Код (Text): 0: kd> !analyzebugcheck -v ACTIVE_EX_WORKER_THREAD_TERMINATION (e9) An executive worker thread is being terminated without having gone through the worker thread rundown code. A stack trace should indicate the cause. Arguments: Arg1: 823c6b30, The exiting ETHREAD. Arg2: 00000000 Arg3: 00000000 Arg4: 00000000 Debugging Details: ------------------ DEFAULT_BUCKET_ID: DRIVER_FAULT BUGCHECK_STR: E9 LAST_CONTROL_TRANSFER: from 805d0f13 to 804f9c37 STACK_TEXT: f88c47d4 805d0f13 000000e9 823c6b30 00000000 nt!PspReaper+0x25 f88c486c 805d109a c0000005 823c6b30 00000000 nt!ObCreateObjectType+0x6cc f88c488c 805d1275 823c6b30 c0000005 f88c48c8 nt!ArbBootAllocation+0x87 f88c48b8 8054060c 00000000 c0000005 f88c4cf4 nt!PiProcessAddBootDevices+0x26 f88c48c8 805004c5 badb0d00 f88c4940 ffff0000 nt!RtlIpv4StringToAddressA+0xfd f88c4cf4 80541075 f88c4d10 00000000 f88c4d64 nt!MiLockCode+0xa f88c4d64 7c90eb94 badb0d00 7c90eb94 823c6b30 nt!RtlRandomEx+0x2a f88c4d54 f88c4c78 00000001 80541026 f88c4d54 0x7c90eb94 f88c4d54 f88c4c78 00000001 80541026 f88c4d54 0xf88c4c78 00000000 00000000 00000000 00000000 00000000 0xf88c4c78 FOLLOWUP_IP: nt!PspReaper+25 804f9c37 5d pop ebp FOLLOWUP_NAME: MachineOwner SYMBOL_NAME: nt!PspReaper+25 MODULE_NAME: nt IMAGE_NAME: ntoskrnl STACK_COMMAND: kb BUCKET_ID: 0xE9_nt!PspReaper+25 Followup: MachineOwner Что не так?
у KeQueryPerformanceCounter другие параметры - число тиков возвращается в качестве результата, а не через параметр.
7c90e102 - адрес юзермодного пространства, нехер туда из дрова прыгать... более того это адрес нтдллной заглушки, которайа должна занести разных пораметров и вызвать sysenter... даже есле до этого сисэнтора дойдед (что врятле), то все равно буит GP, патаму что сисентор расчитон для перехода из ринг3 в ринг0... и даж есле сисентор пройдет нормально, то сисекзет вернет управление на код, адрес которого указон в мср регистрог
Freemanвообще речь идет о вызове тех функций, которых нет в эскпортах ядра. За основу вязл код Нэббета, когда речь идет о динамической привязке ntdll.dll к ядру и вызову оттуда необходимых функций. Что я сделал: 1) нахожу base ntdll.dll через ZwQuerySystemInformation(SystemModuleInformation, ...) 2) анализирую таблицу экспорта ntdll.dll на предмет поиска адреса необходимой мне функции, которую нужно вызвать. 3) вышеуказанным путем (как в первом посту) через хардкорнутый адрес вызываю фукнцию. На форуме уже проскакивали подобные примеры - http://wasm.ru/forum/viewtopic.php?id=16630