关于DeviceIoControl的参数问题

watt 2006-03-06 04:56:25
目前跟踪一程序,程序首先用CreateFile打开一光盘比如E盘,然后使用DeviceIOControl函数,其中dwIoControlCode的值为0x41010和0x41018,请问0x41010和0x41018是何参数?
...全文
302 5 点赞 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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吧
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2006-03-06 04:56
社区公告

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