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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? hub.c

?? 這是一個(gè)開放源代碼的與WINNT/WIN2K/WIN2003兼容的操作系統(tǒng)
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
        purb = NULL;
    }

    return status;
}

void
hub_int_completion(PURB purb, PVOID pcontext)
{

    PUSB_DEV pdev;
    PHUB2_EXTENSION hub_ext;
    ULONG port_idx;
    PUSB_CTRL_SETUP_PACKET psetup;
    NTSTATUS status;
    LONG i;
    PHCD hcd;

    USE_BASIC_NON_PENDING_IRQL;

    if (purb == NULL)
        return;

    if (pcontext == NULL)
    {
        usb_free_mem(purb);
        return;
    }

    usb_dbg_print(DBGLVL_ULTRA, ("hub_int_completion(): entering...\n"));

    pdev = purb->pdev;
    hub_ext = pcontext;

    lock_dev(pdev, TRUE);
    if (dev_state(pdev) == USB_DEV_STATE_ZOMB)
    {
        unlock_dev(pdev, TRUE);
        usb_free_mem(purb);
        return;
    }

    hcd = pdev->hcd;

    if (purb->status == STATUS_SUCCESS)
    {

        for(i = 1; i <= hub_ext->port_count; i++)
        {
            if (hub_ext->int_data_buf[i >> 3] & (1 << i))
            {
                break;
            }
        }
        if (i > hub_ext->port_count)
        {
            //no status change, re-initialize the int request
            unlock_dev(pdev, TRUE);
            usb_free_mem(purb);
            hub_start_int_request(pdev);
            return;
        }

        port_idx = (ULONG)i;

        //re-use the urb to get port status
        purb->pendp = &pdev->default_endp;
        purb->data_buffer = (PUCHAR) & hub_ext->port_status;

        purb->data_length = sizeof(USB_PORT_STATUS);
        purb->pdev = pdev;

        purb->context = hub_ext;
        purb->pdev = pdev;
        purb->completion = hub_get_port_status_completion;
        purb->reference = port_idx;

        psetup = (PUSB_CTRL_SETUP_PACKET) purb->setup_packet;

        psetup->bmRequestType = 0xa3;   //host-device class other recepient
        psetup->bRequest = USB_REQ_GET_STATUS;
        psetup->wValue = 0;
        psetup->wIndex = (USHORT) port_idx;
        psetup->wLength = 4;

        purb->pirp = NULL;
        unlock_dev(pdev, TRUE);

        status = hcd->hcd_submit_urb(hcd, pdev, purb->pendp, purb);
        if (usb_error(status))
        {
            usb_free_mem(purb);
            purb = NULL;
        }
        else if (status == STATUS_SUCCESS)
        {
            // this is for root hub
            hcd->hcd_generic_urb_completion(purb, purb->context);
        }
        return;
    }
    else
    {
        unlock_dev(pdev, TRUE);
        if (usb_halted(purb->status))
        {
            //let's reset pipe
            usb_reset_pipe(pdev, purb->pendp, hub_reset_pipe_completion, NULL);
        }
        //unexpected error
        usb_free_mem(purb);
        purb = NULL;
    }
    return;
}

VOID
hub_get_port_status_completion(PURB purb, PVOID context)
{
    PUSB_DEV pdev;
    PUSB_ENDPOINT pendp;
    BYTE port_idx;
    PHUB2_EXTENSION hub_ext;
    PUSB_CTRL_SETUP_PACKET psetup;
    NTSTATUS status;
    PHCD hcd;

    USE_BASIC_NON_PENDING_IRQL;

    if (purb == NULL || context == NULL)
        return;

    usb_dbg_print(DBGLVL_MAXIMUM, ("hub_get_port_feature_completion(): entering...\n"));

    pdev = purb->pdev;
    pendp = purb->pendp;

    lock_dev(pdev, TRUE);
    if (dev_state(pdev) == USB_DEV_STATE_ZOMB)
    {
        unlock_dev(pdev, TRUE);
        usb_free_mem(purb);
        return;
    }

    hcd = pdev->hcd;
    if (usb_error(purb->status))
    {
        unlock_dev(pdev, TRUE);

        purb->status = 0;
        //simply retry the request refer to item 55 in document
        status = hcd->hcd_submit_urb(hcd, pdev, pendp, purb);
        if (status != STATUS_PENDING)
        {
            if (status == STATUS_SUCCESS)
            {
                hcd->hcd_generic_urb_completion(purb, purb->context);

            }
            else
            {
                //
                // must be fatal error
                // FIXME: better to pass it to the completion for further
                // processing? 
                //
                usb_free_mem(purb);
            }
        }
        return;
    }

    hub_ext = hub_ext_from_dev(pdev);
    port_idx = (BYTE) purb->reference;

    usb_dbg_print(DBGLVL_MAXIMUM, ("hub_get_port_stataus_completion(): port_idx=0x%x, hcd =0x%x, \
                  pdev=0x%x, purb=0x%x, hub_ext=0x%x, portsc=0x%x \n", port_idx, pdev->hcd, pdev,
                  purb, hub_ext, *((PULONG) purb->data_buffer)));

    psq_enqueue(&hub_ext->port_status_queue[port_idx], *((PULONG) purb->data_buffer));

    //reuse the urb to clear the feature
    RtlZeroMemory(purb, sizeof(URB));

    purb->data_buffer = NULL;
    purb->data_length = 0;
    purb->pendp = &pdev->default_endp;
    purb->pdev = pdev;

    purb->context = (PVOID) & hub_ext->port_status;
    purb->pdev = pdev;
    purb->completion = hub_clear_port_feature_completion;
    purb->reference = port_idx;

    psetup = (PUSB_CTRL_SETUP_PACKET) purb->setup_packet;

    psetup->bmRequestType = 0x23;       //host-device class port recepient
    psetup->bRequest = USB_REQ_CLEAR_FEATURE;
    psetup->wIndex = port_idx;
    psetup->wLength = 0;
    purb->pirp = NULL;

    if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_CONNECTION)
    {
        psetup->wValue = USB_PORT_FEAT_C_CONNECTION;
    }
    else if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_ENABLE)
    {
        psetup->wValue = USB_PORT_FEAT_C_ENABLE;
    }
    else if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_SUSPEND)
    {
        psetup->wValue = USB_PORT_FEAT_C_SUSPEND;
    }
    else if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_OVERCURRENT)
    {
        psetup->wValue = USB_PORT_FEAT_C_OVER_CURRENT;
    }
    else if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_RESET)
    {
        psetup->wValue = USB_PORT_FEAT_C_RESET;
    }
    unlock_dev(pdev, TRUE);

    status = hcd->hcd_submit_urb(hcd, pdev, pendp, purb);

    // if( status != STATUS_SUCCESS )
    if (status != STATUS_PENDING)
    {
        hcd->hcd_generic_urb_completion(purb, purb->context);
    }
    /*else if( usb_error( status ) )
       {
       usb_free_mem( purb );
       return;
       } */
    return;

}

VOID
hub_clear_port_feature_completion(PURB purb, PVOID context)
{
    BYTE port_idx;
    LONG i;
    BOOLEAN event_post, brh;
    ULONG pc;
    PHCD hcd;
    NTSTATUS status;
    PUSB_DEV pdev;
    PHUB2_EXTENSION hub_ext = NULL;
    PUSB_DEV_MANAGER dev_mgr;

    PUSB_CTRL_SETUP_PACKET psetup;

    USE_BASIC_NON_PENDING_IRQL;

    if (purb == NULL)
        return;

    if (context == NULL)
    {
        usb_free_mem(purb);
        return;
    }

    usb_dbg_print(DBGLVL_MAXIMUM, ("hub_clear_port_feature_completion(): entering...\n"));

    pdev = purb->pdev;
    port_idx = (BYTE) purb->reference;

    lock_dev(pdev, TRUE);
    dev_mgr = dev_mgr_from_dev(pdev);
    hcd = pdev->hcd;
    brh = (BOOLEAN) (dev_class(pdev) == USB_DEV_CLASS_ROOT_HUB);

    if (usb_error(purb->status))
    {
        unlock_dev(pdev, TRUE);

        purb->status = 0;

        // retry the request
        status = hcd->hcd_submit_urb(hcd, purb->pdev, purb->pendp, purb);
        if (status != STATUS_PENDING)
        {
            if (status == STATUS_SUCCESS)
            {
                hcd->hcd_generic_urb_completion(purb, purb->context);
            }
            else
            {
                //
                // FIXME: should we pass the error to the completion directly
                // instead of forstall it here? 
                //
                // do not think the device is workable, no requests to it any more.
                // including the int polling
                //
                // usb_free_mem( purb );
                //
                goto LBL_SCAN_PORT_STAT;
            }
        }
        return;
    }

    if (dev_state(pdev) == USB_DEV_STATE_ZOMB)
    {
        unlock_dev(pdev, TRUE);
        usb_free_mem(purb);
        return;
    }

    pc = ((PUSB_PORT_STATUS) context)->wPortChange;

    if (pc)
    {
        // the bits are tested in ascending order
        if (pc & USB_PORT_STAT_C_CONNECTION)
        {
            pc &= ~USB_PORT_STAT_C_CONNECTION;
        }
        else if (pc & USB_PORT_STAT_C_ENABLE)
        {
            pc &= ~USB_PORT_STAT_C_ENABLE;
        }
        else if (pc & USB_PORT_STAT_C_SUSPEND)
        {
            pc &= ~USB_PORT_STAT_C_SUSPEND;
        }
        else if (pc & USB_PORT_STAT_C_OVERCURRENT)
        {
            pc &= ~USB_PORT_STAT_C_OVERCURRENT;
        }
        else if (pc & USB_PORT_STAT_C_RESET)
        {
            pc &= ~USB_PORT_STAT_C_RESET;
        }
    }
    ((PUSB_PORT_STATUS) context)->wPortChange = (USHORT) pc;

    hub_ext = hub_ext_from_dev(pdev);

    if (pc)
    {
        //some other status change on the port still active
        psetup = (PUSB_CTRL_SETUP_PACKET) purb->setup_packet;

        if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_CONNECTION)
        {
            psetup->wValue = USB_PORT_FEAT_C_CONNECTION;
        }
        else if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_ENABLE)
        {
            psetup->wValue = USB_PORT_FEAT_C_ENABLE;
        }
        else if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_SUSPEND)
        {
            psetup->wValue = USB_PORT_FEAT_C_SUSPEND;
        }
        else if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_OVERCURRENT)
        {
            psetup->wValue = USB_PORT_FEAT_C_OVER_CURRENT;
        }
        else if (hub_ext->port_status.wPortChange & USB_PORT_STAT_C_RESET)
        {
            psetup->wValue = USB_PORT_FEAT_C_RESET;
        }
        unlock_dev(pdev, TRUE);

        status = hcd->hcd_submit_urb(hcd, pdev, purb->pendp, purb);
        if (status != STATUS_PENDING)
        {
            if (status == STATUS_SUCCESS)
            {
                usb_dbg_print(DBGLVL_MAXIMUM,
                              ("hub_clear_port_status_completion(): port_idx=0x%x, hcd=0x%x, \
                              pdev=0x%x, purb=0x%x, hub_ext=0x%x, wPortChange=0x%x \n",
                              port_idx, pdev->hcd, pdev, purb, hub_ext, pc));

                hcd->hcd_generic_urb_completion(purb, purb->context);
            }
            else
            {
                usb_dbg_print(DBGLVL_MAXIMUM, (" hub_clear_port_feature_completion(): \
                              error=0x%x\n", status));

                // usb_free_mem( purb );
                goto LBL_SCAN_PORT_STAT;
            }
        }
        return;
    }

    for(i = 1; i <= hub_ext->port_count; i++)
    {
        if (hub_ext->int_data_buf[i >> 3] & (1 << i))
        {
            break;
        }
    }

    //clear the port-change map, we have get port i's status.
    hub_ext->int_data_buf[i >> 3] &= ~(1 << i);

    //rescan to find some other port that has status change
    for(i = 1; i <= hub_ext->port_count; i++)
    {
        if (hub_ext->int_data_buf[i >> 3] & (1 << i))
        {
            break;
        }
    }

    if (i <= hub_ext->port_count)
    {
        //still has port-change pending, get the port status change
        port_idx = (UCHAR) i;

        //re-use the urb
        purb->data_buffer = (PUCHAR) & hub_ext->port_status;
        purb->data_length = sizeof(USB_PORT_STATUS);
        purb->pendp = &pdev->default_endp;
        purb->pdev = pdev;

        purb->context = hub_ext;
        purb->pdev = pdev;
        purb->completion = hub_get_port_status_completion;
        purb->reference = port_idx;

        psetup = (PUSB_CTRL_SETUP_PACKET) purb->setup_packet;

        psetup->bmRequestType = 0xa3;   //host-device class other recepient
        psetup->bRequest = USB_REQ_GET_STATUS;
        psetup->wValue = 0;
        psetup->wIndex = port_idx;
        psetup->wLength = 4;

        purb->pirp = NULL;

        unlock_dev(pdev, TRUE);

        status = hcd->hcd_submit_urb(hcd, pdev, purb->pendp, purb);
        if (status != STATUS_PENDING)
        {
            if (status == STATUS_SUCCESS)
            {
                hcd->hcd_generic_urb_completion(purb, purb->context);
            }
            else
            {                   //must be fatal error
                // usb_free_mem( purb );
                goto LBL_SCAN_PORT_STAT;
            }
        }
        return;
    }

    unlock_dev(pdev, TRUE);

LBL_SCAN_PORT_STAT:

    //all status changes are cleared

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品福利视频网站| 狠狠色丁香婷综合久久| 欧美精品一区二区三区在线 | 99久久国产免费看| 午夜精品福利一区二区蜜股av| 国产欧美日韩久久| 欧美精品xxxxbbbb| 色综合天天综合网国产成人综合天| 免费成人在线观看| 亚洲男人的天堂在线观看| 欧美精品一区二区三区四区| 欧美日韩一区成人| 色婷婷综合视频在线观看| 国产一区二区免费看| 天堂蜜桃一区二区三区| 亚洲视频一二区| 国产亚洲欧美一区在线观看| 欧美一区二区在线看| 在线观看日韩精品| 91影视在线播放| 国内精品在线播放| 美女视频网站黄色亚洲| 午夜av区久久| 亚洲一区av在线| 国产精品美女久久久久aⅴ国产馆| 欧美一区二区三区视频在线观看| 欧美亚洲高清一区二区三区不卡| 99在线视频精品| 91精品国产91热久久久做人人| 91麻豆swag| 成人不卡免费av| 国产精品白丝jk黑袜喷水| 麻豆精品国产91久久久久久| 日本系列欧美系列| 免费在线看成人av| 美洲天堂一区二卡三卡四卡视频| 亚洲一区在线看| 一区二区高清免费观看影视大全| 亚洲天堂成人网| 国产精品久久久久影院色老大| 久久精品一区四区| 久久久久亚洲蜜桃| 久久久国产一区二区三区四区小说| 91精品国产色综合久久| 欧美日韩精品久久久| 欧美日韩美少妇| 欧美色大人视频| 欧美乱妇15p| 欧美精品乱码久久久久久按摩| 欧美三日本三级三级在线播放| 欧美三级一区二区| 在线播放/欧美激情| 欧美日韩精品欧美日韩精品一 | 亚洲素人一区二区| 亚洲色图一区二区三区| 樱桃视频在线观看一区| 午夜精品久久久| 久久 天天综合| 国产成人自拍网| 成+人+亚洲+综合天堂| 色视频欧美一区二区三区| 欧美午夜精品一区| 欧美第一区第二区| 国产精品全国免费观看高清| 国产福利一区二区三区视频| 不卡视频在线看| 欧美日韩中文另类| 欧美精品一区在线观看| 国产精品久久久久久久久动漫 | 日韩码欧中文字| 一区二区三区四区不卡在线 | 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 91在线观看下载| 欧美日韩极品在线观看一区| 久久综合色8888| 亚洲同性同志一二三专区| 亚洲福利一二三区| 国产成人亚洲精品狼色在线| 欧美在线观看视频一区二区三区| 日韩亚洲国产中文字幕欧美| 欧美国产视频在线| 日韩av一级电影| av在线这里只有精品| 欧美疯狂性受xxxxx喷水图片| 国产网站一区二区| 亚洲福利电影网| 成人综合激情网| 欧美日韩亚洲综合在线| 日本一区二区三区国色天香| 偷窥少妇高潮呻吟av久久免费| 国产福利一区二区| 91精品国产欧美一区二区| 亚洲少妇30p| 国产精品中文有码| 欧美乱妇20p| 亚洲欧美日韩在线| 国产尤物一区二区在线| 欧美日本一区二区| 亚洲欧美综合在线精品| 久久99久久99| 亚洲精品第1页| 国产精品一线二线三线精华| 欧美图片一区二区三区| 中文字幕一区二区日韩精品绯色| 免费在线欧美视频| 欧美日韩高清在线播放| 亚洲欧美日韩中文播放 | 欧美精品一区二区高清在线观看| 成人欧美一区二区三区小说| 狠狠狠色丁香婷婷综合激情| 欧美精品在线视频| 亚洲欧美日韩精品久久久久| 国产91丝袜在线观看| 日韩欧美视频在线| 婷婷亚洲久悠悠色悠在线播放| 色噜噜狠狠一区二区三区果冻| 久久精品亚洲乱码伦伦中文| 美国欧美日韩国产在线播放| 欧美亚一区二区| 一二三区精品视频| 99精品在线观看视频| 中文字幕成人在线观看| 国产美女视频91| 久久久一区二区三区捆绑**| 久久99热国产| 欧美大片一区二区| 日本成人在线看| 日韩一级黄色片| 蜜桃视频一区二区| 日韩欧美资源站| 美腿丝袜亚洲综合| 日韩欧美成人一区二区| 美女网站视频久久| 亚洲一区二区在线免费观看视频| 色综合一个色综合亚洲| 亚洲色图一区二区三区| 色婷婷亚洲一区二区三区| 亚洲欧美色综合| 色94色欧美sute亚洲线路二| 亚洲女性喷水在线观看一区| 99国产麻豆精品| 一区二区成人在线视频| 欧美色区777第一页| 丝袜亚洲另类欧美| 日韩一卡二卡三卡四卡| 美女尤物国产一区| 久久影视一区二区| 国产suv一区二区三区88区| 国产片一区二区| 99re视频精品| 亚洲成人免费影院| 欧美一级欧美一级在线播放| 久久av资源站| 国产欧美日韩卡一| 色婷婷精品久久二区二区蜜臂av| 亚洲午夜精品在线| 日韩精品中文字幕一区| 国产在线视频一区二区| 国产亚洲精品福利| 91麻豆国产香蕉久久精品| 一区二区激情视频| 欧美一级淫片007| 国产一区二区三区最好精华液| 中文欧美字幕免费| 欧美日韩在线不卡| 国产中文字幕一区| 伊人开心综合网| 日韩欧美高清dvd碟片| 日韩免费观看高清完整版在线观看| 精品一区二区在线看| 国产精品麻豆久久久| 欧美日韩一区二区在线视频| 精彩视频一区二区| 欧洲国内综合视频| 丁香六月综合激情| 精品久久99ma| 东方aⅴ免费观看久久av| 亚洲精品免费看| 日韩免费高清av| 国产ts人妖一区二区| 五月婷婷久久综合| 欧美激情一区二区在线| 欧美日韩一区国产| 成人免费视频一区| 日韩精品国产精品| 中文字幕亚洲视频| 日韩亚洲欧美一区二区三区| av福利精品导航| 麻豆91精品视频| 一区二区三区不卡在线观看 | 不卡一区中文字幕| 日本在线不卡视频一二三区| 国产精品久久三区| 日韩亚洲国产中文字幕欧美| 99久久精品情趣| 九一九一国产精品| 亚洲午夜三级在线| 国产精品人成在线观看免费| 欧美mv和日韩mv的网站| 欧美三级视频在线播放|