问题标签 [wdk]
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.
driver - 如何为WinXP编写虚拟音频设备驱动程序
如何在 WinXP 中编写最简单的音频虚拟设备驱动程序?我知道一种方法是编写 WDM 驱动程序,但我想这不是一件容易的事。我需要为基于 Flash 的应用程序实现一些音频过滤。不幸的是,这似乎是唯一的方法——在 Flash 之外,通过设备驱动程序,然后 Flash 应用程序可以连接到我的虚拟设备。我想知道我是否可以使用一些高级 API(比 WDM 更高)编写设备驱动程序,也许 UMDF 作为虚拟 USB 音频设备(?)或者也许只有一些将注册虚拟设备的 dll。我可以看到 Google Talk 插件包含提供虚拟网络摄像头的 googleadapter.dll,我想知道他们是如何编写的。
在此先感谢,
windows - 将文件内容从内核传递到用户模式的最快方法?
我会尽量简短,但完全描述性:
这是特定于 Windows 的。使用 Windows 驱动程序开发工具包 (DDK)。
我是第一次编写内核模式驱动程序 (KMD),之前没有内核模式方面的经验。我目前正在使用 DDK 附带的“扫描仪”微型过滤器示例,并对其进行扩展以进行练习。“扫描仪”微型过滤器是通用“防病毒”类型扫描驱动程序的基本概述,它挂钩文件创建/关闭并对关联文件进行操作以在批准/拒绝请求的操作之前扫描“坏词”。
最终目标是在打开文件时使用用户模式应用程序扫描文件,确定微过滤器是否应允许操作完成,而不会明显减慢尝试打开文件的进程或用户。文件。当尝试保存以决定是允许保存成功完成还是拒绝保存时,我还想再次扫描整个文件。微型过滤器示例为如何挂钩这些调用奠定了基础,但在实际“扫描”部分中有点弱。
我正在考虑扩展示例以扫描已打开的整个文件,例如生成哈希,而不仅仅是前 1k(示例的限制)。我已修改示例以读取整个文件并使用原始示例中的相同机制发送它。此方法用于FltReadFile
读取 KMD 中的文件FltSendMessage
并将缓冲区发送到用户模式组件。用户模式应用程序GetQueuedCompletionStatus
用于从 KMD 获取通知并处理缓冲区。
但是,我注意到与使用标准库(fstream)在 C++ 中正常打开/读取相比,这个过程似乎相当慢。与在简单的 C++ 用户应用程序中简单地打开和读取文件相比,此方法花费的时间大约要长 4-8 倍。我已经调整了缓冲区大小,看看它是否有显着的改进,虽然它可以稍微有所帮助,但好处似乎并不是很显着。
由于我希望“实时”扫描文件,因此这种传输速度非常令人失望且令人望而却步。有没有更快的方法将文件内容从内核模式驱动程序传输到用户模式应用程序?
windows - 有人熟悉未记录的 ObReferenceObjectByName windows 内核函数吗?
我读过一篇非常有趣的文章,是关于使用 wdk 编程驱动程序的,其中使用的一个函数称为 ObReferenceObjectByName。这个功能让我很头疼。第一个坏事是微软没有记录它。第二件事,文章中使用的语言是 C++,我想将我的代码保持在普通的 C 语言中。我知道大多数时候这不应该是一个问题,但我没有 - 因为我的生活 - 能够弄清楚如何包含此功能。
文章中的代码类似于:
我已经尝试复制这个几个小时了。我尝试在没有'extern'关键字的情况下声明它,我尝试更改调用约定,我尝试更改包含...我总是以错误“未解析的外部符号...”结束。
我完全被难住了,所以如果有人能提供一些建议,我将不胜感激。谢谢。
64-bit - DDK/WDM 开发问题...驱动程序不会在 x64 windows 平台上加载
我是 DDK/WDM 驱动程序开发领域的初学者。我有一项任务涉及将虚拟设备驱动程序从 x86 移植到 x64(英特尔)。我得到了源代码,我对其进行了一些修改,并使用 DDK(构建环境)成功地编译了它。但是当我试图在 ia64 Windows7 机器上加载它时,它不想加载。然后我尝试了一些简单的设备驱动程序示例
-- http://www.codeproject.com/KB/system/driverdev.aspx(我放了'--'以便能够发布超链接)和其他链接,但仍然是同样的问题。
我在一个论坛上听说你用来链接的一些库与新机器不兼容,并建议链接到另一个类似的库……但仍然没有用。
当我构建时,我按照建议使用“-cefw”命令行参数。
我没有关联的 *.inf 文件,但我将它复制到 system32/drivers 中,并且我正在使用 WinObj 查看下次重新启动它是否已加载到内存中。
我还尝试了这个程序(http://www.codeproject.com/KB/system/tdriver.aspx)将驱动程序加载到内存中,但仍然没有为我工作。
请帮助我......我坚持这个,我的截止日期已经过去了。我觉得我在这里发疯了,试图发现我做错了什么。
driver - 微型过滤器功能是否需要启用 APC?
许多使用文件的 Zw* 函数(例如ZwCreateFile)需要在启用 APC 的情况下在 PASSIVE_LEVEL 调用:http: //msdn.microsoft.com/en-us/library/ff566424%28VS.85%29.aspx。这是因为,在内部,I/O 操作是异步的,并且操作的完成是通过 APC 传递的(如果我错了,请纠正我)。
但是,来自微型过滤器(例如FltCreateFile、FltReadFile等)的类似功能的文档并未指定应启用 APC。在禁用 APC 的情况下调用 FltCreateFile/FltReadFile 是否安全?
谢谢!
windows - 从 winDDK 安装示例部分驱动程序时遇到问题
我目前正在尝试构建一个应用程序,它将使用端口 IO 与超级 IO 芯片通信。作为其中的一部分,我正在尝试开发一个我可以联系的内核模式 Windows 驱动程序,它将为我执行 IO。因此,我下载了 Windows Driver Kit v7.1.0,构建 7600.16385.1,并尝试编译和安装 WDK 提供的示例部分驱动程序,因为它似乎非常接近我的需要。
我已经在免费和检查过的 x86 XP 构建环境中编译了驱动程序。这工作正常,但是当我尝试使用提供的说明安装生成的驱动程序时 - 这基本上相当于使用添加硬件向导,然后手动提供文件 - 我收到以下错误:
- 安装了以下硬件:示例 PortIO 驱动程序 (KMDF)
- 此设备的软件现已安装,但可能无法正常工作
-Windows 无法加载此硬件的驱动程序。驱动程序可能已损坏或丢失。(代码 39)
所以,我看到了两种解释:损坏或丢失。据我所知,鉴于我的环境变量和 .inf 文件,丢失意味着生成的 .sys 文件不在 c:\windows\system32\drivers 中,但是当我查看那里时,文件就在那里。
所以这意味着文件已损坏。鉴于我没有接触过驱动程序代码,并且我发现其他人有同样的问题,这似乎不是我的编译问题,而是代码本身的问题,或者机器类型的一些常见组合和代码。但我可能错了。
有人对如何解决这个问题有任何建议吗?
c - 卸载驱动程序时取消 WSK I/O 操作
我最近一直在学习如何使用 Windows DDK 编写驱动程序。在创建了一些测试驱动程序并尝试了系统线程和同步之后,我决定将其提高一个档次并编写一个可以实际做某事的驱动程序,尽管它是无用的。
目前,我的驱动程序使用 Winsock 内核连接到我的另一台计算机,并且只是循环并回显我发送给它的任何内容,直到它收到命令“退出”,这会导致它跳出循环。在我的循环中,在我调用WskReceive()
从另一台计算机获取一些数据之后,我习惯于KeWaitForMultipleObjects()
等待两个 SynchronizationEvents 中的任何一个。BlockEvent 由我的 IRP 设置,CompletionRoutine()
让我的线程知道它从套接字接收到一些数据。EndEvent 由我的DriverUnload()
例程设置,以告诉线程它正在被卸载并且它需要终止。
当我发送“退出”命令时,线程没有问题地终止,之后我可以安全地卸载驱动程序。但是,如果我在驱动程序仍在等待另一台计算机的数据时尝试停止驱动程序,则会出现蓝屏错误:DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS
在我得到 EndEvent 之后但在我退出循环之前,我尝试用 取消 IRPIoCancelIrp()
并用 完成它IoCompleteRequest()
,但这两个都给了我DRIVER_IRQL_NOT_LESS_OR_EQUAL
错误。
然后我尝试调用WskDisconnect()
,希望这会导致接收操作完成,但这让我回到了CANCELLING_PENDING_OPERATIONS
错误。
卸载驱动程序时,如何在运行的 IRQL 上取消 WSK 套接字的挂起 I/O 操作?
windows - Microsoft 驱动程序验证程序
在验证器对话框中,有一个窗口可以选择要验证的驱动程序。
列表控件有 4 列。
1. 验证?
2. 司机姓名。
3. 提供者
4. 版本
我的驱动程序的提供程序和版本表示为“未知”。
我不知道如何设置这些值。
我在哪里可以设置这个值?通过SignTool?还是资源文件?
是的,这不是一个大问题。但我想纠正这一点。
请告诉我。谢谢。
编辑:我们的驱动程序有一个 rc 文件。该文件定义了以下值。
VER_FILETYPE
VER_FILESUBTYPE
VER_FILEDESCRIPTION_STR
VER_INTERNALNAME_STR
VER_INTERNALNAME_STR
VER_LEGALCOPYRIGHT_YEARS
VER_LEGALCOPYRIGHT_STR
VER_ORIGINALFILENAME_STR
VER_COMPANYNAME_STR
VER_PRODUCTVERSION
VER_PRODUCTVERSION_STR
VER_FILEVERSION
VER_FILEVERSION_STR
VER_RIGHTNAME_STR
_
Windows 资源管理器很好地代表了我们的驱动程序版本和数字签名信息。但是驱动程序验证程序没有!
c - microsoft windows driver kit 纯C try catch 语法?
在Windows 驱动程序工具包 (WDK)中,有一些用纯 C 编写的驱动程序代码示例,但散布着一些 try-catch-finally 结构。有人知道他们的语义吗?感谢 Microsoft 提供的出色工具和标准合规性。
代码摘自some_file.c
:
c++ - DDK 生成的过时 PDB 文件
我在 VS.NET 2002 (C++) 中有一个非常简单的应用程序,它从 DLL 调用函数。DLL 使用 WINDDK 构建,MSC_OPTIMIZATION 设置为 /Od /Oi
当我尝试从 DLL 单步执行导出的函数时,它失败了。然后我尝试从 WINDDK(XP 检查环境)生成的 PDB 文件中加载符号,但我收到“pdb 格式已过时”消息。
PDB 文件是“Microsoft C/C++ MSF 7.00”
VS.NET 2002 能否读取此 PDB 文件,即。也许是旧的/新的?
问候奥利弗