日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

驱动线程与事件

發布時間:2025/3/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 驱动线程与事件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

創建線程

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, //線程函數_In_opt_ PVOID StartContext //傳入線程的指針);

初始化事件

VOID KeInitializeEvent (_Out_ PRKEVENT Event, //初始化的事件_In_ EVENT_TYPE Type, //事件類型_In_ BOOLEAN State //初始化狀態一般為 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 );

設置事件

LONG KeSetEvent (_Inout_ PRKEVENT Event, //要設置的事件_In_ KPRIORITY Increment, //提示優先權_In_ _Literal_ BOOLEAN Wait //修改狀態 TRUE阻塞那就會執行);

案例

#include<ntddk.h>//定義一個事件 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); }//線程回調 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);}//設置事件(設置后等待那立馬會執行)KeSetEvent(&g_event, 0, TRUE);//結束自身PsTerminateSystemThread(STATUS_SUCCESS); }VOID MyThreadProc() {UNICODE_STRING str = RTL_CONSTANT_STRING(L"Hello");HANDLE hThread = NULL;//初始化事件KeInitializeEvent(&g_event, SynchronizationEvent, FALSE);//創建線程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; }

總結

以上是生活随笔為你收集整理的驱动线程与事件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。