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

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

?? mouhid.cpp

?? Latest USB 802.3, HID printer and mass storage divers from Microsoft for Platform Builder 4.2.
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// 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.
//
//
//

#include "mouhid.h"
#include <windev.h>


#ifdef DEBUG

// Debug Zones
#define DBG_ERROR              0x0001
#define DBG_WARNING            0x0002
#define DBG_INIT               0x0004
#define DBG_FUNCTION           0x0008

#define DBG_USAGES             0x0010

DBGPARAM dpCurSettings = {
        TEXT("MouHid"), {
        TEXT("Errors"), TEXT("Warnings"), TEXT("Init"), TEXT("Function"),
        TEXT("Usages"), TEXT(""), TEXT(""), TEXT(""),
        TEXT(""), TEXT(""), TEXT(""), TEXT(""),
        TEXT(""), TEXT(""), TEXT(""), TEXT("") },
        DBG_ERROR | DBG_WARNING };
        
#endif // DEBUG


// Conversions from button usages to mouse_event flags
static const DWORD g_rgdwUsageToDownButton[] = {
    0, // Undefined
    MOUSEEVENTF_LEFTDOWN,
    MOUSEEVENTF_RIGHTDOWN,
    MOUSEEVENTF_MIDDLEDOWN,
};

static const DWORD g_rgdwUsageToUpButton[] = {
    0, // Undefined
    MOUSEEVENTF_LEFTUP,
    MOUSEEVENTF_RIGHTUP,
    MOUSEEVENTF_MIDDLEUP,
};


#ifdef DEBUG

static
void
ValidateHidMouse(
    PHID_MOUSE pHidMouse
    );

#else

#define ValidateHidMouse(ptr)

#endif // DEBUG


BOOL
AllocateUsageLists(
    PHID_MOUSE pHidMouse,
    size_t cbUsages
    );

void
DetermineWheelUsage(
    PHID_MOUSE pHidMouse
    );

void
SetButtonFlags(
    PDWORD pdwFlags,
    PUSAGE pUsages,
    DWORD dwMaxUsages,
    const DWORD *pdwUsageMappings,
    DWORD cdwUsageMappings
    );

void
ProcessMouseReport(
    PHID_MOUSE pHidMouse,
    PCHAR pbHidPacket,
    DWORD cbHidPacket
    );

void
MouseEvent(
    DWORD dwFlags,
    DWORD dx,
    DWORD dy,
    DWORD dz
    );

VOID
FreeHidMouse(
    PHID_MOUSE pHidMouse
    );



// Dll entry function.
extern "C" 
BOOL
DllEntry(
    HANDLE hDllHandle,
    DWORD dwReason, 
    LPVOID lpReserved
    )
{
    SETFNAME(_T("MOUHID DllEntry"));
    
    UNREFERENCED_PARAMETER(lpReserved);
    
    switch (dwReason) {
        case DLL_PROCESS_ATTACH:
            DEBUGREGISTER((HINSTANCE)hDllHandle);

            DEBUGMSG(ZONE_INIT, (_T("%s: Attach\r\n"), pszFname));
            DisableThreadLibraryCalls((HMODULE) hDllHandle);
            break;
            
        case DLL_PROCESS_DETACH:
            DEBUGMSG(ZONE_INIT, (_T("%s: Detach\r\n"), pszFname));
            break;
            
        default:
            break;
    }
    
    return TRUE ;
}


// Get interrupt reports from the device. Thread exits when the device has
// been removed.
static
DWORD
WINAPI
MouseThreadProc(
    LPVOID lpParameter
    )
{
    SETFNAME(_T("MouseThreadProc"));

    PHID_MOUSE pHidMouse = (PHID_MOUSE) lpParameter;
    PCHAR pbHidPacket;
    DWORD cbHidPacket;
    DWORD cbBuffer;
    DWORD dwErr;
    
    DEBUGCHK(pHidMouse != NULL);

	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
    
    cbBuffer = pHidMouse->hidpCaps.InputReportByteLength;
    
    pbHidPacket = (PCHAR) LocalAlloc(LMEM_FIXED, cbBuffer);
    if (pbHidPacket == NULL) {
        DEBUGMSG(ZONE_ERROR, (TEXT("%s: LocalAlloc error:%d\r\n"), pszFname, GetLastError()));
        goto EXIT;
    }

    while (TRUE) 
    {
        ValidateHidMouse(pHidMouse);

        // Get an interrupt report from the device.
        dwErr = pHidMouse->pHidFuncs->lpGetInterruptReport(
            pHidMouse->hDevice,
            pbHidPacket,
            cbBuffer,
            &cbHidPacket,
            NULL,
            INFINITE);

        if (dwErr == ERROR_DEVICE_REMOVED) { 
            // Exit thread 
            break;
        }
        else {
            DEBUGCHK(dwErr == ERROR_SUCCESS);
            ProcessMouseReport(pHidMouse, pbHidPacket, cbHidPacket);
        }
    }

EXIT:
    if (pbHidPacket != NULL) LocalFree(pbHidPacket);
    DEBUGMSG(ZONE_FUNCTION, (_T("%s: Exiting thread\r\n"), pszFname));
    
    return 0;
}


// Entry point for the HID driver. Initializes the structures for this 
// keyboard and starts the thread that will receive interrupt reports.
extern "C"
BOOL
HIDDeviceAttach(
    HID_HANDLE                 hDevice, 
    PCHID_FUNCS                pHidFuncs,
    const HID_DRIVER_SETTINGS *pDriverSettings,
    PHIDP_PREPARSED_DATA       phidpPreparsedData,
    PVOID                     *ppvNotifyParameter,
    DWORD                      dwUnused
    )
{
    SETFNAME(_T("HIDDeviceAttach"));

    BOOL fRet = FALSE;
    PHID_MOUSE pHidMouse;
    size_t cbUsages;

    DEBUGCHK(hDevice != NULL);
    DEBUGCHK(pHidFuncs != NULL);
    DEBUGCHK(phidpPreparsedData != NULL);
    DEBUGCHK(ppvNotifyParameter != NULL);

    // Allocate this keyboard's data structure and fill it.
    pHidMouse = (PHID_MOUSE) LocalAlloc(LPTR, sizeof(HID_MOUSE));
    if (pHidMouse == NULL) {
        DEBUGMSG(ZONE_ERROR, (TEXT("%s: LocalAlloc error:%d\r\n"), pszFname, GetLastError()));
        goto EXIT;
    }

    pHidMouse->dwSig = HID_MOUSE_SIG;
    pHidMouse->hDevice = hDevice;
    pHidMouse->pHidFuncs = pHidFuncs;
    pHidMouse->phidpPreparsedData = phidpPreparsedData;
    HidP_GetCaps(pHidMouse->phidpPreparsedData, &pHidMouse->hidpCaps);

    // Get the total number of usages that can be returned in an input packet.
    pHidMouse->dwMaxUsages = HidP_MaxUsageListLength(HidP_Input, 
        HID_USAGE_PAGE_BUTTON, phidpPreparsedData);
    cbUsages = pHidMouse->dwMaxUsages * sizeof(USAGE);

    if (AllocateUsageLists(pHidMouse, cbUsages) == FALSE) {
        goto EXIT;
    }

    // Do we have a mouse wheel?
    DetermineWheelUsage(pHidMouse);

    // Create the thread that will receive reports from this device
    pHidMouse->hThread = CreateThread(NULL, 0, MouseThreadProc, pHidMouse, 0, NULL);
    if (pHidMouse->hThread == NULL) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: Failed creating mouse thread\r\n"), 
            pszFname));
        goto EXIT;
    }
#ifdef DEBUG
    pHidMouse->fhThreadInited = TRUE;
#endif

    *ppvNotifyParameter = pHidMouse;
    ValidateHidMouse(pHidMouse);
    fRet = TRUE;

EXIT:
    if ((fRet == FALSE) && (pHidMouse != NULL)) {
        FreeHidMouse(pHidMouse);
    }
    
    return fRet;
}
#ifdef DEBUG
// Match function with typedef.
static LPHID_CLIENT_ATTACH g_pfnDeviceAttach = HIDDeviceAttach;
#endif


// Entry point for the HID driver to give us notifications.
extern "C" 
BOOL 
WINAPI
HIDDeviceNotifications(
    DWORD  dwMsg,
    WPARAM wParam, // Message parameter
    PVOID  pvNotifyParameter
    )
{
    SETFNAME(_T("HIDDeviceNotifications"));

    BOOL fRet = FALSE;
    PHID_MOUSE pHidMouse = (PHID_MOUSE) pvNotifyParameter;
    DWORD dwFlags = 0;

    UNREFERENCED_PARAMETER(wParam);

    if (VALID_HID_MOUSE(pHidMouse) == FALSE) {
        DEBUGMSG(ZONE_ERROR, (_T("%s: Received invalid structure pointer\r\n"), pszFname));
        goto EXIT;
    }

    ValidateHidMouse(pHidMouse);
    
    switch(dwMsg) {
        case HID_CLOSE_DEVICE:
            // Free all of our resources.
            WaitForSingleObject(pHidMouse->hThread, INFINITE);
            CloseHandle(pHidMouse->hThread);
            pHidMouse->hThread = NULL;

            // Send ups for each button that is still down.
            SetButtonFlags(&dwFlags, pHidMouse->puPrevUsages, pHidMouse->dwMaxUsages,
                g_rgdwUsageToUpButton, dim(g_rgdwUsageToUpButton));
            MouseEvent(dwFlags, 0, 0, 0);
            
            FreeHidMouse(pHidMouse);
            fRet = TRUE;
            break;

        default:
            DEBUGMSG(ZONE_ERROR, (_T("%s: Unhandled message %u\r\n"), pszFname));
            break;
    };

EXIT:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产| 99热这里都是精品| 美女诱惑一区二区| 毛片av一区二区三区| 日韩电影在线观看一区| 免费欧美在线视频| 国产中文字幕精品| 国产一区二区91| 成人免费va视频| 91麻豆精东视频| 91国产精品成人| 欧美日韩精品欧美日韩精品| 51午夜精品国产| 91精品国产色综合久久| 日韩欧美视频在线| 精品国产第一区二区三区观看体验| 久久一区二区三区国产精品| 中文乱码免费一区二区| 亚洲欧美一区二区久久| 亚洲成av人综合在线观看| 蜜桃视频在线观看一区二区| 国产精品自拍在线| 91香蕉视频污| 欧美精品在线观看播放| 精品三级在线看| 国产精品国产三级国产普通话99| 一区二区高清免费观看影视大全 | 久久99精品一区二区三区| 精品一区二区在线免费观看| 粉嫩av亚洲一区二区图片| 91美女片黄在线观看91美女| 4438成人网| 国产片一区二区三区| 亚洲精品亚洲人成人网 | 成人av片在线观看| 欧美性欧美巨大黑白大战| 日韩一区二区在线看片| 中文字幕欧美三区| 亚洲高清免费观看| 国产精品影视网| 在线日韩国产精品| 欧美xxxx老人做受| 亚洲丝袜另类动漫二区| 秋霞午夜av一区二区三区| 成人国产亚洲欧美成人综合网 | 国产精品福利一区| 蜜臀精品一区二区三区在线观看| 成人午夜大片免费观看| 欧美精品三级日韩久久| 国产女同性恋一区二区| 首页综合国产亚洲丝袜| 成人天堂资源www在线| 欧美精品三级在线观看| 国产精品青草综合久久久久99| 性久久久久久久| 成人av午夜影院| 欧美一区二区日韩| 樱桃国产成人精品视频| 国产91精品在线观看| 日韩欧美中文一区| 亚洲色大成网站www久久九九| 久久国产精品72免费观看| 欧美影院精品一区| 国产精品毛片久久久久久久 | 日韩亚洲欧美高清| 亚洲精品伦理在线| 成人深夜福利app| 欧美电影免费观看高清完整版在| 亚洲精品国产一区二区三区四区在线 | 国产精品久久久久影院老司| 久热成人在线视频| 欧美美女视频在线观看| 亚洲欧美国产三级| 处破女av一区二区| 欧美成人午夜电影| 日本午夜一本久久久综合| 91电影在线观看| 国产精品美女www爽爽爽| 精品在线视频一区| 欧美一区二区三区在线| 亚洲第一在线综合网站| 色婷婷av一区二区三区大白胸 | 欧美a级一区二区| 欧美日韩一区不卡| 亚洲综合在线观看视频| bt欧美亚洲午夜电影天堂| 2022国产精品视频| 久久国产视频网| 日韩一区二区精品葵司在线| 五月激情六月综合| 欧美日韩中文另类| 亚洲国产成人av好男人在线观看| 91麻豆自制传媒国产之光| 中文字幕一区二区不卡| av日韩在线网站| 国产精品久久一级| 不卡一二三区首页| 中文字幕中文字幕中文字幕亚洲无线 | 色综合色综合色综合 | www.亚洲在线| 日韩毛片视频在线看| 成人动漫av在线| 国产精品色哟哟| 99视频精品在线| 亚洲你懂的在线视频| 91在线精品一区二区| 亚洲青青青在线视频| 91色在线porny| 亚洲综合网站在线观看| 欧美日本高清视频在线观看| 日韩精品电影在线| 日韩精品中文字幕一区二区三区| 开心九九激情九九欧美日韩精美视频电影 | 色婷婷综合久久久久中文| 亚洲欧美欧美一区二区三区| 在线观看欧美日本| 午夜久久福利影院| 欧美猛男gaygay网站| 免费的国产精品| 精品91自产拍在线观看一区| 国产成人一区在线| 亚洲女同ⅹxx女同tv| 欧美日韩精品是欧美日韩精品| 视频一区在线播放| 精品久久久久香蕉网| 成人一二三区视频| 伊人色综合久久天天人手人婷| 欧美视频你懂的| 精品在线一区二区| 国产精品国产三级国产普通话99 | 色综合网色综合| 午夜精品在线看| 精品国产伦一区二区三区免费| 国产不卡视频一区| 亚洲精品福利视频网站| 51午夜精品国产| 国产99精品国产| 亚洲福利视频导航| 精品国产91亚洲一区二区三区婷婷| 国产不卡视频一区| 亚洲第一av色| 久久久精品天堂| 欧美艳星brazzers| 韩国欧美一区二区| 亚洲欧美另类久久久精品| 日韩一区二区三区av| 成人高清视频在线观看| 性做久久久久久免费观看欧美| 精品国产露脸精彩对白| 色婷婷久久久亚洲一区二区三区| 美女网站在线免费欧美精品| 亚洲私人黄色宅男| 精品av久久707| 久久久久亚洲综合| 在线日韩一区二区| 热久久免费视频| 国产精品久久久久三级| 91精品欧美福利在线观看| 国产精品白丝jk白祙喷水网站| 亚洲国产一区二区a毛片| 亚洲精品在线观| 欧美日韩视频专区在线播放| 国产乱一区二区| 国产一区二区三区免费观看| 欧美精品一区在线观看| 蜜桃久久精品一区二区| 日韩欧美第一区| 日本欧美在线观看| 精品日韩av一区二区| 狠狠色狠狠色综合系列| 久久久五月婷婷| 国产精品一区二区你懂的| 国产亚洲精品中文字幕| 国产精品456| 国产精品乱码一区二区三区软件| 成人精品视频一区二区三区尤物| 中文字幕精品一区| av电影在线观看一区| 亚洲色图另类专区| 欧美视频在线观看一区二区| 午夜电影久久久| 欧美一级视频精品观看| 精品一区免费av| 欧美极品aⅴ影院| 一本久久a久久精品亚洲 | 国产精品欧美综合在线| 色综合久久精品| 丝袜脚交一区二区| 久久久一区二区| 色综合视频在线观看| 图片区小说区区亚洲影院| 精品久久五月天| 韩国av一区二区三区在线观看 | 亚洲欧美日韩电影| 777奇米成人网| 国内精品久久久久影院色| 亚洲欧美中日韩| 9191久久久久久久久久久| 国产一区二区三区免费看| 亚洲欧美日韩电影|