Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法使用Windows微筛选器驱动程序读取文件_C_Windows_Driver - Fatal编程技术网

C 无法使用Windows微筛选器驱动程序读取文件

C 无法使用Windows微筛选器驱动程序读取文件,c,windows,driver,C,Windows,Driver,我有一个基于示例Minivers的minifilter驱动程序 看, 我在用于读取输入文件的FltCreateFile上获得了一些文件的错误代码 我收到的错误代码是 -1073741757 0xC0000034 状态\u对象\u名称\u未找到 接着是另一次尝试 -1073741757 0xC0000043 状态共享违反 我不确定到哪里去或更改以解决问题。我已经查看了FltCreateFile的MSDN页面 看 不幸的是,记录的返回值与我收到的错误不匹配 在Windows101803上运行 我尝试

我有一个基于示例Minivers的minifilter驱动程序 看,

我在用于读取输入文件的FltCreateFile上获得了一些文件的错误代码

我收到的错误代码是

-1073741757 0xC0000034

状态\u对象\u名称\u未找到

接着是另一次尝试

-1073741757 0xC0000043

状态共享违反

我不确定到哪里去或更改以解决问题。我已经查看了FltCreateFile的MSDN页面

不幸的是,记录的返回值与我收到的错误不匹配

在Windows101803上运行

我尝试过修改共享访问标志,但仍然会出现相同的错误

我已经做了更多的测试/调查,并决定在我的示例中监视minifilter中的单个目录C:\temp。我认为我的问题在于预操作回调,即何时调用复制文件。以下是我的术前准备

FLT_PREOP_CALLBACK_STATUS PreOperationCallback(_Inout_ 
PFLT_CALLBACK_DATA Data, _In_ PCFLT_RELATED_OBJECTS FltObjects, 
_Flt_CompletionContext_Outptr_ PVOID* CompletionContext)
{
  //PFILE_RENAME_INFORMATION renameInfo;

  /* 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;
        //DbgPrint("Rename info length- '%u'", renameInfo->FileNameLength);
        //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;
}
当我右键单击temp目录并创建新的富文本文档时,或者如果我将文件复制到该目录中,就会出现上面列出的错误。在c:\temp中创建了一个新文件,我在调试器中收到错误。B.N-我尝试了不同大小写的不同文件,以确认我对文件名大小写没有问题

现在,如果我删除文件,我会得到正确的结果,这是通过

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

 break;
进程\u irp-检查文件并生成一个新的位置,将其移动到何处,然后在满足所有条件时调用copy\u文件

BOOLEAN copy_file(PFLT_FILTER filter,
              PFLT_INSTANCE instance,
              UNICODE_STRING* dest,
              UNICODE_STRING* src)
{
    HANDLE hInput, hOutput;
    PFILE_OBJECT out;
    OBJECT_ATTRIBUTES attr;
    IO_STATUS_BLOCK io_status_block;
    PVOID buf;
    ULONGLONG filesize;
    NTSTATUS status;

    InitializeObjectAttributes(&attr,
                             src,
                             OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
                             NULL,
                             NULL);



    status = FltCreateFile(filter,      /* Filter            */
          instance,                     /* Instance          */
          &hInput,                      /* FileHandle        */
          GENERIC_READ,                 /* DesiredAccess     */
          &attr,                        /* ObjectAttributes  */
          &io_status_block,             /* IoStatusBlock     */
          NULL,                         /* AllocationSize    */
          FILE_ATTRIBUTE_NORMAL,        /* FileAttributes    */
          FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,   /* ShareAccess       */
          FILE_OPEN,                    /* CreateDisposition */
          FILE_SYNCHRONOUS_IO_NONALERT, /* CreateOptions     */
          NULL,                         /* EaBuffer          */
          0,                            /* EaLength          */
          IO_FORCE_ACCESS_CHECK);       /* Flags             */






    if (!NT_SUCCESS(status)) {

        DbgPrint("Could not create the file '%wZ' with STATUS '%d.\n' ",
          dest, 
          status);

      return FALSE;
    }
}
抱歉,这是第一次用C语言编写并创建驱动程序,我已经尝试阅读了IRP,因为我认为问题就在这里。我的想法是,文件在执行时可能不存在,因此我得到了错误-我可能完全错了


任何帮助都将不胜感激。

请在此处直接显示,而不是外部链接。更正了我以前的格式编辑,将
BOOL
更改为原始
BOOLEAN
您可能希望至少显示调用代码,以便希望帮助的人了解您所做的工作,并且可以重现错误。(也就是说,按照第一条评论中提供的链接中的说明进行操作。只是在黑暗中拍摄,但您使用
OBJ_不区分大小写的方法调用
InitializeObjectAttributes
,您的
UNICODE_STRING*src
大小写是否正确?不幸的是,OBJ_不区分大小写没有任何影响,我有一种感觉,这可能是需要的。)执行时执行。我已经做了更多的测试,因此将为问题添加更多细节。请在此处直接显示,而不是外部链接。更正了我以前的格式编辑,将
BOOL
更改回原始
BOOLEAN
您可能希望至少显示调用代码,以便I’我想帮助您了解一下您所做的工作,并重现错误。(也就是说,按照第一条评论中提供的链接中的说明进行操作。只是在黑暗中拍摄,但您使用
OBJ_不区分大小写的方法调用
InitializeObjectAttributes
,您的
UNICODE_STRING*src
大小写是否正确?不幸的是,OBJ_不区分大小写没有任何影响,我有一种感觉,这可能是需要的。)我已经做了更多的测试,所以我会为这个问题添加更多的细节。