通过 Visual C# 的 Windows 驱动程序访问 IO 端口
本文关键字:访问 IO 端口 驱动程序 Windows Visual 通过 | 更新日期: 2023-09-27 18:34:06
我有一个Windows驱动程序(.sys(格式
我需要从Visual C#访问此驱动程序。当我尝试将此驱动程序添加为 Visual C# 的引用时,出现以下错误"确保这是有效的程序集或 COM 组件">
编辑 驱动程序是通过 IO 端口控制 WDT,并具有 IOCTL 调用。如何使用驱动程序并使用 VC# 应用程序设置/重置监视器?
我是 VC# 的新手,希望您提供我可以探索的想法。
提前谢谢。
Windows 中的驱动程序是内核模式组件,它们由操作系统直接加载到内核空间中(一般来说;某些驱动程序位于用户空间中,也可以存在于虚拟内存中,但这些都是例外(。您的驱动程序将(或者更确切地说:应该(由安装程序安装。如果只为您提供二进制文件,请与供应商联系以获取安装说明。每个驱动程序都有自己的特殊安装步骤,所以我无法告诉您如何安装它。
对于用户空间进程(即 .NET 应用程序(,使用 Win32 API 的DeviceIOControl
函数向驱动程序发送消息,这些消息可以包括回调地址,使驱动程序能够与用户空间进程通信。
用户空间程序将执行以下操作:
- 调用
CreateFile
以创建表示设备的文件描述符- 忽略它被称为"文件"的事实,这是Windows类似于Unix的"一切都是文件"哲学的情况之一。
- 例如,设备通常位于命名空间
''.'${deviceName}
下,该命名空间与Unix的/dev/${id}
命名空间进行比较。请注意,每个反斜杠都需要转义,因此''.'Foo
在 C/C++ 中变得"''''.''Foo"
。 - Windows 中的文件描述符是表示多种对象的抽象,您可以使用 WinObj 实用程序查看对象列表:https://technet.microsoft.com/en-us/sysinternals/winobj.aspx
- 调用
DeviceIoControl
(从步骤 1 传入文件描述符(。DeviceIoControl
中的其他参数由驱动程序或驱动程序的"设备类"定义 - 不了解有关驱动程序的更多信息,我无法提供进一步的帮助。
- 事后别忘了打电话给
CloseHandle
。- 请务必在特殊情况下调用它(例如,在 C# 的
finally
块中或将所有访问包装在IDisposable
实现中(。当您处理来源不明的第三方驱动程序时,我不知道它将如何可靠地处理不可预测的用户空间进程。当然,这就是userland程序使整个系统崩溃的方式:通过DeviceIoControl
触发内核模式驱动程序中的错误。
- 请务必在特殊情况下调用它(例如,在 C# 的
根据设备的不同,您的 userland 程序可能需要作为提升的进程(具有管理权限(运行,才能使DeviceIoControl
调用成功。
MSDN 上的此页面详细介绍了如何使用DeviceIoControl
与驱动程序通信:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363147(v=vs.85(.aspx但是需要从驱动程序文档中收集特定的参数值。