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

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

?? mseries.c

?? This is a serial mouse driver, which is compliant with Plug and Play, supports dynamic detection (vi
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*++

Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved
Copyright (c) 1993  Logitech Inc.

Module Name:

    mseries.c

Abstract:


Environment:

    Kernel mode only.

Notes:


Revision History:

--*/

//
// Includes.
//

#include "ntddk.h"
#include "mouser.h"
#include "debug.h"
#include "cseries.h"
#include "mseries.h"

//
// Use the alloc_text pragma to specify the driver initialization routines
// (they can be paged out).
//

#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE,MSerSetProtocol)
#pragma alloc_text(PAGE,MSerPowerUp)
#pragma alloc_text(PAGE,MSerPowerDown)
#pragma alloc_text(PAGE,MSerDetect)
#endif // ALLOC_PRAGMA

//
// Constants.
//

#define MSER_BAUDRATE 1200
#define MAX_RESET_BUFFER 8
#define MINIMUM_RESET_TIME (200 * MS_TO_100_NS)

//
// Microsoft Plus.
//

#define MP_SYNCH_BIT          0x40

#define MP_BUTTON_LEFT        0x20
#define MP_BUTTON_RIGHT       0x10
#define MP_BUTTON_MIDDLE      0x20

#define MP_BUTTON_LEFT_SR     5
#define MP_BUTTON_RIGHT_SR    3
#define MP_BUTTON_MIDDLE_SR   3

#define MP_BUTTON_MIDDLE_MASK 0x04

#define MP_UPPER_MASKX        0x03
#define MP_UPPER_MASKY        0x0C

#define MP_UPPER_MASKX_SL     6
#define MP_UPPER_MASKY_SL     4

//
// Microsoft BallPoint.
//

#define BP_SYNCH_BIT          0x40

#define BP_BUTTON_LEFT        0x20
#define BP_BUTTON_RIGHT       0x10
#define BP_BUTTON_3           0x04
#define BP_BUTTON_4           0x08

#define BP_BUTTON_LEFT_SR     5
#define BP_BUTTON_RIGHT_SR    3
#define BP_BUTTON_3_SL        0
#define BP_BUTTON_4_SL        0

#define BP_UPPER_MASKX        0x03
#define BP_UPPER_MASKY        0x0C

#define BP_UPPER_MASKX_SL     6
#define BP_UPPER_MASKY_SL     4

#define BP_SIGN_MASKX         0x01
#define BP_SIGN_MASKY         0x02

//
// Microsoft Magellan Mouse.
//

#define Z_SYNCH_BIT          0x40
#define Z_EXTRA_BIT          0x20

#define Z_BUTTON_LEFT        0x20
#define Z_BUTTON_RIGHT       0x10
#define Z_BUTTON_MIDDLE      0x10

#define Z_BUTTON_LEFT_SR     5
#define Z_BUTTON_RIGHT_SR    3
#define Z_BUTTON_MIDDLE_SR   3

#define Z_BUTTON_MIDDLE_MASK 0x04

#define Z_UPPER_MASKX        0x03
#define Z_UPPER_MASKY        0x0C
#define Z_UPPER_MASKZ        0x0F

#define Z_LOWER_MASKZ        0x0F

#define Z_UPPER_MASKX_SL     6
#define Z_UPPER_MASKY_SL     4
#define Z_UPPER_MASKZ_SL     4

//
// Type definitions.
//

typedef struct _PROTOCOL {
    PPROTOCOL_HANDLER Handler;
    // UCHAR LineCtrl;
    SERIAL_LINE_CONTROL LineCtrl;
} PROTOCOL;

//
// This list is indexed by protocol values MSER_PROTOCOL_*.
//

static PROTOCOL Protocol[] = {
    {
    MSerHandlerMP,  // Microsoft Plus
    // ACE_7BW | ACE_1SB
    { STOP_BIT_1, NO_PARITY, 7 }
    },
    {
    MSerHandlerBP,  // BALLPOINT
    // ACE_7BW | ACE_1SB
    { STOP_BIT_1, NO_PARITY, 7 }
    },
    {
    MSerHandlerZ,   // Magellan Mouse
    // ACE_7BW | ACE_1SB
    { STOP_BIT_1, NO_PARITY, 7 }
    }
};

PPROTOCOL_HANDLER
MSerSetProtocol(
    PDEVICE_EXTENSION DeviceExtension, 
    UCHAR             NewProtocol
    )
/*++

Routine Description:

    Set the mouse protocol. This function only sets the serial port 
    line control register.

Arguments:

    Port - Pointer to the serial port.

    NewProtocol - Index into the protocol table.

Return Value:

    Pointer to the protocol handler function.

--*/
{
    ASSERT(NewProtocol < MSER_PROTOCOL_MAX);
    PAGED_CODE();

    Print(DeviceExtension, DBG_SS_TRACE, ("MSerSetProtocol called\n"));

    //
    // Set the protocol
    //
    SerialMouseSetLineCtrl(DeviceExtension, &Protocol[NewProtocol].LineCtrl);

    return Protocol[NewProtocol].Handler;
}

NTSTATUS
MSerPowerUp(
    PDEVICE_EXTENSION DeviceExtension
    )
/*++

Routine Description:

    Powers up the mouse. Just sets the RTS and DTR lines and returns.

Arguments:

    Port - Pointer to the serial port.

Return Value:

    TRUE.

--*/
{
    IO_STATUS_BLOCK     iosb;
    NTSTATUS            status;
    KEVENT              event;

    PAGED_CODE();

    Print(DeviceExtension, DBG_SS_TRACE, ("MSerPowerUp called\n"));

    KeInitializeEvent(&event, NotificationEvent, FALSE);

    //
    // Clear DTR
    //
    Print(DeviceExtension, DBG_SS_NOISE, ("Clearing DTR...\n"));
    status = SerialMouseIoSyncIoctl(IOCTL_SERIAL_CLR_DTR,
                                    DeviceExtension->TopOfStack, 
                                    &event,
                                    &iosb
                                    );

    if (!NT_SUCCESS(status)) {
        return status;  
    }
                
    //
    // Clear RTS
    //
    Print(DeviceExtension, DBG_SS_NOISE, ("Clearing RTS...\n"));
    status = SerialMouseIoSyncIoctl(IOCTL_SERIAL_CLR_RTS,
                                    DeviceExtension->TopOfStack, 
                                    &event,
                                    &iosb
                                    );
    if (!NT_SUCCESS(status)) {
        return status;
    }
                
    //
    // Set a timer for 200 ms
    //
    status = SerialMouseWait(DeviceExtension, -PAUSE_200_MS);
    if (!NT_SUCCESS(status)) {
        Print(DeviceExtension, DBG_SS_ERROR,
              ("Timer failed with status %x\n", status ));
        return status;      
    }

    //
    // set DTR
    //
    Print(DeviceExtension, DBG_SS_NOISE, ("Setting DTR...\n"));
    status = SerialMouseIoSyncIoctl(IOCTL_SERIAL_SET_DTR,
                                    DeviceExtension->TopOfStack, 
                                    &event,
                                    &iosb
                                    );
    if (!NT_SUCCESS(status)) {
        return status;
    }
        
    status = SerialMouseWait(DeviceExtension, -PAUSE_200_MS);
    if (!NT_SUCCESS(status)) {
            Print(DeviceExtension, DBG_SS_ERROR,
              ("Timer failed with status %x\n", status ));
        return status;
    }                                 

    // 
    // set RTS      
    //
    Print(DeviceExtension, DBG_SS_NOISE, ("Setting RTS...\n"));
    status = SerialMouseIoSyncIoctl(IOCTL_SERIAL_SET_RTS,
                                    DeviceExtension->TopOfStack, 
                                    &event,
                                    &iosb
                                    );

    status = SerialMouseWait(DeviceExtension, -175 * MS_TO_100_NS);
    if (!NT_SUCCESS(status)) {
        Print(DeviceExtension, DBG_SS_ERROR,
        ("Timer failed with status %x\n", status ));
        return status;
    }                                 

    return status;
}

NTSTATUS
MSerPowerDown(
    PDEVICE_EXTENSION   DeviceExtension 
    )
/*++

Routine Description:

    Powers down the mouse. Sets the RTS line to an inactive state.

Arguments:

    Port - Pointer to the serial port.

Return Value:

    TRUE.

--*/
{
    IO_STATUS_BLOCK     iosb;
    SERIAL_HANDFLOW     shf;
    KEVENT              event;
    NTSTATUS            status;
    ULONG               bits;

    PAGED_CODE();

    Print(DeviceExtension, DBG_SS_TRACE, ("MSerPowerDown called\n"));

    KeInitializeEvent(&event,
                      NotificationEvent,
                      FALSE
                      );


    //
    // Set DTR
    //
    Print(DeviceExtension, DBG_SS_NOISE, ("Setting DTR...\n"));
    status = SerialMouseIoSyncIoctl(IOCTL_SERIAL_SET_DTR,
                                    DeviceExtension->TopOfStack, 
                                    &event,
                                    &iosb);
    if (!NT_SUCCESS(status)) {
        return status; 
    }
        
    //
    // Clear RTS
    //
    Print(DeviceExtension, DBG_SS_NOISE, ("Clearing RTS...\n"));
    status = SerialMouseIoSyncIoctl(IOCTL_SERIAL_CLR_RTS,
                                    DeviceExtension->TopOfStack, 
                                    &event,
                                    &iosb);
    if (!NT_SUCCESS(status)) {
        return status;
    }

    //
    // Set a timer for 200 ms
    //
    status = SerialMouseWait(DeviceExtension, -PAUSE_200_MS);
    if (!NT_SUCCESS(status)) {
        Print(DeviceExtension, DBG_SS_ERROR,
              ("Timer failed with status %x\n", status));
       return status;
    }
    
    return status;
}

#define BUFFER_SIZE 256
    
MOUSETYPE
MSerDetect(
    PDEVICE_EXTENSION DeviceExtension
    )
/*++

Routine Description:

    Detection code for pointing devices that identify themselves at 
    power on time.

Arguments:

    Port - Pointer to the serial port.

    BaudClock - The external frequency driving the serial chip.

Return Value:

    The type of mouse detected.

--*/
{
    ULONG           count = 0;
    MOUSETYPE       mouseType = NO_MOUSE;
    NTSTATUS        status;
    ULONG           i;
    CHAR            receiveBuffer[BUFFER_SIZE];

    PAGED_CODE();

    Print(DeviceExtension, DBG_SS_TRACE,
          ("MSerDetect enter\n"));

    status = SerialMouseInitializePort(DeviceExtension);
    if (!NT_SUCCESS(status)) {
        Print(DeviceExtension, DBG_SS_ERROR,
              ("Initializing the port failed (%x)\n", status));
        // return status;
    }

    status = MSerPowerDown(DeviceExtension);
    if (!NT_SUCCESS(status)) {
        Print(DeviceExtension, DBG_SS_ERROR,
              ("PowerDown failed (%x)\n", status));
        // return status;
    }

    //
    // Set the baud rate.
    //
    SerialMouseSetBaudRate(DeviceExtension, MSER_BAUDRATE);

    //
    // Set the data format so that the possible answer can be recognized.
    //
    SerialMouseSetLineCtrl(DeviceExtension,
                           &Protocol[MSER_PROTOCOL_MP].LineCtrl);

    //
    // Clean possible garbage in uart input buffer.
    //
    SerialMouseFlushReadBuffer(DeviceExtension);

    status = MSerPowerUp(DeviceExtension);
    if (!NT_SUCCESS(status)) {
        Print(DeviceExtension, DBG_SS_ERROR, ("Powerup failed (%x)\n", status));
    }
        
    //
    // Get the possible first reset character ('M' or 'B'), followed
    // by any other characters the hardware happens to send back.
    //
    // Note:  Typically, we expect to get just one character ('M' or
    //        'B'), perhaps followed by a '2' or '3' (to indicate the
    //        number of mouse buttons.  On some machines, we're
    //        getting extraneous characters before the 'M'.
    //        We get extraneous characters after the expected data if this a 
    //        true PnP comm device
    //

    ASSERT(CSER_POWER_UP >= MINIMUM_RESET_TIME);

    status = SerialMouseSetReadTimeouts(DeviceExtension, 200);

    if (NT_SUCCESS(SerialMouseReadChar(DeviceExtension,
                                       &receiveBuffer[count]))) {

        count++;
        SerialMouseSetReadTimeouts(DeviceExtension, 100);

        while (count < (BUFFER_SIZE - 1)) { 
            if (NT_SUCCESS(SerialMouseReadChar(DeviceExtension,
                                               &receiveBuffer[count]))) {
                count++;
            } else {
                break;
            }
        } 
    }

    *(receiveBuffer + count) = 0;

    Print(DeviceExtension, DBG_SS_NOISE, ("Receive buffer:\n"));
    for (i = 0; i < count; i++) {
        Print(DeviceExtension, DBG_SS_NOISE, ("\t0x%x\n", receiveBuffer[i]));
    }

    //
    //
    // Analyze the possible mouse answer.  Start at the beginning of the 
    // "good" data in the receive buffer, ignoring extraneous characters 
    // that may have come in before the 'M' or 'B'.
    //

    for (i = 0; i < count; i++) {
        if (receiveBuffer[i] == 'M') {
            if (receiveBuffer[i + 1] == '3') {
                Print(DeviceExtension, DBG_SS_INFO,
                      ("Detected MSeries 3 buttons\n"));
                mouseType = MOUSE_3B;
            }
            else if (receiveBuffer[i + 1] == 'Z') {
                Print(DeviceExtension, DBG_SS_INFO,
                      ("Detected Wheel Mouse\n"));
                mouseType = MOUSE_Z;
            }
            else {
                Print(DeviceExtension, DBG_SS_INFO,
                      ("Detected MSeries 2 buttons\n"));
                mouseType = MOUSE_2B;
            }
            break;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区欧美在线观看| 日韩二区在线观看| 欧美一区二区三区不卡| 波多野结衣欧美| 青青草97国产精品免费观看| 国产精品嫩草久久久久| 日韩一区二区免费在线电影| 91在线视频免费91| 国产电影一区在线| 日本va欧美va精品| 亚洲国产视频网站| 国产精品国产成人国产三级| 26uuu国产电影一区二区| 欧美三级在线看| 99精品视频一区二区| 乱一区二区av| 日韩和的一区二区| 亚洲综合图片区| 国产精品久久久久aaaa樱花| 久久美女艺术照精彩视频福利播放| 久久蜜臀精品av| 日韩欧美一级在线播放| 欧美日韩国产综合视频在线观看| 99国内精品久久| 成人免费高清视频| 国产高清视频一区| 国产一区美女在线| 美女久久久精品| 美国一区二区三区在线播放| 视频在线观看一区| 亚洲va欧美va人人爽午夜| 一区二区三区欧美| 一区二区三区久久久| 亚洲色大成网站www久久九九| 欧美激情综合五月色丁香小说| 亚洲精品在线免费播放| 精品国偷自产国产一区| 欧美成人官网二区| 欧美成人乱码一区二区三区| 欧美一卡二卡三卡| 日韩精品专区在线影院重磅| 欧美一区二区三区精品| 日韩一区和二区| 日韩女优av电影在线观看| 日韩精品在线一区二区| 久久综合色8888| 国产欧美精品一区| 中文字幕在线不卡一区| 亚洲欧美日韩综合aⅴ视频| 亚洲欧美一区二区不卡| 成人app下载| 91女人视频在线观看| 日本电影欧美片| 欧美三区在线观看| 日韩欧美国产一区二区三区| 欧美精品一区二区在线播放| 欧美激情综合五月色丁香小说| 国产精品国产三级国产普通话99| 亚洲欧美自拍偷拍色图| 亚洲综合偷拍欧美一区色| 婷婷久久综合九色综合绿巨人| 日韩一区欧美二区| 国产一区二区三区精品视频| 丁香六月久久综合狠狠色| 色婷婷综合久久| 337p亚洲精品色噜噜噜| 久久欧美一区二区| 亚洲精品免费电影| 天堂蜜桃一区二区三区 | 日韩一区二区在线免费观看| 日韩午夜在线影院| 国产偷国产偷精品高清尤物| 1000精品久久久久久久久| 亚洲成在人线免费| 国产九色精品成人porny| 色综合中文字幕国产 | 东方aⅴ免费观看久久av| 91浏览器打开| 91精品国产美女浴室洗澡无遮挡| 久久一二三国产| 亚洲欧美一区二区不卡| 日韩av中文在线观看| 国产精品一区二区三区乱码| 91天堂素人约啪| 日韩一卡二卡三卡| 亚洲婷婷综合色高清在线| 日韩国产高清影视| 99久久婷婷国产综合精品 | 欧美撒尿777hd撒尿| 久久免费精品国产久精品久久久久| 亚洲欧洲性图库| 精品在线观看免费| 在线观看日韩电影| 欧美国产日韩亚洲一区| 丝袜美腿高跟呻吟高潮一区| 成人污污视频在线观看| 91精品国产综合久久精品性色| 国产精品视频一二三| 蜜桃av一区二区在线观看| 91极品美女在线| 亚洲国产岛国毛片在线| 麻豆国产一区二区| 欧美艳星brazzers| 亚洲欧美在线aaa| 国产成人福利片| 日韩欧美国产综合| 无码av免费一区二区三区试看| 99视频热这里只有精品免费| 欧美电影免费提供在线观看| 粉嫩av一区二区三区| 欧美成人免费网站| 亚洲va韩国va欧美va| 91麻豆免费观看| 日本一区二区三区在线观看| 免费高清在线视频一区·| 欧美色图片你懂的| 亚洲手机成人高清视频| 粉嫩av一区二区三区| 久久精品综合网| 国产一区亚洲一区| 欧美大片在线观看一区二区| 日韩精品亚洲专区| 欧美日韩黄视频| 亚洲高清在线精品| 欧美私人免费视频| 亚洲影视在线观看| 在线欧美小视频| 一区二区三区欧美激情| 91福利精品视频| 一区二区三区在线视频播放| 91在线精品秘密一区二区| 国产精品免费aⅴ片在线观看| 国产一区二区在线视频| 26uuuu精品一区二区| 国精产品一区一区三区mba桃花| 欧美一区二区国产| 蜜桃精品视频在线| 2023国产精品视频| 国产一区二区免费在线| 久久亚洲一级片| 国产精品一区二区三区四区| 国产三级三级三级精品8ⅰ区| 国产盗摄女厕一区二区三区 | 亚洲视频一区在线| 91天堂素人约啪| 一区二区三区日韩精品| 欧美日韩精品一区二区三区| 午夜一区二区三区视频| 这里只有精品99re| 欧美精品乱人伦久久久久久| 日韩精品三区四区| 欧美精品一区男女天堂| 成人一区在线观看| 亚洲精品高清在线观看| 欧美日韩国产高清一区二区| 青娱乐精品视频在线| 久久综合狠狠综合| 97久久久精品综合88久久| 亚洲成人综合在线| 日韩美女视频在线| 国产高清久久久| 亚洲人成7777| 欧美乱妇15p| 国产成人激情av| 亚洲一区免费在线观看| 日韩视频一区二区三区在线播放| 国精产品一区一区三区mba桃花 | 欧美精品粉嫩高潮一区二区| 麻豆91在线播放| 中文字幕av一区二区三区免费看| 一本久久a久久免费精品不卡| 午夜精品成人在线| 久久精品水蜜桃av综合天堂| 99re热视频这里只精品| 日本不卡视频一二三区| 中文字幕av一区二区三区免费看| 欧美写真视频网站| 国产一区二区三区精品视频| 一区二区在线电影| 久久综合九色综合欧美98 | 久久男人中文字幕资源站| 91在线免费播放| 蜜桃久久久久久| 最新热久久免费视频| 欧美电视剧在线观看完整版| 99久久夜色精品国产网站| 麻豆成人免费电影| 亚洲一区视频在线观看视频| 久久综合九色综合久久久精品综合| 91亚洲男人天堂| 国内成人免费视频| 亚洲第一激情av| 国产精品的网站| 精品美女在线播放| 欧美日韩在线一区二区| 成人亚洲一区二区一| 美女爽到高潮91| 亚洲6080在线| 亚洲欧洲制服丝袜| 欧美国产精品v|