• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            蝸牛的家
            男兒當(dāng)自強(qiáng)
            posts - 48,  comments - 21,  trackbacks - 0

            #include 
            "ntddk.h"
            #include 
            "ntddkbd.h"
            #include 
            "stdio.h"        

            #define KEY_UP        1
            #define KEY_DOWN      0  

            #define LCONTROL      ((USHORT)0x1D)
            #define CAPS_LOCK      ((USHORT)0x3A)  

            PDEVICE_OBJECT HookDeviceObject;
            PDEVICE_OBJECT kbdDevice;              

            NTSTATUS KSnifferDispatchRead( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp );
            NTSTATUS KSnifferReadComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context );
            NTSTATUS KSnifferDispatchGeneral(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp );                  

            NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)        
            {
                CCHAR         ntNameBuffer[
            64];
                STRING         ntNameString;
                UNICODE_STRING      ntUnicodeString;
                NTSTATUS            status;
                
                DbgPrint(
            "DriverEntry \n");
                DriverObject
            ->MajorFunction[IRP_MJ_READ] = KSnifferDispatchRead;    
                DriverObject
            ->MajorFunction[IRP_MJ_CREATE]        =
                DriverObject
            ->MajorFunction[IRP_MJ_CLOSE]          =
                DriverObject
            ->MajorFunction[IRP_MJ_FLUSH_BUFFERS]  =
                DriverObject
            ->MajorFunction[IRP_MJ_CLEANUP]        =
                DriverObject
            ->MajorFunction[IRP_MJ_DEVICE_CONTROL] = KSnifferDispatchGeneral; 

                sprintf( ntNameBuffer, 
            "\\Device\\KeyboardClass0" );
                RtlInitAnsiString( 
            &ntNameString, ntNameBuffer );
                RtlAnsiStringToUnicodeString( 
            &ntUnicodeString, &ntNameString, TRUE );
              
                status 
            = IoCreateDevice( DriverObject,          
                             
            0,
                             NULL,
                             FILE_DEVICE_KEYBOARD,
                             
            0,
                             FALSE,
                             
            &HookDeviceObject );            //建立一鍵盤類設(shè)備

                
            if!NT_SUCCESS(status) ) 
                
            {
                 DbgPrint(
            "Init Error\n");
                 RtlFreeUnicodeString( 
            &ntUnicodeString );
                 
            return STATUS_SUCCESS;
                }

                HookDeviceObject
            ->Flags |= DO_BUFFERED_IO;
                status 
            = IoAttachDevice( HookDeviceObject, &ntUnicodeString, &kbdDevice );      //連接我們的過(guò)濾設(shè)備到\\Device\\KeyboardClass0設(shè)備上
                if!NT_SUCCESS(status) ) 
                
            {
                 DbgPrint(
            "Connect with keyboard failed!\n");
                 IoDeleteDevice( HookDeviceObject );
                 RtlFreeUnicodeString( 
            &ntUnicodeString );
                 
            return STATUS_SUCCESS;
                }

                RtlFreeUnicodeString( 
            &ntUnicodeString );
                DbgPrint(
            "Successfully connected to keyboard device\n");
                
            return STATUS_SUCCESS;
            }



            NTSTATUS KSnifferDispatchRead( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )        
            //有按鍵按下時(shí)執(zhí)行
            {
                PIO_STACK_LOCATION currentIrpStack 
            = IoGetCurrentIrpStackLocation(Irp);        //獲取當(dāng)前的IRP包
                PIO_STACK_LOCATION nextIrpStack    = IoGetNextIrpStackLocation(Irp);
                
            *nextIrpStack = *currentIrpStack;
                IoSetCompletionRoutine( Irp, KSnifferReadComplete, DeviceObject, TRUE, TRUE, TRUE );     
            //調(diào)用完成例程
                return IoCallDriver( kbdDevice, Irp );
            }


            NTSTATUS KSnifferReadComplete( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context )
            {
                PIO_STACK_LOCATION        IrpSp;
                PKEYBOARD_INPUT_DATA      KeyData;
                
                IrpSp 
            = IoGetCurrentIrpStackLocation( Irp );
                
            if( NT_SUCCESS( Irp->IoStatus.Status ) ) 
                
            {
                    KeyData 
            = Irp->AssociatedIrp.SystemBuffer;
                    DbgPrint(
            "ScanCode: %x ", KeyData->MakeCode );
                    DbgPrint(
            "%s\n", KeyData->Flags ? "Up" : "Down" );      //輸出按鍵的掃描碼

                    
            if( KeyData->MakeCode == CAPS_LOCK) 
                    
            {
                        KeyData
            ->MakeCode = LCONTROL;                  //修改按鍵
                    }
              
                }

                
            if( Irp->PendingReturned ) 
                
            {
                    IoMarkIrpPending( Irp );
                }


                
            return Irp->IoStatus.Status;
            }


            NTSTATUS KSnifferDispatchGeneral(                
            //通用事件處理例程
                IN PDEVICE_OBJECT DeviceObject,
                IN PIRP          Irp )
            {
                PIO_STACK_LOCATION currentIrpStack 
            = IoGetCurrentIrpStackLocation(Irp);
                PIO_STACK_LOCATION nextIrpStack    
            = IoGetNextIrpStackLocation(Irp);

                Irp
            ->IoStatus.Status      = STATUS_SUCCESS;
                Irp
            ->IoStatus.Information = 0

                
            if( DeviceObject == HookDeviceObject ) 
                
            {
                    
            *nextIrpStack = *currentIrpStack;
                    
            return IoCallDriver( kbdDevice, Irp );
                }

                
            else
                
            {
                    
            return STATUS_SUCCESS;
                }

            }

            posted on 2008-08-22 10:49 黑色天使 閱讀(2241) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 操作系統(tǒng)

            FeedBack:
            # re: 鍵盤過(guò)濾驅(qū)動(dòng)源代碼[未登錄](méi)
            2009-02-02 14:14 | soul
            再怎么懶也該加上unload例程吧  回復(fù)  更多評(píng)論
              
            # re: 鍵盤過(guò)濾驅(qū)動(dòng)源代碼
            2009-02-10 13:19 | 黑色天使
            @soul
            再怎么懶也應(yīng)該自己實(shí)現(xiàn)一部分吧  回復(fù)  更多評(píng)論
              

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理



            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久女人与动物群交毛片| 理论片午午伦夜理片久久| 综合久久国产九一剧情麻豆| 久久棈精品久久久久久噜噜| 久久久精品免费国产四虎| 亚洲日韩欧美一区久久久久我| 一本久道久久综合狠狠爱| 久久亚洲国产欧洲精品一| 色偷偷88欧美精品久久久| av国内精品久久久久影院| 久久九九免费高清视频| 久久夜色精品国产噜噜亚洲AV| 久久精品视频91| 久久久无码精品亚洲日韩按摩 | 亚洲日韩欧美一区久久久久我| 久久久久久毛片免费播放| 久久有码中文字幕| 国产一久久香蕉国产线看观看| 丁香色欲久久久久久综合网| 欧美国产成人久久精品| 精品一区二区久久久久久久网站| 精品人妻伦九区久久AAA片69| 精品久久久久中文字幕一区| 久久久久久久亚洲Av无码| 亚洲中文久久精品无码| 亚洲欧美国产精品专区久久| 99热成人精品免费久久| 99久久777色| 国产亚洲欧美成人久久片| 无码国内精品久久人妻| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 精品免费久久久久国产一区| 久久精品国产网红主播| 久久国产精品99精品国产| 亚洲午夜久久久久久久久电影网| 一本色道久久88综合日韩精品 | 久久久久亚洲精品日久生情| 午夜精品久久久久久| 中文字幕无码久久久| 亚洲人成无码www久久久| 国产精品久久久久久久人人看|