除了使用ZwCreateFile函数可以打开文件,DDK还提供了一个内核函数ZwOpenFile。ZwOpenFile 内核函数的参数比ZwCreateFile的参数简化,方便程序员打开文件。该函数的声明如下:
NTSTATUS ZwOpenFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG ShareAccess,
IN ULONG OpenOptions
);
// FileHandle: 返回打开的句柄。
// DesiredAccess: 打开的权限,一般设为 GENERIC_ALL。
// ObjectAttributes: ObjectAttributes结构。
// IoStatusBlock: 指向一个结构体的指针。该结构体指明打开文件的状态。
// ShareAccess: 共享的权限。可以是FILE_SHARE_READ或者FILE_SHARE_WRITE。
// OpenOptions: 打开选项, 一般设为 FILE_SYNCHRONOUS_IO_NONALERT。
// 返回值: 指明文件是否被成功打开。
下面的代码演示了如何使用ZwOpenFile打开文件。
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK iostatus;
HANDLE hfile;
UNICODE_STRING logFileUnicodeStr1;
// 初始化UNICODE_STRING字符串
RtlInitUnicodeString(&logFileUnicodeStr1, L"\\?\\C:\\1.log");
// 或者写成 L"\\Device\\HarddiskVolume1\\1.log"
// 初始化objectAttributes
InitializeObjectAttributes(&objectAttributes,
&logFileUnicodeStr1,
OBJ_CASE_INSENSITIVE,
NULL,
NULL);
// 打开文件
NTSTATUS ntStatus = ZwOpenFile(&hfile,
GENERIC_ALL,
&objectAttributes,
&iostatus,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_SYNCHARONOUS_IO_NONALERT);
if(NT_STATUS(ntStatus))
{
KdPrint(("Open file successfully!\n"));
)
else
{
KdPrint(("Open file unsuccessfully!\n"));
}
// 文件操作
// ……
// 关闭文件句柄
ZwClose(hfile);