DeviceIoControl 的问题

zqcsh00 2009-05-20 10:21:54
我用DeviceIoControl 来跟驱动程序通讯, 在用户程序中传入一的IO控制号,怎么到驱动程序里头这个号就变了,DeviceIoControl 返回false, 驱动程序用debugview查看,谢谢!
...全文
126 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zqcsh00 2009-05-20
  • 打赏
  • 举报
回复
我也敢到很奇怪啊


IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
这里的值跟我传进来的已经不一样了
switch(IoControlCode)
{
case xxx:
break;
case xxx:
break;
case xxx:
break;
default:
这里也没有执行到
}

但分发例程还是执行完了,但DeviceIoControl返回false

更奇怪的是我是for执行的,调用同一个DeviceIoControl,
for( int i =0 ; i<1000; i ++ )
{
int vale = i;
DeviceIoControl(hDevice, MY_ControlCode, &vale, sizeof(int),0,0,&dwReturn,NULL);
}
当 i ==500时DeviceIoControl返回false,以后都是false, 我把for从i = 500开始,那他就OK了
从i = 490开始,到了500还是false,很是奇怪.
fiveofhearts 2009-05-20
  • 打赏
  • 举报
回复
驱动方面:
NTSTATUS DriverIoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
char* OutputBuffer;
char* InputBuffer;
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);

OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
OutputBuffer[0] = '\0';

switch(IrpStack->Parameters.DeviceIoControl.IoControlCode)
{
case 1000
break;
case 1004:
break;
case 1008://得到现在的SSDT
break;
}

Irp->IoStatus.Status = 0;
if (uLen)
Irp->IoStatus.Information = uLen;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return STATUS_SUCCESS ;
}

应用层:
char OutBuffer[10240];
DWORD dwReturn = 0;
HANDLE hDriver;
LoadDriver(&hDriver);
DeviceIoControl( hDriver, 1000, 0, 0,
OutBuffer, 10240, &dwReturn, 0);
if (dwReturn)
{
}

我自己程序的框架,io控制号我简单的硬编码了,没用标准的宏来弄。


个人感觉你是不是没有在用应用层IO命令的时候没设返回长度变量&dwReturn了?或者是你驱动力返回成功没写好?
zqcsh00 2009-05-20
  • 打赏
  • 举报
回复
GetLastError() = 5 拒绝访问

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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