真心求教一个DeviceIoControl的问题

lolliboy 2011-07-26 11:54:13
我使用DeviceIoControl从设备读数据失败,缓冲区没有填写数据。

关键代码
R3:

BYTE Buffer[1024];
memset(Buffer, 0, 1024);
DWORD dwLength = 0;
BOOL bRet = DeviceIoControl(
Device,
IOCTL_GETBUFFER,
NULL,
0,
Buffer,
1024,
&dwLength,
NULL);


DispachControl:

case IOCTL_GETBUFFER:
{
ULONG ulOutLen = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
PVOID pBuffer = irp->AssociatedIrp.SystemBuffer;
if(pBuffer == NULL)
DbgPrint("Invalid Buffer\n");
else if(ulOutLen != 1024)
DbgPrint("Invalid Length\n");
else
.....
}


最后打印的是Invalid Buffer,为什么缓冲区是NULL啊,我传入的Buffer是正确的呀。
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lolliboy 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 gw_net 的回复:]
[/Quote]

难道必须define成那什么CTL_CODE xxxx 啊?
woshi_ziyu 2011-07-26
  • 打赏
  • 举报
回复
没有用过这个函数 +++
gw_net 2011-07-26
  • 打赏
  • 举报
回复
应该不是用buffer的方式
lolliboy 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 guetcw 的回复:]
[/Quote]
我也在寻思,这个irp的缓冲区貌似就这一个吧,但如何区别输入和输出呢,
我就霸王硬上弓,读完输入后 直接把这个指针指向输出数据,

是不是应该Free了重新Allocate啊

[Quote=引用 2 楼 huntercao 的回复:]
[/Quote]
这个IOCTL就是一个普通的数字标号,我觉得DispatchControl根据这个数字就可以区别IO的类型了吧
曹大夯 2011-07-26
  • 打赏
  • 举报
回复
你的IOCTL_GETBUFFER是怎么定义的?是什么方式传送数据?
guetcw 2011-07-26
  • 打赏
  • 举报
回复
是这里有问题吧PVOID pBuffer = irp->AssociatedIrp.SystemBuffer;

不是你传的Buffer不正确

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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