win内核内部直接irp读取文件写入文件


#include <ntifs.h>
#include <ntddk.h>

#define TAG_NAME 'tlfF'  // FltF in reverse
#define BUFFER_SIZE PAGE_SIZE

// 驱动设备扩展结构
typedef struct _DEVICE_EXTENSION {
    PDEVICE_OBJECT DeviceObject;
    UNICODE_STRING DeviceName;
    UNICODE_STRING SymLinkName;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

// 文件上下文结构
typedef struct _FILE_CONTEXT {
    PFILE_OBJECT FileObject;
    LARGE_INTEGER FileSize;
    PVOID Buffer;
    ULONG BufferSize;
} FILE_CONTEXT, *PFILE_CONTEXT;

// 函数声明
DRIVER_INITIALIZE DriverEntry;
DRIVER_UNLOAD DriverUnload;
NTSTATUS CreateFileContext(_Out_ PFILE_CONTEXT* FileContext);
VOID FreeFileContext(_In_ PFILE_CONTEXT FileContext);
NTSTATUS CreateFileObject(_In_ PCWSTR FilePath, _In_ ACCESS_MASK DesiredAccess, _Out_ PFILE_OBJECT* FileObject);
NTSTATUS ReadFileDirectly(_In_ PFILE_OBJECT FileObject, _In_ PLARGE_INTEGER Offset, _In_ ULONG Length, _Out_ PVOID Buffer, _Out_ PIO_STATUS_BLOCK IoStatus);
NTSTATUS WriteFileDirectly(_In_ PFILE_OBJECT FileObject, _In_ PLARGE_INTEGER Offset, _In_ ULONG Length, _In_ PVOID Buffer, _Out_ PIO_STATUS_BLOCK IoStatus);
VOID CloseFileObject(_In_ PFILE_OBJECT FileObject);
NTSTATUS FileOperationExample(_In_ PCWSTR FilePath);

// 驱动入口函数
NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
)
{
    NTSTATUS status;
    PDEVICE_OBJECT deviceObject = NULL;
    PDEVICE_EXTENSION deviceExtension = NULL;
    UNICODE_STRING deviceName;
    UNICODE_STRING symLinkName;

    UNREFERENCED_PARAMETER(RegistryPath);

    // 初始化设备名和符号链接名
    RtlInitUnicodeString(&deviceName, L"\\Device\\FileFilterDriver");
    RtlInitUnicodeString(&symLinkName, L"\\??\\FileFilterDriver");

    // 创建设备对象
    status = IoCreateDevice(DriverObject,
                          sizeof(DEVICE_EXTENSION),
                          &deviceName,
                          FILE_DEVICE_UNKNOWN,
                          0,
                          FALSE,
                          &deviceObject);

    if (!NT_SUCCESS(status)) {
        return status;
    }

    // 初始化设备扩展
    deviceExtension = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;
    deviceExtension->DeviceObject = deviceObject;
    deviceExtension->DeviceName = deviceName;
    deviceExtension->SymLinkName = symLinkName;

    // 创建符号链接
    status = IoCreateSymbolicLink(&symLinkName, &deviceName);
    if (!NT_SUCCESS(status)) {
        IoDeleteDevice(deviceObject);
        return status;
    }

    // 设置驱动卸载函数
    DriverObject->DriverUnload = DriverUnload;

    return STATUS_SUCCESS;
}

// 驱动卸载函数
VOID
DriverUnload(
    _In_ PDRIVER_OBJECT DriverObject
)
{
    PDEVICE_EXTENSION deviceExtension;

    deviceExtension = (PDEVICE_EXTENSION)DriverObject->DeviceObject->DeviceExtension;

    // 删除符号链接
    IoDeleteSymbolicLink(&deviceExtension->SymLinkName);

    // 删除设备对象
    IoDeleteDevice(DriverObject->DeviceObject);
}

// 创建文件上下文
NTSTATUS
CreateFileContext(
    _Out_ PFILE_CONTEXT* FileContext
)
{
    PFILE_CONTEXT context;

    context = ExAllocatePoolWithTag(NonPagedPool, sizeof(FILE_CONTEXT), TAG_NAME);
    if (NULL == context) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    RtlZeroMemory(context, sizeof(FILE_CONTEXT));
    context->Buffer = ExAllocatePoolWithTag(NonPagedPool, BUFFER_SIZE, TAG_NAME);
    if (NULL == context->Buffer) {
        ExFreePoolWithTag(context, TAG_NAME);
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    context->BufferSize = BUFFER_SIZE;
    *FileContext = context;
    return STATUS_SUCCESS;
}

// 关闭文件对象
VOID
CloseFileObject(
    _In_ PFILE_OBJECT FileObject
)
{
    if (FileObject) {
        PDEVICE_OBJECT deviceObject = FileObject->DeviceObject;
        if (deviceObject) {
            KEVENT event;
            IO_STATUS_BLOCK ioStatus;
            
            // 发送清理IRP
            KeInitializeEvent(&event, NotificationEvent, FALSE);
            PIRP irp = IoAllocateIrp(deviceObject->StackSize, FALSE);
            if (irp) {
                irp->UserIosb = &ioStatus;
                irp->UserEvent = &event;
                irp->Tail.Overlay.Thread = PsGetCurrentThread();
                irp->RequestorMode = KernelMode;
                irp->Flags = IRP_SYNCHRONOUS_API;

                PIO_STACK_LOCATION irpSp = IoGetNextIrpStackLocation(irp);
                irpSp->MajorFunction = IRP_MJ_CLEANUP;
                irpSp->FileObject = FileObject;

                IoCallDriver(deviceObject, irp);
                KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);

                // 发送关闭IRP
                KeInitializeEvent(&event, NotificationEvent, FALSE);
                irp = IoAllocateIrp(deviceObject->StackSize, FALSE);
                if (irp) {
                    irp->UserIosb = &ioStatus;
                    irp->UserEvent = &event;
                    irp->Tail.Overlay.Thread = PsGetCurrentThread();
                    irp->RequestorMode = KernelMode;
                    irp->Flags = IRP_SYNCHRONOUS_API;

                    irpSp = IoGetNextIrpStackLocation(irp);
                    irpSp->MajorFunction = IRP_MJ_CLOSE;
                    irpSp->FileObject = FileObject;

                    IoCallDriver(deviceObject, irp);
                    KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
                }
            }
        }
        ObDereferenceObject(FileObject);
    }
}

// 释放文件上下文
VOID
FreeFileContext(
    _In_ PFILE_CONTEXT FileContext
)
{
    if (FileContext) {
        if (FileContext->Buffer) {
            ExFreePoolWithTag(FileContext->Buffer, TAG_NAME);
            FileContext->Buffer = NULL;
        }
        
        if (FileContext->FileObject) {
            CloseFileObject(FileContext->FileObject);
            FileContext->FileObject = NULL;
        }
        
        ExFreePoolWithTag(FileContext, TAG_NAME);
    }
}

// 创建文件对象
NTSTATUS
CreateFileObject(
    _In_ PCWSTR FilePath,
    _In_ ACCESS_MASK DesiredAccess,
    _Out_ PFILE_OBJECT* FileObject
)
{
    OBJECT_ATTRIBUTES objAttributes;
    UNICODE_STRING fileName;
    IO_STATUS_BLOCK ioStatus;
    HANDLE fileHandle;
    NTSTATUS status;

    if (NULL == FilePath || NULL == FileObject) {
        return STATUS_INVALID_PARAMETER;
    }

    RtlInitUnicodeString(&fileName, FilePath);
    InitializeObjectAttributes(&objAttributes,
                             &fileName,
                             OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                             NULL,
                             NULL);

    status = IoCreateFile(&fileHandle,
                         DesiredAccess,
                         &objAttributes,
                         &ioStatus,
                         NULL,
                         FILE_ATTRIBUTE_NORMAL,
                         FILE_SHARE_READ | FILE_SHARE_WRITE,
                         FILE_OPEN,
                         0,
                         NULL,
                         0,
                         CreateFileTypeNone,
                         NULL,
                         IO_NO_PARAMETER_CHECKING);

    if (!NT_SUCCESS(status)) {
        return status;
    }

    status = ObReferenceObjectByHandle(fileHandle,
                                     DesiredAccess,
                                     *IoFileObjectType,
                                     KernelMode,
                                     (PVOID*)FileObject,
                                     NULL);

    ZwClose(fileHandle);
    return status;
}

// 直接读取文件
NTSTATUS
ReadFileDirectly(
    _In_ PFILE_OBJECT FileObject,
    _In_ PLARGE_INTEGER Offset,
    _In_ ULONG Length,
    _Out_ PVOID Buffer,
    _Out_ PIO_STATUS_BLOCK IoStatus
)
{
    KEVENT event;
    PIRP irp;
    NTSTATUS status;

    if (NULL == FileObject || NULL == Buffer || NULL == IoStatus) {
        return STATUS_INVALID_PARAMETER;
    }

    KeInitializeEvent(&event, NotificationEvent, FALSE);

    irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
                                     FileObject->DeviceObject,
                                     Buffer,
                                     Length,
                                     Offset,
                                     &event,
                                     IoStatus);
    if (NULL == irp) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    IoGetNextIrpStackLocation(irp)->FileObject = FileObject;

    status = IoCallDriver(FileObject->DeviceObject, irp);
    if (STATUS_PENDING == status) {
        KeWaitForSingleObject(&event,
                             Executive,
                             KernelMode,
                             FALSE,
                             NULL);
        status = IoStatus->Status;
    }

    return status;
}

// 直接写入文件
NTSTATUS
WriteFileDirectly(
    _In_ PFILE_OBJECT FileObject,
    _In_ PLARGE_INTEGER Offset,
    _In_ ULONG Length,
    _In_ PVOID Buffer,
    _Out_ PIO_STATUS_BLOCK IoStatus
)
{
    KEVENT event;
    PIRP irp;
    NTSTATUS status;

    if (NULL == FileObject || NULL == Buffer || NULL == IoStatus) {
        return STATUS_INVALID_PARAMETER;
    }

    KeInitializeEvent(&event, NotificationEvent, FALSE);

    irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
                                     FileObject->DeviceObject,
                                     Buffer,
                                     Length,
                                     Offset,
                                     &event,
                                     IoStatus);
    if (NULL == irp) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }

    IoGetNextIrpStackLocation(irp)->FileObject = FileObject;

    status = IoCallDriver(FileObject->DeviceObject, irp);
    if (STATUS_PENDING == status) {
        KeWaitForSingleObject(&event,
                             Executive,
                             KernelMode,
                             FALSE,
                             NULL);
        status = IoStatus->Status;
    }

    return status;
}

// 文件操作示例
NTSTATUS
FileOperationExample(
    _In_ PCWSTR FilePath
)
{
    PFILE_CONTEXT fileContext = NULL;
    IO_STATUS_BLOCK ioStatus;
    LARGE_INTEGER offset = {0};
    NTSTATUS status;

    // 创建文件上下文
    status = CreateFileContext(&fileContext);
    if (!NT_SUCCESS(status)) {
        return status;
    }

    __try {
        // 创建文件对象
        status = CreateFileObject(FilePath,
                                FILE_READ_DATA | FILE_WRITE_DATA,
                                &fileContext->FileObject);
        if (!NT_SUCCESS(status)) {
            __leave;
        }

        // 读取文件
        status = ReadFileDirectly(fileContext->FileObject,
                                &offset,
                                fileContext->BufferSize,
                                fileContext->Buffer,
                                &ioStatus);
        if (!NT_SUCCESS(status)) {
            __leave;
        }

        // 这里可以处理读取的数据
        // ...

        // 写入文件
        status = WriteFileDirectly(fileContext->FileObject,
                                 &offset,
                                 (ULONG)ioStatus.Information,
                                 fileContext->Buffer,
                                 &ioStatus);
    }
    __finally {
        if (fileContext) {
            FreeFileContext(fileContext);
        }
    }

    return status;
}

如何使用 


/*
 * 文件操作测试函数
 * 用于验证基本的文件操作功能
 */
NTSTATUS 
TestFileOperations(
    VOID
    )
{
    NTSTATUS status = STATUS_SUCCESS;
    const PCWSTR testPath = L"\\??\\C:\\test.txt";

    // 参数验证
    if (NULL == testPath) {
        return STATUS_INVALID_PARAMETER;
    }

    __try {
        // 调用文件操作示例函数
        status = FileOperationExample(testPath);
        
        if (NT_SUCCESS(status)) {
            DbgPrint("[TestFileOperations] File operation completed successfully\n");
        } else {
            DbgPrint("[TestFileOperations] File operation failed. Status: 0x%08X\n", status);
        }
    }
    __except(EXCEPTION_EXECUTE_HANDLER) {
        status = GetExceptionCode();
        DbgPrint("[TestFileOperations] Exception occurred: 0x%08X\n", status);
    }

    return status;
}

/*
 * 驱动程序入口点
 */
NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT  DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status = STATUS_SUCCESS;

    UNREFERENCED_PARAMETER(RegistryPath);

    // 验证参数
    if (NULL == DriverObject) {
        return STATUS_INVALID_PARAMETER;
    }

    __try {
        // 执行驱动初始化
        status = InitializeDriver(DriverObject);
        if (!NT_SUCCESS(status)) {
            DbgPrint("[DriverEntry] Driver initialization failed: 0x%08X\n", status);
            return status;
        }

        // 执行文件操作测试
        status = TestFileOperations();
        if (!NT_SUCCESS(status)) {
            DbgPrint("[DriverEntry] File operations test failed: 0x%08X\n", status);
            // 注意:这里选择继续执行,而不是直接返回错误
        }

        // 设置清理回调
        DriverObject->DriverUnload = DriverUnload;
    }
    __except(EXCEPTION_EXECUTE_HANDLER) {
        status = GetExceptionCode();
        DbgPrint("[DriverEntry] Exception occurred: 0x%08X\n", status);
    }

    return status;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSCP - Proving Grounds - BullyBox

主要知识点 如果发现有域名&#xff0c;则可以加入/etc/hosts后重新执行nmap,nikto等扫描dirsearch的时候可以使用完整一些的字典文件&#xff0c;避免漏掉信息.git dump 具体步骤 执行nmap 扫描&#xff0c;发现 80和22端口开放,访问后发现被重定向到 bullybox.local Star…

【计算机网络】传输层协议TCP与UDP

传输层 传输层位于OSI七层网络模型的第四层&#xff0c;主要负责端到端通信&#xff0c;可靠性保障&#xff08;TCP&#xff09;&#xff0c;流量控制(TCP)&#xff0c;拥塞控制(TCP)&#xff0c;数据分段与分组&#xff0c;多路复用与解复用等&#xff0c;通过TCP与UDP协议实现…

MongoDB 备份与恢复综述

目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;它使用文档存储数据&#xff0c;支持丰富的查询语言和索引…

5. 马科维茨资产组合模型+AI金融智能体(qwen-max)+政策信息优化方案(理论+Python实战)

目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…

后端开发基础——JavaWeb(Servlet)

Servlet 关于系统架构 系统架构包括什么形式&#xff1f; C/S架构 B/S架构 C/S架构&#xff1f; Client / Server&#xff08;客户端 / 服务器&#xff09; C/S架构的软件或者说系统有哪些呢&#xff1f; QQ&#xff08;先去腾讯官网下载一个QQ软件&#xff0c;几十MB&…

Hanlp的学习

参考&#xff1a;HanLP 自然语言处理使用总结-CSDN博客 参考&#xff1a;Sprint Boot 工程中HanLP配置相对路径&#xff0c;始终有问题的解决方案_springboot hanlp-CSDN博客 <!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifa…

LLMs(大型语言模型)的多智能体:Auto-GPT

LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…

JSON全解析:语法、转换与FastJson应用指南

大家好&#xff0c;我是袁庭新。JSON是一种轻量级、基于文本、开放式的数据交换格式。在数据交换的世界里&#xff0c;JSON 扮演着重要角色。它究竟为何备受青睐&#xff1f;下面就为您详细解读其奥秘与应用。 1.JSON简述 JSON&#xff08;JavaScript Object Notation&#…

Java模拟路由协议-rip(路由器仿真实验)

前言&#xff1a; 好久不见&#xff0c;有段时间没有写文章了&#xff0c;本篇文章&#xff0c;由Blue我带大家来复现rip协议。我们以 b站湖南教师匠所讲rip的视频中的例子为我这篇文章所模拟的路由路径 如图&#xff1a; 模拟路径 视频&#xff1a;http://【深入浅出计算机网络…

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者&#xff1a;来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫&#xff0c;将网站索引到 Elasticsearch 中&#xff0c;然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo&#xff1a;https://github.com/Gunner…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代&#xff0c;数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者&#xff0c;面临着一项艰巨的任务&#xff1a;如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…

【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

文章目录 前言&#x1f30d; 一.连接池❄️1. 传统获取Conntion问题分析❄️2. 数据库连接池❄️3.连接池之C3P0技术&#x1f341;3.1关键特性&#x1f341;3.2配置选项&#x1f341;3.3使用示例 ❄️4. 连接池之Druid技术&#x1f341; 4.1主要特性&#x1f341; 4.2 配置选项…

Linux Bash 中使用重定向运算符的 5 种方法

注&#xff1a;机翻&#xff0c;未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

C语言内存之旅:从静态到动态的跨越

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一 动态内存管理的必要性二 动态…

AI时代:弯道超车的新思维与实践路径

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

【Spring】定义的Bean缺少隐式依赖

问题描述 初学 Spring 时&#xff0c;我们往往不能快速转化思维。例如&#xff0c;在程序开发过程中&#xff0c;有时候&#xff0c;一方面我们把一个类定义成 Bean&#xff0c;同时又觉得这个 Bean 的定义除了加了一些 Spring 注解外&#xff0c;并没有什么不同。所以在后续使…

『 实战项目 』Cloud Backup System - 云备份

文章目录 云备份项目服务端功能服务端功能模块划分客户端功能客户端模块划分 项目条件Jsoncpp第三方库Bundle第三方库httplib第三方库Request类Response类Server类Client类搭建简单服务器搭建简单客户端 服务端工具类实现 - 文件实用工具类服务器配置信息模块实现- 系统配置信息…

网络编程 | UDP组播通信

1、什么是组播 在上一篇博客中&#xff0c;对UDP的广播通信进行了由浅入深的总结梳理&#xff0c;本文继续对UDP的知识体系进行探讨&#xff0c;旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间&#xff0c;在一个局域网内&#xff0c;将某些主机添加到组中…

【无标题】微调是迁移学习吗?

是的&#xff0c;微调&#xff08;Fine-Tuning&#xff09;可以被视为一种迁移学习&#xff08;Transfer Learning&#xff09;的形式。迁移学习是一种机器学习方法&#xff0c;其核心思想是利用在一个任务上学到的知识来改进另一个相关任务的性能。微调正是通过在预训练模型的…