您的位置:首页 > 其它

Visual Studio 2013开发 mini-filter driver step by step 获取文件读写内容(6)

2014-09-07 16:38 513 查看
由于后面的内容跟Visual Studio已经没有太大关系,故文章标题去掉Visual Studio前缀。

今天刚好在CSDN上读到一篇文章《程序员都要有八块腹肌》,所以要练好身体啊!其实我也想说,现代程序员要练好太极,才能以柔克刚,以一当十。

本文以获取文件写的内容为例,来探讨怎样获取写入的数据。

请先参考这个关于如何获取数据buffer的文章

http://msdn.microsoft.com/en-us/library/windows/hardware/ff554436(v=vs.85).aspx

请看下面的源代码获取数据的两种方式。

PFLT_FILE_NAME_INFORMATION file_name_info = NULL;

 status = FltGetFileNameInformation(Data, FLT_FILE_NAME_NORMALIZED | FLT_FILE_NAME_QUERY_DEFAULT, &file_name_info);

 if (NT_SUCCESS(status))

 {

  WCHAR *ssmfflag = L".ssmffile";

  SIZE_T len = sizeof(WCHAR) * wcslen(ssmfflag);

  if (file_name_info->Name.Length > wcslen(ssmfflag) &&

   RtlCompareMemory((char*)ssmfflag, (char *)((char *)file_name_info->Name.Buffer + file_name_info->Name.Length - len), len) == len)

  {

   PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("The file name is %wZ,the offset is %u,len is %u", file_name_info->Name, iopb->Parameters.Write.ByteOffset, writeLen));

   

if (iopb->Parameters.Write.MdlAddress == NULL)

   {

    try

    {

     RtlCopyMemory(buffer,

      iopb->Parameters.Write.WriteBuffer,

      min(writeLen, 90));

    }

    except(EXCEPTION_EXECUTE_HANDLER)

    {

     PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, (""Exception occurred.\n"));

    }

   }

   else

   {//这个是针对direct io的。

    PUCHAR buff = MmGetSystemAddressForMdlSafe(iopb->Parameters.Write.MdlAddress,

     NormalPagePriority);

    PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("MDL"));

    if (buff)

    {

     RtlCopyMemory(buffer,

      buff,

      min(writeLen, 90));

     

    }

   }

   PT_DBG_PRINT(PTDBG_TRACE_ROUTINES, ("The data is %s", buffer));

   

  }

  FltReleaseFileNameInformation(file_name_info);

 }

 return FLT_PREOP_SUCCESS_WITH_CALLBACK;

上面的这段代码就是获取写入的数据并把前100个数据内容打印出来。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐