- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个线程用于某些操作,它需要保持事件状态,直到标志另有说明为止。
我用 PsCreateSystemThread创建线程,然后使用 ObReferenceObjectByHandle获取 ETHREAD在使用 KeWaitForSingleObject 卸载驱动程序之前等待线程终止的对象引用.
The function that creates the thread and retrieves a reference to it:
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;
}
The thread routine:
LARGE_INTEGER liSleepTime;
while (FALSE == bThread)
{
liSleepTime.QuadPart = 1000 * RELATIVE_MILLISECOND;
KeDelayExecutionThread(KernelMode, FALSE, (&liSleepTime));
ExAcquireFastMutex(&fmMutex);
//DO SOMTHING
ExReleaseFastMutex(&fmMutex);
}
PsTerminateSystemThread(STATUS_SUCCESS);
The unload driver function:
if (NULL != ptThreadObject)
{
bStopThread = TRUE;
KeWaitForSingleObject(
(PVOID)ptThreadObject,
Executive,
KernelMode,
FALSE,
(&liTimeOut));
ObDereferenceObject((PVOID)ptThreadObject);
ptThreadObject= NULL;
}
One more question:
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;
}
最佳答案
Why does
ObReferenceObjectByHandle
succeed and not fail? -The thread is long gone.
ObReferenceObjectByHandle
只需 return 返回指向对象主体的相应指针。
ETHREAD
在你的情况下。对象的状态 - 在这里不发挥任何作用。终止线程与否绝对无关。直到您拥有指向线程主体结构的句柄或引用指针 (
ETHREAD
) - 该对象将不会被释放。所以,如果
hThread
是有效的句柄 -
ObReferenceObjectByHandle
必须成功。
How to determine if thread terminated?
KeWaitForSingleObject
,你已经完成了。因为线程对象本身是一种调度程序对象,当线程终止时,它设置为信号状态和
KeWaitForSingleObject
返回。
if (ptThreadObject)
{
bStopThread = TRUE;
KeWaitForSingleObject(
ptThreadObject,
Executive,
KernelMode,
FALSE,
0);
ObDereferenceObject(ptThreadObject);
}
ptThreadObject
至
PVOID
- 它已经是指针。
(PVOID)ptThreadObject
不是错误,而是多余和不必要的代码。
Is there a way to check if the thread is terminated prematurely?
PsTerminateSystemThread
设置不同的线程退出状态然后(在线程终止后)通过
PsGetThreadExitStatus
获得此存在状态.如果线程仍在运行
PsGetThreadExitStatus
返回
STATUS_PENDING
.这个例程也可以部分用于检查线程状态 - 如果它返回任何不同于
STATUS_PENDING
的状态- 线程终止。但如果它返回
STATUS_PENDING
- 不清楚 - 或线程仍在运行,或线程存在通过
PsTerminateSystemThread(STATUS_PENDING)
.当然使用
STATUS_PENDING
因为存在状态是个坏主意,永远不要使用。在这种情况下,您可以使用
PsGetThreadExitStatus
确定线程状态(运行/终止)也是,不过这个套路不等。但您的驱动程序逻辑需要
等待 当线程终止时,只有在此之后我们才能卸载驱动程序。所以只有
KeWaitForSingleObject
(或其他等待功能)是正确的解决方案。如果线程可以以不同的方式存在 - 在调用中使用不同的退出状态
PsTerminateSystemThread
并通过
PsGetThreadExitStatus
取回线程终止后(所以在
KeWaitForSingleObject
之后)
PsTerminateSystemThread
是可选的 - 您可以简单地从
ThreadRoutine
返回- 在这种情况下,系统自己拨打
PsTerminateSystemThread(STATUS_SUCCESS);
- 所以在你的代码中调用
PsTerminateSystemThread(STATUS_SUCCESS);
还有多余的和不必要的代码。您需要拨打
PsTerminateSystemThread
仅当您希望退货状态与
STATUS_SUCCESS
不同时和
检查 线程终止后返回状态。请注意,Windows 本身不会解释和使用线程退出状态。它只是将它存储在
ETHREAD
目的。如果您不查询和使用此状态 - 它的退出状态无关紧要。
liSleepTime.QuadPart = 1000 * RELATIVE_MILLISECOND;
如果您使用
,您可以从循环中退出 - 在循环之前设置常数 暂停。
PDRIVER_OBJECT gDriverObject;
DriverEntry
初始化它:
gDriverObject = DriverObject;
ObfReferenceObject(gDriverObject);
NTSTATUS status = PsCreateSystemThread(
&hThread,
0, NULL,
0, NULL,
ThreadRoutine,
pThreadData
);
if (!NT_SUCCESS(status))
{
ObfDereferenceObject(gDriverObject);
}
ObfDereferenceObject(gDriverObject);
.但在
ObfDereferenceObject(gDriverObject);
之后我们已经无法返回驱动程序代码 - 它可以已经卸载。所以这个调用不能从 c/c++ 代码中完成。在用户模式存在
FreeLibraryAndExitThread
,但在内核模式下没有这个 api 的模拟。唯一的解决方案——在 asm 代码中实现线程入口点——这个入口调用 c/c++ 线程例程,最后
jmp (但不是
拨打 )到
ObfDereferenceObject
.
void NTAPI _ThreadRoutine(PVOID pv)
{
// not call PsTerminateSystemThread here !!
}
ml64 /c /Cp $(InputFileName) -> $(InputName).obj
)
extern _ThreadRoutine : PROC
extern gDriverObject : QWORD
extern __imp_ObfDereferenceObject : QWORD
_TEXT segment 'CODE'
ThreadRoutine proc
sub rsp,28h
call _ThreadRoutine
add rsp,28h
mov rcx,gDriverObject
jmp __imp_ObfDereferenceObject
ThreadRoutine endp
_TEXT ENDS
end
ml /c /Cp $(InputFileName) -> $(InputName).obj
)
.686
extern _gDriverObject:DWORD
extern __imp_@ObfDereferenceObject@4:DWORD
extern __ThreadRoutine : PROC
_TEXT SEGMENT
_ThreadRoutine proc
mov eax,[esp]
xchg eax,[esp+4]
mov [esp],eax
call __ThreadRoutine
mov ecx,_gDriverObject
jmp __imp_@ObfDereferenceObject@4
_ThreadRoutine endp
_TEXT ENDS
END
bStopThread = TRUE;
)并从驱动程序卸载返回。
关于c - Windows 内核驱动程序 : How to determine if thread terminated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48953855/
我正在尝试为基于 arm 的板交叉编译驱动程序。在 make 文件中,包含文件的搜索路径是主机内核的路径,即它指向 ubuntu 附带的 linux 头文件。我在主机系统(i7/ubuntu)上也有目
1、准备材料 开发板(正点原子stm32f407探索者开发板V2.4) 。 STM32CubeMX软件(Version 6.10.0) 。 野火DAP仿真器 。 keil µVis
是否可以通过 c# 应用程序“驱动”excel(即从 excel gui 下拉列表中选择某些内容,按下按钮并读取特定单元格的内容)? 这并不是真正用于测试,而是用于类似于 selenium 的数据报废
给定任何具有超过 5 个 View 和 View 模型的中间 MVVM 应用程序,是否有任何推荐的设计模式来说明如何为此类应用程序搭建脚手架? 现在我通常有一个在 App.OnStartup 中创建的
我想知道如何使用曼哈顿距离启发式来驱动 NxN 二维数组中的搜索。我有以下曼哈顿距离: private int manhattan(int[] pos, int tile) { int
我试图了解 CUmodule 在 CUDA 驱动程序 API 函数中实际上代表什么。 许多 CUDA 驱动程序 API 函数都有一个 CUmodule 句柄,但它是什么?它是引导驱动程序调用过程的 d
我正在尝试创建一个 java 程序,它将创建 excel 文件并将其上传到谷歌驱动器中。上传后我需要它来授予权限。我已经完成了所有这些,但问题在于尝试将 excel 文件转换为 google 文件,以
我正在拼命尝试从 Linux(Raspbian 内核 4.4.12-v7+)与使用 TIUSB3410 USB 部件的设备进行通信。 这是 dmesg 的输出: [ 2730.016013] usb
我有一个关于在 PCIe 上使用突发读写的问题。我有一个 fpga,它通过 PCIe 连接到 cpu。我有一个简单的驱动程序,仅用于测试。驱动程序向 FPGA 写入数据以及从 FPGA 读取数据。 f
我有大约 500 条通往特定页面的可能路径,我需要测试所有这些路径。该页面的每个路径看起来都类似于此(使用 PHP 网络驱动程序;通常有大约 10 个步骤): // Navigate to form
如果chrome驱动的版本和当前的chrome版本不同,我想写一个python代码,下载并运行与当前chrome版本匹配的chrome驱动。 这就是我一直在寻找的东西 driver = webdriv
我在 Centos 7 Linux 机器上尝试通过 pyodbc 连接到 SQL 数据库。我了解到您需要设置 DSN,您可以通过安装 freetds 驱动程序并执行以下操作来实现: import py
是否可以使用 NUnit 通过 NDepend 运行 CQL 查询?如果能够将 NDepend dll 包含在 UnitTests 库中并编写如下测试,那就太好了: [Test] public voi
我在 cassandra 中有巨大的表,超过 20 亿行并且还在增加。这些行有一个日期字段,它遵循日期桶模式以限制每一行。 即便如此,对于某个特定日期,我也有超过一百万条条目。 我想尽快读取和处理每一
考虑以下示例,其中一个模块的输出 (inner::out) 应该驱动两个输出(outer::out 和 outer::out2) 的上层层次: #include SC_MODULE(inner) {
我不确定是否可以有一个具有多个 MySQL 根的连接器。当我尝试只使用一根根时,它效果完美。我的有 2 个根的代码如下所示: [ 'locale' => 'es_ES.UTF-8',
我的桌面APP无法注册Mysql JDBC驱动 我下载mysql-connector-java-5.1.16.zip 解压mysql-connector-java-5.1.16-bin.jar并将其放
我有一个无限循环等待输入的 python 脚本,然后输入发生时做一些事情。我的问题是制作 python告诉 emacs 做某事。我只需要一些方法来发送 emacs 输入并让 emacs 评估该输入。
我最初问的没有明确说明我的问题/问题,所以我会更好地解释它。我有一个将 JDialog 设置为可见的 JButton。 JDialog 有一个 WindowListener 将其设置为在 window
假设“doc”是我想插入到 MongoDB 集合中的一些文档,而“collection”是我要将文档插入到的集合。 我有如下内容: try { WriteConcern wc = new Wr
我是一名优秀的程序员,十分优秀!