win驱动下线程操作相关函数封装
生活随笔
收集整理的這篇文章主要介紹了
win驱动下线程操作相关函数封装
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
線程創建
#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));//執行即將結束,將事件置為激發態。KeSetEvent(&g_kEvent, 0, TRUE);//使用內核線程的時候,需要注意一點,當線程執行完畢的時候,必須主動調用下面//這個函數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 創建一個系統線程,能夠執行簡單代碼,并且驗證和主線程不是同一個線程ULONG uId = (ULONG)PsGetCurrentThreadId();KdPrint(("%wZ,Id:%d\n", &szString,uId));// 初始化事件對象KeInitializeEvent(&g_kEvent, SynchronizationEvent, FALSE);PsCreateSystemThread(&hThread,0,NULL,NULL,//這里填寫NULL,說明創建的是內核線程&Id,ThreadProc,//回調函數&szString);KeWaitForSingleObject(&g_kEvent,Executive,KernelMode,FALSE,0 //再內核層的等待函數,0是永久等待);pDriver->DriverUnload = DriverUnload;return STATUS_SUCCESS; }VOID DriverUnload(PDRIVER_OBJECT pDriver) {UNREFERENCED_PARAMETER(pDriver);}遍歷線程
#include <ntifs.h> // 根據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;// 循環遍歷線程(假設線程的最大值不超過0x25600)ULONG i = 0;for (i = 4; i < 0x25600; i += 4) {// a. 根據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. 將線程對象引用計數減1ObDereferenceObject(pEThrd);} }結束線程等
#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); //結束線程,暫停線程,恢復線程,這些函數沒有導出, //就得自己去找 可以先找到它 然后計算他的偏移就可以用代碼實現 ZWTERMINATETHREAD ZwTerminateThread = 0x83e79afc; //函數地址,是自己找到的,沒有導出 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 //打開線程,如果句柄有效,則結束線程ZwOpenThread(&hThread, 1, &objAttribut, &ClientId);if (hThread) {ZwTerminateThread(hThread, 0);ZwClose(hThread);} }轉載于:https://blog.51cto.com/haidragon/2131747
總結
以上是生活随笔為你收集整理的win驱动下线程操作相关函数封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python中类型最佳判断方法
- 下一篇: 迅速解决!!!!!启动Tomcat报错P