【发布时间】:2018-08-03 20:44:28
【问题描述】:
我有一个用于某些操作的线程,它需要处于活动状态,直到标志另有说明。
我使用PsCreateSystemThread 创建线程,然后使用ObReferenceObjectByHandle 获取ETHREAD 对象引用,以在使用KeWaitForSingleObject 卸载驱动程序之前等待线程终止。
创建线程并检索对它的引用的函数:
ntStatus = PsCreateSystemThread(
&hThread,
(ACCESS_MASK)0, NULL,
(HANDLE)0, NULL,
ThreadRoutine,
(PVOID)pThreadData
);
if (!NT_SUCCESS(ntStatus))
{
return ntStatus;
}
ntStatus = ObReferenceObjectByHandle(
hThread,
THREAD_ALL_ACCESS,
NULL,
KernelMode,
(PVOID*)&ptThreadObject,
NULL
);
if (!NT_SUCCESS(ntStatus))
{
bStopThread = TRUE;
ptThreadObject = NULL;
return ntStatus;
}
线程例程:
LARGE_INTEGER liSleepTime;
while (FALSE == bThread)
{
liSleepTime.QuadPart = 1000 * RELATIVE_MILLISECOND;
KeDelayExecutionThread(KernelMode, FALSE, (&liSleepTime));
ExAcquireFastMutex(&fmMutex);
//DO SOMTHING
ExReleaseFastMutex(&fmMutex);
}
PsTerminateSystemThread(STATUS_SUCCESS);
卸载驱动函数:
if (NULL != ptThreadObject)
{
bStopThread = TRUE;
KeWaitForSingleObject(
(PVOID)ptThreadObject,
Executive,
KernelMode,
FALSE,
(&liTimeOut));
ObDereferenceObject((PVOID)ptThreadObject);
ptThreadObject= NULL;
}
我需要这个线程一直运行。
有没有办法检查线程是否提前终止?(如果它是由PsTerminateSystemThread 完成的,我可以在调用 PsTerminateSystemThread 终止线程之前添加一个“布尔值”并设置它) .
还有一个问题:
我在例程开始时终止了线程,并在调用 ObReferenceObjectByHandle 之前等待了 20 秒,但它没有失败。
ntStatus = PsCreateSystemThread(
&hThread,
(ACCESS_MASK)0, NULL,
(HANDLE)0, NULL,
ThreadRoutine,
(PVOID)pThreadData
);
if (!NT_SUCCESS(ntStatus))
{
return ntStatus;
}
// The ThreadRoutine calling PsTerminateSystemThread first and terminate.
liSleepTime.QuadPart = 20000 * RELATIVE_MILLISECOND;
KeDelayExecutionThread(KernelMode, FALSE, (&liSleepTime));
ntStatus = ObReferenceObjectByHandle(
hThread,
THREAD_ALL_ACCESS,
NULL,
KernelMode,
(PVOID*)&ptThreadObject,
NULL
);
if (!NT_SUCCESS(ntStatus))
{
bStopThread = TRUE;
ptThreadObject = NULL;
return ntStatus;
}
为什么 ObReferenceObjectByHandle 成功而不失败? - 线程早就没了。
谢谢。
【问题讨论】:
标签: c windows multithreading driver windows-kernel