问题标签 [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 回答
658 浏览

c++ - 桌面 DirectX Surface (WDM)

我正在尝试制作屏幕录制应用程序。有没有办法使用 DirectX 捕获整个屏幕并将其存储为纹理?这将在 WDM 中。我知道有一种方法可以获得窗口的纹理,但是整个屏幕呢。

我已经尝试过使用 getDC(null) 的 GDI 方法,但这对我的使用来说相当慢。

0 投票
1 回答
452 浏览

windows - 遍历 WDM 设备堆栈

据我了解,只能从下往上迭代 WDM 设备的设备堆栈,因为 DEVICE_OBJECT 有一个 AttachedDevice 成员(但不是 LowerDevice 成员)。幸运的是,AddDevice 回调接收到 PhysicalDeviceObject,因此您可以遍历整个堆栈。

从我的过滤器驱动程序中,我试图确定我是否已经在过滤某个设备对象。(假设我对此有正当理由。请耐心等待。)我的想法是检查堆栈中的每个 DEVICE_OBJECT 并将其 DriverObject 成员与我的成员进行比较。

从 IoGetAttachedDeviceReference 的存在来看,我认为仅仅访问 AttachedDevice 并不是一件安全的事情,因为设备突然消失的风险。但是,IoGetAttachedDeviceReference 将我直接带到了堆栈的顶部,这对我没有好处。

那么,有没有一种安全的方法来迭代设备堆栈?

0 投票
1 回答
415 浏览

c++ - 在虚拟 PBDA 驱动程序中使用 C++:有什么限制?

我计划将现有的 C++ 项目(提供传输流数据)集成到 Windows7 下的虚拟 DVB 驱动程序中。明显的起点似乎是来自 Microsoft WDK(版本 7600.16385.1)的 SW Tuner 示例。Microsoft 提供的这个示例已经实现了一个虚拟 PBDA 驱动程序,该驱动程序从本地文件中读取传输流数据。

现在我的问题是:内核驱动程序中提供(或不提供)C++ 的哪些功能?

我已经阅读了 Microsoft 页面“C++ for Kernel Mode Drivers: Pros and Cons”,并且似乎通常可以在内核驱动程序中使用基本的 C++?虽然微软没有给出非常精确的保证是可以理解的,但这段文字让我对三年前甚至今天使用 C++ 实际可能发生的事情感到有些困惑。

STL 可以在内核驱动程序中使用吗?(通过查看 WDK:有像“USE_STL”或“STL_VER”这样的标志,以及 WDK 路径中有两个目录 STL60 和 STL70。我可以找到的讨论线程有些不确定。我设法让 SWTuner 示例构建“USE_STL=1”,但还没有做任何进一步的测试。)。STL 容器可以用于管理内核驱动程序中的内存吗?

C++ 异常可用吗?从我能找到的(fe at "Drivers, Exceptions and C++")看来,通常可以使用 C++ 异常(try/throw/catch),因为它们被映射到 SEH,但仍然需要一些解决方法?

多线程代码可以在内核空间中工作吗?

作为驱动程序新手,我尝试做出的一般设计决定是:将 C++ 项目集成到现有示例中是否更可行(这将节省接口的很多麻烦,但带有“内核驱动程序中的 C++” ” 包袱),还是将 C++ 项目封装在应用程序中更谨慎,然后通过尚未添加的接口与虚拟驱动程序进行通信。

0 投票
1 回答
770 浏览

windows - 可以在本地范围内分配 IoBuildDeviceIoControlRequest 的内核事件对象

我是驱动程序开发的新手。我有一个基本问题。

在编写 WDM 设备驱动程序时,可以调用IoBuildDeviceIoControlRequest / IoBuildSynchronousFsdRequest来分配要传递给另一个目标驱动程序的同步 IRP。基本要求之一是我们必须在调用这些函数之前 分配一个事件对象。而且,我们必须确保在目标驱动程序完成 IRP 时这个事件对象仍然可用

我们真的可以从调用IoBuildDeviceIoControlRequest/IoBuildSynchronousFsdRequest的函数的本地范围分配该事件对象吗?即来自内核堆栈而不是来自非分页池。许多示例代码只是从本地范围分配事件对象,因此从内核堆栈中分配。但是,如果我们的调用驱动程序在目标驱动程序仍在处理我们的 IRP 时被分页,实际上会有问题吗?

0 投票
1 回答
495 浏览

windows - 如何检测 WDM 驱动程序中的会话创建/终止?

我正在为 Windows 构建一个设备驱动程序(WDM 驱动程序,32 位),我需要检测终端会话的创建和关闭。

我知道如何获取调用者进程的会话 ID(ZwQueryInformationProcess带有ProcessSessionInformation标志)。我还拦截了图形驱动程序加载/卸载到会话中的事件(通过拦截ZwSetSystemInformation/ SystemLoadImageSystemUnLoadImage

ZwSetSystemInformation我希望会话创建/关闭事件之后将调用SystemCreateSession/SystemDeleteSession标志。但不幸的是,这并没有发生。到目前为止,我没有找到会话创建/关闭的良好指示。

0 投票
1 回答
1296 浏览

c# - 将航空玻璃模糊应用于 WPF 中的特定控制区域

在他的书中(Pro WPF in C# 2010 Windows Presentation Foundation in .NET 4)Matthew MacDonald - 写道:

...您可以使用 DwmEnableBlurBehindWindow() 将玻璃效果应用于窗口中的特定区域。

这是否意味着我可以将航空玻璃效果应用于特定控件(或至少它们占据的区域)?

请提供有关如何使用 C# 执行此操作的示例。

0 投票
3 回答
1549 浏览

windows - 将代码移动到内核空间会提供更精确的计时吗?

背景资料:

我目前有一个连接到 USB 端口的硬件设备。硬件设备负责将精确的周期性消息发送到它反过来连接的各种网络上。在硬件设备内部,我有几个 Microchip dsPIC。有两种操作模式。

一种情况是将简单的“作业”发送到 dsPIC,而 dsPIC 又可以以 0.001 毫秒的精度发送精确的消息。这种架构对于更复杂的消息传递并不理想,我们需要发送一个周期性数据包,该数据包会根据 PC 应用程序中发生的事件而变化。因此,我们有第二种操作模式,我们的 PC 应用程序将发送周期性消息,而 dsPIC 只需转换和发送响应。顺便说一下,所有这些对于我们软件的最终用户来说都是透明的。我们的硬件设备是用于汽车领域的测试工具。

目前,我们使用 FTDI 的 USB 转串行芯片和 FTDI Windows 驱动程序将硬件连接到我们的 PC 软件。

问题在于,在我们从 PC 发送消息的模式 2 中,我们能够达到的最佳效果是平均硬件范围约为 1 毫秒。我们受到 Windows 内核抢占。我尝试了许多“技巧”来改进,例如:

  1. 尽可能确保我们的读取器和写入器线程存在于单独的 CPU 关联上。
  2. 增加写入器的线程优先级,同时降低读取器的线程优先级。
  3. 通知用户在使用我们的软件时关闭屏幕保护程序和其他应用程序。
  4. 用 CreateTimerQueueTimer 调用替换 createthread 调用。

我们所有的软件都是用 C/C++ 编写的。我对高级 Windows 编程非常熟悉和熟悉;比如IO Completions、Overlapped I/O、无锁线程队列(真的是一种设计策略)、sockets、线程、信号量等等……

但是,我对 Windows 驱动程序开发一无所知。我已经阅读了一些关于 KMDF、UDMF 和 WDM 的论文。

我希望经验丰富的 Windows 内核模式驱动程序开发人员会在这里做出回应......

下一个版本。我们的硬件可以选择替换 FTDI 芯片并使用 dsPIC 的 USB 接口,或者可能将开源 Linux FTDI 东西移植到 Windows 并继续在我们的自定义驱动程序中使用 FTDI 芯片。我认为通过访问 PC 端的内核模式驱动程序,我可以建立一个内核驱动程序,它可以以更精确的间隔发送周期性消息,而无需抢占和/或可能利用 DMA。

我们的业务中有一个竞争对手,我认为他的工具与他们的工具完全相似。据我所知,用户空间应用程序调度线程的时间不能超过 1 毫秒。我们目前在一个线程中使用 timeGetTime。我已经体验过定时器队列(通过 CreateTimerQueueTimer),但没有真正的改进。

WDM 是实现更精确时序的正确方法吗?

我们的竞争对手如何实现从 Windows 驱动的信号到他们的硬件的非常精确的时序,他们确实加载了一个内核驱动程序 (.sys),他们的设备和我们的一样在 USB2.0 上运行。

如果 WDM 是要走的路,我可以就我应该研究哪些内核函数来设置时序获得一些建议吗?谢谢阅读

0 投票
0 回答
817 浏览

c++ - 从 Virtual Audio Driver 向用户模式应用程序发送音频数据

我目前的任务是将音频数据从虚拟音频驱动程序发送到用户模式应用程序。

首先,我需要从用户模式应用程序创建该虚拟音频驱动程序的实例......

请看下面的代码片段

你能指出原因吗?

对于上面的用户模式应用程序,我曾经编写了一段 IOCTL 代码,如下所示......

您能否指出我的错误。出于测试目的,我只是将一个字符串(IOCTL - Direct In I/O From Kernel Welcome to the world of Portcl")传递到输出缓冲区,稍后我将用音频数据替换它。 ..为什么 deviceIoControl 失败了,尽管我得到了我在驱动程序中传递的字符串,但是 bytesReturn 值总是作为随机值出现,而 bRes 值总是为假......

0 投票
0 回答
1478 浏览

windows - Windows 驱动程序编程,线程函数数据参数被损坏?

我正在测试这段代码:

现在,当我加载此驱动程序时,我的 m/c 因 (IRQL_NOT_LESS_OR_EQUAL_TO) 而崩溃,KeWaitForSingleObject这意味着我正在尝试访问无效地址。但是在 handler 和 start_timer 中的 Timer 地址是相同的。没有 KeWaitForSingleObject 很好。不知道怎么回事,求大神帮忙!

////////////////////////// 编辑 1 //////////////// ////////////

没有KeWaitForSingleObject

它后来崩溃了..成功安装驱动程序并成功卸载...然后突然蓝屏!Windows 驱动程序编程不是儿戏!:(

两个函数中的地址仍然相同..顺便说一句,当我在没有线程的情况下编写时它工作正常......(在 start_timer() 中取消注释代码)但我必须用线程来做......我想要做的是,调用 start_timer( ) 具有多次不同的延迟,并且应该相应地调用处理程序,它不应该阻塞其他执行从而创建线程。

0 投票
0 回答
1012 浏览

driver - WorkItem (IoQueueWorkItem) 给 BSOD 错误“PAGE_FAULT_IN_NONPAGED_AREA”

我正在使用 Windows 7 64 位。WorkItem(IoQueueWorkItem)给蓝屏错误“PAGE_FAULT_IN_NONPAGED_AREA”我也在释放分配的内存......不知道出了什么问题:(

这是我的驱动程序代码:

这是我的测试代码:

此代码使我的笔记本电脑崩溃......我不知道我错在哪里......我也在释放内存。如果我评论它,没有 IoQueueWorkItem 就可以了。

////////////////编辑1 解决了!这是因为这里的 DeviceObject,work->pio = IoAllocateWorkItem(pDeviceObject);pDeviceObject不是我的驱动程序实例......因此它失败了!