紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 1947|回复: 1

IrpDeleteFileForce到符号链接文件

[复制链接]

5

主题

156

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
114
发表于 2020-9-30 21:40:41 | 显示全部楼层 |阅读模式
本帖最后由 Krueger 于 2020-10-1 05:18 编辑

基于此参考 (https://blog.csdn.net/zy_strive_2012/article/details/78337637),我正在使用符号链接文件测试IrpDeleteFileForce(),但对于pFileObject,状态始终为0xC000000D(STATUS_INVALID_PARAMETER)。 我仅在GetDriveObject()例程中将FILE_OPEN_REPARSE_POINT添加到(IoCreateFile()函数的)的CreateOptions参数中,而IrpCreateFile()例程返回STATUS_SUCCESS,我不明白为什么IrpDeleteFileForce()失败的原因:-(

一些解决方案?

  1. NTSTATUS GetDriveObject(PUNICODE_STRING pDriveName, PDEVICE_OBJECT* DeviceObject, PDEVICE_OBJECT* ReadDevice)
  2. {
  3.     NTSTATUS status;
  4.     OBJECT_ATTRIBUTES objectAttributes;
  5.     HANDLE DeviceHandle = NULL;
  6.     IO_STATUS_BLOCK ioStatus;
  7.     PFILE_OBJECT pFileObject;

  8.     if (pDriveName == NULL || DeviceObject == NULL || ReadDevice == NULL)
  9.         return STATUS_INVALID_PARAMETER;

  10.     InitializeObjectAttributes(&objectAttributes, pDriveName, OBJ_CASE_INSENSITIVE, NULL, NULL);

  11.     status = IoCreateFile(&DeviceHandle, SYNCHRONIZE | FILE_ANY_ACCESS, &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE | FILE_OPEN_REPARSE_POINT, NULL, 0, CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING);

  12.     if (!NT_SUCCESS(status))
  13.         return status;

  14.     status = ObReferenceObjectByHandle(DeviceHandle, FILE_READ_DATA, *IoFileObjectType, KernelMode, &pFileObject, NULL);

  15.     if (!NT_SUCCESS(status))
  16.     {
  17.         ZwClose(DeviceHandle);
  18.         return status;
  19.     }

  20.     if (pFileObject->Vpb == 0 || pFileObject->Vpb->RealDevice == NULL)
  21.     {
  22.         ObDereferenceObject(pFileObject);
  23.         ZwClose(DeviceHandle);
  24.         return STATUS_UNSUCCESSFUL;
  25.     }

  26.     *DeviceObject = pFileObject->Vpb->DeviceObject;
  27.     *ReadDevice = pFileObject->Vpb->RealDevice;

  28.     ObDereferenceObject(pFileObject);
  29.     ZwClose(DeviceHandle);

  30.     return STATUS_SUCCESS;
  31. }
复制代码

5

主题

156

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
114
 楼主| 发表于 2020-10-2 20:31:51 | 显示全部楼层
本帖最后由 Krueger 于 2020-10-2 20:34 编辑

解决了 :D

GetDriveObject()

  1. status = IoCreateFile(&DeviceHandle, SYNCHRONIZE | FILE_ANY_ACCESS, &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_REPARSE_POINT, NULL, 0, CreateFileTypeNone, NULL, IO_NO_PARAMETER_CHECKING);
复制代码


IrpCreateFile()

  1. IrpSp->Parameters.Create.Options = (FILE_OPEN_IF << 24) | FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_REPARSE_POINT | 0;
复制代码

评分

参与人数 1水晶币 +100 收起 理由
Tesla.Angela + 100 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-20 16:48 , Processed in 0.023560 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表