您的位置:首页 > 其它

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

2010-02-22 15:49 288 查看
对于文件操作:

我们的步骤应该是

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:当操作完后,我们应该关闭文件的句柄,不然,下次不能对这个文件进行其他的操作了。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: