阅读:1718回复:6
求助 装驱动蓝屏问题
各位驱动高手:
在下手头有一个usb摄像头驱动,在其它类型的机器上运行正常,但在ESC的主板上一装就蓝屏死机,以下是部分功能代码: NTSTATUS InitializeDevice( PHW_DEVICE_EXTENSION pDev, PPORT_CONFIGURATION_INFORMATION pConf ) { NTSTATUS status ; RtlZeroMemory( pDev, sizeof(HW_DEVICE_EXTENSION) ); KeInitializeSpinLock( &(pDev->DataSpinLock) ); pConf->StreamDescriptorSize = sizeof(HW_STREAM_HEADER) + DRIVER_STREAM_COUNT * sizeof(HW_STREAM_INFORMATION); pDev->PDO = pConf->PhysicalDeviceObject; pDev->DriverMediumInstanceCount = GlobalDriverMediumInstanceCount++; for( ULONG i = 0; i < SIZEOF_ARRAY(CrossbarMediums); i++ ) CrossbarMediums.Id = pDev->DriverMediumInstanceCount; for( i = 0; i < SIZEOF_ARRAY(CaptureMediums); i++ ) CaptureMediums.Id = pDev->DriverMediumInstanceCount; pDev->pStrmEx[0] = pDev->pStrmEx[1] = NULL; PUSB_DEVICE_DESCRIPTOR pDevDesc = (PUSB_DEVICE_DESCRIPTOR)ExAllocatePool( NonPagedPool, sizeof(USB_DEVICE_DESCRIPTOR) ); if( pDevDesc == NULL ) return STATUS_INSUFFICIENT_RESOURCES; ULONG StackSize, DescSiz; PURB pSelectUrb; USBD_INTERFACE_LIST_ENTRY IntfList[2]; PUSBD_INTERFACE_INFORMATION pIntfObj = NULL; PUSB_CONFIGURATION_DESCRIPTOR pConfDesc = NULL; ULONG UrbSize = sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST); PURB pUrb = (PURB)ExAllocatePool( NonPagedPool, UrbSize ); UsbBuildGetDescriptorRequest( pUrb, (USHORT)UrbSize, USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, pDevDesc, NULL, UrbSize, NULL ); // status = Send_Cntrl_URB( pDev, pUrb ); if( !NT_SUCCESS(status) ) goto ERROR1; . . . ERROR1: if( pUrb != NULL ) { ExFreePool( pUrb ); } if( pDevDesc != NULL ) { ExFreePool( pDevDesc ); } return status; } 用SoftIce调试,错误发生在倒数第二句(有下划线标注的),运行这一句后会蓝屏,错误提示:“BAD ”。 应该不会是代码的语法之类的错误,因为可以正常编译生成sys文件,也可以在其它电脑上正常运行。我能想到的可能的原因是与主板冲突。现在我想请问一下: 为什么会产生冲突,又该如何解决? 还望各位不吝赐教 |
|
沙发#
发布于:2008-01-07 15:19
错误提示是“BAD_POOL_HEADER”,错误码“0x000000019”
|
|
板凳#
发布于:2008-01-08 09:31
用于对象初始化的应该用PagedPool,你将 PUSB_DEVICE_DESCRIPTOR pDevDesc = (PUSB_DEVICE_DESCRIPTOR)ExAllocatePool( NonPagedPool, sizeof(USB_DEVICE_DESCRIPTOR) ); 中的NonPagedPool改一下试试。
|
|
|
地板#
发布于:2008-01-08 10:38
多谢您的热心回复,可是后面的UsbBuildGetDescriptorRequest()会用到这个pDevDesc,而UsbBuildGetDescriptorRequest()也要求这块区域必须是NonPagedPool的。
我也试了一下,果然提示错误“PAGE_FAULT_IN_NONPAGE_AREA” |
|
地下室#
发布于:2008-01-09 11:34
看代码好像没问题。你注释掉中间代码只申请,释放试试看是哪里引起的。
还有把变量定义全放在函数开始部分,不一定是这个问题,但有时这个能引起很诡异的问题 |
|
5楼#
发布于:2008-01-10 09:52
多谢了,我试过了,只申请,再释放是不会蓝屏的.我又偿试对
UsbBuildGetDescriptorRequest( pUrb, (USHORT)UrbSize, USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, pDevDesc, NULL, UrbSize, NULL ); 做修改.我从查阅了这个函数的资料,这个函数中的倒数第二个参数应该用来说明pDevDesc(倒数第四个参数)的大小.所以我把UrbSize给改成了sizeof(USB_DEVICE_DESCRIPTOR),这样就不会蓝屏了.但是用Amcap试的时候,Amcap总是先弹出提示框"Cannot run preview graph".总要先关掉这个提示框,然后先关掉preview ,然后再打开preview才可以正常运行. 还有一个问题:怎么给分啊,虽然我没有多少分,但也总想对各位的热心回复表示一点心意. |
|
6楼#
发布于:2008-01-10 09:57
对于上面所述的AMCAP的问题,也请大家给点意见.多谢了!
|
|