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

可重用驱动代码片段

驱动里面操作文件真他妈的麻烦啊!以前没有搞过,昨天下午一直搞不好,昨晚看了看NativeAPI参考,在Ring3下只用DDK数据类型并引入NTDLL.DLL写了个例程,编译调试运行通过,拿到驱动程

驱动里面操作文件真他妈的麻烦啊!以前没有搞过,昨天下午一直搞不好,昨晚看了看Native API 参考,在Ring3下只用DDK数据类型并引入NTDLL.DLL写了个例程,编译调试运行通过,拿到驱动程序里编译也可以。总结一个好的调试驱动程序的方法,大部分和Native API(ZwXXX之类的API)相关的的程序片段可以在Ring3编写调试(多方便啊!),引入NTDLL.DLL即可,不过有一点需要注意,就是在KMD里经常需要设置什么KERNEL之类的标志参数,否则出错。另外KMD里的同步没有Win32下那么随心所欲,总之见机行事就是了!

原型:NTSTATUS WriteLogFile(LPWSTR lpszLogFile,PVOID buffer,ULONG uLength)
函数使用同步写操作,没有使用异步机制

lpszLogFile:为文件名,例如//??//d://test.txt,如果不能确定的统统放到/systemroot/下

buffer:为缓冲区,里面是你要写的内容

uLength:是缓冲区长度

NTSTATUS WriteLogFile(LPWSTR lpszLogFile,PVOID buffer,ULONG uLength)
{
 HANDLE hFile=NULL;
 UNICODE_STRING usFileObj={0};
 OBJECT_ATTRIBUTES oa={0};
 IO_STATUS_BLOCK iostatus={0}; 
 NTSTATUS ns=0xffffffff;
 FILE_STANDARD_INFORMATION fsi={0};
 FILE_POSITION_INFORMATION fpi={0};
 
 RtlInitUnicodeString(&usFileObj,lpszLogFile);
 InitializeObjectAttributes(&oa, &usFileObj, OBJ_CASE_INSENSITIVE, NULL, NULL);
 ns=ZwCreateFile(&hFile,
        GENERIC_WRITE|SYNCHRONIZE,
     &oa,
     &iostatus,
     NULL,
     0,
     FILE_SHARE_READ|FILE_SHARE_WRITE,
     FILE_OPEN_IF,
     FILE_SYNCHRONOUS_IO_NONALERT,
     NULL,
     0);
 
 if(NT_SUCCESS(ns))
 {
  ns=ZwQueryInformationFile(hFile,&iostatus,(PVOID)&fsi,sizeof(fsi),FileStandardInformation);
  
  //如果文件有内容,则指向文件末尾
  if(NT_SUCCESS(ns))
  {
   fpi.CurrentByteOffset=fsi.EndOfFile;
   ZwSetInformationFile(hFile,&iostatus,(PVOID)&fpi,sizeof(fpi),FilePositionInformation);
  }
  
  ns = ZwWriteFile(hFile, NULL, NULL, NULL, &iostatus, buffer, uLength, NULL, NULL);
  
  ns=NT_SUCCESS(ns)?ZwClose(hFile):ZwClose(hFile),ns;
 }
 
 return ns;
}

调用代码片段:

VOID AddRecord(PSTR lpszApplication,PWSTR lpszOperation,PWSTR lpszFile)
{
 PVOID pPool=NULL;
 ULONG uSize=strlen(lpszApplication)+(wcslen(lpszOperation)+wcslen(lpszFile))*sizeof(WCHAR);
 
 //如果没有设置日志文件
 if(!wcslen(gchLogFile))
  return;

 //稍微优化一下,对齐大小到PAGE_SIZE,访问速度会快一些
 uSize+=sizeof(LARGE_INTEGER)-(uSize%sizeof(LARGE_INTEGER));

 uSize=uSize

 pPool=ExAllocatePool(PagedPool,uSize);

 if(pPool)
 {
  __try
  {
   _snprintf((char*)pPool,uSize,"%s:%S:%S/r/n",lpszApplication,lpszOperation,lpszFile);
   dprintf("%s",pPool);
   WriteLogFile(gchLogFile,pPool,strlen((char*)pPool));
  }
  __except(1)
  {
   dprintf("Exception In Add AddRecord");
  }
  ExFreePool(pPool);
 }
 //else out of memory
}


推荐阅读
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
author-avatar
hhqblog
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有