亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bulkpnp.c

?? 基于linux的s3c2410開發板usb驅動程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
BulkUsb_StartDevice(
    IN  PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    Called from BulkUsb_ProcessPnPIrp(), the dispatch routine for IRP_MJ_PNP.
    Initializes a given instance of the device on the USB.
    USB client drivers such as us set up URBs (USB Request Packets) to send requests
    to the host controller driver (HCD). The URB structure defines a format for all
    possible commands that can be sent to a USB device.
    Here, we request the device descriptor and store it, and configure the device.


Arguments:

    DeviceObject - pointer to the FDO (Functional Device Object)

Return Value:

    NT status code

--*/
{
    PDEVICE_EXTENSION deviceExtension;
    NTSTATUS ntStatus;
    PUSB_DEVICE_DESCRIPTOR deviceDescriptor = NULL;
    PURB urb;
    ULONG siz;

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_StartDevice\n"));

    deviceExtension = DeviceObject->DeviceExtension;

    urb = BULKUSB_ExAllocatePool(NonPagedPool,
                         sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));

    BULKUSB_KdPrintCond( DBGLVL_HIGH,!urb, ("BulkUsb_StartDevice() FAILED BULKUSB_ExAllocatePool() for URB\n"));

    if (urb) {

        siz = sizeof(USB_DEVICE_DESCRIPTOR);

        deviceDescriptor = BULKUSB_ExAllocatePool(NonPagedPool,
                                          siz);

        BULKUSB_KdPrintCond( DBGLVL_HIGH, !deviceDescriptor, ("BulkUsb_StartDevice() FAILED BULKUSB_ExAllocatePool() for deviceDescriptor\n"));

        if (deviceDescriptor) {

            UsbBuildGetDescriptorRequest(urb,
                                         (USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                                         USB_DEVICE_DESCRIPTOR_TYPE,
                                         0,
                                         0,
                                         deviceDescriptor,
                                         NULL,
                                         siz,
                                         NULL);


            ntStatus = BulkUsb_CallUSBD(DeviceObject, urb);

            BULKUSB_KdPrintCond( DBGLVL_DEFAULT, !NT_SUCCESS(ntStatus), ("BulkUsb_StartDevice() FAILED BulkUsb_CallUSBD(DeviceObject, urb)\n"));

            if (NT_SUCCESS(ntStatus)) {
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("Device Descriptor = %x, len %x\n",
                                deviceDescriptor,
                                urb->UrbControlDescriptorRequest.TransferBufferLength));

                BULKUSB_KdPrint( DBGLVL_MEDIUM,("I82930 Device Descriptor:\n"));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("-------------------------\n"));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bLength %d\n", deviceDescriptor->bLength));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bDescriptorType 0x%x\n", deviceDescriptor->bDescriptorType));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bcdUSB 0x%x\n", deviceDescriptor->bcdUSB));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bDeviceClass 0x%x\n", deviceDescriptor->bDeviceClass));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bDeviceSubClass 0x%x\n", deviceDescriptor->bDeviceSubClass));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bDeviceProtocol 0x%x\n", deviceDescriptor->bDeviceProtocol));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bMaxPacketSize0 0x%x\n", deviceDescriptor->bMaxPacketSize0));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("idVendor 0x%x\n", deviceDescriptor->idVendor));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("idProduct 0x%x\n", deviceDescriptor->idProduct));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bcdDevice 0x%x\n", deviceDescriptor->bcdDevice));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("iManufacturer 0x%x\n", deviceDescriptor->iManufacturer));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("iProduct 0x%x\n", deviceDescriptor->iProduct));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("iSerialNumber 0x%x\n", deviceDescriptor->iSerialNumber));
                BULKUSB_KdPrint( DBGLVL_MEDIUM,("bNumConfigurations 0x%x\n", deviceDescriptor->bNumConfigurations));
            }
        } else {
                        // if we got here we failed to allocate deviceDescriptor
            ntStatus = STATUS_INSUFFICIENT_RESOURCES;
        }

        if (NT_SUCCESS(ntStatus)) {
            deviceExtension->UsbDeviceDescriptor = deviceDescriptor;
        } else if (deviceDescriptor) {
            BULKUSB_ExFreePool(deviceDescriptor);
        }

        BULKUSB_ExFreePool(urb);

    } else {
                // if we got here we failed to allocate the urb
        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }

    if (NT_SUCCESS(ntStatus)) {
        ntStatus = BulkUsb_ConfigureDevice(DeviceObject);

        BULKUSB_KdPrintCond( DBGLVL_MEDIUM,!NT_SUCCESS(ntStatus),("BulkUsb_StartDevice BulkUsb_ConfigureDevice() FAILURE (%x)\n", ntStatus));
    }


    if (NT_SUCCESS(ntStatus)) {
        deviceExtension->DeviceStarted = TRUE;
    }
    BULKUSB_KdPrint( DBGLVL_DEFAULT, ("exit BulkUsb_StartDevice (%x)\n", ntStatus));

    return ntStatus;
}


NTSTATUS
BulkUsb_RemoveDevice(
    IN  PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

        Called from BulkUsb_ProcessPnPIrp() to
    clean up our device instance's allocated buffers; free symbolic links

Arguments:

    DeviceObject - pointer to the FDO

Return Value:

    NT status code from free symbolic link operation

--*/
{
    PDEVICE_EXTENSION deviceExtension;
    NTSTATUS ntStatus = STATUS_SUCCESS;
    UNICODE_STRING deviceLinkUnicodeString;

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_RemoveDevice\n"));

    deviceExtension = DeviceObject->DeviceExtension;

    RtlInitUnicodeString (&deviceLinkUnicodeString,
                          deviceExtension->DeviceLinkNameBuffer);

    // remove the GUID-based symbolic link
    ntStatus = IoSetDeviceInterfaceState(&deviceLinkUnicodeString, FALSE);
    BULKUSB_ASSERT( NT_SUCCESS( ntStatus ) );

    //
    // Free device descriptor structure
    //

    if (deviceExtension->UsbDeviceDescriptor) {
        BULKUSB_ExFreePool(deviceExtension->UsbDeviceDescriptor);
        deviceExtension->UsbDeviceDescriptor = NULL;
    }

    //
    // Free pipe info structs
    //
    if( deviceExtension->PipeInfo ) {

        BULKUSB_ExFreePool( deviceExtension->PipeInfo );
        deviceExtension->PipeInfo = NULL;
    }


    //
    // Free up the UsbInterface structure
    //
    if (deviceExtension->UsbInterface) {
        BULKUSB_ExFreePool(deviceExtension->UsbInterface);
        deviceExtension->UsbInterface = NULL;
    }

        // free up the USB config discriptor
    if (deviceExtension->UsbConfigurationDescriptor) {
        BULKUSB_ExFreePool(deviceExtension->UsbConfigurationDescriptor);
        deviceExtension->UsbConfigurationDescriptor = NULL;
    }


    // free the pending irp list
    if ( deviceExtension->PendingIoIrps ) {
        BULKUSB_ExFreePool(deviceExtension->PendingIoIrps );
        deviceExtension->PendingIoIrps = NULL;
    }

        BULKUSB_ASSERT( gExAllocCount == 0 );
    BULKUSB_KdPrint( DBGLVL_HIGH,("exit BulkUsb_RemoveDevice() gExAllocCount = dec %d\n", gExAllocCount ));

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("exit BulkUsb_RemoveDevice() status = 0x%x\n", ntStatus ));

    return ntStatus;
}




NTSTATUS
BulkUsb_StopDevice(
    IN  PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    Stops a given instance of a 82930 device on the USB.
    We basically just tell USB this device is now 'unconfigured'

Arguments:

    DeviceObject - pointer to the device object for this instance of a 82930

Return Value:

    NT status code

--*/
{
    PDEVICE_EXTENSION deviceExtension;
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PURB urb;
    ULONG siz;

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_StopDevice\n"));

    deviceExtension = DeviceObject->DeviceExtension;

    //
    // Send the select configuration urb with a NULL pointer for the configuration
    // handle. This closes the configuration and puts the device in the 'unconfigured'
    // state.
    //

    siz = sizeof(struct _URB_SELECT_CONFIGURATION);

    urb = BULKUSB_ExAllocatePool(NonPagedPool,
                         siz);

    if (urb) {
        UsbBuildSelectConfigurationRequest(urb,
                                          (USHORT) siz,
                                          NULL);

        ntStatus = BulkUsb_CallUSBD(DeviceObject, urb);

        BULKUSB_KdPrintCond( DBGLVL_DEFAULT,!NT_SUCCESS(ntStatus),("BulkUsb_StopDevice() FAILURE Configuration Closed status = %x usb status = %x.\n", ntStatus, urb->UrbHeader.Status));

        BULKUSB_ExFreePool(urb);
    } else {
        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }


    if (NT_SUCCESS(ntStatus)) {
        deviceExtension->DeviceStarted = FALSE;
    }

    deviceExtension->StopDeviceRequested = FALSE;

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("exit BulkUsb_StopDevice() (%x)\n", ntStatus));

    return ntStatus;
}



NTSTATUS
BulkUsb_IrpCompletionRoutine(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
/*++

Routine Description:

    Used as a  general purpose completion routine so it can signal an event,
    passed as the Context, when the next lower driver is done with the input Irp.
        This routine is used by both PnP and Power Management logic.

    Even though this routine does nothing but set an event, it must be defined and
    prototyped as a completetion routine for use as such


Arguments:

    DeviceObject - Pointer to the device object for the class device.

    Irp - Irp completed.

    Context - Driver defined context, in this case a pointer to an event.

Return Value:

    The function value is the final status from the operation.

--*/
{
    PKEVENT event = Context;

    // Set the input event
    KeSetEvent(event,
               1,       // Priority increment  for waiting thread.
               FALSE);  // Flag this call is not immediately followed by wait.

    // This routine must return STATUS_MORE_PROCESSING_REQUIRED because we have not yet called
    // IoFreeIrp() on this IRP.
    return STATUS_MORE_PROCESSING_REQUIRED;

}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩亚洲欧美中文三级| 韩国女主播一区| 不卡视频一二三| 国产欧美一区二区三区沐欲| 国产乱人伦偷精品视频不卡| 中文天堂在线一区| 波多野结衣精品在线| 亚洲视频你懂的| 欧美午夜不卡在线观看免费| 视频一区二区三区在线| 日韩免费在线观看| 国产成人午夜精品5599| 综合久久一区二区三区| 日韩女优制服丝袜电影| 色天使久久综合网天天| 蜜芽一区二区三区| 在线电影院国产精品| 久久精品国产一区二区三区免费看| 精品久久久久久久久久久久久久久 | 国产精品色哟哟网站| 8x8x8国产精品| 激情偷乱视频一区二区三区| 亚洲综合视频网| 欧美成人精品二区三区99精品| 丁香五精品蜜臀久久久久99网站| 亚洲激情av在线| 日韩限制级电影在线观看| 91精品福利视频| 久久av老司机精品网站导航| 亚洲五码中文字幕| 久久这里都是精品| 一本大道久久a久久精品综合| 国产精品一区二区在线观看网站 | 国产精品三级av在线播放| 精品伦理精品一区| 欧美一级夜夜爽| 色综合久久中文综合久久97| 欧洲国产伦久久久久久久| 爽好久久久欧美精品| 亚洲精品高清视频在线观看| 中文字幕亚洲不卡| 欧美一级黄色片| 制服丝袜亚洲网站| 777a∨成人精品桃花网| 在线播放国产精品二区一二区四区| 91福利资源站| 在线欧美一区二区| 欧美性色黄大片| 欧美在线视频全部完| 欧美自拍偷拍一区| 欧美日韩一区三区四区| 国产不卡视频在线播放| 成人免费视频播放| 久久成人麻豆午夜电影| 精品一区二区免费看| 性做久久久久久久免费看| 国产精品女同一区二区三区| 国产精品国产三级国产三级人妇| 91精品国产综合久久香蕉的特点| 欧美一区二区免费视频| 精品国精品自拍自在线| 欧美三级韩国三级日本三斤| 欧美剧情电影在线观看完整版免费励志电影| 欧美日韩免费视频| 日韩欧美资源站| 久久精品一区二区三区不卡牛牛| 欧美一区三区四区| 久久综合色天天久久综合图片| 国产欧美精品区一区二区三区 | 国产精品国产自产拍高清av王其| 一区二区三区在线不卡| 国产婷婷色一区二区三区在线| 国产午夜精品在线观看| 亚洲欧美日韩国产另类专区| 中文成人综合网| 亚洲人成伊人成综合网小说| 亚洲福利视频导航| 韩日av一区二区| 99热精品一区二区| 777欧美精品| 国产精品网站在线播放| 亚洲福利一区二区三区| 国产精品资源站在线| 色婷婷综合久久久久中文一区二区| 欧美高清视频www夜色资源网| 久久影院午夜片一区| 亚洲精品菠萝久久久久久久| 蜜臀va亚洲va欧美va天堂| av色综合久久天堂av综合| 欧美人狂配大交3d怪物一区| 欧美精选一区二区| 国产欧美精品国产国产专区| 亚洲福利一区二区三区| 成人黄色综合网站| 91精品国产手机| 国产精品久久久久三级| 日韩二区三区四区| 六月丁香婷婷色狠狠久久| 91香蕉视频黄| 日本久久一区二区| 26uuu久久综合| 亚洲高清久久久| 9色porny自拍视频一区二区| 日韩视频免费观看高清完整版在线观看 | 日本韩国一区二区三区| 欧美大白屁股肥臀xxxxxx| 国产视频一区在线观看| 日韩和欧美一区二区| 99在线精品免费| 精品国产第一区二区三区观看体验| 亚洲精品你懂的| 成人app在线观看| 精品国产乱码久久久久久夜甘婷婷 | 粉嫩av一区二区三区在线播放| 色94色欧美sute亚洲线路一ni| 国产午夜精品一区二区| 奇米精品一区二区三区在线观看一| 91视频精品在这里| 国产精品视频观看| 韩国女主播成人在线| 欧美电影免费观看完整版| 亚洲图片有声小说| 色偷偷一区二区三区| 欧美国产一区视频在线观看| 亚洲欧美综合色| 国产成人免费视频一区| 久久影院午夜论| 国产综合久久久久久鬼色 | 国产成人亚洲精品青草天美| 欧美一级二级三级乱码| 日韩在线卡一卡二| 欧美日本韩国一区二区三区视频| 亚洲欧美另类在线| 91麻豆成人久久精品二区三区| 欧美国产在线观看| 成人亚洲精品久久久久软件| 久久久国产一区二区三区四区小说| 亚洲综合激情另类小说区| 不卡的看片网站| 国产精品久久久久久一区二区三区| 成人午夜免费av| 国产精品久99| 欧美一区二区三区系列电影| 视频一区视频二区中文| 欧美日本在线一区| 亚洲高清免费观看 | 精品国内片67194| 国产一区视频网站| 91久久久免费一区二区| 亚洲区小说区图片区qvod| 91免费看`日韩一区二区| 亚洲男人的天堂在线观看| 色丁香久综合在线久综合在线观看| 亚洲另类在线一区| 欧美精品在线视频| 天天操天天综合网| 日本道免费精品一区二区三区| 亚洲色图欧洲色图| 欧洲亚洲国产日韩| 日韩国产一二三区| 日韩一区二区三区四区五区六区 | 波多野结衣在线一区| 1024成人网| 欧美日韩国产区一| 免费成人在线播放| 国产精品视频麻豆| 欧美三级中文字幕| 韩国精品一区二区| 国产精品久久久久久亚洲伦 | 一本大道久久精品懂色aⅴ| 亚洲午夜国产一区99re久久| 欧美日韩成人综合| 国产永久精品大片wwwapp | 国产精品国产自产拍高清av| 欧美在线小视频| 精品一区二区免费| 一二三区精品福利视频| 日韩午夜av电影| 成人av在线观| 午夜精品成人在线视频| 久久久久久97三级| 欧美视频一二三区| 国产自产2019最新不卡| 亚洲人成网站色在线观看| 91精品国产免费| 成人av动漫在线| 蜜桃视频在线观看一区二区| 国产精品嫩草影院com| 91麻豆精品国产91久久久| 成人午夜视频福利| 久久国产人妖系列| 亚洲精品videosex极品| 久久精品亚洲一区二区三区浴池 | 午夜影院在线观看欧美| 国产欧美一区视频| 91精品国产麻豆| 色久综合一二码| 国产传媒一区在线| 日本成人在线一区| 亚洲精品菠萝久久久久久久|