阅读:1534回复:9
METHOD_IN_DERECT应用的问题,急
要从系统向设备传送数据进行DMA,利用DeviceIoControl函数:
应用程序中: union { ULONG buf1[BUFFER_LENGTH+1]; UCHAR buf2[BUFFER_LENGTH*4]; }bufIn;//四字节对齐,用户态字节为单位,驱动中双字为单位。 ULONG nOut; file.Read(bufIn.buf2,BUFFER_LENGTH*4); DeviceIoControl(hdevice, IOCTL_PLAY_START, bufIn.buf1, BUFFER_LENGTH*4, NULL,NULL, &nOut, NULL); 驱动中: //**ioctl.h: #define TS_IOCTL_PLAY_START CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_IN_DIRECT, FILE_ANY_ACCESS ) //**device.cpp: VOID TsDevice::Serial_IOCTL_PLAY_START_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; status = dma.Initiate( this, &m_Dma_Ts, I.Mdl(), FromMemoryToDevice, LinkTo(CallBack_Dma) ); if(!NT_SUCCESS(status)) { I.Information() = 0; I.Status() = status; m_DriverManagedQueue.NextIrp(I); } } 调试发现,在dma.Initiate时出现页错误,现在可以肯定是访问IRP的Mdl造成的。 关键不在Dma的流程,因为即使不进行DMA,在这里一访问I.Mdl就出现页错误。 那位大侠能指点一二,如问题解决可以送好多可用分。 :) |
|
最新喜欢:![]()
|
沙发#
发布于:2002-10-15 15:31
这个问题解决了,原来要传送的数据应放在bufOut。 那可能是因为ds封装的时候这样封装的 用ddk就没有这个问题 :D 你还有什么问题,拿出来看看 现成的例子没有呀 |
|
|
板凳#
发布于:2002-10-15 15:22
这个问题解决了,原来要传送的数据应放在bufOut。
但我的DMA(总线主控)还是有问题。肥虫虫对这有研究吗?有没有成功的例子共享一下?有重谢阿 |
|
|
地板#
发布于:2002-10-15 15:18
这个原因在于,应该把要传送的数据放在bufOut里。
这个问题解决了,但我的DMA还是有问题,再发贴问吧。 分就少给点,不然ZN不愿意 ;) |
|
|
地下室#
发布于:2002-10-15 13:35
这里出现页错的情况 天呀,怎么会这样? :( |
|
|
5楼#
发布于:2002-10-15 13:30
这里出现页错的情况
就是定义ioctl和接受传下来的缓冲区不一致的时候会出现 但是我看你的程序是正确的 :mad: |
|
|
6楼#
发布于:2002-10-15 13:17
看不出来哪里有问题 :mad: 对,最头疼的就是这一点! 那么出现页错误的原因有可能有那些呢?我的框架是DS的向导生成的。 |
|
|
7楼#
发布于:2002-10-15 13:14
用的DS?DS不太会玩,你自己解决吧。 这不等于没说吗? 其实用DDK也一样,道理是相通的呀。我就是迷惑如何访问IRP携带的数据 |
|
|
8楼#
发布于:2002-10-15 13:13
看不出来哪里有问题 :mad:
|
|
|
9楼#
发布于:2002-10-15 13:02
用的DS?DS不太会玩,你自己解决吧。
|
|