Windows驱动开发(4) - 内核模式下的文件操作

Windows驱动开发(4) - 内核模式下的文件操作

1、文件的创建

NTSTATUS ZwCreateFile(
  _Out_    PHANDLE            FileHandle,
  _In_     ACCESS_MASK        DesiredAccess,
  _In_     POBJECT_ATTRIBUTES ObjectAttributes,
  _Out_    PIO_STATUS_BLOCK   IoStatusBlock,
  _In_opt_ PLARGE_INTEGER     AllocationSize,
  _In_     ULONG              FileAttributes,
  _In_     ULONG              ShareAccess,
  _In_     ULONG              CreateDisposition,
  _In_     ULONG              CreateOptions,
  _In_opt_ PVOID              EaBuffer,
  _In_     ULONG              EaLength
);
  • FileHandle:返回打开文件的句柄。
  • DesiredAccess:对打开文件操作的描述,读、写、其他。
  • ObjectAttributes:是OBJECT_ATTRIBUTES结构的地址,该结构包含要打开的文件名。
  • IoStatusBlock:指向一个IO_STATUS_BLOCK结构,该结构接收ZwCreateFile操作的结果状态。
  • AllocationSize:指向64位整数的指针,指定文件初始分配时的大小。
  • FileAttributes:0或FILE_ATTRIBUTE_NORMAL,指定新创建文件的属性。
  • ShareAccess:FILE_SHARE_READ或0,指定文件共享方式。
  • CreateDisposition:FILE_OPEN、FILE_OVERWRITE_IF,表明当指定文件存在或不存在时应如何处理。
  • CreateOptions:FILE_SYNCHRONOUS_IO_NONALERT,指定控制打开操作和句柄使用的附加标志位。
  • EaBuffer:指向可选的扩展属性区的指针。
  • EaLength:扩展属性区的长度。
VOID InitializeObjectAttributes(
  [out]          POBJECT_ATTRIBUTES   InitializedAttributes,
  [in]           PUNICODE_STRING      ObjectName,
  [in]           ULONG                Attributes,
  [in]           HANDLE               RootDirectory,
  [in, optional] PSECURITY_DESCRIPTOR SecurityDescriptor
);

初始化OBJECT_ATTRIBUTES结构。
- InitializedAttributes:返回的OBJECT_ATTRIBUTES结构。
- ObjectName:对象名称(文件名,必须为符号链接或设备名,如:”\??\c:”),用UNICODE_STRING描述。
- Attributes:大小写敏感。
- RootDirectory:一般为NULL。
- SecurityDescriptor:一般为NULL。

2、文件的打开

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:打开的权限。
  • ObjectAttributes:ObjectAttributes结构。
  • IoStatusBlock:指向一个结构体的指针,该结构体指明打开文件的状态。
  • ShareAccess:共享的权限。
  • OpenOptions:打开选项。
  • 返回值:指明文件是否被打开。

3、获取或修改文件属性

NTSTATUS ZwSetInformationFile(
  _In_  HANDLE                 FileHandle,
  _Out_ PIO_STATUS_BLOCK       IoStatusBlock,
  _In_  PVOID                  FileInformation,
  _In_  ULONG                  Length,
  _In_  FILE_INFORMATION_CLASS FileInformationClass
);
  • FileHandle:文件句柄。
  • IoStatusBlock:返回设置的状态。
  • FileInformation:输入信息。
  • Length:FileInformation数据的长度。
  • FileInformationClass:描述修改属性的类型。
NTSTATUS ZwQueryInformationFile(
  _In_  HANDLE                 FileHandle,
  _Out_ PIO_STATUS_BLOCK       IoStatusBlock,
  _Out_ PVOID                  FileInformation,
  _In_  ULONG                  Length,
  _In_  FILE_INFORMATION_CLASS FileInformationClass
);
  • FileHandle:文件句柄。
  • IoStatusBlock:返回设置的状态。
  • FileInformation:输出信息。
  • Length:FileInformation数据的长度。
  • FileInformationClass:描述查询属性的类型。

(1)当FileInformationClass是FileStandardInformation时,输入输出的数据是FILE_STANDARD_INFORMATION结构体。

typedef struct _FILE_STANDARD_INFORMATION {
  LARGE_INTEGER AllocationSize; //为文件分配的大小
  LARGE_INTEGER EndOfFile;      //距离文件结尾还有多少字节
  ULONG         NumberOfLinks;  //有多少个链接文件
  BOOLEAN       DeletePending;  //是否准备删除
  BOOLEAN       Directory;      //是否为目录
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;

(2)当FileInformationClass是FileBasicInformation时,输入输出的数据是FILE_BASIC_INFORMATION结构体。

typedef struct _FILE_BASIC_INFORMATION {
  LARGE_INTEGER CreationTime;   //文件创建时间
  LARGE_INTEGER LastAccessTime; //最后访问时间
  LARGE_INTEGER LastWriteTime;  //最后写时间
  LARGE_INTEGER ChangeTime;     //修改时间
  ULONG         FileAttributes; //文件属性
} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;

(3)当FileInformationClass是FileNameInformation时,输入输出的数据是FILE_NAME_INFORMATION结构体。

typedef struct _FILE_NAME_INFORMATION {
  ULONG FileNameLength;         //文件名长度
  WCHAR FileName[1];            //文件名
} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;

(4)当FileInformationClass是FilePositionInformation时,输入输出的数据是FILE_POSITION_INFORMATION结构体。

typedef struct _FILE_POSITION_INFORMATION {
  LARGE_INTEGER CurrentByteOffset;  //代表当前文件指针的位置
} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;

4、文件写操作

NTSTATUS ZwWriteFile(
  _In_     HANDLE           FileHandle,
  _In_opt_ HANDLE           Event,
  _In_opt_ PIO_APC_ROUTINE  ApcRoutine,
  _In_opt_ PVOID            ApcContext,
  _Out_    PIO_STATUS_BLOCK IoStatusBlock,
  _In_     PVOID            Buffer,
  _In_     ULONG            Length,
  _In_opt_ PLARGE_INTEGER   ByteOffset,
  _In_opt_ PULONG           Key
);
  • FileHandle:文件句柄。
  • Event:很少用到,一般为NULL。
  • ApcRoutine:很少用到,一般为NULL。
  • ApcContext:很少用到,一般为NULL。
  • IoStatusBlock:记录写操作的状态。
  • Buffer:从这个缓冲区开始往文件里写。
  • Length:准备写多少字节。
  • ByteOffset:从文件的多少偏移地址开始写。
  • Key:很少用到,一般为NULL。

6、文件读操作

NTSTATUS ZwReadFile(
  _In_     HANDLE           FileHandle,
  _In_opt_ HANDLE           Event,
  _In_opt_ PIO_APC_ROUTINE  ApcRoutine,
  _In_opt_ PVOID            ApcContext,
  _Out_    PIO_STATUS_BLOCK IoStatusBlock,
  _Out_    PVOID            Buffer,
  _In_     ULONG            Length,
  _In_opt_ PLARGE_INTEGER   ByteOffset,
  _In_opt_ PULONG           Key
);
  • FileHandle:文件句柄。
  • Event:很少用到,一般为NULL。
  • ApcRoutine:很少用到,一般为NULL。
  • ApcContext:很少用到,一般为NULL。
  • IoStatusBlock:记录读操作的状态。
  • Buffer:将数据读到这个缓冲区。
  • Length:准备读多少字节。
  • ByteOffset:从文件的多少偏移地址开始读。
  • Key:很少用到,一般为NULL。

你可能感兴趣的:(windows,内核,驱动开发)