驱动线程与事件
創(chuàng)建線程
NTSTATUS PsCreateSystemThread (_Out_ PHANDLE ThreadHandle, //句柄指針_In_ ULONG DesiredAccess, //0_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes //NULL_In_opt_ HANDLE ProcessHandle, //NULL_Out_opt_ PCLIENT_ID ClientId, //NULL_In_ PKSTART_ROUTINE StartRoutine, //線程函數(shù)_In_opt_ PVOID StartContext //傳入線程的指針);初始化事件
VOID KeInitializeEvent (_Out_ PRKEVENT Event, //初始化的事件_In_ EVENT_TYPE Type, //事件類(lèi)型_In_ BOOLEAN State //初始化狀態(tài)一般為 FALSE);//等待事件(阻塞)
NTSTATUS KeWaitForSingleObject(_In_ PVOID Object, //事件_In_ KWAIT_REASON WaitReason, //Executive_In_ KPROCESSOR_MODE WaitMode, //KernelMode_In_ BOOLEAN Alertable, //0_In_opt_ PLARGE_INTEGER Timeout //0 );設(shè)置事件
LONG KeSetEvent (_Inout_ PRKEVENT Event, //要設(shè)置的事件_In_ KPRIORITY Increment, //提示優(yōu)先權(quán)_In_ _Literal_ BOOLEAN Wait //修改狀態(tài) TRUE阻塞那就會(huì)執(zhí)行);案例
#include<ntddk.h>//定義一個(gè)事件 static KEVENT g_event;VOID Sleep(LONG msec) {LARGE_INTEGER My_interval;My_interval.QuadPart = (-10 * 1000);My_interval.QuadPart *= msec;KeDelayExecutionThread(KernelMode, 0, &My_interval); }//線程回調(diào) VOID ThreadProc(PVOID context) {PUNICODE_STRING str = (PUNICODE_STRING)context;for (size_t i = 0; i < 10; i++){KdPrint(("%wZ %d\n", str, i));Sleep(1000);}//設(shè)置事件(設(shè)置后等待那立馬會(huì)執(zhí)行)KeSetEvent(&g_event, 0, TRUE);//結(jié)束自身PsTerminateSystemThread(STATUS_SUCCESS); }VOID MyThreadProc() {UNICODE_STRING str = RTL_CONSTANT_STRING(L"Hello");HANDLE hThread = NULL;//初始化事件KeInitializeEvent(&g_event, SynchronizationEvent, FALSE);//創(chuàng)建線程NTSTATUS status = PsCreateSystemThread(&hThread, 0, NULL, NULL, NULL, (PKSTART_ROUTINE)ThreadProc, (PVOID)&str);if (!NT_SUCCESS(status)){KdPrint(("CreateThread error!\n"));if (hThread != NULL)ZwClose(hThread);return;}ZwClose(hThread);//等待事件(阻塞)KeWaitForSingleObject(&g_event, Executive, KernelMode, 0, 0);//等待KdPrint(("完畢\n"));}//卸載 VOID MyUnload(PDRIVER_OBJECT pDriverObject) {}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pUnicodeString) {MyThreadProc();pDriverObject->DriverUnload = MyUnload;return STATUS_SUCCESS; }總結(jié)