win驱动下线程操作相关函数封装
生活随笔
收集整理的這篇文章主要介紹了
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中类型最佳判断方法
- 下一篇: 迅速解决!!!!!启动Tomcat报错P