问题标签 [wdm]
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.
filter - 开发文件系统微过滤驱动程序时应该使用 WDM 吗?我应该使用 KMDF 吗?或者它有什么问题吗?
开发文件系统微过滤驱动程序时应该使用 WDM 吗?我应该使用 KMDF 吗?或者它有什么问题吗?
c - _InterlockedAdd64 的重新定义
我正在 Code::Blocks 中使用 MinGW-W64 7.1.0 (seh, posix) 制作一个简单的内核模式驱动程序。我正在使用“include/ddk”中的内置 DDK 头文件进行编译。但是构建失败并出现该错误:
相同的代码在 TDM-GCC 64 位上编译得很好,但它使用的是一个非常旧的 GCC 版本,5.1.0。
我尝试了具有不同线程模型和异常的旧版本的 MinGW-W64,但没有成功。
可能我错过了一些东西。
提前致谢。
driver - 用户模式和内核模式的进程 ID 相同
我很震惊,在我的应用程序通过 DeviceIoControl() Win32 API 向我的内核驱动程序 (WDM) 发出的 IOCTL 请求中,我在用户模式和内核模式之间获得了相同的 PID。
据我所知,驱动程序在内核模式下有自己的PID;应用程序在用户模式下拥有自己的PID,它们是分开的,可以通过IOCTL进行通信。但是今天,我在 IOCTL 请求中的用户/内核模式之间获得了相同的 PID。我GetCurrentProcessId()
在用户模式下通过函数获得了 PID;并在内核模式下通过PsGetCurrentProcessId()
函数获得PID,在用户模式应用程序中显示结果,这两个PID是相同的。
有谁知道为什么?
windows - 如何模拟 SCSI 设备
让我们画图。
Windows 提供 SCSI 端口(总线)驱动程序。驱动程序FDO
为总线 ( FILE_DEVICE_BUS_EXTENDER
) 和PDO
连接到总线 ( ) 的每个设备创建FILE_DEVICE_MASS_STORAGE
。我们将大容量存储设备“连接”到 PnP 请求处理程序中的总线设备。
Windows 还提供了位于端口驱动程序之上的类驱动程序(针对每个设备类)。它在每个子设备FDO
的顶部形成设备堆栈。PDO
类驱动程序将内部 ioctl 发送到端口驱动程序;主要功能码是IRP_MJ_SCSI
,次要功能码是IRP_MN_SCSI_CLASS
,SCSI_REQUEST_BLOCK
结构中填写了特定于请求的信息。
端口驱动程序处理与设备的通信(将数据从 SRB 移动到设备/将数据从设备移动到 SRB)并完成请求。
现在假设我们要模拟 scsi 设备。我们需要开发“虚拟 SCSI 端口(总线)”驱动程序。该驱动程序将为FDO
总线 ( FILE_DEVICE_BUS_EXTENDER
) 和PDO
我们将创建的每个设备 ( FILE_DEVICE_MASS_STORAGE
) 创建。我们将处理内部 ioctl、进行 irp 队列管理、将数据移入/移出 SRB 等。
我想了解必须满足哪些“条件”才能使 Windows“认为”SCSI 设备是真实的(以便它出现在资源管理器等中)。类驱动程序会在我们创建设备后立即自动发送内部 ioctl,还是我们需要模拟这些请求?
我的问题可能很愚蠢,但我需要掌握正在发生的事情才能了解更多。谢谢您的帮助。
windows - 在 RemoveEntryList 中带有错误检查 0x139 的蓝屏死机
我们开发了基于(WinDDK 6)本机串行COM端口驱动程序的WDM串行端口驱动程序。
但是我们的客户在使用我们的驱动程序时有一个应用程序触发了 BSOD。
此应用程序在程序上的按钮打开时连续调用IRP_MJ_READ,而在程序关闭时没有关闭按钮时发生BSOD。
我们使用 WinDBG 进行了调试,发现根本原因是RemoveEntryList
错误检查代码告诉我们已经调用RemoveEntryList
了两次。请参阅错误检查 0x139。
经过分析,我们的驱动程序和WinDDK的代码看不出有什么区别,但是原生COM1在运行这个应用程序时不会触发BSOD。
相关代码如下:
当程序被关闭时,系统调用SerialKillAllReadsOrWrites
会杀死 ReadQueue 中未决的 IRP。
我们发现第一次调用RemoveEntryList
inSerialKillAllReadsOrWrites
和第二次调用SerialCancelQueued
将删除同一个条目。
我们已经测试过,如果我们标记第一个RemoveEntryList
,它就通过了,不再蓝屏。
RemoveEntryList
但是为什么本机COM即使调用两次删除同一个条目也不会触发BSOD呢?
有人可以帮我理解为什么吗?谢谢。
windows - 在 PnP 驱动程序中删除 WDM 设备
我对设备移除有疑问。
当我们想通知 PnP 管理器设备已消失时,我们IoInvalidateDeviceRelations
使用BusRelations
. 之后,操作系统将发送IRP_MN_QUERY_DEVICE_RELATIONS
带有BusRelations
. 在这个请求处理程序中,我们将从数组中排除设备,并将做另一项必要的工作来“断开”它与总线的连接,我们还将RemovePending
在其设备扩展中设置标志。
我不明白如何在设备变为“删除待处理”之后和操作系统发送请求之前处理传入设备的 IO 请求IRP_MN_REMOVE_DEVICE
。我们应该检查RemovePending
标志并返回STATUS_DEVICE_DOES_NOT_EXIST
还是应该像往常一样继续?
现在想象一下,IRP_MN_REMOVE_DEVICE
请求终于到达了。MSDN说我们必须调用IoReleaseRemoveLockAndWait
释放当前获取的remove lock,防止后续获取,等待现有获取被释放。所以它迫使我们总是在 PnP 请求处理程序中获取删除锁IoAcquireRemoveLock
;IoReleaseRemoveLockAndWait
并用forIRP_MN_REMOVE_DEVICE
或 with IoReleaseRemoveLock
for 另一个次要代码释放它。
我不明白为什么我们需要在 PnP 请求处理程序中获取删除锁?据我了解,我们只需要为挂起的 irp 获取删除锁,并在此类 irp 完成时释放它。因此,Windows 人员可以为我们提供IoWaitForExistingRemoveLocks
例程而不是IoReleaseRemoveLockAndWait
.
对不起,如果它有点乱,我就是想不通。谢谢。
windows - 在多处理器架构中以内核模式安全访问共享对象的最佳方法是什么
我已经阅读了有关内核同步技术的 The Rootkit Arsenal 书(第 269 页 - https://books.google.co.il/books?id=GAsuwHTquhEC )。
根据我所读到的,在多 CPU 架构中访问共享对象的最安全/适当的方法是为每个 CPU 内核发出 DPC 调用,并在“主”内核处理共享对象时旋转共享对象。
我真的不明白为什么在单个 cpu 核心上旋转共享对象和处理是不够的,有人可以向我解释一下吗?
windows - 通过 CreateFileMapping 将 IO 空间映射到 UserMode
我正在为 KVM 编写一些概念验证代码,用于 Windows 10 和主机 Linux 系统之间的通信。
我拥有的是一个虚拟 RAM 设备,它实际上连接到主机上的共享内存段。PCIe BAR 2 直接映射到此 RAM。
我的目的是提供一种不涉及其他常用方法(套接字等)的高带宽低延迟数据传输方法。ZeroCopy 将是理想的。
到目前为止,我几乎完成了所有工作,我编写了一个驱动程序,该驱动程序调用MmAllocateMdlForIoSpace
然后MmMapLockedPagesSpecifyCache
通过DeviceIOControl
. 这完美地工作,用户模式应用程序能够寻址共享内存并写入它。
我缺少的是CreateFileMapping
在用户模式下使用来获取HANDLE
此内存的映射的能力。我对 Windows 驱动程序编程相当陌生,因此我不确定这是否可能。关于实现这一目标的最佳方法的任何指示都会非常有帮助。
c++ - Windows驱动、自旋锁获取和条件测试
在一个调度例程中,我们有以下代码:
在另一个调度例程中,我们有以下代码:
因此,当我们将在第一个调度例程中获取自旋锁时,DeviceExtension->Flag
已经可以FALSE
由第二个例程设置。解决方案是获取自旋锁,然后检查DeviceExtension->Flag
. 但是DeviceExtension->Flag
可能是 FALSE,在这种情况下,自旋锁获取似乎非常繁重。
我对多线程不是很熟悉,尤其是在内核模式下。我知道这个问题很愚蠢,但我迷路了。在这种情况下,正确的解决方案是什么?谢谢你。
ruby-on-rails - 将 Gem 'wdm' 添加到您的 GemFile
我尝试在 git bash 中运行以下命令
我得到了图片中的错误。我尝试了多种解决方案:
1-尝试运行
2-尝试运行
3-我尝试添加
和
因为我读到 0.1.0 不再工作了。但问题还没有解决。我正在使用 Windows 10、ruby 2.3.3、rails 5.1.4