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;
}
相关文章:
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_STRIN…...
1. 基于图像的三维重建
1. 基于图像的三维重建 核心概念三维重建中深度图、点云的区别?深度图点云总结 深度图到点云还需要什么步骤?1. **获取相机内参**2. **生成相应的像素坐标**3. **计算三维坐标**4. **构建点云**5. **处理颜色信息(可选)**6. **去除…...
如何确保Python爬虫不违反微店规定
在使用Python爬虫获取微店商品详情时,确保爬虫行为符合微店的规定和相关法律法规至关重要。以下是一些关键步骤和注意事项,帮助你合法合规地使用爬虫技术: 一、遵守法律法规 在使用爬虫技术时,必须严格遵守《网络安全法》、《个…...
Spring Event和MQ的区别和使用场景
概念 Spring事件(Spring Event)是Spring框架的一项功能,它允许不同组件之间通过发布-订阅机制进行解耦的通信。 MQ一般是一个独立的中间件,它可以通过消息队列对消息进行传递和存储,生产者将消息发送到MQ,…...
SpringBoot:websocket 实现后端主动前端推送数据
简单说明下websocket实用场景。 实时通信领域:社交聊天弹幕多玩家游戏协同编辑股票基金实时报价体育实况更新视频会议/聊天基于位置的应用在线教育智能家居等需要高实时性的场景 一、服务端代码 pom.xml: <dependencies><dependency><…...
嵌入式硬件篇---PID控制
文章目录 前言第一部分:连续PID1.比例(Proportional,P)控制2.积分(Integral,I)控制3.微分(Derivative,D)控制4.PID的工作原理5..实质6.分析7.各种PID控制器P控…...
小程序获取微信运动步数
1、用户点击按钮,在小程序中触发getuserinfo方法,获取用户信息 <scroll-view class"scrollarea" scroll-y type"list"><view class"container"><button bind:tap"getLogin">获取</button&…...
5G 核心网 相关概念快速入门
在我们开始阅读3GPP协议来学习5G核心网之前, 不妨来看看我之前整理的PPT,快速学习核心网相关概念, 以及5G转发面PFCP协议的相关核心知识。 涵盖了最精简的核心骨干内容,助你轻松上阵。 讲解目标 3GPP和相关协议 5G核心网架构模…...
【2024 年度总结】从小白慢慢成长
【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心,继续前行 1. 加入 CSDN 的契机 首次接触…...
SAP POC 项目完工进度 - 收入确认方式【工程制造行业】【新准则下工程项目收入确认】
1. SAP POC收入确认基础概念 1.1 定义与原则 SAP POC(Percentage of Completion)收入确认方式是一种基于项目完工进度来确认收入的方法。其核心原则是根据项目实际完成的工作量或成本投入占预计总工作量或总成本的比例,来确定当期应确认的收…...
vue3+three.js加载glb模型
<template><div><!-- 亮度调节滑块 --><div class"controls"><label for"brightness">背景光亮度:</label><inputtype"range"id"brightness"v-model"brightness"min&quo…...
Golang Gin系列-4:Gin Framework入门教程
在本章中,我们将深入研究Gin,一个强大的Go语言web框架。我们将揭示制作一个简单的Gin应用程序的过程,揭示处理路由和请求的复杂性。此外,我们将探索基本中间件的实现,揭示精确定义路由和路由参数的技术。此外ÿ…...
25西湖ctf
2025西湖冬季 图片不全去我blog找👇 25西湖 | DDLS BLOG 文章所有参考将在文末给出 web web1 ssti 太简单的不赘述,知道用就行 {{cycler.__init__.__globals__.__builtins__[__import__](os).popen($(printf "\150\145\141\144\40\57\146\1…...
AI Agent:AutoGPT的使用方法
AutoGPT的使用方法 准备工作: 安装Python:确保你的电脑上安装了Python 3.8或更高版本。获取OpenAI API密钥:访问https://platform.openai.com/account/api-keys获取API密钥,并保存备用。获取Google API及Google Search Engine ID(可选):若要使用谷歌搜索功能,需访问htt…...
2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望
目录 引言 一、推动 Android 应用创新的核心力量 1.1 人工智能与机器学习的崛起 1.2 增强现实(AR)与虚拟现实(VR)的应用扩展 1.3 5G技术的推动 1.4 跨平台开发技术的成熟 1.4.1 React Native 1.4.2 Flutter 1.4.3 Taro …...
蓝桥杯小白备考指南
一、了解蓝桥杯 蓝桥杯大赛是工业和信息化部人才交流中心举办的全国性专业信息技术赛事 ,旨在促进软件和信息领域专业技术人才培养,提升高校毕业生的就业竞争力。比赛涵盖多个编程语言组别,如 Java、C/C、Python 等。不同组别和参赛类别&…...
面向对象的程序设计:以对象的方式进行思考
1 理解接口与实现的区别 以上一篇文章的电视机需要插电使用的例子继续来讲解: 对电视而言,插电使用,只需要标准的插座即可,具体的电从哪里来,是火力发电厂,或是太阳能发电,亦或是畜电池逆变供电,电视机是不需要关心的。 发电厂或供电设备属于实现,220V交流电插座属于…...
酵母三杂交实验全解析:从技术到应用【泰克生物】
酵母三杂交实验(Yeast Three-Hybrid, Y3H)是酵母双杂交(Y2H)技术的扩展,专门用于研究更复杂的分子相互作用,尤其是小分子与蛋白质间的相互作用。通过引入小分子作为第三方调节因子,酵母三杂交技…...
Git 分支合并
Merge(合并) Merge 是 Git 中最常用的分支合并方式之一。当你想要将一个分支的更改合并到另一个分支时,你可以使用 Merge 操作。 合并步骤: 通常是从开发分支往主分支上合并代码的时候用 merge 1、git checkout master&#x…...
C# 以管理员方式启动程序全解析
引言 在 Windows 应用程序开发的领域中,C# 语言凭借其强大的功能和广泛的适用性,被众多开发者所青睐。然而,在实际的开发过程里,我们常常会遭遇这样的情况:程序需要访问特定的系统资源,像是系统文件夹、注…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
