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

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

?? io.c

?? This is a serial mouse driver, which is compliant with Plug and Play, supports dynamic detection (vi
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*++

Copyright (c) 1997-1998 Microsoft Corporation, All Rights Reserved

Module Name:

    io.c

Abstract:

    Contains functions that communicate to the serial driver below sermouse in
    the stack.  This includes the read/complete loop mechanism to acquire bytes
    and IOCTL calls.

Environment:

    Kernel & user mode.

Revision History:

--*/


#include "mouser.h"
#include "debug.h"

#ifdef ALLOC_PRAGMA
#pragma alloc_text (PAGE, SerialMousepIoSyncIoctl)
#pragma alloc_text (PAGE, SerialMousepIoSyncIoctlEx)
#endif

//
// Private definitions.
//

NTSTATUS
SerialMouseReadComplete (
    IN PDEVICE_OBJECT       DeviceObject,
    IN PIRP                 Irp,
    IN PDEVICE_EXTENSION    DeviceExtension  // (PVOID Context)
    )
/*++

Routine Description:

    This routine is the read IRP completion routine.  It is called when the
    serial driver satisfies (or rejects) the IRP request we sent it.  The
    read report is analysed, and a MOUSE_INPUT_DATA structure is built
    and sent to the mouse class driver via a callback routine.

Arguments:

    DeviceObject - Pointer to the device object.

    Irp - Pointer to the request packet.

    Context - Pointer to the device context structure


Return Value:

    NTSTATUS result code.

--*/
{
    LARGE_INTEGER       li;
    ULONG               inputDataConsumed,
                        buttonsDelta,
                        i;
    NTSTATUS            status;
    PMOUSE_INPUT_DATA   currentInput;
    KIRQL               oldIrql;
    BOOLEAN             startRead = TRUE;

    Print(DeviceExtension, DBG_READ_TRACE, ("ReadComplete enter\n"));

    //
    // Obtain the current status of the IRP.
    //
    status = Irp->IoStatus.Status;

    Print(DeviceExtension, DBG_SS_NOISE,
          ("Comp Routine:  interlock was %d\n", DeviceExtension->ReadInterlock));

    //
    // If ReadInterlock is == START_READ, this func has been completed
    // synchronously.  Place IMMEDIATE_READ into the interlock to signify this
    // situation; this will notify StartRead to loop when IoCallDriver returns.
    // Otherwise, we have been completed async and it is safe to call StartRead()
    //
    startRead =
       (SERIAL_MOUSE_START_READ !=
        InterlockedCompareExchange(&DeviceExtension->ReadInterlock,
                                   SERIAL_MOUSE_IMMEDIATE_READ,
                                   SERIAL_MOUSE_START_READ));

    //
    // Determine if the IRP request was successful.
    //
    switch (status) {
    case STATUS_SUCCESS:
        //
        // The buffer of the context now contains a single byte from the device.
        //
        Print(DeviceExtension, DBG_READ_NOISE,
              ("read, Information = %d\n",
              Irp->IoStatus.Information
              ));

        //
        // Nothing read, just start another read and return
        //
        if (Irp->IoStatus.Information == 0) {
            break;
        }

        ASSERT(Irp->IoStatus.Information == 1);

        currentInput = &DeviceExtension->InputData;

        Print(DeviceExtension, DBG_READ_NOISE,
              ("byte is 0x%x\n",
              (ULONG) DeviceExtension->ReadBuffer[0]
              ));

        if ((*DeviceExtension->ProtocolHandler)(
                DeviceExtension,
                currentInput,
                &DeviceExtension->HandlerData,
                DeviceExtension->ReadBuffer[0],
                0
                )) {

            //
            // The report is complete, compute the button deltas and send it off
            //
            // Do we have a button state change?
            //
            if (DeviceExtension->HandlerData.PreviousButtons ^ currentInput->RawButtons) {
                //
                // The state of the buttons changed. Make some calculations...
                //
                buttonsDelta = DeviceExtension->HandlerData.PreviousButtons ^
                                    currentInput->RawButtons;

                //
                // Button 1.
                //
                if (buttonsDelta & MOUSE_BUTTON_1) {
                    if (currentInput->RawButtons & MOUSE_BUTTON_1) {
                        currentInput->ButtonFlags |= MOUSE_BUTTON_1_DOWN;
                    }
                    else {
                        currentInput->ButtonFlags |= MOUSE_BUTTON_1_UP;
                    }
                }

                //
                // Button 2.
                //
                if (buttonsDelta & MOUSE_BUTTON_2) {
                    if (currentInput->RawButtons & MOUSE_BUTTON_2) {
                        currentInput->ButtonFlags |= MOUSE_BUTTON_2_DOWN;
                    }
                    else {
                        currentInput->ButtonFlags |= MOUSE_BUTTON_2_UP;
                    }
                }

                //
                // Button 3.
                //
                if (buttonsDelta & MOUSE_BUTTON_3) {
                    if (currentInput->RawButtons & MOUSE_BUTTON_3) {
                        currentInput->ButtonFlags |= MOUSE_BUTTON_3_DOWN;
                    }
                    else {
                        currentInput->ButtonFlags |= MOUSE_BUTTON_3_UP;
                    }
                }

                DeviceExtension->HandlerData.PreviousButtons =
                    currentInput->RawButtons;
            }

            Print(DeviceExtension, DBG_READ_NOISE,
                  ("Buttons: %0lx\n",
                  currentInput->Buttons
                  ));

            if (DeviceExtension->EnableCount) {
                //
                // Synchronization issue -  it's not a big deal if .Enabled is set
                // FALSE after the condition above, but before the callback below,
                // so long as the .MouClassCallback field is not nulled.   This is
                // guaranteed since the disconnect IOCTL is not implemented yet.
                //
                // Mouse class callback assumes we are running at DISPATCH level,
                // however this IoCompletion routine can be running <= DISPATCH.
                // Raise the IRQL before calling the callback.
                //

                KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);

                //
                // Call the callback.
                //
                (*(PSERVICE_CALLBACK_ROUTINE)
                 DeviceExtension->ConnectData.ClassService) (
                     DeviceExtension->ConnectData.ClassDeviceObject,
                     currentInput,
                     currentInput+1,
                     &inputDataConsumed);

                //
                // Restore the previous IRQL right away.
                //
                KeLowerIrql(oldIrql);

                if (1 != inputDataConsumed) {
                    //
                    // oh well, the packet was not consumed, just drop it
                    //
                    Print(DeviceExtension, DBG_READ_ERROR,
                          ("packet not consumed!!!\n"));
                }
            }

            //
            // Clear the button flags for the next packet
            //
            currentInput->Buttons = 0;
        }

        break;

    case STATUS_TIMEOUT:
        // The IO timed out, this shouldn't happen because we set the timeouts
        // to never when the device was initialized
        break;

    case STATUS_CANCELLED:
        // The read IRP was cancelled.  Do not send any more read IRPs.
        //
        // Set the event so that the stop code can continue processing
        //
        KeSetEvent(&DeviceExtension->StopEvent, 0, FALSE);

    case STATUS_DELETE_PENDING:
    case STATUS_DEVICE_NOT_CONNECTED:
        //
        // The serial mouse object is being deleted.  We will soon
        // receive Plug 'n Play notification of this device's removal,
        // if we have not received it already.
        //
        Print(DeviceExtension, DBG_READ_INFO,
              ("removing lock on cancel, count is 0x%x\n",
              DeviceExtension->EnableCount));
        IoReleaseRemoveLock(&DeviceExtension->RemoveLock, DeviceExtension->ReadIrp);
        startRead = FALSE;

        break;

    default:
        //
        // Unknown device state
        //
        Print(DeviceExtension, DBG_READ_ERROR, ("read error\n"));
        TRAP();

    }

    if (startRead) {
        Print(DeviceExtension, DBG_READ_NOISE, ("calling StartRead directly\n"));
        SerialMouseStartRead(DeviceExtension);
    }
#if DBG
    else {
        Print(DeviceExtension, DBG_READ_NOISE, ("StartRead will loop\n"));
    }
#endif

    return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS
SerialMouseStartRead (
    IN PDEVICE_EXTENSION DeviceExtension
    )
/*++

Routine Description:

    Initiates a read to the serial port driver.

    Note that the routine does not verify that the device context is in the
    OperationPending state, but simply assumes it.

    Note the IoCount must be incremented before entering into this read loop.

Arguments:

    DeviceExtension - Device context structure

Return Value:

    NTSTATUS result code from IoCallDriver().

--*/
{
    PIRP                irp;
    NTSTATUS            status = STATUS_SUCCESS;
    PIO_STACK_LOCATION  stack;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩精品一区| 日韩免费观看2025年上映的电影 | 精品一区二区综合| 亚洲二区视频在线| 亚洲成人免费视频| 亚洲福中文字幕伊人影院| 亚洲一区二区三区四区中文字幕| 国产精品第五页| 综合欧美一区二区三区| 最新成人av在线| 国产精品久久久久影视| 中文一区二区完整视频在线观看| 国产婷婷一区二区| 中文字幕一区二区三区四区| 亚洲免费视频中文字幕| 夜夜嗨av一区二区三区四季av| 亚洲色图在线播放| 亚洲图片欧美综合| 麻豆国产精品777777在线| 麻豆国产91在线播放| 国内精品久久久久影院薰衣草| 精品一区二区在线看| 国产成人精品免费| 一本到不卡精品视频在线观看| 色婷婷综合激情| 91精品黄色片免费大全| 精品粉嫩超白一线天av| 中文字幕在线不卡| 一区二区高清在线| 久久电影国产免费久久电影| 国产传媒欧美日韩成人| 色播五月激情综合网| 日韩精品最新网址| **性色生活片久久毛片| 日韩精品电影在线观看| 国产精品资源网站| 在线精品视频一区二区| 精品久久久久久久久久久久久久久久久| 精品国产乱码久久久久久免费| 国产精品萝li| 日本特黄久久久高潮| 豆国产96在线|亚洲| 宅男在线国产精品| 18欧美亚洲精品| 久草中文综合在线| 91社区在线播放| 久久久久久久久久久电影| 亚洲一区二三区| 成人一区二区三区中文字幕| 在线不卡中文字幕播放| 国产精品二三区| 国产在线播精品第三| 欧美日韩中文字幕一区| 1000精品久久久久久久久| 国产麻豆精品在线观看| 欧美日韩电影在线播放| 亚洲免费观看高清完整版在线观看| 久久97超碰色| 91精品国产综合久久精品| 中文字幕视频一区二区三区久| 精品一区在线看| 日韩亚洲欧美高清| 婷婷综合在线观看| 在线观看网站黄不卡| 国产精品久久久爽爽爽麻豆色哟哟| 久久国产精品区| 91精品福利在线一区二区三区| 亚洲自拍偷拍网站| 欧美一区二区女人| 亚洲在线免费播放| 91丨九色丨黑人外教| 中文字幕在线免费不卡| 成人免费观看av| 国产精品国产三级国产a| 国产一区二区女| 久久久久9999亚洲精品| 韩国三级中文字幕hd久久精品| 91精品国产欧美一区二区成人 | 色婷婷av一区二区| 日韩一区在线免费观看| 成人免费精品视频| 中文字幕一区二区三区色视频 | 一区二区三区蜜桃网| 色综合咪咪久久| 亚洲已满18点击进入久久| 91久久人澡人人添人人爽欧美| 国产精品日产欧美久久久久| 国产成人免费在线观看| 久久精品一区二区三区不卡| 国产精品456露脸| 中文字幕一区二区在线播放| 91亚洲精品一区二区乱码| 亚洲一区二区中文在线| 欧美电影影音先锋| 久久99精品国产.久久久久久| 26uuu成人网一区二区三区| 国产福利一区在线| 国产精品素人一区二区| 欧美在线观看你懂的| 蜜臀a∨国产成人精品| 国产亚洲美州欧州综合国| 不卡在线视频中文字幕| 亚洲国产精品一区二区久久恐怖片 | 欧美日韩精品三区| 久久se精品一区精品二区| 国产精品三级在线观看| 欧美性xxxxxxxx| 九一久久久久久| 日韩一区在线免费观看| 日韩女优制服丝袜电影| 成人在线视频一区二区| 亚洲第一av色| 国产亚洲欧美在线| 欧美日韩国产影片| 国产成人在线视频网站| 亚洲不卡一区二区三区| 久久久久久久久久电影| 在线观看日韩高清av| 国产福利一区在线| 五月婷婷综合网| 亚洲欧洲在线观看av| 日韩免费在线观看| 欧美日韩一区不卡| 成人av电影观看| 激情综合五月婷婷| 天堂影院一区二区| 亚洲欧洲综合另类| 国产亚洲精品久| 日韩一卡二卡三卡国产欧美| 日本韩国精品在线| 国产成人精品在线看| 日本亚洲一区二区| 亚洲蜜桃精久久久久久久| 国产网站一区二区三区| 日韩午夜小视频| 在线观看中文字幕不卡| a在线欧美一区| 国产精品18久久久| 国产自产高清不卡| 麻豆精品视频在线| 国产91精品在线观看| 日韩电影在线观看网站| 亚洲在线中文字幕| 樱桃国产成人精品视频| 国产精品国产三级国产有无不卡| 精品福利一区二区三区免费视频| 欧美色图激情小说| 欧美在线影院一区二区| 色综合久久久网| 一本大道久久a久久精二百| 国产98色在线|日韩| 国产成人丝袜美腿| 国产成人一区在线| 成人午夜在线播放| 91在线免费看| 91一区二区三区在线播放| 成人黄色小视频在线观看| 成人动漫视频在线| 97精品超碰一区二区三区| 91一区二区在线观看| 成人动漫在线一区| 色噜噜狠狠一区二区三区果冻| 91在线国内视频| 色综合久久综合网97色综合| 97se亚洲国产综合自在线观| 色狠狠色狠狠综合| 91麻豆精品久久久久蜜臀| 日韩精品在线一区二区| 亚洲精品一区二区三区香蕉| 久久色成人在线| 国产精品久久久久久久久果冻传媒 | 欧美日韩不卡视频| 日韩一卡二卡三卡四卡| 国产女人18毛片水真多成人如厕| 久久久精品日韩欧美| 国产精品丝袜久久久久久app| 国产精品乱码妇女bbbb| 玉足女爽爽91| 久久国产婷婷国产香蕉| 丁香六月综合激情| 欧美在线|欧美| 欧美成人bangbros| 国产精品久久久久三级| 亚洲成人免费av| 国产精品一区二区x88av| 97久久精品人人做人人爽| 在线成人av影院| 国产精品久久久久婷婷| 五月天激情综合| 国产成人av影院| 欧美伦理影视网| 国产精品日韩成人| 日韩高清在线不卡| av不卡在线播放| 日韩一区二区中文字幕| 亚洲视频网在线直播| 三级成人在线视频| 91丨九色丨国产丨porny| 精品欧美乱码久久久久久1区2区| 中文字幕一区二区不卡|