IOCTL 可以用于向驱动程序发送自定义输入吗

Posted

技术标签:

【中文标题】IOCTL 可以用于向驱动程序发送自定义输入吗【英文标题】:Can IOCTL be used in sending custom input to a Driver 【发布时间】:2018-07-14 02:12:52 【问题描述】:

对不起,如果这是一个菜鸟问题,但我正在为游戏开发软件“插件”。我通过驱动程序这样做只是因为反作弊不支持环 0 检测。我还没有看到太多关于如何使用 IOCTL 的信息,我想知道您是否可以发送自定义输入,例如进程 ID 和其他可能会更改的信息,或者它们是否像开关功能或其他东西一样一成不变。再次为菜鸟问题感到抱歉。

【问题讨论】:

抱歉语法很糟糕,凌晨 4 点,我整晚都没有睡 没有规则,IOCTL 让你为所欲为。 这就是ioctl 的全部意义所在。它是一个简单的通用接口,可让您在标准 I/O 操作不适合时添加所需的任何驱动程序特定操作。 【参考方案1】:

您可以使用DeviceIoControl Win32 API 例程通过 IOCTL 与内核模式设备驱动程序进行通信。该例程在内部调用NtDeviceIoControlFile (NTDLL),后者执行系统调用以执行NtDeviceIoControlFile (NTOSKRNL)

DeviceIoControl 例程记录在 MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/aa363216(v=vs.85).aspx

内核模式设备驱动程序需要满足一个先决条件:https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/named-device-objects

我没有看到太多关于如何使用 IOCTL 的信息,我想知道您是否可以发送自定义输入,如进程 ID 和其他信息

答案是肯定的,您可以通过 IOCTL 发送自定义缓冲区。您还可以从内核模式设备驱动程序接收输出缓冲区返回到启动 IOCTL 操作的用户模式应用程序 - 这当然是可选的。

如果您需要同时发送多条信息,请考虑使用结构。

我还建议您阅读以下内容: https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/methods-for-accessing-data-buffers

【讨论】:

以上是关于IOCTL 可以用于向驱动程序发送自定义输入吗的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中将 IOCTL 发送到 Windows 上的所有驱动程序

如何从驱动程序向另一个驱动程序(不在同一个堆栈中)进行 IOCTL 调用(在 Windows 上)

在 FreeBSD 中实现 ioctl() 命令

使用 DeviceIoControl 从应用程序向驱动程序发送数据

我可以向 Outlook 添加自定义“发送”按钮吗?

IOCTL Linux 设备驱动程序 [关闭]