newsky
驱动牛犊
驱动牛犊
  • 注册日期2003-03-07
  • 最后登录2013-09-12
  • 粉丝1
  • 关注0
  • 积分25分
  • 威望220点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1399回复:0

请教大牛 : IoAttachDeviceToDeviceStack时蓝屏重启

楼主#
更多 发布于:2009-03-05 10:04
现在正在做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);
游客

返回顶部