通过来自 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
函数向驱动程序发送消息,这些消息可以包含启用驱动程序的回调地址与用户态进程进行通信。
用户空间程序将执行此操作:
- 调用
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
- 调用
DeviceIoControl
(传入步骤 1 中的文件描述符)。
DeviceIoControl
中的其他参数由驱动程序或驱动程序定义"device class" - 不了解您的驱动程序我无法提供进一步的帮助。
- 之后别忘了给
CloseHandle
打电话。
- 一定要在特殊情况下调用它(例如,在 C# 中的
finally
块中或将所有访问包装在 IDisposable
实现中)。当您处理来源不明的第三方驱动程序时,我不知道它处理不可预测的用户进程的可靠性如何。当然,这就是用户态程序如何使整个系统崩溃:通过 DeviceIoControl
. 触发内核模式驱动程序中的错误
根据设备的不同,您的用户空间程序可能需要 运行 作为提升的进程(具有管理权限)才能使 DeviceIoControl
调用成功。
MSDN 上的此页面详细介绍了如何使用 DeviceIoControl
与驱动程序通信:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363147(v=vs.85).aspx 但是需要从驱动程序的文档中收集特定的参数值。
我有一个 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
函数向驱动程序发送消息,这些消息可以包含启用驱动程序的回调地址与用户态进程进行通信。
用户空间程序将执行此操作:
- 调用
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
- 调用
DeviceIoControl
(传入步骤 1 中的文件描述符)。DeviceIoControl
中的其他参数由驱动程序或驱动程序定义"device class" - 不了解您的驱动程序我无法提供进一步的帮助。
- 之后别忘了给
CloseHandle
打电话。- 一定要在特殊情况下调用它(例如,在 C# 中的
finally
块中或将所有访问包装在IDisposable
实现中)。当您处理来源不明的第三方驱动程序时,我不知道它处理不可预测的用户进程的可靠性如何。当然,这就是用户态程序如何使整个系统崩溃:通过DeviceIoControl
. 触发内核模式驱动程序中的错误
- 一定要在特殊情况下调用它(例如,在 C# 中的
根据设备的不同,您的用户空间程序可能需要 运行 作为提升的进程(具有管理权限)才能使 DeviceIoControl
调用成功。
MSDN 上的此页面详细介绍了如何使用 DeviceIoControl
与驱动程序通信:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363147(v=vs.85).aspx 但是需要从驱动程序的文档中收集特定的参数值。