创建文件:
/************************************************************************/
/* 创建文件函数 */
/************************************************************************/
#define STRPATH L"\\??\\C:\\123.txt"
BOOLEAN bIsDir ;
UNICODE_STRING strPath;
HANDLE KernelCreateFile(IN PUNICODE_STRING pstrFile, IN BOOLEAN bIsDir)
{
HANDLE hFile = NULL;
NTSTATUS Statuss = STATUS_UNSUCCESSFUL;
IO_STATUS_BLOCK StatusBlock = {0};
ULONG ulShareAccess = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
ULONG ulCreateOpt = FILE_SYNCHRONOUS_IO_NONALERT;
// 1 初始化OBJECT_ATTRIBUTES的内容
OBJECT_ATTRIBUTES objAttrib = {0};
ULONG ulAttributes = OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE;
InitializeObjectAttributes(
&objAttrib,
pstrFile,
ulAttributes,
NULL, NULL);
// 2 创建文件对象
ulCreateOpt |= bIsDir ? FILE_DIRECTORY_FILE : FILE_NON_DIRECTORY_FILE;
Statuss = ZwCreateFile(
&hFile,
GENERIC_ALL,
&objAttrib,
&StatusBlock,
0,
FILE_ATTRIBUTE_NORMAL,
ulShareAccess,
FILE_OPEN_IF,
ulCreateOpt,
NULL,
0);
if (!NT_SUCCESS(Statuss))
{
return (HANDLE)-1;
}
return hFile;
}
获取文件大小
/************************************************************************/
/* 获取文件大小 */
/************************************************************************/
ULONG64 KernelGetFileSize(IN HANDLE hFile)
{
// 查询文件状态
IO_STATUS_BLOCK StatusBlock = {0};
FILE_STANDARD_INFORMATION fsi = {0};
NTSTATUS Statuss = STATUS_UNSUCCESSFUL;
Statuss = ZwQueryInformationFile(
hFile, // 文件句柄
&StatusBlock, // 接收函数的操作结果
&fsi, // 根据最后一个参数的类型输出相关信息
sizeof(FILE_STANDARD_INFORMATION),
FileStandardInformation);
if (!NT_SUCCESS(Statuss))
{
return 0;
}
return fsi.EndOfFile.QuadPart;
}
读取文件
/************************************************************************/
/* 读取文件 */
/************************************************************************/
ULONG64 KernelReadFile(IN HANDLE hFile, // 文件句柄
IN PLARGE_INTEGER Offset, // 从哪里开始读取
IN ULONG ulLength, // 读取多少个字节
OUT PVOID pBuffer) // 保存数据的缓存
{
// 1 读取文件
IO_STATUS_BLOCK StatusBlock = {0};
NTSTATUS Status = STATUS_UNSUCCESSFUL;
Status = ZwReadFile(
hFile, // 文件句柄
NULL, // 信号状态
NULL, NULL, // 保留
&StatusBlock, // 接收函数的操作结果
pBuffer, // 保存读取数据的缓存
ulLength, // 想要读取的长度
Offset, // 读取的起始偏移
NULL); // 一般为NULL
if (!NT_SUCCESS(Status))
{
return 0;
}
// 2 返回实际读取的长度
return StatusBlock.Information;
}
写入文件
/************************************************************************/
/* 写入文件 */
/************************************************************************/
ULONG64 KernelWriteFile(IN HANDLE hFile, // 文件句柄
IN PLARGE_INTEGER Offset, // 从哪里开始写入
IN ULONG ulLength, // 写入多少个字节
OUT PVOID pBuffer) // 要写入的数据
{
// 1 写入文件
IO_STATUS_BLOCK StatusBlock = {0};
NTSTATUS Status = STATUS_UNSUCCESSFUL;
Status = ZwWriteFile(
hFile, // 文件句柄
NULL, // 信号状态
NULL, NULL, // 保留
&StatusBlock, // 接收函数的操作结果
pBuffer, // 要写入的数据
ulLength, // 想要写入的长度
Offset, // 写入的起始偏移
NULL); // 一般为NULL
if (!NT_SUCCESS(Status))
{
return 0;
}
// 2 返回实际写入的长度
return StatusBlock.Information;
}
删除文件
/************************************************************************/
/* 删除文件 */
/************************************************************************/
NTSTATUS KernelDeleteFile(IN PUNICODE_STRING pstrFile)
{
// 1 初始化 OBJECT_ATTRIBUTES 的内容
OBJECT_ATTRIBUTES objAttrib = {0};
ULONG ulAttributes = OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE ;
InitializeObjectAttributes(
&objAttrib, // 返回初始化完毕的结构体
pstrFile, // 文件对象名称
ulAttributes, // 对象属性
NULL, // 根目录(一般为NULL)
NULL); // 安全属性(一般为NULL)
// 2 删除指定文件/文件夹
return ZwDeleteFile(&objAttrib);
}