问题标签 [windows-kernel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wdk - 用于读取超过 1 kb 文件的 FltReadFile 函数
我正在使用 WDK 的 FltReadFile 函数来读取文件。我只能读取 1kb 文件。如何读取超过 1kb 的文件?谢谢你。
windows - 如何判断 Windows 内核事件对象是自动重置还是手动重置?
Windows 允许创建(命名的)事件对象。
Event(Windows 中的同步原语)可以是 auto-reset 类型(在这种情况下,您可以说它是一种 semaphore),也可以是 manual-reset 类型,在这种情况下,它会一直保持设置,直到有人重置它。
现在,从CreateEvent、OpenEvent、SetEvent等的文档看来,一旦创建了事件,似乎无法确定它是自动重置还是手动重置。
我的情况是,一个进程创建了一个命名事件,而第二个进程必须对该事件进行操作(它传递了名称,然后打开事件并最终发出信号)。由于该事件应该始终是一个手动重置事件以使整个事情变得有意义,我希望在第二个过程中添加一个检查以确保它是一个手动重置事件。有没有办法检查这个?
(是的,在我的情况下它更像是一个不错的选择,因为如果任何代码会创建一个自动重置事件然后将其传递给这个进程,这将是一个错误。但是错误发生了,如果我可以检测到它们。)
windows-kernel - 以 \??\ 开头的 Windows 内核对象名称是什么意思?
我正在维护一个带有用户空间和内核组件的旧版 Windows 应用程序。用户空间通过注册表键将一些文件路径传递给设备驱动程序。
目前,代码找到文件的完整路径,然后在将\??\
其写入注册表之前将其添加到文件前面,因此路径最终类似于\??\C:\foo.bar
. 驱动程序将此路径传递给InitializeObjectAttributes()
and ZwCreateFile()
,从而成功打开文件(或根据需要创建文件)。
我熟悉\\.\
前缀作为 的别名\DosDevices\
,但不是\??\
,而且它不是那种可以用谷歌搜索的东西。有谁知道这意味着什么?
windows - 只要线程的任何句柄都打开,线程 ID 是否保持唯一/有效?
如果我有一个 Win32 线程,我通过句柄引用它,也可以获得它的线程 ID。
在我关闭句柄之前,句柄仍然有效且可用,即使线程已终止。(否则,无法使用例如GetExitCodeThread
然而,文档似乎没有一致地提及线程终止后线程 ID “发生”了什么,但只要任何人仍然持有终止线程的线程句柄。
线程句柄和标识符指出
从线程创建到线程终止,标识符都是有效的。
然后,当我们查看GetThreadId API 时,我们会想知道如果 ID 仅在线程终止之前有效,那么对于终止的线程应该返回什么。(并且该站点上还有一条用户评论:“不正确。只要线程有一个打开的句柄,它的线程 ID 仍然有效且唯一。”这确实回答了这个问题,但没有更多上下文我很警惕。)
另外,我在 SO 的答案中找到了这个片段:
ID 是系统中运行的线程的唯一数字标识符。与任何内核对象句柄一样,线程句柄可以看作是一种特殊类型的指向内核对象的引用计数指针。
如果这是正确的,并且线程 ID 确实是内核对象的 ID,那么只要打开任何句柄,这个 ID 就必须保持有效(因为内核对象需要保留在那里才能被查询)。
我的推理合理吗?只要打开任何句柄,线程 ID 是否有效?是否有任何MS 文档或权威书籍明确说明其中之一?
c++ - 使用 C++ 检测进程崩溃的最佳方法是什么
有什么方法可以检测 Windows 7 中的进程崩溃?澄清一下,在每个进程崩溃时,windows 都会创建 WERfault.exe(windows 错误报告)。我有驱动程序通过使用内核的现有内核回调机制来监视系统。当某个进程事件发生时,回调会通知我的驱动程序(使用 PsSetCreateProcessNotifyRoutine)。问题是我看到由 svchost.exe 创建的 WERfault.exe 但我找不到解决哪个进程崩溃的方法。
usb - WDM:给定设备 FDO/PDO 确定它是否是 USB Root Hub
USBPcap 附加为所有根集线器的上层过滤器。它通过为 {36FC9E60-C465-11CF-8056-444553540000} 类添加 UpperFilters 条目来实现。然后在 AddDevice 函数中检索 PDO 并获取硬件 ID 列表。然后检查列表中的 USB\ROOT_HUB 和 USB\ROOT_HUB20 条目。如果它在列表中,则该设备被视为 Root Hub,否则不是。上述函数的源代码可在 github 获得:https ://github.com/desowin/usbpcap/blob/master/USBPcapDriver/USBPcapHelperFunctions.c#L725
此解决方案不适用于 USB 3.0 根集线器。由于 USB 3.0 控制器有许多不同的驱动程序,因此没有标准的 USB\ROOT_HUB30 条目。基本上每个驱动程序都有自己的硬件 ID。我宁愿避免列出所有根集线器的硬件 ID。
我想知道是否有任何方法可以可靠地确定设备是否是根集线器,而不仅仅依赖于硬件 ID。
我考虑过检查设备是否具有 GUID_DEVINTERFACE_USB_HUB 并且其父设备是否具有 GUID_DEVINTERFACE_USB_HOST_CONTROLLER,但我不知道如何(以及是否)可以在 AddDevice 回调中调用的函数内部的内核模式下完成。
windows - RegistryCallback 和 RegCreateKeyEx
我想监控一台windows机器。我创建了一个 Windows 服务,我的目的是在进程尝试创建新的注册表项时收到通知。
我使用RegistryCallback
以下签名
RegistryCallback 已使用 CmRegisterCallback 注册。问题是我在每次创建注册表项时都会收到通知,但是我只想在创建新注册表项时收到通知,或者至少要获得该项已经存在的信息,有什么办法吗?
c++ - CreateThread 与 PsCreateSystemThread - 有什么区别?
我想问一下PsCreateSystemThread
和有什么区别CreateThread
。从 MSDN 的描述来看,这似乎PsCreateSystemThread
是针对内核线程的。
CreateThread
看起来像一个内核线程,但与一个进程共享相同的虚拟空间内存。这意味着我可以让许多线程一起运行,但我无法访问其他进程内存空间。
winapi - 用户空间的 Windows Vista/7 内核挂钩
我正在寻找有关在 Vista 和 7 下实现驱动程序的建议,该驱动程序可以挂钩和监视用户进程的任意系统功能。我的目标是简单地转储从 ntdll、kernel32 等调用的系统函数的参数。来自 XP、SSDT 修改和类似技术很流行。在 Vista+ 上有过滤器驱动程序和通知例程。这些中的任何一个都用于挂钩本机功能吗?该驱动程序适用于 32 位和 64 位,并且必须与 Patch Guard 配合使用。欢迎任何建议。
windows - Windbg 和符号文件
我有符号文件的问题。我尝试了符号文件路径并设置路径如下:
但后来我将其更改为以下内容:
我在路径中用 mydriver 更改了 driver2:这是我的驱动程序的 .pdb 文件所在的路径。问题是 .sympath 打印正确的路径,如下所示:
但是仍然找不到驱动程序的符号。如果我运行 .reload 命令,我们可以看到 WinDbg 在 driver2/ 目录而不是 mydriver/ 目录中寻找 .pdb。
我已经删除了所有工作区,关闭了 WinDbg,重新启动了 Windows,但 driver2/ 条目仍然存在:它必须在默认工作区的缓存中或某处。如何删除 WinDbg 的整个个人设置,包括那些缓存,以便我可以重新启动 WinDbg 并使用 driver2/ 路径并使其使用 mydriver/。
我也可以通过将 mydriver/ 目录重命名为 driver2/ 来解决问题,但我不想这样解决问题。我想了解发生了什么并尽我所能解决它。