安全的等待線程結束

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章