MmGetFileNameForSection

NTSTATUS __stdcall MmGetFileNameForSection(_SECTION *SectionObject, _OBJECT_NAME_INFORMATION **FileNameInfo){
  union {unsigned int LongFlags;_MMSECTION_FLAGS Flags;} v2; 
  NTSTATUS v3; 
  NTSTATUS result; 
  _OBJECT_NAME_INFORMATION *Pool; 
  _CONTROL_AREA *v8; 
  _FILE_OBJECT *v9; 
  NTSTATUS v10; 
  int v11; 
  unsigned int v12; 
  _OBJECT_NAME_INFORMATION *v13; 
  UINT64 ReturnLength; 

  v2.LongFlags = (unsigned int)SectionObject->u;
  v3 = 0;
  LODWORD(ReturnLength) = 0;
  *FileNameInfo = 0i64;
  if( (v2.LongFlags & 0x20) == 0 )
    return -1073741751;
  Pool = (_OBJECT_NAME_INFORMATION *)MiAllocatePool(256i64, 0x400ui64, 0x20206D4Dui64);
  *FileNameInfo = Pool;
  if( !Pool )
    return -1073741801;
  v8 = MiSectionControlArea(SectionObject);
  v9 = MiReferenceControlAreaFile(v8);
  v10 = ObQueryNameStringMode(v9, *FileNameInfo, 0x400ui64, &ReturnLength, 0);
  v11 = v10;
  if( v10 >= 0 )
    goto LABEL_11;
  if( v10 == -1073741820 )
  {
    ExFreePoolWithTag(*FileNameInfo, 0);
    v12 = ReturnLength + 1024;
    if( (unsigned int)ReturnLength >= 0xFFFFFC00 || (_DWORD)ReturnLength == 0 )
    {
      *FileNameInfo = 0i64;
      MiDereferenceControlAreaFile(v8, v9);
      return -1073741801;
    }
    v13 = (_OBJECT_NAME_INFORMATION *)MiAllocatePool(256i64, v12, 0x20206D4Dui64);
    *FileNameInfo = v13;
    if( !v13 )
    {
      v3 = -1073741801;
LABEL_11:
      MiDereferenceControlAreaFile(v8, v9);
      return v3;
    }
    v11 = ObQueryNameStringMode(v9, v13, v12, &ReturnLength, 0);
    if( v11 >= 0 )
      goto LABEL_11;
  }
  MiDereferenceControlAreaFile(v8, v9);
  ExFreePoolWithTag(*FileNameInfo, 0);
  result = v11;
  *FileNameInfo = 0i64;
  return result;
}

Referenced by:

DbgkpSectionToFileHandle