阅读:1399回复:0
请教大牛 : IoAttachDeviceToDeviceStack时蓝屏重启
现在正在做USB的虚拟串口驱动,在AddDevice的函数里,成功调用了IoCreateDevice后,再调用IoAttachDeviceToDeviceStack发生蓝屏重启,把调用IoAttachDeviceToDeviceStack那一行代码注释掉就不会发生蓝屏重启,请大牛赐教!!
AddDevice里面的主要代码如下: status=IoCreateDevice( DriverObject, sizeof(EVCOM_DEVICE_EXTENSION), &DeviceName, // Name FILE_DEVICE_SERIAL_PORT, FILE_DEVICE_SECURE_OPEN, TRUE, // Not exclusive &fdo); if(!NT_SUCCESS(status)) { DebugPrint("Create FDO failed !"); if(status==STATUS_INSUFFICIENT_RESOURCES) DebugPrint("Reason is STATUS_INSUFFICIENT_RESOURCES"); else if(status==STATUS_OBJECT_NAME_EXISTS) DebugPrint("Reason is STATUS_OBJECT_NAME_EXISTS"); else if(status==STATUS_OBJECT_NAME_COLLISION) DebugPrint("Reason is STATUS_OBJECT_NAME_COLLISION"); return status; } DebugPrint("IoCreateDevice OK"); dx=(PEVCOM_DEVICE_EXTENSION)fdo->DeviceExtension; RtlZeroMemory(dx, sizeof(EVCOM_DEVICE_EXTENSION)); RtlInitUnicodeString(&(dx->DeviceName),NULL); dx->DeviceName.MaximumLength = DeviceName.MaximumLength; dx->DeviceName.Length = DeviceName.Length; dx->DeviceName.Buffer = (PWSTR)ALLOCPOOL(NonPagedPool, dx->DeviceName.MaximumLength); if (dx->DeviceName.Buffer == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } RtlZeroMemory(dx->DeviceName.Buffer, dx->DeviceName.MaximumLength); RtlMoveMemory(dx->DeviceName.Buffer, DeviceName.Buffer, DeviceName.Length); DebugPrint("dx->DeviceName : %T",&(dx->DeviceName)); dx->DriverObject = DriverObject; dx->IsStarted = FALSE; dx->IsOpened = FALSE; dx->DeviceObject = fdo; dx->Pdo = pdo; dx->PowerState.DeviceState = PowerDeviceD0; // PoSetPowerState(fdo, DevicePowerState, dx->PowerState); InitializeListHead(&(dx->InQueue)); InitializeListHead(&(dx->OutQueue)); KeInitializeEvent(&(dx->InReadEvent), SynchronizationEvent, FALSE); KeInitializeEvent(&(dx->OutWriteEvent), SynchronizationEvent, FALSE); KeInitializeEvent(&(dx->StartEvent), SynchronizationEvent, FALSE); KeInitializeEvent(&(dx->StopEvent), SynchronizationEvent, FALSE); fdo->Flags |= DO_BUFFERED_IO; fdo->Flags |= DO_DIRECT_IO; if(pdo->Flags & DO_POWER_PAGABLE) { fdo->Flags |= DO_POWER_PAGABLE; } DebugPrint("IoAttachDeviceToDeviceStack - fdo : %d, pdo : %d",fdo, pdo); LowerLayerDeviceObject = IoAttachDeviceToDeviceStack(fdo, pdo); DebugPrint("LowerLayerDeviceObject - %d",LowerLayerDeviceObject); |
|