测试环境: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 请求包删除文件相关推荐

  1. R语言使用fs包的dir_delete函数删除指定的文件目录(remove the directory)、举一反三、file_delete函数、link_delete函数可以用来删除文件和文件夹

    R语言使用fs包的dir_delete函数删除指定的文件目录(remove the directory).举一反三.file_delete函数.link_delete函数可以用来删除文件和文件夹 目录

  2. 微信小程序提示 “Error: 代码包大小为 2491 kb,上限为 2048 kb请删除文件后重试”

    遇到情况: 预览小程序时,提示 "Error: 代码包大小为 2491 kb,上限为 2048 kb请删除文件后重试" 看了一下官方说明如下: 目前小程序分包大小有以下限制: 解决 ...

  3. 强制删除文件——直接发IRP到文件系统

    学习资料:http://www.antiprotect.com/forum_posts.asp?TID=95 上面这个连接中的DEMO是比较完整软件,这里我把其中发IRP强制删除文件的部分抽出来了, ...

  4. idea包或文件删除恢复

    当不小心删除了项目中的包或者文件的时候,如果Ctrl+Z不能返回至删除之前,谨慎尝试下面的操作. 选择要恢复的目标项目 找到Local History 的Show History选项 左侧为更改历史记 ...

  5. DevOps进阶(十)Jenkins组包时解决无法删除文件夹的情况:文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开...

    在删除文件夹的时候,可能会遇到文件夹正在使用,操作无法完成,因为其中的文件,或文件夹已在另一个程序中打开,请关闭该文件夹或或文件,然后重试.这类无法关闭删除文件夹的情况,如下图所示. 解决这个的关键是 ...

  6. 大型分布式C++框架《四:netio之请求包中转站 上》

    本来一篇文章就该搞定的.结果要分上下篇了.主要是最近颈椎很不舒服.同时还在做秒杀的需求也挺忙的. 现在不能久坐.看代码的时间变少了.然后还买了两本治疗颈椎的书.在学着,不过感觉没啥用.突然心里好害怕. ...

  7. python读取压缩文件的大小_python查看zip包中文件及大小的方法

    python查看zip包中文件及大小的方法 本文实例讲述了python查看zip包中文件及大小的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python import ...

  8. php如何删除文件夹里的图片,php如何删除文件夹

    php如何删除文件夹 php删除文件夹的方法:首先创建一个PHP示例文件:然后通过"function deldir($dir) {...}"删除目录下的文件并删除当前文件夹即可. ...

  9. python删除失败_对python 各种删除文件失败的处理方式分享

    对python 各种删除文件失败的处理方式分享 调用python提供的各种删除文件的操作均失败 返回值5,拒绝访问,但是多次确认文件没有被打开,文件是从一个zip包中解压出来后,没有任何打开读写等操作 ...

最新文章

  1. 前端小笔记:左定宽,右随意
  2. 啊啊啊...每次需求评审总被boss虐成狗?解药来了
  3. 让 FileUpload 文本框只读
  4. oracle hr样本模式,Oracle 样本模式 HR
  5. Project Student:维护Webapp(只读)
  6. 嵌入式工作笔记0004---常见术语积累--随时更新
  7. Kubernetes之Pod调度
  8. PADS无模命令总结
  9. MySQL 四种链接
  10. 【学术】论文写作葵花宝典
  11. flink实战-实时计算平台通过api停止流任务
  12. yolov3/yolov4/yolov5/yolov6/yolov7/lite/fastdet/efficientdet各系列模型开发、项目交付、组合改造创新之—桥梁基建隧道裂痕裂缝检测实战
  13. win10电脑锁屏快捷键
  14. catia曲面扫掠命令详解_4.3.3.15-扫掠曲面之二次曲线_两条引导线扫略
  15. superoj738 诸葛亮
  16. 基于Mathcad的LLC公式推导与化简(一)
  17. Python开发【项目】:生产环境下实时统计网站访问日志信息
  18. Python制作PPT
  19. 圈叉棋、套娃圈叉棋、嵌套圈叉棋、九个井字棋
  20. adprw指令教程_三菱FX3U从入门到精通(全套)

热门文章

  1. 三星性能测试软件,三星T7 性能测试
  2. 新能源车电机控制器源代码资料 基于TI芯片的FOC源代码资料
  3. 如何测算BMI指数(Python)
  4. opengl生成图片php,(转)使用OpenGL显示图像(七)Android OpenGLES2.0——纹理贴图之显示图片...
  5. 计算机公式等级评定,Excel函数如何完成学生成绩等级评定
  6. java心电图_使用原生js+canvas实现模拟心电图
  7. 超导量子计算机最新报道,量子效应的量子计算机,在高温超导体加持下,或将迎来重大突破!...
  8. php文章相似度计算,PHP相似度算法
  9. gensim基本使用+文本相似度分析
  10. cuda FORTRAN 统一内存 managed