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