热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

键盘过滤驱动只响应键盘,其他都死机了,为什么

NTSTATUSKMRead(DEVICE_OBJECT*DeviceObject,IRP*Irp){PMY_DEVICE_EXTENSIONmyDeviceExtensi

NTSTATUS KMRead(DEVICE_OBJECT *DeviceObject, IRP *Irp)
{
    PMY_DEVICE_EXTENSION myDeviceExtension;
KEVENT event;
    PIO_STACK_LOCATION currentIrpStack; 
NTSTATUS ntStatus = STATUS_SUCCESS;
    //KdPrint(("KMRead.\n"));
   PUCHAR buff;
    int len;
    myDeviceExtension = (PMY_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
   currentIrpStack = IoGetCurrentIrpStackLocation(Irp); 
 IoCopyCurrentIrpStackLocationToNext(Irp);   
    /* 只有驱动可以保证在完成例程被调用之前不被卸载的情况下,可以使用 IoSetCompletionRoutine,
   如果你不能保证,那么就需要用 IoSetCompletionRoutineEx,让内核来使驱动不被卸载*/
/*IoSetCompletionRoutine(Irp,
                           KMReadCompletion,
                           NULL,
                           TRUE,
                           TRUE,
                           TRUE);*/



IoSetCompletionRoutine(Irp,KMReadCompletion,&event,TRUE,TRUE,TRUE);
//初始化事件
KeInitializeEvent(&event, NotificationEvent, FALSE);
   
 ntStatus =IoCallDriver(myDeviceExtension->TargetDevice, Irp);

if (ntStatus == STATUS_PENDING)
{

KdPrint(("IoCallDriver return STATUS_PENDING,Waiting ...\n"));
KeWaitForSingleObject(&event,Executive,KernelMode ,FALSE,NULL);

if (NT_SUCCESS(Irp->IoStatus.Status))               {
        // 由于设备标志为 DO_BUFFERED_IO, 内核分配了该缓冲区
       buff = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;
        // 返回值一般都保存在 Information 中,即长度
        len = Irp->IoStatus.Information;



        if (buff[4] == 0)         {
            /* 键盘被按下 */
switch (buff[2]) 
            {
case 0x3A:
                g_caps = (g_caps == 1)?0:1;
                break;
case 0x2A:
case 0x36:
                g_shift = 1;
                break;
case 0x45:
                g_num = (g_num == 1)?0:1;
                break;
default:
                KMPrintKey(buff[2]);
                break;
            }
                  } else if (buff[4] == 1) 
                          {
            /* 键盘被释放 */
switch (buff[2]) {
case 0x2A:
case 0x36:
                g_shift = 0;
                break;
default: break;
                                         }
                          }
                                                   }

ntStatus = Irp->IoStatus.Status;
}                             
  IoCompleteRequest (Irp, IO_NO_INCREMENT);

KdPrint(("DriverB:Leave B HelloDDKRead\n"));

return ntStatus;
}


NTSTATUS KMReadCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context)
{
    
if (Irp->PendingReturned == TRUE) 
{
//设置事件
KeSetEvent((PKEVENT)Context,IO_NO_INCREMENT,FALSE);
}

return STATUS_MORE_PROCESSING_REQUIRED;



}


void KMPrintKey(UCHAR sch)
{

   
   IO_STATUS_BLOCK ioStatus;
    OBJECT_ATTRIBUTES oa;
   // UNICODE_STRING usPath;
    UCHAR ch = 0;
   UNICODE_STRING usBuff;
   UNICODE_STRING usCopyDes;
 PUCHAR usCopyDes1;
int len=sizeof(UCHAR);
   //WCHAR *UnicodeString = L"UnicodeString";

    if ((sch < 0x47) || ((sch >= 0x47 && sch < 0x54) && g_num==0)) {
        ch = asciiTbl[sch];
        if(g_shift && g_caps)
            ch = asciiTbl[sch+84*3];
        else if(g_shift==1)
            ch = asciiTbl[sch+84*2];
        else if(g_caps==1)
            ch = asciiTbl[sch+84];
}

if(ch==0x08)
{
//DbgPrint("退格");
}

if (ch >= 0x20 && ch < 0x7F)
{
//DbgPrint("%C",ch);
//DbgPrint("美女123 %C",ch);




usCopyDes1= (PUCHAR)ExAllocatePool(PagedPool,len);
  RtlFillMemory(usCopyDes1,len,ch);
  if(NT_SUCCESS(ntStatus))

{ZwWriteFile(
    hFile,
    NULL,
    NULL,
    NULL,
    &ioStatus,
    usCopyDes1,
     len,
    NULL,
    NULL);

}
ExFreePool(usCopyDes1);


}
}
[/code]




//这样,我把过滤的完成例程改为IoCallDriver异步的,就是IoCallDriver返回STATUS_PENDING就只响应键盘,其他都死机了。假如改回IoCallDriver同步的就没事。为什么。

1 个解决方案

#1


http://www.osronline.com/

推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
author-avatar
吴为36
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有