通过来自 Visual C# 的 windows 驱动程序访问 IO 端口

Access IO ports via windows driver from Visual C#

我有一个 Windows 驱动程序 (.sys) 格式

我需要从 Visual C# 访问此驱动程序。 当我尝试从 Visual C# 添加此驱动程序作为参考时,出现以下错误 "Make sure this is a valid assembly or COM component"

编辑 驱动是通过IO口控制WDT,有IOCTL调用。如何通过 VC# 应用程序使用驱动程序和 set/reset 看门狗?


我是 VC# 的新手,希望您提供我可以探索的想法。

提前致谢。

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

对于用户态进程(即您的 .NET 应用程序),您使用 Win32 API 的 DeviceIOControl 函数向驱动程序发送消息,这些消息可以包含启用驱动程序的回调地址与用户态进程进行通信。

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

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

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

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