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。