可重用驱动代码片段

驱动里面操作文件真他妈的麻烦啊!以前没有搞过,昨天下午一直搞不好,昨晚看了看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
}


原文链接: http://blog.csdn.net/augusdi/article/details/4247582

你可能感兴趣的:(可重用驱动代码片段)