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

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

?? kbfiltr.c

?? 鍵盤過濾驅動
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*--
Copyright (c) 1998. 1999  Microsoft Corporation

Module Name:

    kbfiltr.c

Abstract:

Environment:

    Kernel mode only.

Notes:


--*/

#include "kbfiltr.h"

NTSTATUS DriverEntry (PDRIVER_OBJECT, PUNICODE_STRING);

#ifdef ALLOC_PRAGMA
#pragma alloc_text (INIT, DriverEntry)
#pragma alloc_text (PAGE, KbFilter_AddDevice)
#pragma alloc_text (PAGE, KbFilter_CreateClose)
#pragma alloc_text (PAGE, KbFilter_IoCtl)
#pragma alloc_text (PAGE, KbFilter_InternIoCtl)
#pragma alloc_text (PAGE, KbFilter_Unload)
#pragma alloc_text (PAGE, KbFilter_DispatchPassThrough)
#pragma alloc_text (PAGE, KbFilter_PnP)
#pragma alloc_text (PAGE, KbFilter_Power)
#endif

NTSTATUS
DriverEntry (
    IN  PDRIVER_OBJECT  DriverObject,
    IN  PUNICODE_STRING RegistryPath
    )
/*++
Routine Description:

    Initialize the entry points of the driver.

--*/
{
    ULONG i;

    UNREFERENCED_PARAMETER (RegistryPath);

    // 
    // Fill in all the dispatch entry points with the pass through function
    // and the explicitly fill in the functions we are going to intercept
    // 
    for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) {
        DriverObject->MajorFunction[i] = KbFilter_DispatchPassThrough;
    }

    DriverObject->MajorFunction [IRP_MJ_CREATE] =
    DriverObject->MajorFunction [IRP_MJ_CLOSE] =        KbFilter_CreateClose;
    DriverObject->MajorFunction [IRP_MJ_PNP] =          KbFilter_PnP;
    DriverObject->MajorFunction [IRP_MJ_POWER] =        KbFilter_Power;
    DriverObject->MajorFunction [IRP_MJ_INTERNAL_DEVICE_CONTROL] =
                                                        KbFilter_InternIoCtl;
    //
    // If you are planning on using this function, you must create another
    // device object to send the requests to.  Please see the considerations 
    // comments for KbFilter_DispatchPassThrough for implementation details.
    //
    // DriverObject->MajorFunction [IRP_MJ_DEVICE_CONTROL] = KbFilter_IoCtl;

    DriverObject->DriverUnload = KbFilter_Unload;
    DriverObject->DriverExtension->AddDevice = KbFilter_AddDevice;

    return STATUS_SUCCESS;
}

NTSTATUS
KbFilter_AddDevice(
    IN PDRIVER_OBJECT   Driver,
    IN PDEVICE_OBJECT   PDO
    )
{
    PDEVICE_EXTENSION        devExt;
    IO_ERROR_LOG_PACKET      errorLogEntry;
    PDEVICE_OBJECT           device;
    NTSTATUS                 status = STATUS_SUCCESS;

    PAGED_CODE();

    status = IoCreateDevice(Driver,                   
                            sizeof(DEVICE_EXTENSION), 
                            NULL,                    
                            FILE_DEVICE_KEYBOARD,   
                            0,                     
                            FALSE,                
                            &device              
                            );

    if (!NT_SUCCESS(status)) {
        return (status);
    }

    RtlZeroMemory(device->DeviceExtension, sizeof(DEVICE_EXTENSION));

    devExt = (PDEVICE_EXTENSION) device->DeviceExtension;
    devExt->TopOfStack = IoAttachDeviceToDeviceStack(device, PDO);

    if (devExt->TopOfStack == NULL) {
        IoDeleteDevice(device);
        return STATUS_DEVICE_NOT_CONNECTED; 
    }

    
    ASSERT(devExt->TopOfStack);

    devExt->Self =          device;
    devExt->PDO =           PDO;
    devExt->DeviceState =   PowerDeviceD0;

    devExt->SurpriseRemoved = FALSE;
    devExt->Removed =         FALSE;
    devExt->Started =         FALSE;

    device->Flags |= (DO_BUFFERED_IO | DO_POWER_PAGABLE);
    device->Flags &= ~DO_DEVICE_INITIALIZING;

    return status;
}

NTSTATUS
KbFilter_Complete(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp,
    IN PVOID            Context
    )
/*++
Routine Description:

    Generic completion routine that allows the driver to send the irp down the 
    stack, catch it on the way up, and do more processing at the original IRQL.
    
--*/
{
    PKEVENT  event;

    event = (PKEVENT) Context;

    UNREFERENCED_PARAMETER(DeviceObject);
    UNREFERENCED_PARAMETER(Irp);

    //
    // We could switch on the major and minor functions of the IRP to perform
    // different functions, but we know that Context is an event that needs
    // to be set.
    //
    KeSetEvent(event, 0, FALSE);

    //
    // Allows the caller to use the IRP after it is completed
    //
    return STATUS_MORE_PROCESSING_REQUIRED;
}

NTSTATUS
KbFilter_CreateClose (
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
/*++
Routine Description:

    Maintain a simple count of the creates and closes sent against this device
    
--*/
{
    PIO_STACK_LOCATION  irpStack;
    NTSTATUS            status;
    PDEVICE_EXTENSION   devExt;


    PAGED_CODE();

    irpStack = IoGetCurrentIrpStackLocation(Irp);
    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    status = Irp->IoStatus.Status;

    switch (irpStack->MajorFunction) {
    case IRP_MJ_CREATE:
    
        if (NULL == devExt->UpperConnectData.ClassService) {
            //
            // No Connection yet.  How can we be enabled?
            //
            status = STATUS_INVALID_DEVICE_STATE;
        }
        else if ( 1 == InterlockedIncrement(&devExt->EnableCount)) {
            //
            // first time enable here
            //
        }
        else {
            //
            // More than one create was sent down
            //
        }
    
        break;

    case IRP_MJ_CLOSE:

        if (0 == InterlockedDecrement(&devExt->EnableCount)) {
            //
            // successfully closed the device, do any appropriate work here
            //
        }

        break;
    }

    Irp->IoStatus.Status = status;

    //
    // Pass on the create and the close
    //
    return KbFilter_DispatchPassThrough(DeviceObject, Irp);
}

NTSTATUS
KbFilter_DispatchPassThrough(
        IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp
        )
/*++
Routine Description:

    Passes a request on to the lower driver.
     
Considerations:
     
    If you are creating another device object (to communicate with user mode
    via IOCTLs), then this function must act differently based on the intended 
    device object.  If the IRP is being sent to the solitary device object, then
    this function should just complete the IRP (becuase there is no more stack
    locations below it).  If the IRP is being sent to the PnP built stack, then
    the IRP should be passed down the stack. 
    
    These changes must also be propagated to all the other IRP_MJ dispatch
    functions (create, close, cleanup, etc) as well!

--*/
{
    PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);

    //
    // Pass the IRP to the target
    //
    IoSkipCurrentIrpStackLocation(Irp);
        
    return IoCallDriver(((PDEVICE_EXTENSION) DeviceObject->DeviceExtension)->TopOfStack, Irp);
}           

NTSTATUS
KbFilter_InternIoCtl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++

Routine Description:

    This routine is the dispatch routine for internal device control requests.
    There are two specific control codes that are of interest:
    
    IOCTL_INTERNAL_KEYBOARD_CONNECT:
        Store the old context and function pointer and replace it with our own.
        This makes life much simpler than intercepting IRPs sent by the RIT and
        modifying them on the way back up.
                                      
    IOCTL_INTERNAL_I8042_HOOK_KEYBOARD:
        Add in the necessary function pointers and context values so that we can
        alter how the ps/2 keyboard is initialized.  
                                            
    NOTE:  Handling IOCTL_INTERNAL_I8042_HOOK_KEYBOARD is *NOT* necessary if 
           all you want to do is filter KEYBOARD_INPUT_DATAs.  You can remove
           the handling code and all related device extension fields and 
           functions to conserve space.
                                         
Arguments:

    DeviceObject - Pointer to the device object.

    Irp - Pointer to the request packet.

Return Value:

    Status is returned.

--*/
{
    PIO_STACK_LOCATION              irpStack;
    PDEVICE_EXTENSION               devExt;
    PINTERNAL_I8042_HOOK_KEYBOARD   hookKeyboard; 
    KEVENT                          event;
    PCONNECT_DATA                   connectData;
    NTSTATUS                        status = STATUS_SUCCESS;

    devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    Irp->IoStatus.Information = 0;
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    switch (irpStack->Parameters.DeviceIoControl.IoControlCode) {

    //
    // Connect a keyboard class device driver to the port driver.
    //
    case IOCTL_INTERNAL_KEYBOARD_CONNECT:
        //
        // Only allow one connection.
        //
        if (devExt->UpperConnectData.ClassService != NULL) {
            status = STATUS_SHARING_VIOLATION;
            break;
        }
        else if (irpStack->Parameters.DeviceIoControl.InputBufferLength <
                sizeof(CONNECT_DATA)) {
            //
            // invalid buffer
            //
            status = STATUS_INVALID_PARAMETER;
            break;
        }

        //
        // Copy the connection parameters to the device extension.
        //
        connectData = ((PCONNECT_DATA)
            (irpStack->Parameters.DeviceIoControl.Type3InputBuffer));

        devExt->UpperConnectData = *connectData;

        //
        // Hook into the report chain.  Everytime a keyboard packet is reported
        // to the system, KbFilter_ServiceCallback will be called
        //
        connectData->ClassDeviceObject = devExt->Self;
        connectData->ClassService = KbFilter_ServiceCallback;

        break;

    //
    // Disconnect a keyboard class device driver from the port driver.
    //
    case IOCTL_INTERNAL_KEYBOARD_DISCONNECT:

        //
        // Clear the connection parameters in the device extension.
        //
        // devExt->UpperConnectData.ClassDeviceObject = NULL;
        // devExt->UpperConnectData.ClassService = NULL;

        status = STATUS_NOT_IMPLEMENTED;
        break;

    //
    // Attach this driver to the initialization and byte processing of the 
    // i8042 (ie PS/2) keyboard.  This is only necessary if you want to do PS/2
    // specific functions, otherwise hooking the CONNECT_DATA is sufficient
    //
    case IOCTL_INTERNAL_I8042_HOOK_KEYBOARD:
        DebugPrint(("hook keyboard received!\n")); 
        if (irpStack->Parameters.DeviceIoControl.InputBufferLength <
            sizeof(INTERNAL_I8042_HOOK_KEYBOARD)) {
            DebugPrint(("InternalIoctl error - invalid buffer length\n"));

            status = STATUS_INVALID_PARAMETER;
            break;
        }
        hookKeyboard = (PINTERNAL_I8042_HOOK_KEYBOARD) 
            irpStack->Parameters.DeviceIoControl.Type3InputBuffer;
            
        //
        // Enter our own initialization routine and record any Init routine
        // that may be above us.  Repeat for the isr hook
        // 
        devExt->UpperContext = hookKeyboard->Context;

        //
        // replace old Context with our own
        //
        hookKeyboard->Context = (PVOID) DeviceObject;

        if (hookKeyboard->InitializationRoutine) {
            devExt->UpperInitializationRoutine =
                hookKeyboard->InitializationRoutine;
        }
        hookKeyboard->InitializationRoutine =
            (PI8042_KEYBOARD_INITIALIZATION_ROUTINE) 
            KbFilter_InitializationRoutine;

        if (hookKeyboard->IsrRoutine) {
            devExt->UpperIsrHook = hookKeyboard->IsrRoutine;
        }
        hookKeyboard->IsrRoutine = (PI8042_KEYBOARD_ISR) KbFilter_IsrHook; 

        //
        // Store all of the other important stuff
        //
        devExt->IsrWritePort = hookKeyboard->IsrWritePort;
        devExt->QueueKeyboardPacket = hookKeyboard->QueueKeyboardPacket;
        devExt->CallContext = hookKeyboard->CallContext;

        status = STATUS_SUCCESS;
        break;

    //
    // These internal ioctls are not supported by the new PnP model.
    //
#if 0       // obsolete
    case IOCTL_INTERNAL_KEYBOARD_ENABLE:
    case IOCTL_INTERNAL_KEYBOARD_DISABLE:
        status = STATUS_NOT_SUPPORTED;
        break;
#endif  // obsolete

    //
    // Might want to capture these in the future.  For now, then pass them down
    // the stack.  These queries must be successful for the RIT to communicate
    // with the keyboard.
    //
    case IOCTL_KEYBOARD_QUERY_ATTRIBUTES:
    case IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION:
    case IOCTL_KEYBOARD_QUERY_INDICATORS:
    case IOCTL_KEYBOARD_SET_INDICATORS:
    case IOCTL_KEYBOARD_QUERY_TYPEMATIC:
    case IOCTL_KEYBOARD_SET_TYPEMATIC:
        break;
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃视频免费观看一区| 成人免费小视频| 国产乱码字幕精品高清av| 亚洲精品在线观| 国产成人啪午夜精品网站男同| 久久免费国产精品| www.激情成人| 亚洲午夜激情网站| 日韩欧美亚洲国产另类 | 日韩一区二区三区免费观看| 美洲天堂一区二卡三卡四卡视频| 日韩精品专区在线| 成人免费精品视频| 亚洲一区在线电影| 日韩一二在线观看| 成人免费高清在线| 亚洲第一主播视频| 久久久精品国产免费观看同学| 不卡av免费在线观看| 午夜视频在线观看一区二区三区| 日韩精品一区二区三区视频| 福利91精品一区二区三区| 日韩伦理电影网| 日韩视频在线一区二区| 成人晚上爱看视频| 丝袜脚交一区二区| 日本一区二区三区在线观看| 欧美亚洲禁片免费| 久久激五月天综合精品| 亚洲欧美国产高清| 2021中文字幕一区亚洲| 91九色02白丝porn| 韩国女主播一区| 亚州成人在线电影| 国产精品入口麻豆原神| 91精品国产综合久久福利软件| 国产精品一色哟哟哟| 亚洲第一在线综合网站| 亚洲国产精品激情在线观看| 制服丝袜国产精品| av中文一区二区三区| 久久av资源站| 亚洲一区精品在线| 国产精品每日更新在线播放网址| 日韩一区二区三区免费观看| 色婷婷综合久色| 高清不卡一区二区| 久久国产精品色婷婷| 亚洲国产精品影院| 亚洲色图在线看| 久久精品亚洲国产奇米99| 91精品国产综合久久久久久漫画| 94色蜜桃网一区二区三区| 国产精品123| 日本不卡123| 亚洲一二三四在线观看| **欧美大码日韩| 久久久国产午夜精品| 欧美sm美女调教| 欧美裸体bbwbbwbbw| 91麻豆高清视频| 岛国av在线一区| 国产精品自拍三区| 激情国产一区二区| 另类调教123区| 欧美aaaaa成人免费观看视频| 一区二区三区四区高清精品免费观看| 国产日产欧美一区| 久久久精品国产免大香伊| 亚洲精品在线三区| 久久久精品免费观看| 亚洲精品在线免费观看视频| 精品国产一区二区三区久久影院 | 日韩欧美一级二级三级| 欧美精品亚洲一区二区在线播放| 色狠狠色噜噜噜综合网| 色欧美88888久久久久久影院| 成人黄色电影在线| 99这里只有久久精品视频| 91日韩在线专区| 在线一区二区视频| 欧美日韩一区二区三区在线看| 91国内精品野花午夜精品| 精品视频一区三区九区| 欧美夫妻性生活| 717成人午夜免费福利电影| 欧美一区二区性放荡片| 欧美电影精品一区二区| wwwwww.欧美系列| 中文字幕av一区二区三区 | 亚洲女性喷水在线观看一区| 夜夜亚洲天天久久| 石原莉奈在线亚洲二区| 精品一区二区三区蜜桃| 成人小视频免费观看| 91麻豆.com| 91精品综合久久久久久| 精品少妇一区二区三区日产乱码 | 日韩午夜在线播放| 久久久午夜精品| 亚洲品质自拍视频网站| 亚洲成人免费看| 国产乱码精品一区二区三区五月婷 | 亚洲一区在线视频观看| 青青草国产精品亚洲专区无| 国产曰批免费观看久久久| caoporen国产精品视频| 555www色欧美视频| 国产欧美一区二区三区鸳鸯浴 | 成人欧美一区二区三区| 亚洲综合激情另类小说区| 青娱乐精品在线视频| 成人小视频免费观看| 欧美美女bb生活片| 欧美国产精品v| 日日夜夜精品免费视频| 粉嫩久久99精品久久久久久夜| 91国内精品野花午夜精品| 精品国一区二区三区| 一区二区三区四区蜜桃| 国产一区激情在线| 欧美人xxxx| 亚洲欧洲精品一区二区精品久久久| 亚洲成av人片在线观看| 成人国产精品免费网站| 日韩欧美资源站| 亚洲精品你懂的| 国产精品99久| 欧美一区二区三区喷汁尤物| 国产欧美精品一区aⅴ影院 | 亚洲国产综合91精品麻豆| 国产真实乱子伦精品视频| 欧美亚洲动漫另类| 中文字幕一区二区三区av| 久久99国产精品麻豆| 欧洲精品视频在线观看| 国产精品欧美一级免费| 久久精品国产99久久6| 欧美日韩极品在线观看一区| 国产欧美日韩久久| 黄色小说综合网站| 欧美一卡二卡在线观看| 亚洲一二三区视频在线观看| 成人sese在线| 国产精品私人自拍| 高清av一区二区| 久久久高清一区二区三区| 久久国产精品色| 91麻豆精品国产自产在线| 一区二区三区在线观看国产| 成人午夜短视频| 国产午夜三级一区二区三| 久久精品国产澳门| 精品国产一区久久| 久久激情五月激情| 日韩天堂在线观看| 免费观看久久久4p| 91麻豆精品国产91久久久资源速度 | 国产精品1区二区.| 久久综合中文字幕| 国产高清不卡二三区| 国产日产欧美精品一区二区三区| 精彩视频一区二区三区| 精品理论电影在线| 精品一区二区三区在线播放视频| 日韩精品一区二区三区三区免费| 欧美96一区二区免费视频| 91精品国产欧美一区二区成人 | 欧美色图第一页| 五月激情综合网| 欧美一级在线免费| 蜜桃一区二区三区在线| 日韩精品专区在线影院观看| 久久99精品国产麻豆婷婷| 欧美岛国在线观看| 国产一区二区视频在线| 精品88久久久久88久久久| 国产精品自在欧美一区| 中文字幕中文在线不卡住| 99re这里只有精品6| 亚洲精品高清视频在线观看| 欧美在线视频你懂得| 天堂资源在线中文精品| 欧美一级免费观看| 国产一区二区三区蝌蚪| 亚洲国产精品av| 欧美在线999| 亚洲成人一区在线| 欧美一级日韩不卡播放免费| 国产一区二区三区精品视频| 中文字幕一区二区三区视频| 色婷婷av久久久久久久| 蜜臀av一区二区在线免费观看 | 中文字幕日韩一区二区| 在线免费观看日韩欧美| 麻豆国产一区二区| 中文字幕一区二区日韩精品绯色| 欧美日韩国产首页| 国产成人综合精品三级| 亚洲综合一二区|