VrpPostQueryKey

NTSTATUS __stdcall VrpPostQueryKey(_REG_POST_OPERATION_INFORMATION *PostInfo, _VRP_JOB_CONTEXT *JobContext){
  _QWORD *ObjectContext; 
  VOID **PreInformation; 
  INT8 PreviousMode; 
  __int64 v6; 
  int Status; 
  __int64 *v8; 
  INT8 v9; 
  unsigned int v10; 
  VOID **v11; 
  unsigned int v13; 
  NTSTATUS v14; 
  NTSTATUS v15; 
  __int64 *v16; 
  bool v17; 
  __int64 *v18; 
  UINT64 KeyFlags; 
  NTSTATUS updated; 
  unsigned int v21; 
  PVOID BufferUsed; 
  PVOID SuspectBuffer; 
  _REG_POST_OPERATION_INFORMATION *v24; 
  _LPGUID ActivityId[4]; 
  _EVENT_DATA_DESCRIPTOR v26[2]; 
  __int64 *v27; 
  __int64 v28; 
  __int64 *v29; 
  __int64 v30; 
  int *p_updated; 
  __int64 v32[3]; 

  v24 = PostInfo;
  *(_OWORD *)ActivityId = 0i64;
  EtwActivityIdControl(3ui64, (_GUID *)ActivityId);
  ObjectContext = PostInfo->ObjectContext;
  PreInformation = (VOID **)PostInfo->PreInformation;
  BufferUsed = 0i64;
  PreviousMode = ExGetPreviousMode();
  Status = PostInfo->Status;
  v8 = &EmptyUnicodeString;
  SuspectBuffer = 0i64;
  v9 = PreviousMode;
  if( Status < 0 && Status != -1073741789 && Status != -2147483643 )
    goto LABEL_4;
  v10 = *((_DWORD *)PreInformation + 2);
  if( v10 > 8 )
    goto LABEL_4;
  v6 = 283i64;
  if( !_bittest((const int *)&v6, v10) )
    goto LABEL_4;
  if( *(&stru_140C00F40 + 1162) > 5u )
  {
    v16 = ObjectContext + 2;
    v21 = *((_DWORD *)PreInformation + 2);
    v28 = 4i64;
    v27 = (__int64 *)&v21;
    if( !ObjectContext[3] )
      v16 = &EmptyUnicodeString;
    v30 = 2i64;
    v29 = v32;
    p_updated = (int *)v16[1];
    v32[0] = *(unsigned __int16 *)v16;
    tlgWriteTransfer_EtwWriteTransfer(
      (__int64)&stru_140C00F40 + 4648,
      (unsigned __int8 *)&word_14002345E,
      (const _GUID *)ActivityId,
      0i64,
      5u,
      v26);
  }
  if( (*((_DWORD *)ObjectContext + 9) & 0x20000000) == 0 )
  {
    v13 = *((_DWORD *)PreInformation + 2);
    if( v13 != 3 && v13 != 8 )
      goto LABEL_4;
  }
  Status = VrpProcessBufferParameter(v9, PreInformation[2], *((unsigned int *)PreInformation + 6), &BufferUsed);
  if( Status >= 0 )
  {
    Status = VrpOutputBufferParameter(v9, BufferUsed, *((unsigned int *)PreInformation + 6), PreInformation + 2);
    if( Status >= 0 )
    {
      Status = VrpProcessBufferParameter(v9, PreInformation[4], 4ui64, &SuspectBuffer);
      if( Status >= 0 )
      {
        Status = VrpOutputBufferParameter(v9, SuspectBuffer, 4ui64, PreInformation + 4);
        if( Status >= 0 )
        {
          LODWORD(KeyFlags) = *((_DWORD *)ObjectContext + 9);
          updated = VrpUpdateKeyInformation(
                      *((_KEY_INFORMATION_CLASS *)PreInformation + 2),
                      BufferUsed,
                      *((unsigned int *)PreInformation + 6),
                      (UINT64 *)SuspectBuffer,
                      (_UNICODE_STRING *)ObjectContext + 1,
                      KeyFlags);
          Status = updated;
          if( updated >= 0 || updated == -2147483643 || updated == -1073741789 )
          {
            v14 = VrpOutputBufferParameter(v9, PreInformation[2], *((unsigned int *)PreInformation + 6), &BufferUsed);
            if( v14 < 0 )
            {
              Status = v14;
            }
            else
            {
              v15 = VrpOutputBufferParameter(v9, PreInformation[4], 4ui64, &SuspectBuffer);
              if( v15 < 0 )
              {
                Status = v15;
              }
              else
              {
                v24->ReturnStatus = updated;
                Status = -1073740541;
                if( *(&stru_140C00F40 + 1162) <= 5u )
                  goto LABEL_5;
                v17 = ObjectContext[3] == 0i64;
                v18 = &EmptyUnicodeString;
                v28 = 2i64;
                if( !v17 )
                  v18 = ObjectContext + 2;
                v32[0] = 4i64;
                v27 = &v30;
                v32[2] = 4i64;
                v29 = (__int64 *)v18[1];
                v30 = *(unsigned __int16 *)v18;
                v21 = *((_DWORD *)PreInformation + 2);
                p_updated = (int *)&v21;
                v32[1] = (__int64)&updated;
                tlgWriteTransfer_EtwWriteTransfer(
                  (__int64)&stru_140C00F40 + 4648,
                  (unsigned __int8 *)word_14002351A,
                  (const _GUID *)ActivityId,
                  0i64,
                  6u,
                  v26);
              }
            }
          }
LABEL_4:
          if( Status >= 0 )
            goto LABEL_5;
        }
      }
    }
  }
  if( Status != -1073740541 && *(&stru_140C00F40 + 1162) > 2u )
  {
    if( ObjectContext[3] )
      v8 = ObjectContext + 2;
    v28 = 2i64;
    v27 = &v30;
    v29 = (__int64 *)v8[1];
    v30 = *(unsigned __int16 *)v8;
    p_updated = &updated;
    updated = Status;
    v32[0] = 4i64;
    tlgWriteTransfer_EtwWriteTransfer(
      (__int64)&stru_140C00F40 + 4648,
      (unsigned __int8 *)&dword_14002349C,
      (const _GUID *)ActivityId,
      0i64,
      5u,
      v26);
  }
LABEL_5:
  LOBYTE(v6) = v9;
  VrpCleanupBufferParameter((VOID **)v6, &BufferUsed);
  LOBYTE(v11) = v9;
  VrpCleanupBufferParameter(v11, &SuspectBuffer);
  return Status;
}

Referenced by:

VrpRegistryCallback