您的位置:首页 > 其它

安全的等待线程结束

2016-07-15 09:48 218 查看
#include <ntifs.h>

//卸载函数
VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject);
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath);
VOID Test(void);
BOOLEAN bIsRunThread = FALSE;
HANDLE hThread = NULL;
PETHREAD pThread = NULL;

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{

pDriverObject->DriverUnload = HelloDDKUnload;
DbgBreakPoint();
Test();
return STATUS_SUCCESS;
}

//卸载函数
VOID HelloDDKUnload(IN PDRIVER_OBJECT pDriverObject)
{
bIsRunThread = FALSE;
KeWaitForSingleObject(pThread, Executive, KernelMode, FALSE, NULL);
ObDereferenceObject(pThread);
return;
}

VOID MyProcessThread(IN PVOID  StartContext)
{
LARGE_INTEGER liSleep;
liSleep.QuadPart = -10 * 1000 * 1000;

while (bIsRunThread)
{
KeDelayExecutionThread(KernelMode, FALSE, &liSleep);
KdPrint(("线程执行中.....\n"));
}
//结束线程
PsTerminateSystemThread(STATUS_SUCCESS);
return;
}
VOID Test(void)
{
bIsRunThread = TRUE;
OBJECT_ATTRIBUTES ObjectAttributes;
InitializeObjectAttributes(&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
CLIENT_ID cid;

//创建线程
PsCreateSystemThread(&hThread, 0L, &ObjectAttributes, NULL, &cid,MyProcessThread, NULL);
PsLookupThreadByThreadId(cid.UniqueThread, &pThread);
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: