MmGetFileNameForAddress

NTSTATUS __stdcall MmGetFileNameForAddress(PVOID ProcessVa, _UNICODE_STRING *FileName){
  __int64 v3; 
  void *v4; 
  _CONTROL_AREA *v6; 
  _ADAPTER_OBJECT *v7; 
  unsigned int i; 
  _OBJECT_NAME_INFORMATION *Pool; 
  _OBJECT_NAME_INFORMATION *v10; 
  int v11; 
  size_t v12; 
  UINT64 ReturnLength; 
  INT64 v14; 

  LODWORD(ReturnLength) = 0;
  LODWORD(v3) = MiObtainReferencedVadEx((UINT64)ProcessVa, 2, &v14);
  v4 = (void *)v3;
  if( !v3 )
    return -1073741503;
  if( (*(_DWORD *)(v3 + 48) & 0x100000) != 0 || (v6 = **(_CONTROL_AREA ***)(v3 + 72), (v6->u.LongFlags & 0x20) == 0) )
  {
    MiUnlockAndDereferenceVadShared((PVOID)v3);
    return -1073741751;
  }
  else
  {
    v7 = (_ADAPTER_OBJECT *)MiReferenceControlAreaFile(v6);
    MiUnlockAndDereferenceVadShared(v4);
    for( i = 1040; ; i = ReturnLength )
    {
      Pool = (_OBJECT_NAME_INFORMATION *)MiAllocatePool(256i64, i, 0x20206D4Dui64);
      v10 = Pool;
      if( !Pool )
        break;
      LODWORD(ReturnLength) = 0;
      v11 = ObQueryNameStringMode(v7, Pool, i, &ReturnLength, 0);
      if( v11 >= 0 )
      {
        v12 = *(_WORD *)v10;
        FileName->MaximumLength = v12;
        FileName->Length = v12;
        FileName->Buffer = (wchar_t *)v10;
        memmove(v10, *((const VOID **)v10 + 1), v12);
        goto LABEL_12;
      }
      ExFreePoolWithTag(v10, 0);
      if( (unsigned int)ReturnLength <= i )
        goto LABEL_12;
    }
    v11 = -1073741801;
LABEL_12:
    HalPutDmaAdapter(v7);
    return v11;
  }
}

Referenced by:

DbgkPostModuleMessage
EtwpProviderArrivalCallback