浅谈 “驱动中的文件操作”

来源:互联网 发布:socket 编程实例 编辑:程序博客网 时间:2024/06/15 04:50

对于文件操作:

我们的步骤应该是

 1:---------------打开我们指定的文件(大部分是通过文件名的得到这个文件的操作句柄),可以使用 ZwOpenFile, ZwCreateFile....

当然,创建只能用第二个。。。

 

这是一个打开已知文件的例子:

NTSTATUS status;


OBJECT_ATTRIBUTES oa;


IO_STATUS_BLOCK iostatus;


HANDLE hfile;                                 //    the output from this process


PUNICODE_STRING pathname;    //    you've been given this
 
InitializeObjectAttributes(&oa, pathname, OBJ_CASE_INSENSITIVE, NULL, NULL);


status = ZwCreateFile(&hfile,
                GENERIC_READ,
                &oa,
                &iostatus,
                NULL,
                0,
                FILE_SHARE_READ,
                FILE_OPEN,
                FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0);

 

创建或重写文件
为了创建一个新文件,或打开一个已存在文件并截为 0 长度,用下面方式调用 ZwCreateFile 函数:
status = ZwCreateFile(&hfile,
                GENERIC_WRITE,
                &oa,
                &iostatus,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                0,
                FILE_OVERWRITE_IF,
                FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0);

 

2:---------------拿到我们想要的文件句柄后,我们将要对这个文件进行处理了,read 还是 write ,wdk 给我们提供了ZwReadFile 和

ZwWriteFile 这两个函数

 

读写的例子:

PVOID buffer;
ULONG bufsize;
status = ZwReadFile(hfile, NULL, NULL, NULL, &iostatus, buffer, bufsize, NULL, NULL); 
 
status = ZwWriteFile(hfile, NULL, NULL, NULL, &iostatus, buffer, bufsize, NULL, NULL);

 

3:如果要对整个文件的内容进行读取:

那么我们应该首先知道这个文件的大小,然后在指定要读取这个文件的大小。。。

获取整个文件的大小:

FILE_STANDARD_INFORMATION si;


ZwQueryInformationFile(hfile, &iostatus, &si, sizeof(si), FileStandardInformation);


ULONG length = si.EndOfFile.LowPart;

 

 

4:当操作完后,我们应该关闭文件的句柄,不然,下次不能对这个文件进行其他的操作了。。。


原创粉丝点击