阅读:1976回复:5
应用程序和驱动程序进行通信的问题(DeviceIoControl)
应用程序和驱动程序进行通信的问题(DeviceIoControl)
问题如下:(为了突出问题,我只从程序中取出了相关的一段。) 应用程序中调用DeviceIoControl: USHORT bufInput[100]; for(int i=0;i<100;i++) bufInput=100-i; if (!DeviceIoControl(hDevice, UPLOAD_TO_DSP, bufInput, 100, NULL, 0, &nOutput, NULL) ) { printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError()); Exit(1); } 传递了100个数到驱动程序中。 驱动程序: NTSTATUS status = STATUS_SUCCESS; ULONG StartPos = 0; ULONG wLength = 0 ; ULONG *pBuffer = NULL; pBuffer = (PULONG)I.IoctlBuffer(); if(pBuffer == NULL) { I.Information() = 0; status = STATUS_BUFFER_TOO_SMALL; } else { StartPos = 0x80; //中断向量首地址 wLength = I.IoctlInputBufferSize(); m_Ctl_MemoryRange.outw(PCI_DSP_HPIC_OFFSET,0x0303); m_Ctl_MemoryRange.outd(PCI_DSP_HPIA_OFFSET,StartPos); ///这里的个数应该怎么设定?传递过来的是什么类型? for(ULONG i=0;i<wLength/2;i++) { m_Ctl_MemoryRange.outd(PCI_DSP_HPID0_OFFSET,pBuffer ); DbgPrint(\"Current Data is %x \\n\", pBuffer ); } } return status; 这个程序通过softice 在驱动里面看到只有应用程序数组中的第一个数:100得到了传递,其余所有数都变成了0。(即没有传递!)为什么呢 ? 我将DeviceIoControl()中的第三个参量取指针、取地址都试过了,还是只有一个值得到了传递!究竟是什么问题呢?如何解决?请帮帮忙!谢谢! |
|
沙发#
发布于:2003-07-22 08:52
不给分,不回答 :P,其实,可能原因有两个,1,传递的指定长度有错误,应该是100*sizeof(USHORT)=200,2,不知你的UPLOAD_TO_DSP如何定义的?贴上来看看
|
|
板凳#
发布于:2003-07-22 13:09
对了,for(ULONG i=0;i<wLength/2;i++)
{ m_Ctl_MemoryRange.outd(PCI_DSP_HPID0_OFFSET,pBuffer ); DbgPrint(\"Current Data is %x \\n\", pBuffer );} 这句只能打印打印第一个传递值 |
|
地板#
发布于:2003-07-22 23:17
这个问题我已经得到了部分解决!
但是还有几个问题存在: (1):不知道DeviceIoControl()函数中的nInBufferSize即应用程序传递到驱动程序的数据字节数有没有大小限制? 我试验写几个数据就是正确的,采用PCI2040的地址自增数据少也对,一多若达到几K的数据到后面就出错了呢?按道理还是在内部空间啊! (2):同样的情况下,我的驱动程序什么改变都没有,在调用softice时,有时无缘无故地就蓝屏了!原因是什么呢?我对DS生成的框架对其中的OnStart和一个存储器映射函数进行了修改,其他几乎没有什么改变! |
|
地下室#
发布于:2003-07-23 14:19
问题(1)已经明白了,DeviceIoControl传递的是数据“字节”个数,与前面的数据类型无关!
但是现在我往DSP的HPI口发送数据, for(USHORT i=0;i<wLength/4;i++) { m_Ctl_MemoryRange.outw(PCI_DSP_HPID0_OFFSET,(USHORT)pBuffer); DbgPrint(\"Current %d Data is %x \\n\",i, (USHORT)pBuffer); } 现在发送的数据是正确的了。但是接下来我专门从DSP读取数据,就完全不对了!我再次检查了硬件,连接上没有问题,或者有我不明白的问题,现在的情况如下: // 写完后再从DSP读取到的数据都是错误的。 // 都是地址信息的高8位的重复! // 地址0x1000读取到:0x1010; 地址0x1001读取到:0x1010; // 地址0x007e读取到:0x0000; 地址0x007f读取到:0x0000; // 地址0x2000读取到:0x2020; 地址0x2001读取到:0x2020; // 都是地址信息的高8位的重复! 大概会是什么原因呢?? 迷惑中! |
|
5楼#
发布于:2003-08-05 14:43
问题已经解决,谢谢!
|
|