关于DeviceIoControl的参数问题

watt 2006-03-06 04:56:25
目前跟踪一程序,程序首先用CreateFile打开一光盘比如E盘,然后使用DeviceIOControl函数,其中dwIoControlCode的值为0x41010和0x41018,请问0x41010和0x41018是何参数?
...全文
400 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Atomictry 2006-03-22
  • 打赏
  • 举报
回复
我上面说的那个“Function功能序号:4”是错误的,正确的你看下面。

#define ARG_DWORD 0x400
#define ARG_VOID 0
#define MY_DEVICE_CODE( fn, Access, ArgSize ) CTL_CODE( FILE_DEVICE_CONTROLLER, (0x400 + ArgSize + fn ), METHOD_BUFFERED, Access )
#define MY_DEVICE_CODE_1( fn, Access, ArgSize ) CTL_CODE( FILE_DEVICE_CONTROLLER, (0x3000 + ArgSize + fn ), METHOD_BUFFERED, Access )

// 0x41010 // (void)
#define IOCTL_Device_Func1 MY_DEVICE_CODE(4, FILE_ANY_ACCESS, ARG_VOID)
// 0x41018 // (void)
#define IOCTL_Device_Func2 MY_DEVICE_CODE(6, FILE_ANY_ACCESS, ARG_VOID)
// 0x4D014 // (ARG_DWORD dwSerialNo)
#define IOCTL_Device_Func3 MY_DEVICE_CODE_1(5, FILE_WRITE_ACCESS, ARG_DWORD)

这里的关于Function部分我不敢确定,因为0x400是微软保留的,而0x3000却又是为用户自定义的功能。

关于你的问题,你去问搞驱动的人,他们会更清楚。我只是以前看过gnu的代码发现有这么一回事。
估计你的代码是对一个设备进行打开、读、写、关闭等操作。如果当时写程序的人,写成这种格式就非常明白:
// Function codes
#define IOCTL_Device_Open DEVICE_CODE( 0, FILE_WRITE_ACCESS, ARG_DWORD) // (ARG_DWORD dwSerialNo)
#define IOCTL_Device_Close DEVICE_CODE( 1, FILE_WRITE_ACCESS, ARG_VOID) // (void)
#define IOCTL_Device_Read DEVICE_CODE( 2, FILE_WRITE_ACCESS, ARG_VOID) // (void)
#define IOCTL_Device_Write DEVICE_CODE( 3, FILE_WRITE_ACCESS, ARG_VOID) // (void)
#define IOCTL_Device_CancelIO DEVICE_CODE( 6, FILE_WRITE_ACCESS, ARG_VOID) // (void)
#define IOCTL_Device_GetSerialNumber DEVICE_CODE( 7, FILE_READ_ACCESS, ARG_VOID) // void

也就是上面的IOCTL_Device_Func1,IOCTL_Device_Func2,IOCTL_Device_Func3。
watt 2006-03-21
  • 打赏
  • 举报
回复
不会错,还用到4D014能不能在给分析一下。
watt 2006-03-07
  • 打赏
  • 举报
回复
这年控制码应该是常用的,但我只知道是0x41010和0x41018两个值,具体功能不清楚。
程序用Createfile打开一个光盘,然后使用DeviceIOControl读取,但我不知道读的什么东西?
Atomictry 2006-03-07
  • 打赏
  • 举报
回复
dwIoControlCode : // 这是MSDN中一句话
Control code to process. This member can be a developer-defined value or one of these system-defined values:
DIOC_CLOSEHANDLE
DIOC_GETVERSION

你所说的0x41010和0x41018值是由下面的宏得到的。
#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
)

以上的宏的意思是说, DeviceType,Access,Function分别左移,Method保持不变.
0x41010 = 100'0001'0000'0001'0000
所以0x41010 = CTL_CODE(FILE_DEVICE_CONTROLLER, 4, METHOD_BUFFERED, FILE_READ_ACCESS);
表示DeviceType设备类型:FILE_DEVICE_CONTROLLER;Function功能序号:4;Method方法:METHOD_BUFFERED;Access访问类型:FILE_READ_ACCESS

0x41018我推导出来有问题,发现Access等于8,是不是你写错了?
妍妍 2006-03-06
  • 打赏
  • 举报
回复
Control code for the operation. This value identifies the specific operation to be performed and the type of device on which to perform it.

这个控制码所代表的意思,应该是由发送者和接收者约定的吧
也有预定义的控制码
详细信息参考msdn吧

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧