【发布时间】:2010-04-21 12:09:36
【问题描述】:
我正在使用一个 WinCE 设备,该设备具有在 MFC 中为其编写的无线电管理器驱动程序。在 Radio GUI 的代码中,我可以看到调用了特定 IOCTL 的函数 Deviceiocontrol。但是,我无法跟踪此函数调用的特定代码。有人能告诉我 Deviceiocontrol 是如何工作的吗?
【问题讨论】:
标签: visual-studio mfc windows-ce device-driver
我正在使用一个 WinCE 设备,该设备具有在 MFC 中为其编写的无线电管理器驱动程序。在 Radio GUI 的代码中,我可以看到调用了特定 IOCTL 的函数 Deviceiocontrol。但是,我无法跟踪此函数调用的特定代码。有人能告诉我 Deviceiocontrol 是如何工作的吗?
【问题讨论】:
标签: visual-studio mfc windows-ce device-driver
DeviceIoControl 使用文件句柄调用设备驱动程序。如果要单步执行设备驱动程序本身,则必须使用内核调试器。
文件句柄代表一个内核对象,它由一个包含函数表的 DEVICE_OBJECT 结构组成。在这个 IRP_MJ_DEVICE_CONTROL 索引处的表中,驱动程序设置了它的句柄函数。然后使用打包到 IRP 中的 io 控制参数调用该函数。
【讨论】:
Rmgr* 是您传递给DeviceIoControl 的设备句柄。当您调用CreateFile 时会填充此句柄。其人口的确切方式是特定于驱动程序/实现的。它可能会在每次调用驱动程序的 XXX_Open 时填充,并且可能在驱动程序的 XXX_Init 期间填充,它可能只是驱动程序返回的虚拟句柄。特定于驱动程序。
您有发送 IOCTL 的驱动程序的源代码吗?
您将句柄传递给DeviceIoControl - 使用对CreateFile(L"XXX#:",...) 的调用打开句柄 - XXX 是注册表中设置的驱动程序前缀。 # 是驱动程序在加载时给出的索引(也可以在注册表中设置)。
要查看执行的功能,请在驱动程序的源代码中搜索您发送到DeviceIoControl 的 IOCTL。你会在XXX_IoControl的驱动实现中找到它。
【讨论】: