Windows内核编程之简单文件的操作相关函数


创建文件:

/************************************************************************/
/*                    创建文件函数                                      */
/************************************************************************/
#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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值