阅读:4971回复:6
请教:DeviceIoControl返回错误
下面的代码是一段最简单的应用程序,运行完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; } :( :( |
|
|
沙发#
发布于: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定义出入的问题,仔细检查一下。 |
|
|
板凳#
发布于:2002-06-18 09:39
上面那个IOCTL是在ntddser.h中定义,我继续查下去,过几天要是还查不出,还要麻烦帮主啊
:P 多谢帮主! |
|
|
地板#
发布于: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的错误。 |
|
|
地下室#
发布于: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都要经历的呢。 |
|
|
5楼#
发布于:2002-06-18 15:52
那你是把这个IOCTL发送到哪个驱动程序?你自己的驱动程序吗?那当然不行。
既然IOCTL都不是你自己定义的,你自己的驱动程序怎么会识别这个IOCTL 码呢? |
|
|
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了,为什么还是能发到驱动程序那去的呢(当然是我改写的那个驱动程序了)。 假如帮主你看到你刚才已经回答了我的这些疑问,请不要发火,假如已经发火了,请暂时不要告诉我答案,让我多想想,说不定就不那么笨了呢,可是要是依然如故,咋办:) |
|
|