阅读:1137回复:5
救命!我的VXD采集驱动程序为什么老是蓝屏?
我是用VtoosD3.0开发VXD驱动程序。
包含IO端口操作、DMA和中断。 DMA 通道号为5,16bits传输。 int 号为4。 采集程序需要连续采集。我的方法: 采用VSharedHardwareInt 和 VDMAChannel。 DMA设为auto init模式。DMA设为8192字节。传送完后自动重新开始。而接口卡上每1024个DMA请求产生一个中断。 一般情况下能够正常采集。 现在的麻烦问题在于:老是要蓝屏。而且有一个特点,每当打开资源管理器操作硬盘或插入(拔除)USB接口上的优盘后,在主程序执行DeviceIoControl,vxd程序必然会出错: (softice窗口提示) Break due to page fault(0Eh), Fault = 0004 或者 Break due to General Protection Fault (0Dh). fault = 0000 用softice装入代码后,有时出错的代码在 OnW32DeviceIoControl的入口。 DWORD CSonicDrvDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams) { if(m_pSonicInt==NULL) return DEVIOCTL_ERROR; if(m_pSonicDMA==NULL) return DEVIOCTL_ERROR; switch (pDIOCParams->dioc_IOCtlCode) { case DIOC_OPEN: dprintf(\"DIOC_OPEN!\\n \"); break; case DIOC_CLOSEHANDLE: dprintf(\"DIOC_CLOSEHANDLE\\n! \"); break; 而且 即使DMA和中断处于mask状态,也要出错。 |
|
沙发#
发布于:2003-05-18 17:00
忘记提一点,这是ISA卡,vxd由应用程序动态装入。
各位大侠,好歹给个建议或分析。 |
|
板凳#
发布于:2004-05-17 10:01
楼主你好,我也在调ISA的DMA驱动,也是老蓝屏,不知怎么回事,我的错误也是fault(0Eh),而且一出错就vxd就卸载不掉,我怀疑是缓冲区容量申明的问题,因为我屏蔽掉初始化代码里的VDMABuffer::reserve(MAX_TRANSFER_PAGES,(PVOID)MAX_PHYS_ADDR);后就不会蓝屏了。我的DWORD MAX_TRANSFER_PAGES = 4096;DWORD MAX_PHYS_ADDR = 0x18000000;不知道这样申明缓冲区有什么问题?希望能和你共同探讨。QQ:63370649
我的初始代码如下: BOOL Arinc429Device::OnSysDynamicDeviceInit() { pMyIRQ = new MyHwInt(); if((pMyIRQ==NULL)||!pMyIRQ->hook()) return FALSE; pMyDMA = new MyDMAChannel(); if((pMyDMA==NULL)||!pMyDMA->hook()) return FALSE; VDMABuffer::reserve(MAX_TRANSFER_PAGES,(PVOID)MAX_PHYS_ADDR); return TRUE; } |
|
|
地板#
发布于:2004-05-31 16:08
我做过的Arinc429的卡也是ISA的,你有必要做VXD吗?直接DLL不就完了;再说这个VXD吧,就是缓冲区容量申明的问题!我以前是直接删除这条语句,照样能用。不懂再问吧,QQ:9487774
[编辑 - 5/31/04 by liu_xw917] |
|
地下室#
发布于:2004-06-03 23:21
试试看去掉 SoftIce, 我做的也是这样的类型的程序
选择不安装 SoftIce 从未出过蓝屏,在98下装driverstudio时候如果装了SoftIce有时候会有奇怪的故障 |
|
5楼#
发布于:2004-06-04 10:27
呵呵,你用这句了吗?
VDMABuffer::reserve(MAX_TRANSFER_PAGES,(PVOID)MAX_PHYS_ADDR); 如果用了,去掉这句就应该好了。 |
|
|