首页
社区
课程
招聘
微过滤驱动蓝屏问题
发表于: 2014-5-8 13:43 5403

微过滤驱动蓝屏问题

2014-5-8 13:43
5403
FLT_POSTOP_CALLBACK_STATUS TestPostCreate(
  __inout PFLT_CALLBACK_DATA Data,
  __in PCFLT_RELATED_OBJECTS FltObjects,
  __in_opt PVOID CompletionContext,
  __in FLT_POST_OPERATION_FLAGS Flags
  )
{
  NTSTATUS status;
  PFLT_FILE_NAME_INFORMATION NameInfo;
  UNICODE_STRING Extension;
  UNICODE_STRING FileName,VolumeName;

  ANSI_STRING AnsiPath;

  PAGED_CODE();

  
  RtlInitUnicodeString(&Extension,L"txt");

  status = FltGetFileNameInformation(Data,FLT_FILE_NAME_NORMALIZED|FLT_FILE_NAME_QUERY_DEFAULT,&NameInfo);
  if (!NT_SUCCESS(Data->IoStatus.Status))
  {
    FltParseFileNameInformation(NameInfo);
    return FLT_POSTOP_FINISHED_PROCESSING;
  }

  
  
  
  if (NameInfo->Extension.Length!=0)
  {
    if (RtlEqualUnicodeString(&NameInfo->Extension,&Extension,FALSE))
    {
      IoVolumeDeviceToDosName(FltObjects->FileObject->DeviceObject,&VolumeName);

      FileName.Buffer = (PWCH) ExAllocatePool(NonPagedPool,512);
      FileName.Length = 0;
      FileName.MaximumLength = 512;
      RtlZeroMemory(FileName.Buffer,512);
      
      RtlAppendUnicodeStringToString(&FileName,&VolumeName);

      
      ExFreePool(VolumeName.Buffer);

      RtlAppendUnicodeStringToString(&FileName,&FltObjects->FileObject->FileName);
      AnsiPath.Buffer = (CHAR*)ExAllocatePool(NonPagedPool,512);
      AnsiPath.Length =0 ;
      AnsiPath.MaximumLength = 512;
      RtlUnicodeStringToAnsiString(&AnsiPath,&FileName,FALSE);
      //TestSendMessage(AnsiPath.Buffer,AnsiPath.Length);
      ExFreePool(FileName.Buffer);
      ExFreePool(AnsiPath.Buffer);
    }
  }

  FltReleaseFileNameInformation(NameInfo);

  //KdPrint((NameInfo->Extension.Buffer));
  return FLT_POSTOP_FINISHED_PROCESSING;

}

这段代码可以运行,但是不久就会蓝屏,蓝屏就在这个函数里
请教下是什么问题呢

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
附上DUMP 或者WINDBG的蓝屏代码
2014-5-8 16:52
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
windbg的话是 这个函数+ec 有时候是RltUnicodeStringToAnsiString这里的问题
2014-5-8 22:35
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
没看见代码里你调用了这个函数
还有你代码逻辑挺乱的
2014-5-9 03:21
0
雪    币: 200
活跃值: (282)
能力值: ( LV5,RANK:72 )
在线值:
发帖
回帖
粉丝
5
ExFreePool(VolumeName.Buffer);
没有见到你分配内存,就释放..
2014-8-21 22:23
0
雪    币: 239
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
ExFreePool(VolumeName.Buffer);
VolumeName前面没有调用RtlInitUnicodeString
2014-8-26 09:24
0
雪    币: 121
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
IoVolumeDeviceToDosName函数分配的,所以释放是正确的。
这个说实话,直接这么看代码,没有啥问题。
建议LZ,你自己挂上debug调试下,把分析的发出来。

另外给你一个强烈的建议:
内核下,有返回值的API,都检查下返回值吧。可以减少非常多的挂的情况。如果按LZ说,挂的地方是RtlUnicodeStringToAnsiString,建议你先检查运行级别是否高于PASSIVE_LEVEL,再检查返回值吧。
2014-8-26 10:34
0
雪    币: 200
活跃值: (282)
能力值: ( LV5,RANK:72 )
在线值:
发帖
回帖
粉丝
8
恩 当时没仔细看,IoVolumeDeviceToDosName函数分配内存了且需要用户使用后释放,msdn说vista之后的系统在调用IoVolumeDeviceToDosName之前要先确认APCs没有关闭,要不就是IRQL的原因吧。
建议太好了,现在越来越发现检查返回值的重要性了。否则是个错误、失败的就蓝屏。。
+1024
2014-8-28 13:43
0
雪    币: 63
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
status = FltGetFileNameInformation(Data,FLT_FILE_NAME_NORMALIZED|FLT_FILE_NAME_QUERY_DEFAULT,&NameInfo);
  if (!NT_SUCCESS(Data->IoStatus.Status))
  {
    FltParseFileNameInformation(NameInfo);
/**
* 这里有错误,你没有释放FltGetFileNameInformation分配的内存就 return了
*
*另外,你也没有判断FltGetFileNameInformation是否执行成功!
*
*/

    return FLT_POSTOP_FINISHED_PROCESSING;
  }

后面的代码没看
2014-11-3 13:48
0
雪    币: 4
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我曾写过相似的,lz的问题应该是没有判断FltGetFileNameInformation成功,而内存释放倒不是问题
2014-11-3 14:00
0
游客
登录 | 注册 方可回帖
返回
//