hzhq
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2002-10-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4971回复:6

请教:DeviceIoControl返回错误

楼主#
更多 发布于:2002-06-17 15:33
下面的代码是一段最简单的应用程序,运行完DeviceIoControl时,没有返回数据,GetLastError返回值为1。在驱动程序中的ioctl_serial_get_baud处理部分已经设置好了irp.status/irp.information/.SystemBuffer等参数,irp不往下层驱动程序传递,立即返回应用程序。并且用softice追踪到应用程序已经向驱动分发ioctl_serial_get_baud_rate.
是DeviceIoControl参数不对,还是什么原因呢。我自己查了两个多星期了,都查不出,笨啊,没办法:(

哪位大侠帮指点一下,多谢!
#include \"ntddser.h\"
int main(int argc, char* argv[])
{
printf(\"\\nWdm1Test\\n\");
HANDLE hWdm1 = CreateFile(\"\\\\\\\\.\\\\COM4\",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hWdm1 == INVALID_HANDLE_VALUE) {
printf(\"XXX CreateFile can open COM port, error code : 0X%xH\\n\", GetLastError());
return 1;
}

printf(\"     Opened OK\\n\");
const int szPinLength = 8; // in bytes
IO_BLOCK ioBlock;
SERIAL_BAUD_RATE Rate; //Baud rate
ULONG ModemControl; //Modem Control
ULONG FifoData; //FIFO Data
//SERIAL_LINE_CONTROL LineControl;
BYTE devicePin[szPinLength];
DWORD dwBytes;
int index;

ioBlock.uOffset = 0;
ioBlock.uLength = 8;
ioBlock.pbyData = (PUCHAR)devicePin;
ioBlock.uIndex = GET_DEVICE_PIN;
Rate.BaudRate=0x112;
if(

DeviceIoControl(hWdm1,
  IOCTL_SERIAL_GET_BAUD_RATE,
  NULL,
      0,
  (PVOID)&Rate,
  4,
      &dwBytes,
      NULL)

){}
else {

printf(\"Error %d in call to DeviceIoControl\\n\", GetLastError());
}

printf(\"Baud Rate= %xh\",Rate.BaudRate);
if( !CloseHandle(hWdm1))
printf(\"XXX  CloseHandle failed, last error code : %d\\n\", GetLastError());
else
printf(\"     CloseHandle worked\\n\");

return 0;
}

 :( :(
hzhongqiu
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-17 15:44
很可能是IOCTL_SERIAL_GET_BAUD_RATE的定义错误,或者应用程序和驱动程序中的IOCTL定义得不一致。
 that function codes 0-2047 are reserved for Microsoft Corporation, and
 2048-4095 are reserved for customers.


#define CTL_CODE( DeviceType, Function, Method, Access ) (                 \\
    ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \\
你的DeviceType定义为什么?是否应用程序和驱动程序保持一致。
功能错误一定是IOCTL定义出入的问题,仔细检查一下。
Tom_lyd
hzhq
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2002-10-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-18 09:39
上面那个IOCTL是在ntddser.h中定义,我继续查下去,过几天要是还查不出,还要麻烦帮主啊

 :P
多谢帮主!
hzhongqiu
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-18 10:10
你的IOCTL code定义有错误,很可能是FILE_DEVICE_TYPE输入不正确,比如说:
在驱动程序中作如下定义:
#define   FILE_DEVICE_MYDEIVCE 0x8001
#define   IOCTL_SERIAL_GET_BAUD_RAT CTL_CODE( FILE_DEVICE_MYDEVICE,0x801,METHOD_BUFFERED, FILE_ANY_ACCESS )

那么你在创建驱动设备对象的时候是否也一样是采用这个值?即:
IoCreateDevice( pdo,sizeof(DEVICE_EXTENSION),&uDeviceName,
FILE_DEVICE_MYDEVICE,0,FALSE,&DeviceObject );
最后就是在应用程序中也需要包含IOCTL的定义,你保证了这几人处的值是完全一致的吗?如果完全一致,则一定不会出错,或者说,一定不会有GetLastError()返回1的错误。
Tom_lyd
hzhq
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2002-10-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-18 15:48
 :( :(
怪呢。
1,我自己定义的另一个IOCTL一点事都没有(即通过应用程序发送,驱动程序处理返回,全部正常)
2,上面说到的那个IOCTL_SERIAL_GET_BAUD_RATE是ntddser.h中定义的,在应用和驱动中都引用了同样的DDK/INC/ntddser.h.却出了问题。
3,GetLastError的错误码是1,incorrect function.可是这个错误发生了,应用程序还能正确地向驱动程序发送IOCTL_SERIAL_GER_BAUD_RATE.
谢谢帮主和各位大侠的指点,俺自己再想想,再想想。
 :( :mad: :o :)
呵呵,上面四个表情,不知道是不是每次DEBUG都要经历的呢。
hzhongqiu
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-18 15:52
那你是把这个IOCTL发送到哪个驱动程序?你自己的驱动程序吗?那当然不行。
既然IOCTL都不是你自己定义的,你自己的驱动程序怎么会识别这个IOCTL 码呢?
Tom_lyd
hzhq
驱动牛犊
驱动牛犊
  • 注册日期2001-08-21
  • 最后登录2002-10-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-06-18 16:46
头一次写驱动,真的好笨。#_%
1,我的驱动是用微软的POSUSB例子程序改的。基本的结构是,先创建一个USB FDO,初始化USB端口后,再创建一个串口com PDO,截取串口的IOCTL,然后发到USBDI。创建COM PDO时,已经定义设备类型是串口设备。难道我在驱动和应用程序里都包含了同一个ntddser.h,还不行吗。ntddser.h里面已经有了相同的IOCTL_SERIAL_GET_BAUD_RATE 和FILE_DEVICE_SERIAL_PORT的定义了啊.
2,我自己定义的那个IOCTL也是发到COM PDO那的,也是同一个串口设备类型。IOCTL_SERIAL_GET_BAUD_RATE是微软定义的IOCTL,应用程序已经报告incorrect function了,为什么还是能发到驱动程序那去的呢(当然是我改写的那个驱动程序了)。

假如帮主你看到你刚才已经回答了我的这些疑问,请不要发火,假如已经发火了,请暂时不要告诉我答案,让我多想想,说不定就不那么笨了呢,可是要是依然如故,咋办:)


hzhongqiu
游客

返回顶部