驱动中文件的操作和在ring3下对文件的操作有所不同,ring3下直接输文件路径就可以对文件操作了,在驱动中应该先为文件初始化一个对象,然后对这个对象操作,下面来编写一个驱动实现创建一个文件并写入字符串“www.lingdux.com”。
首先确定一下流程:
1.定义一个操作对象OBJECT_ATTRIBUTES
2.用InitializeObjectAttributes()函数初始化这个对象
3.用ZwCreateFile()函数来创建一个文件
4.用ZwWriteFile()函数写入字符串
5. 关闭打开的文件ZwClose();
实现代码如下:
#include <ntddk.h>
void UnLoad(IN PDRIVER_OBJECT DriverObject)
{}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
UNICODE_STRING mystr;//定义字符串结构用来存放字符串
UNICODE_STRING mypath;//定义字符串结构来存放路径
OBJECT_ATTRIBUTES myoa;//定义一个操作对象
HANDLE hfile=NULL;//定义一个句柄用于接收返回的文件句柄
IO_STATUS_BLOCK iostatus;//定义结构用来接收打开文件的返回值
RtlInitUnicodeString(&mystr,L”www.lingdux.com“);//初始化字符串
RtlInitUnicodeString(&mypath,L”//??//E://lingdux.txt”);//初始化路径字符串
InitializeObjectAttributes(//初始化操作对象
&myoa,//操作对象
&mypath,//路径
OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,//属性
NULL,
NULL
);
ZwCreateFile(//创建文件
&hfile,//返回的句柄
GENERIC_ALL,//打开文件时候的权限
&myoa,//文件对象
&iostatus,//返回值
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,//共享权限
FILE_OPEN_IF,//打开文件的方式
FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
ZwWriteFile(
hfile,//文件句柄
NULL,
NULL,
NULL,
&iostatus,//返回值
mystr.Buffer,//字符串缓冲区
mystr.Length,//字符串长度
NULL,
NULL
);
ZwClose(hfile);
DriverObject->DriverUnload=UnLoad;
return STATUS_SUCCESS;
}
编译后用驱动加载工具加载,成功在E盘根目录想建立文件lingdux.txt,内容为“www.lingdux.com”