通过 irp 请求包删除文件
测试环境:win7 32
测试功能:通过构造irp 请求包,直接发给DeviceObject 调用对应DriverObject中的MajorFunction 来删除文件
参考:强制删除文件(1)——直接发IRP到文件系统_zz_strive_2012的专栏-CSDN博客
来源:从文件 MD5:dace344b6a923a756143a76c9cd12ebc 中扣出来的。
NTSTATUS DeleteCompletionRoutine(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context)
{Irp->UserIosb->Status = Irp->IoStatus.Status;Irp->UserIosb->Information = Irp->IoStatus.Information;KeSetEvent(Irp->UserEvent, 0, FALSE);IoFreeIrp(Irp);return STATUS_MORE_PROCESSING_REQUIRED;
}NTSTATUS TryDeleteFile(PFILE_OBJECT FileObject, HANDLE FileHandle)
{NTSTATUS status = STATUS_SUCCESS;KEVENT Event = { 0 };IO_STATUS_BLOCK IoStatusBlock = { 0 };PDEVICE_OBJECT RelatedDeviceObject = NULL;PIRP Irp = NULL;PIO_STACK_LOCATION IoStackLocation = NULL;CHAR FileDispositionInfo = 1;PSECTION_OBJECT_POINTERS pSectionObjectPointer;RelatedDeviceObject = IoGetRelatedDeviceObject(FileObject);if (RelatedDeviceObject == NULL){DbgPrint("fails to get related DeviceObject");return STATUS_UNSUCCESSFUL;}Irp = IoAllocateIrp(RelatedDeviceObject->StackSize, FALSE);if (Irp){KeInitializeEvent(&Event, SynchronizationEvent, 0);Irp->RequestorMode = KernelMode;Irp->AssociatedIrp.SystemBuffer = &FileDispositionInfo;Irp->UserEvent = &Event;Irp->UserIosb = &IoStatusBlock;Irp->Tail.Overlay.Thread = (PETHREAD)KeGetCurrentThread();Irp->Tail.Overlay.OriginalFileObject = FileObject;IoStackLocation = IoGetNextIrpStackLocation(Irp);if (IoStackLocation){IoStackLocation->MajorFunction = IRP_MJ_SET_INFORMATION;IoStackLocation->DeviceObject = RelatedDeviceObject;IoStackLocation->FileObject = FileObject;IoStackLocation->Parameters.SetFile.Length = 1;IoStackLocation->Parameters.SetFile.FileInformationClass = FileDispositionInformation;IoStackLocation->Parameters.SetFile.FileObject = FileObject;IoStackLocation->Parameters.SetFile.DeleteHandle = Handle;//IoStackLocation->CompletionRoutine = (PIO_COMPLETION_ROUTINE)DeleteCompletionRoutine;IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE)DeleteCompletionRoutine, NULL, TRUE, TRUE, TRUE);IoStackLocation->Control = 0xe0;//pSectionObjectPointer = FileObject->SectionObjectPointer;//pSectionObjectPointer->ImageSectionObject = 0;//pSectionObjectPointer->DataSectionObject = 0;status = IoCallDriver(RelatedDeviceObject, Irp);if (status == STATUS_PENDING){KeWaitForSingleObject(&Event,0,KernelMode,TRUE,0);}status = Irp->UserIosb->Status;}else{DbgPrint("the next irp stack location is null!\n");}}else{status = STATUS_NO_MEMORY;}return status;
}NTSTATUS DeleteFileByIrp(WCHAR* FileName)
{NTSTATUS status = STATUS_SUCCESS;UNICODE_STRING DestinationString = { 0 };OBJECT_ATTRIBUTES ObjectAttributes = { 0 };IO_STATUS_BLOCK IoStatusBlock = { 0 };HANDLE Handle = NULL;PFILE_OBJECT FileObject = NULL;RtlInitUnicodeString(&DestinationString, FileToDelete);ObjectAttributes.ObjectName = &DestinationString;ObjectAttributes.Length = 0x18;ObjectAttributes.Attributes = 0x240;ObjectAttributes.RootDirectory =ObjectAttributes.SecurityDescriptor =ObjectAttributes.SecurityQualityOfService = NULL;status = ZwCreateFile(&Handle,FILE_READ_DATA | SYNCHRONIZE,&ObjectAttributes,&IoStatusBlock,0,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ | FILE_SHARE_DELETE,FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);if (NT_SUCCESS(status)){status = ObReferenceObjectByHandle(Handle,DELETE,*IoFileObjectType,KernelMode,&FileObject,NULL);if (NT_SUCCESS(status)){DbgPrint("<<<DeleteFileByIrp>>>get the file object.");status = TryDeleteFile(FileObject, Handle);}else{DbgPrint("fails to reference file ,status:0x%x", status);}}else{DbgPrint("open file fails,status:0x%x", status);}if (FileObject){ObDereferenceObject(FileObject);}if (Handle){ZwClose(Handle);}return status;
}
通过 irp 请求包删除文件相关推荐
- R语言使用fs包的dir_delete函数删除指定的文件目录(remove the directory)、举一反三、file_delete函数、link_delete函数可以用来删除文件和文件夹
R语言使用fs包的dir_delete函数删除指定的文件目录(remove the directory).举一反三.file_delete函数.link_delete函数可以用来删除文件和文件夹 目录
- 微信小程序提示 “Error: 代码包大小为 2491 kb,上限为 2048 kb请删除文件后重试”
遇到情况: 预览小程序时,提示 "Error: 代码包大小为 2491 kb,上限为 2048 kb请删除文件后重试" 看了一下官方说明如下: 目前小程序分包大小有以下限制: 解决 ...
- 强制删除文件——直接发IRP到文件系统
学习资料:http://www.antiprotect.com/forum_posts.asp?TID=95 上面这个连接中的DEMO是比较完整软件,这里我把其中发IRP强制删除文件的部分抽出来了, ...
- idea包或文件删除恢复
当不小心删除了项目中的包或者文件的时候,如果Ctrl+Z不能返回至删除之前,谨慎尝试下面的操作. 选择要恢复的目标项目 找到Local History 的Show History选项 左侧为更改历史记 ...
- DevOps进阶(十)Jenkins组包时解决无法删除文件夹的情况:文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开...
在删除文件夹的时候,可能会遇到文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开,请关闭该文件夹或或文件,然后重试.这类无法关闭删除文件夹的情况,如下图所示. 解决这个的关键是 ...
- 大型分布式C++框架《四:netio之请求包中转站 上》
本来一篇文章就该搞定的.结果要分上下篇了.主要是最近颈椎很不舒服.同时还在做秒杀的需求也挺忙的. 现在不能久坐.看代码的时间变少了.然后还买了两本治疗颈椎的书.在学着,不过感觉没啥用.突然心里好害怕. ...
- python读取压缩文件的大小_python查看zip包中文件及大小的方法
python查看zip包中文件及大小的方法 本文实例讲述了python查看zip包中文件及大小的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python import ...
- php如何删除文件夹里的图片,php如何删除文件夹
php如何删除文件夹 php删除文件夹的方法:首先创建一个PHP示例文件:然后通过"function deldir($dir) {...}"删除目录下的文件并删除当前文件夹即可. ...
- python删除失败_对python 各种删除文件失败的处理方式分享
对python 各种删除文件失败的处理方式分享 调用python提供的各种删除文件的操作均失败 返回值5,拒绝访问,但是多次确认文件没有被打开,文件是从一个zip包中解压出来后,没有任何打开读写等操作 ...
最新文章
- 前端小笔记:左定宽,右随意
- 啊啊啊...每次需求评审总被boss虐成狗?解药来了
- 让 FileUpload 文本框只读
- oracle hr样本模式,Oracle 样本模式 HR
- Project Student:维护Webapp(只读)
- 嵌入式工作笔记0004---常见术语积累--随时更新
- Kubernetes之Pod调度
- PADS无模命令总结
- MySQL 四种链接
- 【学术】论文写作葵花宝典
- flink实战-实时计算平台通过api停止流任务
- yolov3/yolov4/yolov5/yolov6/yolov7/lite/fastdet/efficientdet各系列模型开发、项目交付、组合改造创新之—桥梁基建隧道裂痕裂缝检测实战
- win10电脑锁屏快捷键
- catia曲面扫掠命令详解_4.3.3.15-扫掠曲面之二次曲线_两条引导线扫略
- superoj738 诸葛亮
- 基于Mathcad的LLC公式推导与化简(一)
- Python开发【项目】:生产环境下实时统计网站访问日志信息
- Python制作PPT
- 圈叉棋、套娃圈叉棋、嵌套圈叉棋、九个井字棋
- adprw指令教程_三菱FX3U从入门到精通(全套)
热门文章
- 三星性能测试软件,三星T7 性能测试
- 新能源车电机控制器源代码资料 基于TI芯片的FOC源代码资料
- 如何测算BMI指数(Python)
- opengl生成图片php,(转)使用OpenGL显示图像(七)Android OpenGLES2.0——纹理贴图之显示图片...
- 计算机公式等级评定,Excel函数如何完成学生成绩等级评定
- java心电图_使用原生js+canvas实现模拟心电图
- 超导量子计算机最新报道,量子效应的量子计算机,在高温超导体加持下,或将迎来重大突破!...
- php文章相似度计算,PHP相似度算法
- gensim基本使用+文本相似度分析
- cuda FORTRAN 统一内存 managed