阅读:1116回复:3
测试的应用程序返回的数据很古怪(DeviceIoControl)
测试的应用程序返回的数据很古怪:
当驱动中希望返回0x00~0x7F时,应用程序返回的是0x00~0x7F; 而当驱动中希望返回>0x7F,例如期望返回0xAF时,应用程序返回的却是0xFFFFFFAF. 为什么会变呢?DeviceIoControl函数究竟怎么用才正确呢? 以下是驱动和应用测试程序的有关代码: 驱动中: NTSTATUS ThinDevice::READ_DATA_Handler(KIrp I) { NTSTATUS status; UCHAR a[84]; int i; UCHAR b; b=0xa5; if(I.IoctlOutputBufferSize()>=sizeof(UCHAR)) { *(UCHAR*)I.IoctlBuffer()=b; I.Information() = sizeof(UCHAR); status=STATUS_SUCCESS; } else { I.Information()=0; status=STATUS_BUFFER_TOO_SMALL; } return status; } 应用程序中: void Test_READ_DATA(void) { CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device CHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device ULONG nOutput; // Count written to bufOutput // Call device IO Control interface (READ_DATA) in driver printf(\"Issuing Ioctl to device - \"); if (!DeviceIoControl(hDevice, READ_DATA, bufInput, IOCTL_INBUF_SIZE, bufOutput, IOCTL_OUTBUF_SIZE, &nOutput, NULL) ) { printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError()); Exit(1); } else printf(\"Data:0x%x\\n\",*bufOutput); } 哪位大侠指导一下啊,困了好几天了。 |
|
|
沙发#
发布于:2004-01-13 19:57
你把
CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device CHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device 改为 UCHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device UCHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device 试试 |
|
板凳#
发布于:2004-01-13 20:22
给分先。
大侠果然是高手,刚刚试了试,果然灵验(不知能否给个联系方法,我的email:hawk@emails.bjut.edu.cn),不过又有新问题如下: 又是DeviceIoControl惹的祸 应用程序中置数,驱动中接收到后立刻返回该数,但是数就变了,为什么? 请各位老大援手,以下是程序段: 驱动: NTSTATUS ThinDevice::READ_DATA_Handler(KIrp I) { NTSTATUS status; UCHAR a[84]; UCHAR b; b=(UCHAR)I.IoctlBuffer(); if(I.IoctlOutputBufferSize()>=sizeof(UCHAR)) { *(UCHAR*)I.IoctlBuffer()=b; I.Information() = sizeof(UCHAR); status=STATUS_SUCCESS; } else { I.Information()=0; status=STATUS_BUFFER_TOO_SMALL; } return status; } WRITE_DATA_HANDLER中未作处理。 应用程序中: #define IOCTL_INBUF_SIZE 512 #define IOCTL_OUTBUF_SIZE 512 void Test_READ_DATA(void) { CHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device CHAR bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device ULONG nOutput; // Count written to bufOutput // Call device IO Control interface (READ_DATA) in driver printf(\"Issuing Ioctl to device - \"); if (!DeviceIoControl(hDevice, READ_DATA, NULL, 0, bufOutput, IOCTL_OUTBUF_SIZE, &nOutput, NULL) ) { printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError()); Exit(1); } else { printf(\"Reveiving Data Now...\\n\"); printf(\"Data:0x%x\\n\",*bufOutput); } } 返回的数有时是0x8,有时是0xFFFFFFE8,有时是0xFFFFFFC8,怎么一个原因呢? 请各位大虾援手!!! [编辑 - 1/13/04 by hawkdtw] [编辑 - 1/13/04 by hawkdtw] |
|
|
地板#
发布于:2004-01-13 20:27
你把CHAR改为UCHAR就可以了,
你不访用printf(\"%d...\")替换printf(\"%x...\"),就会发现所谓出错的地方全是负数。其实你没错,程序也没错,只是你认为打印结果错了。 你比我深入得多,我基本上都是用DS做的,现在才刚摸DDK,互相切磋:dswei99@sina.com [编辑 - 1/13/04 by dswei] |
|