VrpPostQueryKey

INT64 __fastcall VrpPostQueryKey(INT64 a1){
  __int64 v2; 
  __int64 v3; 
  INT8 PreviousMode; 
  errno_t v5; 
  __int64 *v6; 
  INT8 v7; 
  unsigned int v8; 
  __int64 v9; 
  int v11; 
  WCHAR *v12; 
  NTSTATUS v13; 
  NTSTATUS v14; 
  __int64 *v15; 
  bool v16; 
  __int64 *v17; 
  _UNICODE_STRING *KeyName; 
  _UNICODE_STRING *KeyNamea; 
  WCHAR *KeyFlags; 
  WCHAR *KeyFlagsa; 
  UINT64 KeyFlagsb; 
  errno_t updated; 
  int v24; 
  PVOID BufferUsed; 
  PVOID SuspectBuffer; 
  INT64 v27; 
  GUID ActivityId; 
  struct _EVENT_DATA_DESCRIPTOR v29[2]; 
  __int64 *v30; 
  __int64 v31; 
  __int64 *v32; 
  __int64 v33; 
  int *p_updated; 
  __int64 v35[3]; 
  v27 = a1;
  ActivityId = 0i64;
  EtwActivityIdControl(3u, &ActivityId);
  v2 = *(_QWORD *)(a1 + 40);
  v3 = *(_QWORD *)(a1 + 16);
  BufferUsed = 0i64;
  PreviousMode = ExGetPreviousMode();
  v5 = *(_DWORD *)(a1 + 8);
  v6 = &EmptyUnicodeString;
  SuspectBuffer = 0i64;
  v7 = PreviousMode;
  if( v5 < 0 && v5 != -1073741789 && v5 != -2147483643 )
    goto LABEL_4;
  v8 = *(_DWORD *)(v3 + 8);
  if( v8 > 8 )
    goto LABEL_4;
  v9 = 283i64;
  if( !_bittest((const int *)&v9, v8) )
    goto LABEL_4;
  if( (unsigned int)CallbackContext > 5 )
  {
    v15 = (__int64 *)(v2 + 16);
    v24 = *(_DWORD *)(v3 + 8);
    v31 = 4i64;
    v30 = (__int64 *)&v24;
    if( !*(_QWORD *)(v2 + 24) )
      v15 = &EmptyUnicodeString;
    v33 = 2i64;
    v32 = v35;
    p_updated = (int *)v15[1];
    v35[0] = *(unsigned __int16 *)v15;
    tlgWriteTransfer_EtwWriteTransfer(
      (__int64)&CallbackContext,
      (unsigned __int8 *)&word_14002345E,
      &ActivityId,
      0i64,
      5u,
      v29);
  }
  if( (*(_DWORD *)(v2 + 36) & 0x20000000) == 0 )
  {
    v11 = *(_DWORD *)(v3 + 8);
    if( v11 != 3 && v11 != 8 )
      goto LABEL_4;
  }
  LOBYTE(v9) = v7;
  v5 = VrpProcessBufferParameter(
         (PWCHAR)v9,
         *(_QWORD *)(v3 + 16),
         (PWCHAR)*(unsigned int *)(v3 + 24),
         (PWCHAR)&BufferUsed,
         &KeyName->Length,
         KeyFlags);
  if( v5 >= 0 )
  {
    v5 = VrpOutputBufferParameter(v7, BufferUsed, *(unsigned int *)(v3 + 24), (PVOID *)(v3 + 16));
    if( v5 >= 0 )
    {
      LOBYTE(v12) = v7;
      v5 = VrpProcessBufferParameter(
             v12,
             *(_QWORD *)(v3 + 32),
             (PWCHAR)4,
             (PWCHAR)&SuspectBuffer,
             &KeyNamea->Length,
             KeyFlagsa);
      if( v5 >= 0 )
      {
        v5 = VrpOutputBufferParameter(v7, SuspectBuffer, 4ui64, (PVOID *)(v3 + 32));
        if( v5 >= 0 )
        {
          LODWORD(KeyFlagsb) = *(_DWORD *)(v2 + 36);
          updated = VrpUpdateKeyInformation(
                      (_KEY_INFORMATION_CLASS)*(_DWORD *)(v3 + 8),
                      BufferUsed,
                      *(unsigned int *)(v3 + 24),
                      (UINT64 *)SuspectBuffer,
                      (_UNICODE_STRING *)(v2 + 16),
                      KeyFlagsb);
          v5 = updated;
          if( updated >= 0 || updated == -2147483643 || updated == -1073741789 )
          {
            v13 = VrpOutputBufferParameter(v7, *(PVOID *)(v3 + 16), *(unsigned int *)(v3 + 24), &BufferUsed);
            if( v13 < 0 )
            {
              v5 = v13;
            }
            else
            {
              v14 = VrpOutputBufferParameter(v7, *(PVOID *)(v3 + 32), 4ui64, &SuspectBuffer);
              if( v14 < 0 )
              {
                v5 = v14;
              }
              else
              {
                *(_DWORD *)(v27 + 24) = updated;
                v5 = -1073740541;
                if( (unsigned int)CallbackContext <= 5 )
                  goto LABEL_5;
                v16 = *(_QWORD *)(v2 + 24) == 0i64;
                v17 = &EmptyUnicodeString;
                v31 = 2i64;
                if( !v16 )
                  v17 = (__int64 *)(v2 + 16);
                v35[0] = 4i64;
                v30 = &v33;
                v35[2] = 4i64;
                v32 = (__int64 *)v17[1];
                v33 = *(unsigned __int16 *)v17;
                v24 = *(_DWORD *)(v3 + 8);
                p_updated = &v24;
                v35[1] = (__int64)&updated;
                tlgWriteTransfer_EtwWriteTransfer(
                  (__int64)&CallbackContext,
                  (unsigned __int8 *)word_14002351A,
                  &ActivityId,
                  0i64,
                  6u,
                  v29);
              }
            }
          }
LABEL_4:
          if( v5 >= 0 )
            goto LABEL_5;
        }
      }
    }
  }
  if( v5 != -1073740541 && (unsigned int)CallbackContext > 2 )
  {
    if( *(_QWORD *)(v2 + 24) )
      v6 = (__int64 *)(v2 + 16);
    v31 = 2i64;
    v30 = &v33;
    v32 = (__int64 *)v6[1];
    v33 = *(unsigned __int16 *)v6;
    p_updated = &updated;
    updated = v5;
    v35[0] = 4i64;
    tlgWriteTransfer_EtwWriteTransfer(
      (__int64)&CallbackContext,
      (unsigned __int8 *)&dword_14002349C,
      &ActivityId,
      0i64,
      5u,
      v29);
  }
LABEL_5:
  VrpCleanupBufferParameter(v7, &BufferUsed);
  VrpCleanupBufferParameter(v7, &SuspectBuffer);
  return(unsigned int)v5;
}

Referenced by:

VrpRegistryCallback