问题标签 [wdf]

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 投票
2 回答
6245 浏览

c++ - 编译使用 WinUsb 的应用程序

我正在编写一个应用程序以使用 WinUsb.dll 与 USB 设备进行通信。这是一个用户模式库,它允许通过安装在内核中的驱动程序 winusb.sys 与设备进行通信。

我正在使用 Visual Studio 2008 用 C++ 编写这个应用程序。

在 Windows DDK 中可以找到标头 WinUsb.h,因此我添加了包含路径“D:\WinDDK\7100.0.0\inc\ddk”。然后我得到一个错误,即无法找到 WinUsb.h 包含的 Usb.h,Usb.h 也在 ddk 但在不同的目录中,所以我添加“D:\WinDDK\7100.0.0\inc\api”作为一个包含目录。

一旦我添加了该路径,那么一切都将进入厕所,我开始在 stdio.h 和其他一些奇怪的地方出现编译错误。

我真的不想使用 DDK 构建系统和编译器来简单地使用这个 DLL,这是我使用 WinUsb 而不是编写适当的驱动程序的主要原因之一。

有没有人使用 WinUsb.dll 和 Visual Studio 构建过应用程序?

0 投票
1 回答
3385 浏览

c++ - 从 IRQL=DISPATCH_LEVEL (KbFilter/KMDF) 发送 IOCTL

我在 WDK 中使用 KbFilter 示例,尝试在 KbFilter_ServiceCallback 调用的函数中发送 IOCTL,因此在 DISPATCH_LEVEL 处执行。该函数只需要发送一个 IOCTL 并返回,而不是等待输出缓冲区被填充,因此它可以是异步的、触发并忘记。

我目前正在使用 WDF 函数WdfIoTargetFormatRequestForIoctlWdfRequestSend尝试在 DISPATCH_LEVEL 发送,但一无所获。对 WdfRequestSend 的调用成功,但似乎未收到 IOCTL。

使用WdfIoTargetSendIoctlSynchronously或 WDM 模式IoBuildDeviceIoControlRequest() 和 IoCallDriver()需要 PASSIVE_LEVEL 并且我知道在 PASSIVE_LEVEL 调用这些的唯一方法是创建一个在 PASSIVE_LEVEL 运行的单独线程并通过缓冲区或队列传递指令,同步带有自旋锁和信号量。

有人可以告诉我是否有更简单的方法将 IOCTL 传递给我的过滤器下方的驱动程序,或者当您需要以更高的 IRQL 执行操作时,线程/队列是否接近正常模式?在什么情况下我可以使用KeRaiseIrql,这是我应该使用的吗?谢谢。

0 投票
1 回答
982 浏览

kernel - 同一处理器上有两个自旋锁?

  1. 两个 CPU 可以同时持有两个“不同”的自旋锁吗?

  2. 那么......这是否意味着:一个单一(单处理器)CPU 不能同时持有两个“不同”的自旋锁?

  3. 那么……这是否意味着:单个 CPU 上的自旋锁数量不能大于 1。

PS:“不同”暗示与不同内存资源相关的自旋锁。


有人知道自旋锁在内部是如何工作的吗?...我的意思是,他们会在测试集操作期间冻结总线吗?我用谷歌搜索过,但没有绝对的答案。

0 投票
1 回答
798 浏览

drivers - WDF EvtIoDeviceControl 缓冲区长度

在 WDF 驱动程序中处理 DeviceIoControl 请求时,获取输入/输出缓冲区大小的正确方法是什么。

它似乎都作为参数传递:

但也可以通过WdfRequestRetrieveInputBuffer它来访问请求缓冲区。

InputBufferLength因此,我想知道参数和WdfRequestRetrieveInputBufferLength参数)设置的值之间是否存在差异。

0 投票
1 回答
206 浏览

driver - UMDF-应用层的锁设备

我正在使用UMDF over WinUsb 为我们的设备编写一个简单的 USB 驱动程序。该驱动程序可以被多个应用程序同时使用。我需要实现 WdfDeviceLevel\WdfObjectLevel 没有给我的自定义锁定系统:我想要一个原子读写功能:

  1. 获取设备上的锁
  2. 写一个值
  3. 读取一个值
  4. 释放锁

我怎样才能实现这样的功能?我找不到如何在界面功能之上公开自定义功能。除了这个特定的原子函数之外,如果我能让每个应用程序能够获得一个锁,该锁将阻止所有其他应用程序访问该设备,那就太好了。

0 投票
1 回答
983 浏览

windows - Windows 示例驱动程序正确构建但不会安装,

我不知道这是否是正确的地方,因为它在技术上不是编程问题,但它与驱动程序开发有关,所以无论如何:

对于学校作业,我必须查看 WDF 示例驱动程序的代码。(并稍微改变一下)所以我下载了 Windows Driver Kit,并尝试构建一个示例驱动程序。(Ramdisk 示例驱动程序)

构建运行良好,但是当我尝试使用添加新硬件向导安装它时,安装失败。向导告诉我它“找不到指定的文件”。我尝试了其他示例驱动程序,在不同的机器上尝试过,等等……它总是给出同样的错误。(我完全按照文档进行构建和安装)

0 投票
1 回答
2822 浏览

windows-7 - Windows 7 32 位中的 WDF UMDF 驱动程序安装问题

我有一个简单的用户模式 ​​USB 驱动程序,它在 Windows XP 32 位和 Windows 7 64 位中安装和工作正常,但由于某种原因无法在 Windows 7 32 位中正确安装。XP 32bit 和 win7 32bit 我需要 2 个单独的驱动程序吗?我的印象是我没有。我使用的 inf 文件如下所示:

2011 年 6 月 10 日更新,我对 inf 文件进行了如下修改,现在似乎可以在 windows7 中使用,但是在 xp 上它问我 /x86 在哪里,当我给它一个路径时,它会在开头添加一个 \,然后我删除它,它工作正常。我使用以下方法向 Windows 注册 .inf 文件:

infFullPath 是我复制驱动程序包的程序文件下的位置。谁能明白为什么这不起作用我将文件存储如下:

AbcRadio.inf
\x86\AbcRadio.dll
\x86\WudfUpdate_01009.dll
\x86\WdfCoInstaller01009.dll
\x86\WinUsbCoinstaller2.dll
\x64\AbcRadio.dll
\x64\WudfUpdate_01009.dll
\x64\WdfCoInstaller01009.dll
\x64\WinUsbCoinstaller2. dll

0 投票
1 回答
3949 浏览

c++ - 我想创建一个微过滤器驱动程序来透明地重定向磁盘 i/o,但我在开始时遇到了麻烦

我目前正在进行的一个项目需要实现一个 w/m 复制机制,该机制将用于在 Windows XP 上以与 Deep Freeze 或 Sandboxie 类似的方式重定向磁盘 i/o。如果可以的话,我还希望能够“挂载”用户修改过的文件,类似于 VirtualCloneDrive 如何模拟磁盘驱动器并在其上透明地挂载 ISO 映像。

据我了解,此类程序使用微过滤器驱动程序来重定向 i/o 请求。标准流程将任何修改后的数据复制到辅助位置,然后读取/修改该存储以供后续访问该数据;所以我想我明白我需要在那里做什么。但是,在模拟 CD/DVD 驱动器并在其上安装映像时,我完全迷失了方向。

我一直在网上(谷歌、MSDN、代码项目等)和诸如使用 Windows 驱动程序基础Windows NT 文件系统内部开发驱动程序:开发人员指南等书籍中寻找特定信息和示例(关于监视、拦截和重定向请求和创建环回设备)被证明是困难的。我对所涉及的技术还很陌生,所以我可能无法只见树木不见森林。

我想知道是否有人遇到过类似的情况并发现了任何有用的资源,或者可以为我指出正确的方向,以便我可以实现类似的功能。

编辑:我发现这个问题似乎是一个有用的资源(尽管不适用于我的特定用例),所以我将其链接到此处以添加到任何即将到来的回复中。

一些澄清:

我正在尝试创建一个程序,该程序允许用户安装和使用应用程序而无需管理权限。该程序将通过将任何文件系统/注册表修改保存到单独的存储区域(例如,笔式驱动器或网络存储上的文件)然后允许将这些修改集成到运行主机程序的任何桌面中来运行. 用 USB 笔随身携带您的桌面,将其插入,然后应用您的设置。

要重定向 I/O,我可以:

  1. 修补进程的导入地址表 (IAT) 以在应用程序级别插入自定义代码。
  2. 编写用户模式过滤器驱动程序以动态修改请求。
  3. 为了增强(实际上是)安全性,实现内核模式驱动程序以与 AV 软件类似的方式修补系统服务描述符表 (SSDT)。

这些方法中的每一种都有优点和缺点。例如,方法三比方法一困难得多。它提供了更高的安全性,但即便如此,它也可以被击败(理论攻击自 96 年以来一直存在,实际攻击自 07 年以来一直存在。)

我最初是在考虑特定的安全功能(而不是类似于WoW64 兼容性设置的 i/o 重定向);但是自从开始研究这个问题以来,我记得你不能永远保护用户免受自己的伤害,而且无论我为保护主机系统免受恶意进程或愚蠢用户的攻击付出了多少努力,它都可能被击败(或更有可能我会犯错误。)我还决定避免重新发明沙盒和防病毒轮子,而只专注于创建一些有用的功能。“一个工具应该做好一项工作,把它做好”的理念赢得了胜利。

简而言之,我要做的就是实现类似于 VM 快照的功能,并将更改重定向到我自己的存储区域。下图有点过时了,但它可能比我现在更能传达我的意图:-)

早期应用设计

0 投票
1 回答
1460 浏览

windows - 多设备驱动程序?(KMDF/WDF)

我刚刚编写了一个 KMDF USB 驱动程序。现在我想将几个(最多四个)设备连接到 PC。我从哪说起呢?我注意到,当我将第二个设备连接到 PC 时,它使用与第一个连接设备相同的驱动程序实例。EvtDeviceAdd(...) 每个设备运行一次,由于我没有对多个设备进行任何处理,所以事情变得很奇怪......现在我的 EvtDeviceAdd 看起来像这样:

我从哪说起呢?有什么好的例子吗?

0 投票
1 回答
865 浏览

wdf - 无中生有地创建 WDF 读取请求?

背景:我正在编写一个虚拟 USB 到 RS232 驱动程序。但由于我的硬件是 USB 芯片 (PDIUSBD12) 而不是纯 UART 芯片,驱动程序需要一些特殊的调整。使用超级终端之类的 PC 应该相信它正在与常规的 RS232 芯片通信。反正问题不在这件事上,更多的是理解-WDF-issue,呵呵:)

问题:我想要完成的是创建一个“读取请求”(无中生有)并将其传递给硬件。可悲的是WdfRequestRetrieveOutputMemory导致“访问破坏”/崩溃。我如何创建新请求有什么基本问题吗?WdfRequestRetrieveOutputMemory的输入变量都不是 NULL,但我猜maskRequest变量在某种程度上有问题?!