Board logo

标题: 可重用驱动代码片段 [打印本页]

作者: look_w    时间: 2017-11-18 14:21     标题: 可重用驱动代码片段

驱动里面操作文件真他妈的麻烦啊!以前没有搞过,昨天下午一直搞不好,昨晚看了看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:为文件名,例如[url=]//??//d://test.txt[/url],如果不能确定的统统放到/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://bbs.eccn.com/) Powered by Discuz! 7.0.0