可重用驱动代码片段
来源:互联网 发布:seo考试 编辑:程序博客网 时间:2024/06/01 22:13
可重用驱动代码片段
驱动里面操作文件真他妈的麻烦啊!以前没有搞过,昨天下午一直搞不好,昨晚看了看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
驱动里面操作文件真他妈的麻烦啊!以前没有搞过,昨天下午一直搞不好,昨晚看了看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
永久地
- 可重用驱动代码片段
- 可重用驱动代码片段
- 可重用代码的艺术
- 增强代码可重用能力
- 可重用的代码块
- 《最大化JAVA代码的可重用性》
- 最大化JAVA代码的可重用性
- flex as3 创建可重用代码
- 可重用代码之数据pack
- 创建一个可重用的UITableViewCell代码
- Xcode可重用代码块code snippets
- 可重用代码的基本特性
- 单例模式,重用UITableViewCell,代码片段库
- 提高Java代码可重用性的三个措施
- 提高Java代码可重用性的三个措施
- 【转】提高Java代码可重用性的三个措施
- 提高Java代码可重用性的三个措施 【转】
- 最大限制地提高代码的可重用性
- BEA WebLogic 814中Blog对象插入时问题的原因:Oracle驱动
- 查资料手册
- FREEBSD6 ports安装配置web服务
- 进程隐藏的Delphi代码(操作 PhysicalMemory
- 数据库,包括sql语句的使用总结
- 可重用驱动代码片段
- 最荐一本好的网页设计的电子书!!!
- 中小企业如何进行信息化
- 搜你没商量!十九招秘技玩转GOOGLE
- 如何在MDI程序中把子窗体菜单合并到主窗体上
- 如何混合使用C和C++(下)
- 另外一份杂记
- FTP登陆错误详解
- JSP与XML的结合(一)