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

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

?? hcddrv.cpp

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? CPP
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Module Name:
//     uhcddrv.cpp
//
// Abstract:
//
// Notes:
//

#include "globals.hpp"
#include "Hcd.hpp"
#include <cphysmem.hpp>
#include <cardserv.h>
#include <devload.h>

// Debug Zones.
#ifdef DEBUG

#define DBG_UHCD                (1 << 0)
#define DBG_INIT                (1 << 1)
#define DBG_REGISTERS           (1 << 2)
#define DBG_HUB                 (1 << 3)
#define DBG_ATTACH              (1 << 4)
#define DBG_DESCRIPTORS         (1 << 5)
#define DBG_FUNCTION            (1 << 6)
#define DBG_PIPE                (1 << 7)
#define DBG_TRANSFER            (1 << 8)
#define DBG_QH                  (1 << 9)
#define DBG_TD                  (1 << 10)
#define DBG_CPHYSMEM            (1 << 11)
#define DBG_VERBOSE             (1 << 12)
#define DBG_WARNING             (1 << 13)
#define DBG_ERROR               (1 << 14)
#define DBG_UNUSED              (1 << 15)

DBGPARAM dpCurSettings = {
    TEXT("USB HCD"),
    {
        TEXT("Uhcd"),
        TEXT("Init"),
        TEXT("Registers"),
        TEXT("Hub"),
        TEXT("Attach"),
        TEXT("Descriptors"),
        TEXT("Function"),
        TEXT("Pipe"),
        TEXT("Transfer"),
        TEXT("QH"),
        TEXT("TD"),
        TEXT("CPhysMem"),
        TEXT("Verbose"),
        TEXT("Warning"),
        TEXT("Error"),
        TEXT("Unused")
    },
    DBG_INIT | DBG_ATTACH | DBG_WARNING | DBG_ERROR
};
#endif

extern "C" HINSTANCE g_hInstance;
DWORD g_IstThreadPriority;

extern HCD_FUNCS gc_HcdFuncs =
{
    sizeof(HCD_FUNCS),      //DWORD                   dwCount;

    &HcdGetFrameNumber,     //LPHCD_GET_FRAME_NUMBER      lpGetFrameNumber;
    &HcdGetFrameLength,     //LPHCD_GET_FRAME_LENGTH      lpGetFrameLength;
    &HcdSetFrameLength,     //LPHCD_SET_FRAME_LENGTH      lpSetFrameLength;
    &HcdStopAdjustingFrame, //LPHCD_STOP_ADJUSTING_FRAME  lpStopAdjustingFrame;
    &HcdOpenPipe,           //LPHCD_OPEN_PIPE             lpOpenPipe;
    &HcdClosePipe,          //LPHCD_CLOSE_PIPE            lpClosePipe;
    &HcdResetPipe,          //LPHCD_RESET_PIPE            lpResetPipe;
    &HcdIsPipeHalted,       //LPHCD_IS_PIPE_HALTED        lpIsPipeHalted;
    &HcdIssueTransfer,      //LPHCD_ISSUE_TRANSFER        lpIssueTransfer;
    &HcdAbortTransfer       //LPHCD_ABORT_TRANSFER        lpAbortTransfer;
};

BOOL WINAPI DllMain(HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
    if ( dwReason == DLL_PROCESS_ATTACH ) {
        DEBUGREGISTER((HINSTANCE)hinstDLL);
        DEBUGMSG (ZONE_INIT,(TEXT("UHCD driver DLL attach\r\n")));
	DisableThreadLibraryCalls((HMODULE) hinstDLL);
    }
    return HcdPdd_DllMain(hinstDLL, dwReason, lpvReserved);
}


static BOOL HcdGetFrameNumber(LPVOID lpvHcd, LPDWORD lpdwFrameNumber)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->GetFrameNumber(lpdwFrameNumber);
}

static BOOL HcdGetFrameLength(LPVOID lpvHcd, LPUSHORT lpuFrameLength)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->GetFrameLength(lpuFrameLength);
}

static BOOL HcdSetFrameLength(LPVOID lpvHcd, HANDLE hEvent, USHORT uFrameLength)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->SetFrameLength(hEvent, uFrameLength);
}

static BOOL HcdStopAdjustingFrame(LPVOID lpvHcd)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->StopAdjustingFrame();
}

static BOOL HcdOpenPipe(LPVOID lpvHcd, UINT iDevice,
        LPCUSB_ENDPOINT_DESCRIPTOR lpEndpointDescriptor,
        LPUINT lpiEndpointIndex)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->OpenPipe(iDevice, lpEndpointDescriptor, lpiEndpointIndex);
}

static BOOL HcdClosePipe(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->ClosePipe(iDevice, iEndpointIndex);
}

static BOOL HcdResetPipe(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->ResetPipe(iDevice, iEndpointIndex);
}

static BOOL HcdIsPipeHalted(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex, LPBOOL lpbHalted)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->IsPipeHalted(iDevice, iEndpointIndex, lpbHalted);
}

static BOOL HcdIssueTransfer(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex,
        LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
        DWORD dwFlags, LPCVOID lpvControlHeader,
        DWORD dwStartingFrame, DWORD dwFrames, LPCDWORD aLengths,
        DWORD dwBufferSize, LPVOID lpvBuffer, ULONG paBuffer,
        LPCVOID lpvCancelId, LPDWORD adwIsochErrors, LPDWORD adwIsochLengths,
        LPBOOL lpfComplete, LPDWORD lpdwBytesTransfered, LPDWORD lpdwError)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->IssueTransfer(iDevice, iEndpointIndex, lpStartAddress,
            lpParameter, dwFlags, lpvControlHeader, dwStartingFrame, dwFrames,
            aLengths, dwBufferSize, lpvBuffer, paBuffer, lpvCancelId,
            adwIsochErrors, adwIsochLengths,lpfComplete, lpdwBytesTransfered,
            lpdwError);
}

static BOOL HcdAbortTransfer(LPVOID lpvHcd, UINT iDevice, UINT iEndpointIndex,
        LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
        LPCVOID lpvCancelId)
{
    CHcd * const pHcd = (CHcd *)lpvHcd;
    return pHcd->AbortTransfer(iDevice, iEndpointIndex, lpStartAddress,
            lpParameter, lpvCancelId);
}


#ifdef CE_PREv3
// This constant is private in the device manager and I'm lazy
// enough to want to avoid dynamic allocation.
#define REG_PATH_LEN 256

// This is a back port for a new function in CE 3.0
HKEY OpenDeviceKey( LPCTSTR lpszActiveKey )
{
    LONG keyStatus;
    HKEY hKey;
    TCHAR szKeyName[REG_PATH_LEN];
    DWORD dwKeyLen = REG_PATH_LEN;

    // lpszActiveKey is the key to this driver's active settings area
    // Within this area, the value of DEVLOAD_DEVKEY_VALNAME points to the
    // builtin driver area, where OEM settings were placed.

    keyStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                 lpszActiveKey,
                 0,
                 KEY_ALL_ACCESS,
                 &hKey);
    if ( keyStatus != ERROR_SUCCESS ) {
        return NULL;
    }

    keyStatus = RegQueryValueEx(hKey,
                                DEVLOAD_DEVKEY_VALNAME,
                                NULL,
                                NULL,  // don't care about the type - it better be REG_SZ
                                (PBYTE) szKeyName,
                                &dwKeyLen);
    RegCloseKey( hKey );
    if ( keyStatus != ERROR_SUCCESS ) {
        return NULL;
    }

    keyStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                 szKeyName,
                 0,
                 KEY_ALL_ACCESS,
                 &hKey);
    if ( keyStatus != ERROR_SUCCESS ) {
        return NULL;
    }

    return hKey;
}
#endif

// -----------------------------------------------------------------------------
// Function to read the interrupt thread priority from the registry.
// If it is not in the registry then a default value is returned.
// -----------------------------------------------------------------------------
static DWORD
GetInterruptThreadPriority(
    LPWSTR lpszActiveKey
    )
{
    HKEY hDevKey;
    DWORD dwValType;
    DWORD dwValLen;
    DWORD dwPrio;

    dwPrio = DEFAULT_UHCD_IST_PRIORITY;

    hDevKey = OpenDeviceKey(lpszActiveKey);
    if (hDevKey) {
        dwValLen = sizeof(DWORD);
        RegQueryValueEx(
            hDevKey,
            TEXT("Priority256"),
            NULL,
            &dwValType,
            (PUCHAR)&dwPrio,
            &dwValLen);
        RegCloseKey(hDevKey);
    }
    return dwPrio;
}


extern "C" LPVOID HcdMdd_CreateMemoryObject(DWORD cbSize, DWORD cbHighPrioritySize,
                                             PUCHAR pVirtAddr, PUCHAR pPhysAddr)
{
    //
    // We need at least a USBPAGE for Special allocation and a PAGE for normal
    // allocation.
    //
    ASSERT((cbHighPrioritySize + (2*USBPAGESIZE)) < cbSize);

    CPhysMem * pobMem = new CPhysMem(cbSize,cbHighPrioritySize,pVirtAddr,pPhysAddr);
    if (pobMem)
        if ( ! pobMem->InittedOK() ) {
            delete pobMem;
            pobMem = 0;
        }

    return pobMem;
}

extern "C" LPVOID HcdMdd_CreateHcdObject(LPVOID lpvUhcdPddObject,
        LPVOID lpvMemoryObject, LPCWSTR szRegKey, PUCHAR ioPortBase,
        DWORD dwSysIntr)
{
    CHcd * pobUhcd = CreateHCDObject(lpvUhcdPddObject,(CPhysMem *)lpvMemoryObject,szRegKey,ioPortBase,dwSysIntr);
    
    if ( pobUhcd != NULL ) {
        if ( !pobUhcd->DeviceInitialize( )) {
            delete pobUhcd;
            pobUhcd = NULL;
        }
    }

    return pobUhcd;
}

extern "C" BOOL HcdMdd_DestroyHcdObject(LPVOID lpvUhcdObject)
{
    CHcd * pobUhcd = (CHcd *)lpvUhcdObject;
    delete pobUhcd;

    return TRUE;
}

extern "C" BOOL HcdMdd_DestroyMemoryObject(LPVOID lpvMemoryObject)
{
    CPhysMem * pobMem = (CPhysMem *)lpvMemoryObject;
    delete pobMem;

    return TRUE;
}

extern "C" BOOL HcdMdd_PowerUp(LPVOID lpvUhcdObject)
{
    CHcd * pobUhcd = (CHcd *)lpvUhcdObject;
    pobUhcd->PowerMgmtCallback(FALSE);

    return TRUE;
}

extern "C" BOOL HcdMdd_PowerDown(LPVOID lpvUhcdObject)
{
    CHcd * pobUhcd = (CHcd *)lpvUhcdObject;
    pobUhcd->PowerMgmtCallback(TRUE);

    return TRUE;
}

extern "C"  DWORD   HcdMdd_SetCapability (LPVOID lpvUhcdObject, DWORD dwCapability )
{
    CHcd * pobUhcd = (CHcd *)lpvUhcdObject;
    return pobUhcd->SetCapability(dwCapability);
}







// Stream functions
extern "C" DWORD HCD_Init(DWORD dwContext)
{
    HKEY ActiveKey;
    WCHAR RegKeyPath[DEVKEY_LEN];
    DWORD status;
    DWORD ValType;
    DWORD ValLen;

    DEBUGMSG (ZONE_INIT, (TEXT("UHCD!HCD_Init\r\n")));

    
    // Open driver's ACTIVE key
    status = RegOpenKeyEx(
                HKEY_LOCAL_MACHINE,
                (LPCWSTR)dwContext,
                0,
                0,
                &ActiveKey);
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("UHCD!HCD_Init RegOpenKeyEx(%s) returned %d.\r\n"),
            (LPCWSTR)dwContext, status));
        return NULL;
    }

    // Get Key value, which points to driver's key
    ValLen = sizeof(RegKeyPath);
    status = RegQueryValueEx(
                ActiveKey,
                DEVLOAD_DEVKEY_VALNAME,
                NULL,
                &ValType,
                (PUCHAR)RegKeyPath,
                &ValLen);
    if (status != ERROR_SUCCESS) {
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("UHCD!HCD_Init RegQueryValueEx(%s\\%s) returned %d\r\n"),
            (LPCWSTR)dwContext, DEVLOAD_DEVKEY_VALNAME, status));
        RegCloseKey(ActiveKey);
        return NULL;
    }

    RegCloseKey(ActiveKey);
    
    g_IstThreadPriority = GetInterruptThreadPriority(RegKeyPath);
    return HcdPdd_Init((DWORD)RegKeyPath);
}


extern "C" void HCD_PowerUp(DWORD hDeviceContext)
{
    HcdPdd_PowerUp(hDeviceContext);

    return;
}


extern "C" void HCD_PowerDown(DWORD hDeviceContext)
{
    HcdPdd_PowerDown(hDeviceContext);

    return;
}


extern "C" BOOL HCD_Deinit(DWORD hDeviceContext)
{
    DEBUGMSG (ZONE_INIT, (TEXT("UHCD: HCD_Deinit\r\n")));
    return HcdPdd_Deinit(hDeviceContext);
}


extern "C" DWORD HCD_Open(DWORD hDeviceContext, DWORD AccessCode,
        DWORD ShareMode)
{
    return HcdPdd_Open(hDeviceContext, AccessCode, ShareMode);
}


extern "C" BOOL HCD_Close(DWORD hOpenContext)
{
    return HcdPdd_Close(hOpenContext);
}


extern "C" DWORD HCD_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
    return HcdPdd_Read(hOpenContext, pBuffer, Count);
}


extern "C" DWORD HCD_Write(DWORD hOpenContext, LPCVOID pSourceBytes,
        DWORD NumberOfBytes)
{
    return HcdPdd_Write(hOpenContext, pSourceBytes, NumberOfBytes);
}


extern "C" DWORD HCD_Seek(DWORD hOpenContext, LONG Amount, DWORD Type)
{
    return HcdPdd_Seek(hOpenContext, Amount, Type);
}


extern "C" BOOL HCD_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn,
        DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
    return HcdPdd_IOControl(hOpenContext, dwCode, pBufIn, dwLenIn, pBufOut,
            dwLenOut, pdwActualOut);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区四区高清精品免费观看| 日韩欧美中文字幕制服| 国产精品无遮挡| 成人午夜视频在线观看| 国产精品久久毛片av大全日韩| 国产91精品免费| 国产精品美女久久久久高潮| aaa欧美色吧激情视频| 亚洲日本一区二区| 在线视频你懂得一区| 婷婷六月综合网| 欧美一区二区大片| 韩国中文字幕2020精品| 中文字幕二三区不卡| 色88888久久久久久影院按摩| 亚洲精品一卡二卡| 91麻豆精品国产91久久久| 另类小说视频一区二区| 国产精品久久影院| 欧美性感一类影片在线播放| 日本一区中文字幕| 日本一区二区三区dvd视频在线| av成人老司机| 日韩av一区二区在线影视| 久久影院午夜片一区| 91日韩一区二区三区| 偷拍日韩校园综合在线| 久久久久国产精品厨房| 色综合久久中文综合久久97| 免费成人av在线| 中文幕一区二区三区久久蜜桃| 欧美日韩一区二区三区在线看| 欧美aaaaaa午夜精品| 国产精品久久久久久久蜜臀| 欧美午夜片在线观看| 91精品午夜视频| 亚洲一级二级三级| 久久一留热品黄| 色综合久久88色综合天天免费| 日本成人中文字幕在线视频| 亚洲国产成人私人影院tom| 欧美日韩国产中文| 成人高清视频免费观看| 五月天网站亚洲| 国产精品热久久久久夜色精品三区 | 成人v精品蜜桃久久一区| 亚洲第一综合色| 日本一区二区三区四区在线视频| 在线观看日韩av先锋影音电影院| 国产麻豆成人传媒免费观看| 一区二区三区欧美激情| 国产精品三级视频| 日韩欧美国产综合在线一区二区三区| www.欧美色图| 国产精品一区二区在线观看网站| 亚洲成人在线网站| 中文字幕综合网| 国产亚洲婷婷免费| 精品日韩99亚洲| 欧美精品在线一区二区| 在线观看日韩av先锋影音电影院| 成人免费毛片片v| 国产在线精品一区二区不卡了| 亚洲成人动漫在线观看| 一区二区三区产品免费精品久久75| 国产喷白浆一区二区三区| 欧美成人女星排行榜| 宅男在线国产精品| 欧美日韩一区二区在线观看| 日本乱人伦aⅴ精品| 91女厕偷拍女厕偷拍高清| 成人深夜福利app| 国产成人精品www牛牛影视| 国内精品在线播放| 极品尤物av久久免费看| 免费看欧美美女黄的网站| 日韩精品欧美精品| 日韩精品福利网| 日韩av在线免费观看不卡| 亚洲成av人片一区二区三区| 亚洲成a人在线观看| 午夜伦理一区二区| 日本欧美一区二区三区乱码 | 亚洲国产一区二区a毛片| 一区二区三区在线观看网站| 亚洲免费高清视频在线| 亚洲午夜久久久久久久久久久 | 26uuu欧美| 久久嫩草精品久久久精品一| 久久亚洲春色中文字幕久久久| 久久影视一区二区| 国产精品麻豆视频| 亚洲视频一区二区在线观看| 亚洲人成在线观看一区二区| 一区二区三区中文免费| 五月婷婷久久丁香| 极品销魂美女一区二区三区| 成人在线一区二区三区| av不卡在线观看| 欧美亚洲愉拍一区二区| 欧美一二三区在线| 国产欧美一区二区在线| 国产精品乱人伦中文| 亚洲一区二区偷拍精品| 日本vs亚洲vs韩国一区三区二区 | 日精品一区二区三区| 美女精品一区二区| 成人免费看视频| 91老司机福利 在线| 91精品国产手机| 久久女同精品一区二区| 亚洲女同女同女同女同女同69| 亚洲大片免费看| 极品少妇xxxx偷拍精品少妇| 91色|porny| 日韩一区二区免费在线电影| 欧美国产综合色视频| 一区二区三区不卡视频| 精久久久久久久久久久| 色婷婷av一区二区三区大白胸 | 日本vs亚洲vs韩国一区三区二区| 国产一区二区三区四区在线观看| 成人综合在线观看| 欧美日韩国产另类不卡| 久久女同互慰一区二区三区| 一区二区三区在线免费视频| 国内精品写真在线观看| 色88888久久久久久影院按摩| 精品免费日韩av| 亚洲一区二区三区自拍| 国产毛片精品国产一区二区三区| 在线观看区一区二| 欧美国产精品专区| 日韩精品乱码免费| 91麻豆产精品久久久久久| 日韩精品一区二| 一区二区三区中文免费| 高清不卡在线观看| 欧美v日韩v国产v| 亚洲综合在线第一页| 成人美女视频在线观看18| 日韩美女主播在线视频一区二区三区| 亚洲欧洲av色图| 国产一区二区中文字幕| 欧美精品亚洲二区| 亚洲精品自拍动漫在线| 成人在线一区二区三区| 欧美精品一区二区三区蜜桃视频| 亚洲h在线观看| 91免费国产在线| 国产精品成人免费精品自在线观看| 理论电影国产精品| 欧美精品aⅴ在线视频| 亚洲免费视频成人| 99在线精品免费| 中文字幕av不卡| 粉嫩久久99精品久久久久久夜| 精品噜噜噜噜久久久久久久久试看| 香蕉成人伊视频在线观看| 在线亚洲精品福利网址导航| 综合久久久久久| 成人免费视频视频在线观看免费 | 日产欧产美韩系列久久99| 色国产综合视频| 亚洲欧美一区二区三区国产精品| 粉嫩高潮美女一区二区三区| 久久新电视剧免费观看| 国产麻豆成人传媒免费观看| 久久青草欧美一区二区三区| 韩国三级中文字幕hd久久精品| 欧美成人精品3d动漫h| 蜜乳av一区二区三区| 日韩你懂的在线播放| 久久99精品国产麻豆婷婷| 26uuu欧美日本| 风间由美一区二区av101| 欧美激情综合五月色丁香小说| 粉嫩av一区二区三区在线播放| 国产精品入口麻豆九色| 成人动漫中文字幕| 一区二区三区国产豹纹内裤在线| 欧美亚一区二区| 亚洲成人av福利| 日韩欧美亚洲国产精品字幕久久久| 日本成人在线视频网站| 精品少妇一区二区三区| 国产白丝网站精品污在线入口| 国产精品成人一区二区艾草 | 亚洲综合av网| 制服丝袜日韩国产| 国产在线一区二区综合免费视频| 久久精品夜色噜噜亚洲aⅴ| 成人精品电影在线观看| 亚洲精品国产精华液| 欧美一区二区免费观在线| 国产精品一二三在| 亚洲免费观看高清完整版在线观看熊| 欧美日韩精品二区第二页| 久久精品99国产精品| 国产精品天天看|