阅读:1449回复:8
也许是分页的问题
一个PCI卡数据帧大小为384个16位数,接收必须一次一帧的进行,所以我在设备扩展中设了一个大小为384的UNSIGNED SHORT类型的数据用于接收数据。在用SOFTICE的单步跟踪当中,可以看到所有数据都正确的接收到了,一直到最后一个。
为了使上层应用得到这些数据, 我用DeviceIoControl函数和一个足够大的数组去驱动程序中取数。结果发现,只有前192数据能够正确的被从底层取到上层。后面的数据无法读出来,我认为是数据分页的原因,但是具体怎么回事不清楚。 大家能帮我分析一下原因吗?并且讨论一下数据怎么完整的取到上层去。谢谢。 |
|
沙发#
发布于:2003-07-06 10:43
我知道原因了。偶犯了一个错误,在调用中
IoctlResult = DeviceIoControl( handle, IOCTL_DATA_BACK; Data; sizeof(ULONG)*390; // Input Data; sizeof(ULONG)*390; // Output &BytesReturned, NULL); Data的数据类型是USHORT,而不是ULONG。 而在驱动程序中 PULONG pIOBuffer = (PULONG) Irp->AssociatedIrp.SystemBuffer; pIOBuffer指针是ULONG型的,所以每次读到一半数据还是对的,以后就出错了。 谢谢各位大虾的提示和启发,分到。 |
|
板凳#
发布于:2003-07-05 21:21
干脆,这样:
IoctlResult = DeviceIoControl( handle, IOCTL_DATA_BACK; Data; sizeof(ULONG)*390; // Input Data; sizeof(ULONG)*390; // Output &BytesReturned, NULL); 省的找原因了。 |
|
地板#
发布于:2003-07-05 10:29
DeviceIoControl是怎么样的啊? IoctlResult = DeviceIoControl(handle, IOCTL_DATA_BACK; t; sizeof(t); // Input Data; sizeof(ULONG)*390; // Output &BytesReturned, NULL); 其中handle是设备句柄, BOOL IoctlResult; DWORD BytesReturned; ULONG t; ULONG Data[390] 这里Data数组的类型是ULONG,而驱动中从FIFO中取到的数放在一个USHORT数组中,是否这里类型转换导致数据对齐的问题? 并且,我试过用两次DeviceIoControl调用来取回数据,每次只取384个数据的一半,就是192个。结果发现,前192个数据还是能正确取到,后一半数据(也就是在第二个DeviceIoControl调用)仍旧不能取到,并且SOFTICE会报缺页错误,只好重新启动。假如先取后192个数据,也会出现缺页错误。很奇怪。请大虾再看看。 |
|
地下室#
发布于:2003-07-05 10:14
你的程序可能有问题。 是我贴错了,应该是 for (int i=0;i<384;i++) { *(pIOBuffer+i) = dx->FetchData; } 事实上我得到的前192个数据还是对的,之后数据就不对了。 |
|
5楼#
发布于:2003-07-04 23:14
你的程序可能有问题。
仔细看看下面 for (int i=0;i<384;i++) { *(pIOBuffer+i) = dx->FetchData; } dx->FetchData; 数组下标没有移动。 |
|
|
6楼#
发布于:2003-07-04 22:53
DeviceIoControl是怎么样的啊?
|
|
7楼#
发布于:2003-07-04 19:50
贴下你相关的代码? 我在派遣例程中是这样写的: case IOCTL_DATA_BACK: KdPrint( (\"Fetch Packet\\n\") ); Irp->IoStatus.Status = STATUS_SUCCESS; pIOBuffer = (PULONG) Irp->AssociatedIrp.SystemBuffer; if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < (sizeof(USHORT)*384)) { Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL; } else { for (int i=0;i<384;i++) { *(pIOBuffer+i) = dx->FetchData; } Irp->IoStatus.Information = sizeof(USHORT)*384; } status = Irp->IoStatus.Status; IoCompleteRequest( Irp, 0 ); return status; 其中dx->FetchData是大小为384的USHORT数组 在上层调用中,我定义了一个大小为390的ULONG的数组,名字为T,然后作为DeviceIoControl的输出参数调用。请大虾看一下,谢了先。 |
|
8楼#
发布于:2003-07-04 18:53
贴下你相关的代码?
可能是数据对齐的原因。 |
|