首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

可重用驱动代码片段

可重用驱动代码片段

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