问题标签 [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.

0 投票
1 回答
275 浏览

filter - 开发文件系统微过滤驱动程序时应该使用 WDM 吗?我应该使用 KMDF 吗?或者它有什么问题吗?

开发文件系统微过滤驱动程序时应该使用 WDM 吗?我应该使用 KMDF 吗?或者它有什么问题吗?

0 投票
1 回答
566 浏览

c - _InterlockedAdd64 的重新定义

我正在 Code::Blocks 中使用 MinGW-W64 7.1.0 (seh, posix) 制作一个简单的内核模式驱动程序。我正在使用“include/ddk”中的内置 DDK 头文件进行编译。但是构建失败并出现该错误:

相同的代码在 TDM-GCC 64 位上编译得很好,但它使用的是一个非常旧的 GCC 版本,5.1.0。

我尝试了具有不同线程模型和异常的旧版本的 MinGW-W64,但没有成功。

可能我错过了一些东西。

提前致谢。

0 投票
1 回答
848 浏览

driver - 用户模式和内核模式的进程 ID 相同

我很震惊,在我的应用程序通过 DeviceIoControl() Win32 API 向我的内核驱动程序 (WDM) 发出的 IOCTL 请求中,我在用户模式和内核模式之间获得了相同的 PID。

据我所知,驱动程序在内核模式下有自己的PID;应用程序在用户模式下拥有自己的PID,它们是分开的,可以通过IOCTL进行通信。但是今天,我在 IOCTL 请求中的用户/内核模式之间获得了相同的 PID。我GetCurrentProcessId()在用户模式下通过函数获得了 PID;并在内核模式下通过PsGetCurrentProcessId()函数获得PID,在用户模式应用程序中显示结果,这两个PID是相同的。

有谁知道为什么?

0 投票
1 回答
393 浏览

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_CLASSSCSI_REQUEST_BLOCK结构中填写了特定于请求的信息。

端口驱动程序处理与设备的通信(将数据从 SRB 移动到设备/将数据从设备移动到 SRB)并完成请求。

现在假设我们要模拟 scsi 设备。我们需要开发“虚拟 SCSI 端口(总线)”驱动程序。该驱动程序将为FDO总线 ( FILE_DEVICE_BUS_EXTENDER) 和PDO我们将创建的每个设备 ( FILE_DEVICE_MASS_STORAGE) 创建。我们将处理内部 ioctl、进行 irp 队列管理、将数据移入/移出 SRB 等。

我想了解必须满足哪些“条件”才能使 Windows“认为”SCSI 设备是真实的(以便它出现在资源管理器等中)。类驱动程序会在我们创建设备后立即自动发送内部 ioctl,还是我们需要模拟这些请求?

我的问题可能很愚蠢,但我需要掌握正在发生的事情才能了解更多。谢谢您的帮助。

0 投票
1 回答
451 浏览

windows - 在 RemoveEntryList 中带有错误检查 0x139 的蓝屏死机

我们开发了基于(WinDDK 6)本机串行COM端口驱动程序的WDM串行端口驱动程序。

但是我们的客户在使用我们的驱动程序时有一个应用程序触发了 BSOD。

此应用程序在程序上的按钮打开时连续调用IRP_MJ_READ,而在程序关闭时没有关闭按钮时发生BSOD。

我们使用 WinDBG 进行了调试,发现根本原因是RemoveEntryList错误检查代码告诉我们已经调用RemoveEntryList了两次。请参阅错误检查 0x139

经过分析,我们的驱动程序和WinDDK的代码看不出有什么区别,但是原生COM1在运行这个应用程序时不会触发BSOD。

相关代码如下:

当程序被关闭时,系统调用SerialKillAllReadsOrWrites会杀死 ReadQueue 中未决的 IRP。

我们发现第一次调用RemoveEntryListinSerialKillAllReadsOrWrites和第二次调用SerialCancelQueued将删除同一个条目。

我们已经测试过,如果我们标记第一个RemoveEntryList,它就通过了,不再蓝屏。

RemoveEntryList但是为什么本机COM即使调用两次删除同一个条目也不会触发BSOD呢?

有人可以帮我理解为什么吗?谢谢。

0 投票
1 回答
645 浏览

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 请求处理程序中获取删除锁IoAcquireRemoveLockIoReleaseRemoveLockAndWait并用forIRP_MN_REMOVE_DEVICE或 with IoReleaseRemoveLockfor 另一个次要代码释放它。

我不明白为什么我们需要在 PnP 请求处理程序中获取删除锁?据我了解,我们只需要为挂起的 irp 获取删除锁,并在此类 irp 完成时释放它。因此,Windows 人员可以为我们提供IoWaitForExistingRemoveLocks例程而不是IoReleaseRemoveLockAndWait.

对不起,如果它有点乱,我就是想不通。谢谢。

0 投票
0 回答
57 浏览

windows - 在多处理器架构中以内核模式安全访问共享对象的最佳方法是什么

我已经阅读了有关内核同步技术的 The Rootkit Arsenal 书(第 269 页 - https://books.google.co.il/books?id=GAsuwHTquhEC )。

根据我所读到的,在多 CPU 架构中访问共享对象的最安全/适当的方法是为每个 CPU 内核发出 DPC 调用,并在“主”内核处理共享对象时旋转共享对象。

我真的不明白为什么在单个 cpu 核心上旋转共享对象和处理是不够的,有人可以向我解释一下吗?

0 投票
0 回答
176 浏览

windows - 通过 CreateFileMapping 将 IO 空间映射到 UserMode

我正在为 KVM 编写一些概念验证代码,用于 Windows 10 和主机 Linux 系统之间的通信。

我拥有的是一个虚拟 RAM 设备,它实际上连接到主机上的共享内存段。PCIe BAR 2 直接映射到此 RAM。

我的目的是提供一种不涉及其他常用方法(套接字等)的高带宽低延迟数据传输方法。ZeroCopy 将是理想的。

到目前为止,我几乎完成了所有工作,我编写了一个驱动程序,该驱动程序调用MmAllocateMdlForIoSpace然后MmMapLockedPagesSpecifyCache通过DeviceIOControl. 这完美地工作,用户模式应用程序能够寻址共享内存并写入它。

我缺少的是CreateFileMapping在用户模式下使用来获取HANDLE此内存的映射的​​能力。我对 Windows 驱动程序编程相当陌生,因此我不确定这是否可能。关于实现这一目标的最佳方法的任何指示都会非常有帮助。

0 投票
1 回答
201 浏览

c++ - Windows驱动、自旋锁获取和条件测试

在一个调度例程中,我们有以下代码:

在另一个调度例程中,我们有以下代码:

因此,当我们将在第一个调度例程中获取自旋锁时,DeviceExtension->Flag已经可以FALSE由第二个例程设置。解决方案是获取自旋锁,然后检查DeviceExtension->Flag. 但是DeviceExtension->Flag可能是 FALSE,在这种情况下,自旋锁获取似乎非常繁重。

我对多线程不是很熟悉,尤其是在内核模式下。我知道这个问题很愚蠢,但我迷路了。在这种情况下,正确的解决方案是什么?谢谢你。

0 投票
2 回答
1882 浏览

ruby-on-rails - 将 Gem 'wdm' 添加到您的 GemFile

错误

我尝试在 git bash 中运行以下命令

我得到了图片中的错误。我尝试了多种解决方案:

1-尝试运行

2-尝试运行

3-我尝试添加

因为我读到 0.1.0 不再工作了。但问题还没有解决。我正在使用 Windows 10、ruby 2.3.3、rails 5.1.4