cb615cb
驱动牛犊
驱动牛犊
  • 注册日期2002-08-18
  • 最后登录2005-01-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1976回复:5

应用程序和驱动程序进行通信的问题(DeviceIoControl)

楼主#
更多 发布于:2003-07-19 12:52
应用程序和驱动程序进行通信的问题(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()中的第三个参量取指针、取地址都试过了,还是只有一个值得到了传递!究竟是什么问题呢?如何解决?请帮帮忙!谢谢!

最新喜欢:

wfinewfine WY.lslrtWY.lsl... slummerslumme...
emt_lx
驱动牛犊
驱动牛犊
  • 注册日期2002-08-14
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-22 08:52
不给分,不回答 :P,其实,可能原因有两个,1,传递的指定长度有错误,应该是100*sizeof(USHORT)=200,2,不知你的UPLOAD_TO_DSP如何定义的?贴上来看看
emt_lx
驱动牛犊
驱动牛犊
  • 注册日期2002-08-14
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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 );}
这句只能打印打印第一个传递值

cb615cb
驱动牛犊
驱动牛犊
  • 注册日期2002-08-18
  • 最后登录2005-01-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-22 23:17
这个问题我已经得到了部分解决!
但是还有几个问题存在:
(1):不知道DeviceIoControl()函数中的nInBufferSize即应用程序传递到驱动程序的数据字节数有没有大小限制?
我试验写几个数据就是正确的,采用PCI2040的地址自增数据少也对,一多若达到几K的数据到后面就出错了呢?按道理还是在内部空间啊!
(2):同样的情况下,我的驱动程序什么改变都没有,在调用softice时,有时无缘无故地就蓝屏了!原因是什么呢?我对DS生成的框架对其中的OnStart和一个存储器映射函数进行了修改,其他几乎没有什么改变!
cb615cb
驱动牛犊
驱动牛犊
  • 注册日期2002-08-18
  • 最后登录2005-01-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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位的重复!
大概会是什么原因呢??
迷惑中!
cb615cb
驱动牛犊
驱动牛犊
  • 注册日期2002-08-18
  • 最后登录2005-01-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-05 14:43
问题已经解决,谢谢!
游客

返回顶部