EtwpLocateDbgIdForRegEntry

INT64 __fastcall EtwpLocateDbgIdForRegEntry(CHAR a1, INT64 a2, UINT8 **a3, UINT64 *a4){
  void *v6; 
  _ETHREAD *CurrentThread; 
  INT64 result; 
  UINT64 v9; 
  ULONGLONG Size; 
  PVOID BaseOfImage; 
  PIMAGE_NT_HEADERS NtHeader; 
  INT64 v13; 
  LODWORD(v13) = 0;
  NtHeader = 0i64;
  BaseOfImage = 0i64;
  Size = 0i64;
  v6 = *(void **)(a2 + 88);
  if( !v6 )
    return 3221225793i64;
  if( !a1 )
  {
    RtlPcToFileHeader(v6, &BaseOfImage);
    if( !BaseOfImage )
      return 3221226021i64;
LABEL_5:
    LODWORD(result) = RtlImageNtHeaderEx(
                        1ui64,
                        (PVOID)((unsigned __int64)BaseOfImage & 0xFFFFFFFFFFFFFFFCui64),
                        Size,
                        &NtHeader);
    if( (int)result >= 0 )
    {
      v9 = Size;
      if( !Size )
      {
        LODWORD(result) = EtwpGetImageSize(NtHeader, &Size);
        v9 = Size;
      }
      if( (int)result >= 0 )
      {
        if( a1 == 1
          && v9
          && ((unsigned __int64)BaseOfImage + v9 > 0x7FFFFFFF0000i64 || (char *)BaseOfImage + v9 < BaseOfImage) )
        {
          MEMORY[0x7FFFFFFF0000] = 0;
          v9 = Size;
        }
        return EtwpFindDebugId(BaseOfImage, v9, 0i64, (UINT64 *)a3);
      }
    }
    return result;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (*(_BYTE *)(*((_QWORD *)CurrentThread + 23) + 992i64) & 1) != 0 )
    return VslGetEtwDebugId(*((_QWORD *)CurrentThread + 23), *(_QWORD *)(a2 + 88), (INT64 *)a3, a4);
  result = MmGetImageInformation((UINT64)v6, &BaseOfImage, &Size, &v13);
  if( (int)result >= 0 )
    goto LABEL_5;
  return result;
}

Referenced by:

EtwpProviderArrivalCallback