阅读:2071回复:12
又是DeviceIoControl惹的祸
又是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) { UCHAR bufInput[IOCTL_INBUF_SIZE]; // Input to device UCHAR 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] |
|
|
沙发#
发布于:2004-01-14 14:35
各位老大,一天多了也没有人搭理,斑竹呢?给点指示吗。只好自己顶顶了。
|
|
|
板凳#
发布于:2004-01-14 14:54
对于UCHAR类型的变量来说,用printf(\"%x...)输出时,是不会出现“0xFFFFFFE8,有时是0xFFFFFFC8”这种情况的
|
|
地板#
发布于:2004-01-14 15:12
检查一下你的数据线,看看和你的数据类型符不符合,不符合就有可能出现这样的情况。
|
|
|
地下室#
发布于:2004-01-14 15:31
0xFFFFFFE8或0xFFFFFFC8已经是4个字节的输出了,你用printf(\"%d\")试试。如果你的应用程序没出错的话,这真是个棘手的问题。
|
|
5楼#
发布于:2004-01-14 16:19
1、
b=(UCHAR)I.IoctlBuffer(); 这是什么?地址被截掉大部分,赋值给b。 2、 *(UCHAR*)I.IoctlBuffer()=b; I.Information() = sizeof(UCHAR); 那么这相当于是bufOutput[ 0 ]=b了 3、 printf(\"Data:0x%x\\n\",*bufOutput); 打印出bufOutput[ 0 ]的值。但是也不会0xFFFFFFC8这样的。 |
|
6楼#
发布于:2004-01-14 17:12
检查一下你的数据线,看看和你的数据类型符不符合,不符合就有可能出现这样的情况。
----------------------------- 不知你说的是哪儿的数据线?PCI侧还是LOCAL侧?我的LOCAL侧是8位复用的PCI侧是32位的。 |
|
|
7楼#
发布于:2004-01-14 17:23
对于UCHAR类型的变量来说,用printf(\"%x...)输出时,是不会出现“0xFFFFFFE8,有时是0xFFFFFFC8”这种情况的
--------------------- 我已经改正了,目前是没有前面的0xFFFFFF字符了,而且已经把UCHAR改成ULONG了,不过返回的数据还是不对,刚编译完VC的测试程序后返回的是0x28,然后是0x8,一直是0x8就不变了。为什么不是我想要的0xcf呢? |
|
|
8楼#
发布于:2004-01-14 21:48
我知道怎么回事了!
把例程NTSTATUS ThinDevice::READ_DATA_Handler(KIrp I)里的 b=(UCHAR)I.IoctlBuffer(); 改成 UCHAR* p=(UCHAR*)I.IoctlBuffer(); b=p[0]; 再不成就没天理了 |
|
9楼#
发布于:2004-01-15 19:23
老大,不灵呀,还有其他招没有?
|
|
|
10楼#
发布于:2004-01-15 20:07
你的DEVICE IO 是METHOD_BUFFERED方式吗
|
|
11楼#
发布于:2004-01-20 12:02
谢谢大家的关注,首先祝大家春节快乐!
我在用DS生成框架时选择的是Buffer类啊! |
|
|
12楼#
发布于:2008-07-31 14:24
试试用wprintf()看看
|
|