kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1449回复:8

也许是分页的问题

楼主#
更多 发布于:2003-07-04 17:07
一个PCI卡数据帧大小为384个16位数,接收必须一次一帧的进行,所以我在设备扩展中设了一个大小为384的UNSIGNED SHORT类型的数据用于接收数据。在用SOFTICE的单步跟踪当中,可以看到所有数据都正确的接收到了,一直到最后一个。

为了使上层应用得到这些数据, 我用DeviceIoControl函数和一个足够大的数组去驱动程序中取数。结果发现,只有前192数据能够正确的被从底层取到上层。后面的数据无法读出来,我认为是数据分页的原因,但是具体怎么回事不清楚。

大家能帮我分析一下原因吗?并且讨论一下数据怎么完整的取到上层去。谢谢。
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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型的,所以每次读到一半数据还是对的,以后就出错了。

谢谢各位大虾的提示和启发,分到。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-07-05 21:21
干脆,这样:
IoctlResult = DeviceIoControl(
handle,
IOCTL_DATA_BACK;
Data;
sizeof(ULONG)*390; // Input
Data;
sizeof(ULONG)*390; // Output
&BytesReturned, NULL);

省的找原因了。
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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个数据,也会出现缺页错误。很奇怪。请大虾再看看。
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-05 10:14
你的程序可能有问题。
仔细看看下面
for (int i=0;i<384;i++)
{
*(pIOBuffer+i) = dx->FetchData;
}

dx->FetchData;
数组下标没有移动。


是我贴错了,应该是
for (int i=0;i<384;i++)
{
*(pIOBuffer+i) = dx->FetchData;
}

事实上我得到的前192个数据还是对的,之后数据就不对了。
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-04 23:14
你的程序可能有问题。
仔细看看下面
for (int i=0;i<384;i++)
{
*(pIOBuffer+i) = dx->FetchData;
}

dx->FetchData;
数组下标没有移动。
你的认可是对我最大的鼓励!
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-07-04 22:53
DeviceIoControl是怎么样的啊?
kittylh
驱动牛犊
驱动牛犊
  • 注册日期2002-04-16
  • 最后登录2004-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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的输出参数调用。请大虾看一下,谢了先。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2003-07-04 18:53
贴下你相关的代码?
可能是数据对齐的原因。
游客

返回顶部