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

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

?? setup.cpp

?? hidclass source code for windows ce use
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
    DUMP_USB_DEVICE_DESCRIPTOR(pDeviceInfo->Descriptor);
    DUMP_USB_CONFIGURATION_DESCRIPTOR(pDeviceInfo->lpActiveConfig->Descriptor);

    pUsbHid = (PUSBHID_CONTEXT)HidAlloc(sizeof(USBHID_CONTEXT));
    if (pUsbHid == NULL) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: LocalAlloc error:%d\r\n"), pszFname,
            GetLastError()));
        goto EXIT;
    }
    ZeroMemory(pUsbHid, sizeof(USBHID_CONTEXT));

    pUsbHid->Sig = USB_HID_SIG;
    InitializeCriticalSection(&pUsbHid->csLock);
    pUsbHid->hUsbDevice = hUsbDevice;
    pUsbHid->pUsbInterface = pUsbInterface;

    DUMP_USB_INTERFACE_DESCRIPTOR(pUsbHid->pUsbInterface->Descriptor, 
        pUsbHid->pUsbInterface->Descriptor.bInterfaceNumber);

    pUsbHid->hHidDriver = ActivateDeviceEx(HID_REGKEY_SZ, NULL, 0, CLIENT_REGKEY_SZ);
    if (pUsbHid->hHidDriver == NULL) {
        DEBUGMSG(ZONE_ERROR,(_T("%s: Unable to activate HID stream driver\r\n"), 
            pszFname));
        goto EXIT;
    }

    if (pUsbInterface->lpEndpoints == NULL) {
        DEBUGMSG(ZONE_ERROR,(_T("%s: Missing endpoint descriptors\r\n"), 
            pszFname));
        goto EXIT;
    }
    pEndpoint = &pUsbInterface->lpEndpoints[0];
    DEBUGCHK(pEndpoint != NULL);
    
    // Regarding bSendToInterface.  The original HID spec said that the Hid
    // descriptor would come after the interface and endpoint descriptors.
    // It also said that class specific commands should be sent to the endpoint.
    // The next spec said that the HID descriptor would come after the interface
    // descriptor (not at the end) and that commands should be sent to the
    // interface, not to the endpoint.  So, I'm assuming that if I find the
    // Hid descriptor after the interface, the device is following the new spec
    // and I should send commands to the interface.  Otherwise, I'll send them
    // to the endpoint, as stated in the old spec.
    pHidDescriptor = (PHID_DESCRIPTOR) pUsbInterface->lpvExtended;
    
    if (pHidDescriptor == NULL) {
        pHidDescriptor = (PHID_DESCRIPTOR) pUsbInterface->lpEndpoints->lpvExtended;
        if (pHidDescriptor == NULL) {
            DEBUGMSG(ZONE_ERROR, (_T("%s: Missing HID descriptor\r\n"), pszFname));
            goto EXIT;
        }
        else {
            pUsbHid->fSendToInterface = FALSE;
        }
    }
    else {
        pUsbHid->fSendToInterface = TRUE;
    }

    DUMP_USB_HID_DESCRIPTOR((*pHidDescriptor));

    pUsbHid->pUsbFuncs = pUsbFuncs;

    pUsbHid->Flags.Open = FALSE;
    pUsbHid->Flags.UnloadPending = FALSE;

    // create endpoint 0 event
    pUsbHid->hEP0Event = CreateEvent(NULL, MANUAL_RESET_EVENT, FALSE, NULL);
    if (pUsbHid->hEP0Event == NULL) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: CreateEvent error:%d\r\n"), pszFname, 
            GetLastError()));
        goto EXIT;
    }

    // set the USB interface/pipes
    if (SetUsbInterface(pUsbHid) == FALSE) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: SetUsbInterface failed!\r\n"), pszFname));
        goto EXIT;
    }
    
    // Mouse and keyboard HID devices might have a boot protocol that can be 
    // used at boot time. We never use the boot protocol and the devices
    // should default to the standard report format, but they are not 
    // guaranteed to. Therefore, we will manually set the report protocol here.
    if (pUsbInterface->Descriptor.bInterfaceSubClass == HID_INTERFACE_BOOT_SUBCLASS) {
        SetReportProtocol(pUsbHid);
    }

    // Allocate space temporarily for the report descriptor for our interface.
    cbReportDescriptor = pHidDescriptor->wDescriptorLength;
    pbReportDescriptor = (PBYTE) HidAlloc(cbReportDescriptor);
    if (pbReportDescriptor == NULL) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: LocalAlloc error:%d\r\n"), pszFname,
            GetLastError()));
        goto EXIT;
    }

    // Get the report descriptor for our interface.
    if (GetReportDescriptor(pUsbHid, pbReportDescriptor, 
            cbReportDescriptor) == FALSE) {
        goto EXIT;
    }

    // Remember if this device can wake the system.
    if (pDeviceInfo->lpActiveConfig->Descriptor.bmAttributes & USB_CONFIG_REMOTE_WAKEUP) {
        pUsbHid->Flags.RemoteWakeup = TRUE;
    }

    // Determine how many interrupt transfers to issue at once
    SetQueuedTransfers(CLIENT_REGKEY_SZ);

    // Pass the report descriptor off to the MDD.
    if (HidMdd_Attach(
            (HID_PDD_HANDLE) pUsbHid,
            pbReportDescriptor,
            cbReportDescriptor,
            pDeviceInfo->Descriptor.idVendor,
            pDeviceInfo->Descriptor.idProduct,
            pDeviceInfo->Descriptor.bcdDevice,
            pUsbHid->pUsbInterface->Descriptor.bInterfaceNumber,
            &pUsbHid->pvNotifyParameter,
            &pUsbHid->cbMaxReport) == FALSE) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: Failed initializing HID Mdd\r\n"), 
            pszFname));
        goto EXIT;
    }
    pUsbHid->Flags.MddInitialized = TRUE;

    // Create the thread that receives the data from the device.
    // Only do this, though, if there are input reports.
    if (pUsbHid->cbMaxReport && CreateInterruptThread(pUsbHid) == FALSE) {
        goto EXIT;
    }

    ValidateUsbHidContext(pUsbHid);

    fErr = FALSE;

EXIT:
    if (pbReportDescriptor != NULL) HidFree(pbReportDescriptor);
    
    if ((fErr == TRUE) && (pUsbHid != NULL)) {
        RemoveDeviceContext(pUsbHid);
		pUsbHid = NULL;
    }

    DEBUGMSG(ZONE_INIT, (_T("-%s\r\n"), pszFname));
    return pUsbHid;
}


// Helper routine to start an Interrupt Transfer.
static
USB_TRANSFER
StartInterruptTransfer(
    PUSBHID_CONTEXT pUsbHid,
    PBYTE pbBuffer,
    DWORD cbBuffer,
    HANDLE hev
    )
{
    SETFNAME(_T("StartInterruptTransfer"));

    PREFAST_DEBUGCHK(pUsbHid);
    DEBUGCHK(pbBuffer);
    DEBUGCHK(hev);

#ifdef DEBUG
    FillMemory(pbBuffer, cbBuffer, GARBAGE_BYTE);
#endif

    USB_TRANSFER hTransfer = pUsbHid->pUsbFuncs->lpIssueInterruptTransfer(
        pUsbHid->InterruptIn.hPipe,
        DefaultTransferComplete,
        hev,
        USB_IN_TRANSFER | USB_SHORT_TRANSFER_OK,
        cbBuffer,
        pbBuffer,
        NULL
        );

    if (hTransfer == NULL) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: IssueInterruptTransfer failed\r\n"), 
            pszFname));
    }

    return hTransfer;
}


#ifdef DEBUG
// Validates a PUSB_HID_TRANSFER
static
void
ValidateTransfer(
    const USB_HID_TRANSFER *pTransfer
    )
{
    PREFAST_DEBUGCHK(pTransfer);
    DEBUGCHK(pTransfer->hev);
    DEBUGCHK(pTransfer->hev != GARBAGE_PVOID);
    DEBUGCHK(pTransfer->hTransfer);
    DEBUGCHK(pTransfer->hTransfer != GARBAGE_PVOID);
    DEBUGCHK(pTransfer->rgbBuffer);
    DEBUGCHK(pTransfer->rgbBuffer != GARBAGE_PVOID);
}
#else
#define ValidateTransfer(ptr)
#endif // DEBUG


// Receives the interrupt reports from the device
static
DWORD
WINAPI
InterruptThreadProc(
    LPVOID lpParameter
    )
{
    SETFNAME(_T("InterruptThreadProc"));

    PUSBHID_CONTEXT pUsbHid = (PUSBHID_CONTEXT) lpParameter;
    BYTE  cTransfers; // Count of valid transfers
    BYTE  bTransfer;
    DWORD cbBuffer;
    BOOL  fUnloadPending = FALSE;
    USB_HID_TRANSFER *pTransfers = NULL;

    PREFAST_DEBUGCHK(pUsbHid != NULL);
    ValidateUsbHidContext(pUsbHid);

	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);

    cbBuffer = pUsbHid->cbMaxReport;

    cTransfers = g_bQueuedTransfers;
    DEBUGCHK(cTransfers >= MIN_QUEUED_TRANSFERS);
    DEBUGCHK(cTransfers <= MAX_QUEUED_TRANSFERS);
    DEBUGMSG(ZONE_COMMENT, (_T("%s: Thread started for %u queued transfers\r\n"),
        pszFname, cTransfers));

    DWORD cbTransfer = sizeof(USB_HID_TRANSFER) + cbBuffer;
    DWORD cbTransfers = cbTransfer * cTransfers;

    pTransfers = (PUSB_HID_TRANSFER) HidAlloc(cbTransfers);
    if (pTransfers == NULL) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: LocalAlloc error:%d\r\n"), pszFname, 
            GetLastError()));
        goto EXIT;
    }
#ifdef DEBUG
    FillMemory(pTransfers, cbTransfers, GARBAGE_BYTE);
#endif

    for (bTransfer = 0; bTransfer < cTransfers; ++bTransfer) {
        PUSB_HID_TRANSFER pTransfer = &pTransfers[bTransfer];
        pTransfer->rgbBuffer = ((PBYTE) &pTransfers[cTransfers]) + (cbBuffer * bTransfer);
        pTransfer->hev = CreateEvent(NULL, AUTO_RESET_EVENT, FALSE, NULL);
        if (pTransfer->hev == NULL) {
            DEBUGMSG(ZONE_ERROR, (_T("%s: CreateEvent error:%d\r\n"), 
                pszFname, GetLastError()));
            cTransfers = bTransfer; // Invalidate this transfer
            break;
        }
           
        pTransfer->hTransfer = StartInterruptTransfer(pUsbHid,
            pTransfer->rgbBuffer, cbBuffer, pTransfer->hev);
        
        if (pTransfer->hTransfer == NULL) {
            CloseHandle(pTransfer->hev);
#ifdef DEBUG
            FillMemory(pTransfer, cbTransfer, GARBAGE_BYTE);
#endif
            cTransfers = bTransfer; // Invalidate this transfer
            break;
        }
    }

    if (cTransfers == 0) {
        ERRORMSG(1, (_T("USB HID: Unable to issue interrupt transfers\r\n")));
        goto EXIT;
    }

#ifdef DEBUG
    // At this point, indices 0 through cTransfers-1 are valid
    {
        for (BYTE bDebugIdx = 0; bDebugIdx < cTransfers; ++bDebugIdx) {
            ValidateTransfer(&pTransfers[bDebugIdx]);
        }
    }
#endif

    bTransfer = 0;
    while (fUnloadPending == FALSE) {
        DEBUGCHK(bTransfer < cTransfers);
        PUSB_HID_TRANSFER pTransfer = &pTransfers[bTransfer];
        ValidateTransfer(pTransfer);
        DWORD dwWait = WaitForSingleObject(pTransfer->hev, INFINITE);

        if (dwWait == WAIT_OBJECT_0) {
            DWORD dwBytesTransferred;
            USB_ERROR usbError;
            
            ValidateTransfer(pTransfer);
            
            GetTransferStatus(pUsbHid->pUsbFuncs, pTransfer->hTransfer, 
                &dwBytesTransferred, &usbError);
            CloseTransferHandle(pUsbHid->pUsbFuncs, pTransfer->hTransfer);

            if (usbError != USB_NO_ERROR) {
                // Device has probably been unplugged. Allow time for 
                // USBDeviceNotifications to get the news.

                // Since this could be a real error, we'll clean up the
                // hardware, just in case.
                ResetPipe(pUsbHid->pUsbFuncs, pUsbHid->InterruptIn.hPipe, 0);

                if (usbError == USB_STALL_ERROR) {
                    ClearOrSetFeature( 
                        pUsbHid->pUsbFuncs,
                        pUsbHid->hUsbDevice,
                        NULL,
                        NULL,
                        USB_SEND_TO_ENDPOINT,
                        USB_FEATURE_ENDPOINT_STALL,
                        pUsbHid->InterruptIn.bIndex,
                        0,
                        FALSE);
                }
                
                const DWORD dwSleepTime = 25;
                Sleep(dwSleepTime);
            }
            else {
                DWORD dwErr = HidMdd_ProcessInterruptReport(pTransfer->rgbBuffer, 
                    dwBytesTransferred, pUsbHid->pvNotifyParameter);
                DEBUGCHK(dwErr == ERROR_SUCCESS);
            }

            // Restart this transfer. If it fails, the device has been unplugged.
            pTransfer->hTransfer = StartInterruptTransfer(pUsbHid,
                pTransfer->rgbBuffer, cbBuffer, pTransfer->hev);
            if (pTransfer->hTransfer == NULL) {
                DEBUGMSG(ZONE_COMMENT, (_T("%s: Failed starting interrupt transfer. ")
                    _T("Assuming device removed\r\n"), pszFname));
                break;
            }

            // Wait on the next transfer
            if (++bTransfer == cTransfers) {
                bTransfer = 0;
            }
        }
        else {
            ERRORMSG(1, (_T("USB HID: Failure in WaitForSingleObject--returned %u\r\n"),
                dwWait));
            break;
        }            

        fUnloadPending = pUsbHid->Flags.UnloadPending;
    }

    // Clean up the valid transfers
    for (bTransfer = 0; bTransfer < cTransfers; ++bTransfer) {
        PUSB_HID_TRANSFER pTransfer = &pTransfers[bTransfer];
        DEBUGCHK(pTransfer->hev && (pTransfer->hev != GARBAGE_PVOID));
        
        // The final time through the interrupt loop might get a NULL transfer.
        if (pTransfer->hTransfer) {
            CloseTransferHandle(pUsbHid->pUsbFuncs, pTransfer->hTransfer);
            WaitForSingleObject(pTransfer->hev, INFINITE);
        }

        CloseHandle(pTransfer->hev);
    }

EXIT:
    if (pTransfers) HidFree(pTransfers);

    return 0;
}


// Create the thread that will receive the device's interrupt data
BOOL
CreateInterruptThread(
    PUSBHID_CONTEXT pUsbHid
    )
{
    SETFNAME(_T("CreateInterruptThread"));

    BOOL fRet = FALSE;
    
    PREFAST_DEBUGCHK(pUsbHid != NULL);
	DEBUGCHK(VALID_CONTEXT(pUsbHid));

    pUsbHid->hThread = CreateThread(NULL, 0, InterruptThreadProc, pUsbHid, 
        0, NULL);
    if (pUsbHid->hThread == NULL) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: CreateThread error:%d\r\n"), 
            pszFname, GetLastError()));
        goto EXIT;
    }
#ifdef DEBUG
	pUsbHid->fhThreadInited = TRUE;
#endif

    fRet = TRUE;

EXIT:
    return fRet;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久草热8精品视频在线观看| 欧美日韩精品专区| 欧美日产国产精品| 国产日韩精品一区二区浪潮av| 亚洲精品视频免费看| 国产精品中文欧美| 欧美一卡2卡三卡4卡5免费| 亚洲婷婷综合色高清在线| 伦理电影国产精品| 欧美精品丝袜久久久中文字幕| 亚洲视频你懂的| 国产麻豆一精品一av一免费| 欧美日韩在线播放一区| 亚洲人成7777| 不卡在线视频中文字幕| 精品国产sm最大网站| 亚洲成国产人片在线观看| 91色在线porny| 国产精品三级av在线播放| 国产综合色视频| 日韩你懂的在线观看| 日韩国产精品久久| 欧美区一区二区三区| 亚洲曰韩产成在线| 色综合久久88色综合天天免费| 久久色视频免费观看| 精品午夜久久福利影院 | 日产精品久久久久久久性色| 波多野结衣在线一区| 久久免费偷拍视频| 国产精品一区二区在线观看网站| 日韩欧美在线123| 蓝色福利精品导航| 久久亚洲一级片| 风流少妇一区二区| 日本一区二区三区久久久久久久久不| 国产在线视频不卡二| 精品国产一区二区精华| 精品一区二区三区在线播放 | 99re66热这里只有精品3直播 | 成人av网站在线观看免费| 久久久不卡网国产精品二区| 黄色日韩网站视频| 欧美激情中文字幕| 91猫先生在线| 午夜精品久久久久久久99樱桃| 欧美剧情电影在线观看完整版免费励志电影| 亚洲综合色噜噜狠狠| 在线免费观看日本欧美| 婷婷开心激情综合| 欧美一区午夜精品| 国产原创一区二区三区| 国产精品全国免费观看高清| 91视视频在线观看入口直接观看www | 2014亚洲片线观看视频免费| 久久66热re国产| 亚洲国产成人私人影院tom | 亚洲精品亚洲人成人网| 欧美日韩国产精选| 天天av天天翘天天综合网 | 久久国产夜色精品鲁鲁99| 久久久精品tv| 色八戒一区二区三区| 亚洲成人资源网| 日韩欧美久久久| 99热精品国产| 蜜臀国产一区二区三区在线播放| 久久精品在这里| 欧美在线free| 国产成人免费9x9x人网站视频| 国产三级一区二区三区| 色综合天天综合网天天狠天天| 免费的国产精品| 亚洲色图一区二区| 欧美精品一区视频| 欧美在线高清视频| 夫妻av一区二区| 裸体一区二区三区| 亚洲丝袜美腿综合| 久久众筹精品私拍模特| 色噜噜久久综合| 国产剧情av麻豆香蕉精品| 亚洲一区二区成人在线观看| 久久久www免费人成精品| 在线91免费看| 色综合激情久久| 国产99久久久国产精品免费看| 亚洲一区二区三区四区在线免费观看| 久久久一区二区三区捆绑**| 欧美日韩免费不卡视频一区二区三区| 99久久精品费精品国产一区二区| 日av在线不卡| 性久久久久久久久久久久| 亚洲人妖av一区二区| 精品国产91久久久久久久妲己| 在线一区二区三区| 色综合中文综合网| 狠狠色狠狠色综合| 日韩精品免费专区| 夜夜嗨av一区二区三区中文字幕| 国产三级一区二区| 久久先锋影音av| 欧美一级免费观看| 欧美精品aⅴ在线视频| 在线观看日韩高清av| 99精品视频在线观看| 丁香激情综合国产| 国产成人免费xxxxxxxx| 黑人巨大精品欧美黑白配亚洲| 欧美a一区二区| 日本女优在线视频一区二区| 一区二区三区加勒比av| 亚洲美女免费在线| 自拍av一区二区三区| 中文字幕一区二区三区不卡| 日本一区二区三区高清不卡| 久久精品一区二区三区av| 精品久久久久久久久久久久包黑料 | 午夜视频一区二区| 天堂蜜桃91精品| 午夜精品福利一区二区三区av | 国产精品美日韩| 欧美变态tickle挠乳网站| 欧美一级高清片| 久久婷婷国产综合精品青草| 久久久综合网站| 国产精品蜜臀在线观看| 亚洲欧美国产三级| 亚洲成人精品一区| 午夜精品久久久久久久久| 久久精品国产精品亚洲综合| 激情六月婷婷久久| 欧美在线观看一区二区| 在线观看国产91| 欧美老女人在线| 精品久久人人做人人爱| 日本一二三不卡| 一区二区三区中文在线观看| 午夜精品久久久久久久99水蜜桃| 久久国产尿小便嘘嘘| 国产黄色91视频| 色94色欧美sute亚洲13| 欧美色综合影院| 日韩女优av电影在线观看| 中文字幕久久午夜不卡| 成人免费一区二区三区视频| 香蕉影视欧美成人| 国产精品亚洲综合一区在线观看| 粉嫩av一区二区三区在线播放| 99vv1com这只有精品| 91精品国产综合久久久久久漫画 | 国产乱人伦偷精品视频不卡| 国产高清精品在线| 91国偷自产一区二区开放时间| 91精品国产麻豆国产自产在线| 国产欧美日本一区视频| 午夜视黄欧洲亚洲| 丰满放荡岳乱妇91ww| 欧美精品久久一区| 国产视频一区在线播放| 五月婷婷另类国产| 成人爱爱电影网址| 91精品国产综合久久精品app| 国产日产精品1区| 日韩不卡一二三区| 99精品在线观看视频| www国产精品av| 亚洲电影在线免费观看| 成人免费观看视频| 亚洲精品国产a| 狠狠v欧美v日韩v亚洲ⅴ| 欧洲精品在线观看| 国产精品美女久久久久久久网站| 日韩高清一区在线| 色噜噜狠狠成人中文综合| 国产偷国产偷精品高清尤物| 青草国产精品久久久久久| 日本高清无吗v一区| 亚洲国产经典视频| 国产一区在线视频| 欧美不卡123| 日韩av电影免费观看高清完整版| 色偷偷成人一区二区三区91| 久久精品欧美一区二区三区不卡 | 亚洲综合清纯丝袜自拍| 国产成人精品午夜视频免费| 日韩一级在线观看| 日韩制服丝袜av| 欧美精品黑人性xxxx| 亚洲综合免费观看高清完整版 | 欧美一区二区三区在线看| 一区二区三区在线免费播放| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 欧美一区二区视频在线观看| 亚洲成人在线观看视频| 91黄色免费观看| 亚洲第一福利视频在线| 欧美三区在线视频| 亚洲成a人在线观看| 欧美日韩国产综合一区二区三区|