通过 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# 的新手,希望您提供我可以探索的想法。

提前谢谢。

通过 Visual C# 的 Windows 驱动程序访问 IO 端口

Windows 中的驱动程序是内核模式组件,它们由操作系统直接加载到内核空间中(一般来说;某些驱动程序位于用户空间中,也可以存在于虚拟内存中,但这些都是例外(。您的驱动程序将(或者更确切地说:应该(由安装程序安装。如果只为您提供二进制文件,请与供应商联系以获取安装说明。每个驱动程序都有自己的特殊安装步骤,所以我无法告诉您如何安装它。

对于用户空间进程(即 .NET 应用程序(,使用 Win32 API 的DeviceIOControl函数向驱动程序发送消息,这些消息可以包括回调地址,使驱动程序能够与用户空间进程通信。

用户空间程序将执行以下操作:

  1. 调用 CreateFile 以创建表示设备的文件描述符
    • 忽略它被称为"文件"的事实,这是Windows类似于Unix的"一切都是文件"哲学的情况之一。
    • 例如,设备通常位于命名空间''.'${deviceName}下,该命名空间与Unix的/dev/${id}命名空间进行比较。请注意,每个反斜杠都需要转义,因此''.'Foo在 C/C++ 中变得"''''.''Foo"
    • Windows 中的文件描述符是表示多种对象的抽象,您可以使用 WinObj 实用程序查看对象列表:https://technet.microsoft.com/en-us/sysinternals/winobj.aspx
  2. 调用DeviceIoControl(从步骤 1 传入文件描述符(。
    • DeviceIoControl中的其他参数由驱动程序或驱动程序的"设备类"定义 - 不了解有关驱动程序的更多信息,我无法提供进一步的帮助。
  3. 事后别忘了打电话给CloseHandle
    • 请务必在特殊情况下调用它(例如,在 C# 的 finally 块中或将所有访问包装在 IDisposable 实现中(。当您处理来源不明的第三方驱动程序时,我不知道它将如何可靠地处理不可预测的用户空间进程。当然,这就是userland程序使整个系统崩溃的方式:通过DeviceIoControl触发内核模式驱动程序中的错误。

根据设备的不同,您的 userland 程序可能需要作为提升的进程(具有管理权限(运行,才能使DeviceIoControl调用成功。

MSDN 上的此页面详细介绍了如何使用DeviceIoControl与驱动程序通信:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363147(v=vs.85(.aspx但是需要从驱动程序文档中收集特定的参数值。