首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重命名文件操作前Windows Minifilter驱动程序

重命名文件操作前Windows Minifilter驱动程序
EN

Stack Overflow用户
提问于 2019-08-15 19:44:27
回答 1查看 578关注 0票数 0

我有一个微型筛选器驱动程序,想要重命名文件,但我不确定如何获得新的文件名。我想通过与创建文件相同的标准来运行新文件名- IRP_MJ_CREATE。

我目前监控过滤器中的所有文件,并根据一组规则进行相应的移动。

我在上找到了一个关于取消重命名的链接,但不确定如何获得新的文件名。

链接为How to cancel a rename operation in minifilter driver

此时,我可以在case FileRenameInformation中获得现有的文件名,但我需要知道新的文件名信息是什么。

我尝试过使用:

代码语言:javascript
复制
PFILE_RENAME_INFORMATION renameInfo
Iopb->Parameters.SetFileInformation.InfoBuffer;

在开关- FileRenameInformation中,但输出始终为空。

我的PreOperation回调如下:

代码语言:javascript
复制
FLT_PREOP_CALLBACK_STATUS PreOperationCallback(_Inout_ 
PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects, 
_Flt_CompletionContext_Outptr_ PVOID* CompletionContext)
{
  PFILE_RENAME_INFORMATION renameInfo;
  //WCHAR buf[4096] = { 0 };

  /* IRP-based I/O operation? */
  if (FLT_IS_IRP_OPERATION(Data)) {
    /* Open file? */
    if (Data->Iopb->MajorFunction == IRP_MJ_CREATE) {
      /* Open file for writing/appending? */
      if (Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess &
      (FILE_WRITE_DATA | FILE_APPEND_DATA)) {
    return process_irp(Data, FltObjects, CompletionContext, DEFERRED_IO, FALSE);
  }
} else if (Data->Iopb->MajorFunction == IRP_MJ_SET_INFORMATION) {

  switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass) {

    case FileDispositionInformation:
          if (((FILE_DISPOSITION_INFORMATION*) Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->DeleteFile) {
            return process_irp(Data, FltObjects, CompletionContext, FALSE, FALSE);
          }
      break;
    case FileEndOfFileInformation:
    case FileRenameInformation:

        //https://stackoverflow.com/questions/40564824/how-to-cancel-a-rename-operation-in-minifilter-driver
        renameInfo = Data->Iopb->Parameters.SetFileInformation.InfoBuffer;
        //memcpy(buf, renameInfo->FileName, renameInfo->FileNameLength);
        DbgPrint("Rename info - '%wZ'", renameInfo->FileName);


      return process_irp(Data, FltObjects, CompletionContext, FALSE, TRUE);
      }
    }
  }

  return FLT_PREOP_SUCCESS_NO_CALLBACK;
 }
EN

回答 1

Stack Overflow用户

发布于 2019-08-17 15:17:22

此问题存在于您需要使用%ws的DbgPrint中

代码语言:javascript
复制
FLT_PREOP_CALLBACK_STATUS PreOperationCallback(_Inout_ 
PFLT_CALLBACK_DATA Data,
_In_ PCFLT_RELATED_OBJECTS FltObjects, 
_Flt_CompletionContext_Outptr_ PVOID* CompletionContext)
{
  PFILE_RENAME_INFORMATION renameInfo;
  //WCHAR buf[4096] = { 0 };

  /* IRP-based I/O operation? */
  if (FLT_IS_IRP_OPERATION(Data)) {
    /* Open file? */
    if (Data->Iopb->MajorFunction == IRP_MJ_CREATE) {
      /* Open file for writing/appending? */
      if (Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess &
      (FILE_WRITE_DATA | FILE_APPEND_DATA)) {
        return process_irp(Data, FltObjects, CompletionContext, DEFERRED_IO, 
          FALSE);
   }
 } else if (Data->Iopb->MajorFunction == IRP_MJ_SET_INFORMATION) {

   switch (Data->Iopb->Parameters.SetFileInformation.FileInformationClass) {

    case FileDispositionInformation:
          if (((FILE_DISPOSITION_INFORMATION*) Data->Iopb->Parameters.SetFileInformation.InfoBuffer)->DeleteFile) {
        return process_irp(Data, FltObjects, CompletionContext, FALSE, FALSE);
      }
  break;
    case FileEndOfFileInformation:
    case FileRenameInformation:

       DbgPrint("Original file - '%wZ'", name_info->Name);

       renameInfo = Data->Iopb->Parameters.SetFileInformation.InfoBuffer;

       DbgPrint("Rename info length- '%u'", renameInfo->FileNameLength);
       DbgPrint("Rename File info - '%ws'", renameInfo->FileName);


      return process_irp(Data, FltObjects, CompletionContext, FALSE, TRUE);
    }
  }
}

return FLT_PREOP_SUCCESS_NO_CALLBACK;
}

您可以调用get_file_name_information来获取上述代码中的原始文件位置,如下所示:

代码语言:javascript
复制
PFLT_FILE_NAME_INFORMATION name_info;
get_file_name_information(Data, &name_info);

//Release
FltReleaseFileNameInformation(name_info);

现在有一个问题,rename->FileName的格式与name_info->Name不同

下面的示例将C:\temp\1.rtf重命名为C:\temp\12.rtf

代码语言:javascript
复制
DbgPrint("Original file - '%wZ'", name_info->Name);

将采用以下格式:

\Device\HarddiskVolume4\Temp\1.rtf

其中作为

代码语言:javascript
复制
DbgPrint("Rename File info - '%ws'", renameInfo->FileName);

将采用以下格式:

\??\C:\Temp\12.rtf

代码语言:javascript
复制
BOOLEAN get_file_name_information(PFLT_CALLBACK_DATA data,
                              PFLT_FILE_NAME_INFORMATION* name_info)
{
  /* Get name information. */
  if (NT_SUCCESS(FltGetFileNameInformation(
               data,
               FLT_FILE_NAME_NORMALIZED |
               FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
               name_info
             ))) {
    /* Parse file name information. */
    if (NT_SUCCESS(FltParseFileNameInformation(*name_info))) {
      return TRUE;
    }

    FltReleaseFileNameInformation(*name_info);
#if OSVER(NTDDI_VERSION) > NTDDI_WIN2K
  } else {
    /*
    * We couldn't get the "normalized" name, try to get the "opened"
    * name.
    */
    if (NT_SUCCESS(FltGetFileNameInformation(data,
                 FLT_FILE_NAME_OPENED |
                 FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP,
                 name_info
               ))) {
      if (NT_SUCCESS(FltParseFileNameInformation(*name_info))) {
        return TRUE;
      }

      FltReleaseFileNameInformation(*name_info);
    }
 #endif /* OSVER(NTDDI_VERSION) > NTDDI_WIN2K */
 }

 return FALSE;
}

不确定这是否需要是Stack overflow上的另一篇文章,但如果有人知道如何将rename->FileName更改为与name_info->Name相同的格式/结构,他们可以更新答案吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57509144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档