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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

win驱动下线程操作相关函数封装

發(fā)布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 win驱动下线程操作相关函数封装 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

線程創(chuàng)建

#include <ntifs.h>KEVENT g_kEvent;VOID DriverUnload(PDRIVER_OBJECT pDriver);VOID ThreadProc(PVOID StartContext) {ULONG uId = (ULONG)PsGetCurrentThreadId();KdPrint(("%wZ,%d\n", StartContext, uId));//執(zhí)行即將結(jié)束,將事件置為激發(fā)態(tài)。KeSetEvent(&g_kEvent, 0, TRUE);//使用內(nèi)核線程的時候,需要注意一點,當(dāng)線程執(zhí)行完畢的時候,必須主動調(diào)用下面//這個函數(shù)PsTerminateSystemThread(STATUS_SUCCESS); }NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pPath) {UNREFERENCED_PARAMETER(pPath);DbgBreakPoint();HANDLE hThread = 0;CLIENT_ID Id = {0};UNICODE_STRING szString;RtlInitUnicodeString(&szString, L"Hello allen");//1 創(chuàng)建一個系統(tǒng)線程,能夠執(zhí)行簡單代碼,并且驗證和主線程不是同一個線程ULONG uId = (ULONG)PsGetCurrentThreadId();KdPrint(("%wZ,Id:%d\n", &szString,uId));// 初始化事件對象KeInitializeEvent(&g_kEvent, SynchronizationEvent, FALSE);PsCreateSystemThread(&hThread,0,NULL,NULL,//這里填寫NULL,說明創(chuàng)建的是內(nèi)核線程&Id,ThreadProc,//回調(diào)函數(shù)&szString);KeWaitForSingleObject(&g_kEvent,Executive,KernelMode,FALSE,0 //再內(nèi)核層的等待函數(shù),0是永久等待);pDriver->DriverUnload = DriverUnload;return STATUS_SUCCESS; }VOID DriverUnload(PDRIVER_OBJECT pDriver) {UNREFERENCED_PARAMETER(pDriver);}

遍歷線程

#include <ntifs.h> // 根據(jù)TID返回線程ETHREAD,失敗返回NULL PETHREAD LookupThread(HANDLE hTid) {PETHREAD pEThread = NULL;if (NT_SUCCESS(PsLookupThreadByThreadId(hTid,&pEThread)))return pEThread;return NULL; } VOID EnumThread(PEPROCESS pEProcess //要枚舉的是哪一個進程的線程 ) {PEPROCESS pEProc = NULL;PETHREAD pEThrd = NULL;// 循環(huán)遍歷線程(假設(shè)線程的最大值不超過0x25600)ULONG i = 0;for (i = 4; i < 0x25600; i += 4) {// a. 根據(jù)TID返回ETHREADpEThrd = LookupThread((HANDLE)i);if (!pEThrd) continue;// b. 獲得線程所屬進程,如果相等則打印線程信息pEProc = IoThreadToProcess(pEThrd);if (pEProc == pEProcess) {DbgPrint("[THREAD]ETHREAD=%p TID=%ld\n",pEThrd, (ULONG)PsGetThreadId(pEThrd));}// c. 將線程對象引用計數(shù)減1ObDereferenceObject(pEThrd);} }

結(jié)束線程等

#include <ntifs.h> NTSTATUS ZwOpenThread(_Out_ PHANDLE ThreadHandle,_In_ ACCESS_MASK DesiredAccess,_In_ POBJECT_ATTRIBUTES ObjectAttributes,_In_ PCLIENT_ID ClientId); typedef NTSTATUS(__fastcall *ZWTERMINATETHREAD)(HANDLE hThread,ULONG uExitCode); //結(jié)束線程,暫停線程,恢復(fù)線程,這些函數(shù)沒有導(dǎo)出, //就得自己去找 可以先找到它 然后計算他的偏移就可以用代碼實現(xiàn) ZWTERMINATETHREAD ZwTerminateThread = 0x83e79afc; //函數(shù)地址,是自己找到的,沒有導(dǎo)出 void KernelKillThread(ULONG tID) {HANDLE hThread = NULL;CLIENT_ID ClientId = { 0 };OBJECT_ATTRIBUTES objAttribut ={ sizeof(OBJECT_ATTRIBUTES) };ClientId.UniqueProcess = 0;ClientId.UniqueThread = (HANDLE)tID; // TID //打開線程,如果句柄有效,則結(jié)束線程ZwOpenThread(&hThread, 1, &objAttribut, &ClientId);if (hThread) {ZwTerminateThread(hThread, 0);ZwClose(hThread);} }

轉(zhuǎn)載于:https://blog.51cto.com/haidragon/2131747

總結(jié)

以上是生活随笔為你收集整理的win驱动下线程操作相关函数封装的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。