MmGetFileNameForSection

INT64 __fastcall MmGetFileNameForSection(INT64 a1, OBJECT_NAME_INFORMATION **a2){
  int v2; 
  unsigned int v3; 
  INT64 result; 
  OBJECT_NAME_INFORMATION *v7; 
  _CONTROL_AREA *v8; 
  _FILE_OBJECT *v9; 
  int v10; 
  int v11; 
  unsigned int v12; 
  OBJECT_NAME_INFORMATION *v13; 
  UINT64 ReturnLength; 
  v2 = *(_DWORD *)(a1 + 56);
  v3 = 0;
  LODWORD(ReturnLength) = 0;
  *a2 = 0i64;
  if( (v2 & 0x20) == 0 )
    return 3221225545i64;
  LODWORD(v7) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
  *a2 = v7;
  if( !v7 )
    return 3221225495i64;
  v8 = MiSectionControlArea((_SECTION *)a1);
  v9 = MiReferenceControlAreaFile(v8);
  v10 = ObQueryNameStringMode(v9, *a2, 0x400ui64, &ReturnLength, 0);
  v11 = v10;
  if( v10 >= 0 )
    goto LABEL_11;
  if( v10 == -1073741820 )
  {
    ExFreePoolWithTag(*a2, 0);
    v12 = ReturnLength + 1024;
    if( (unsigned int)ReturnLength >= 0xFFFFFC00 || (_DWORD)ReturnLength == 0 )
    {
      *a2 = 0i64;
      MiDereferenceControlAreaFile((__int64)v8, (unsigned __int64)v9);
      return 3221225495i64;
    }
    LODWORD(v13) = MiAllocatePool((struct _SLIST_ENTRY *)0x100);
    *a2 = v13;
    if( !v13 )
    {
      v3 = -1073741801;
LABEL_11:
      MiDereferenceControlAreaFile((__int64)v8, (unsigned __int64)v9);
      return v3;
    }
    v11 = ObQueryNameStringMode(v9, v13, v12, &ReturnLength, 0);
    if( v11 >= 0 )
      goto LABEL_11;
  }
  MiDereferenceControlAreaFile((__int64)v8, (unsigned __int64)v9);
  ExFreePoolWithTag(*a2, 0);
  result = (unsigned int)v11;
  *a2 = 0i64;
  return result;
}

Referenced by:

DbgkpSectionToFileHandle