ntcreatefile(NTCreateFile函数详解)

jk 695次浏览

最佳答案NTCreateFile函数详解 介绍 NTCreateFile函数是Windows操作系统中用来创建或打开文件对象的重要函数,其功能十分强大且应用场景广泛,因此我们有必要对其进行深入了解。 函数原...

NTCreateFile函数详解

介绍

NTCreateFile函数是Windows操作系统中用来创建或打开文件对象的重要函数,其功能十分强大且应用场景广泛,因此我们有必要对其进行深入了解。

函数原型

NTCreateFile函数的原型如下:

NTSTATUS NTAPI NtCreateFile( PHANDLE FileHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes, PIO_STATUS_BLOCK IoStatusBlock, PLARGE_INTEGER AllocationSize, ULONG FileAttributes, ULONG ShareAccess, ULONG CreateDisposition, ULONG CreateOptions, PVOID EaBuffer, ULONG EaLength );

参数说明

NTCreateFile函数的各个参数含义如下:

  • FileHandle:指向要创建或打开的文件的句柄指针。
  • DesiredAccess:请求的访问权限。可以是下列值之一或它们的组合:
    • FILE_READ_DATA(读取数据)
    • FILE_WRITE_DATA(写入数据)
    • FILE_APPEND_DATA(在文件末尾添加数据)
    • FILE_READ_EA(读取EA(扩展属性))
    • FILE_WRITE_EA(写入EA(扩展属性))
    • FILE_EXECUTE(执行文件)
    • FILE_DELETE_CHILD(删除子项)
    • FILE_READ_ATTRIBUTES(读取属性)
    • FILE_WRITE_ATTRIBUTES(写入属性)
    • SYNCHRONIZE(同步)
  • ObjectAttributes:指向要创建或打开的对象的OBJECT_ATTRIBUTES结构体。其中包含了对象名,安全描述符等信息。
  • IoStatusBlock:指向IO_STATUS_BLOCK结构体的指针。
  • AllocationSize:指向一个64位的整数,表示将要为文件创建的空间大小。
  • FileAttributes:指定将用于创建新文件的文件属性。可以是下列值之一或它们的组合:
    • FILE_ATTRIBUTE_NORMAL(普通文件)
    • FILE_FLAG_WRITE_THROUGH(立即将所有写入操作写入磁盘)
    • FILE_FLAG_OVERLAPPED(使用异步IO方式)
    • FILE_FLAG_NO_BUFFERING(禁止系统缓存)
    • FILE_FLAG_RANDOM_ACCESS(随机访问)
    • FILE_FLAG_SEQUENTIAL_SCAN(顺序访问)
    • FILE_FLAG_DELETE_ON_CLOSE(关闭文件时删除)
  • ShareAccess:共享模式。可以是下列值之一或它们的组合:
    • FILE_SHARE_READ(允许其他进程读取这个文件)
    • FILE_SHARE_WRITE(允许其他进程写入这个文件)
    • FILE_SHARE_DELETE(允许其他进程删除这个文件)
  • CreateDisposition:指定如何处理当前请求。可以是下列值之一:
    • FILE_SUPERSEDE(覆盖已有文件)
    • FILE_OPEN(打开文件)
    • FILE_CREATE(创建新文件)
    • FILE_OPEN_IF(打开现有文件,如果不存在则创建)
    • FILE_OVERWRITE(覆盖现有文件,如果不存在则创建)
    • FILE_OVERWRITE_IF(覆盖现有文件,如果不存在则创建)
  • CreateOptions:指定如何创建打开文件的行为。可以是下列值之一或它们的组合:
    • FILE_DIRECTORY_FILE(将该文件作为目录打开)
    • FILE_NON_DIRECTORY_FILE(将该文件作为普通文件打开)
    • FILE_OPEN_FOR_BACKUP_INTENT(为备份目的而打开文件)
    • FILE_DELETE_ON_CLOSE(将文件打开为删除)
    • FILE_NO_COMPRESSION(对于支持压缩的文件系统,不要压缩文件)
    • FILE_OPEN_BY_FILE_ID(使用ID号打开一个已有的文件)
  • EaBuffer:包含要写入EA的数据的指针。如果未使用EA,则应为NULL。
  • EaLength:指定要写入EA的数据的大小。如果未使用EA,则应为0。

示例代码

下面的示例代码展示了如何使用NTCreateFile函数创建一个文件:

#include #include int main() { OBJECT_ATTRIBUTES ObjectAttributes = {0}; IO_STATUS_BLOCK IoStatusBlock = {0}; UNICODE_STRING FileName; HANDLE FileHandle = NULL; NTSTATUS Status; RtlInitUnicodeString(&FileName, L\"test.txt\"); InitializeObjectAttributes( &ObjectAttributes, &FileName, OBJ_CASE_INSENSITIVE, NULL, NULL ); Status = NtCreateFile( &FileHandle, GENERIC_WRITE | GENERIC_READ, &ObjectAttributes, &IoStatusBlock, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_CREATE, FILE_NON_DIRECTORY_FILE, NULL, 0 ); if (NT_SUCCESS(Status)) { printf(\"File created successfully!\ \"); } else { printf(\"Failed to create File! ErrorCode: %d\ \", Status); } return 0; }

结语

NTCreateFile函数是Windows操作系统中用来创建或打开文件对象的重要函数。本文简要介绍了NTCreateFile函数的函数原型,参数说明以及示例代码。开发人员可以根据需求,选用不同的CreateDisposition、DesiredAccess、CreateOptions、FileAttributes等函数参数,达到不同的创建或打开文件对象的目的。