NtRenameKey

NTSTATUS __stdcall NtRenameKey(PVOID KeyHandle, _UNICODE_STRING *NewName){
  char v3; 
  unsigned int v4; 
  char v5; 
  char v6; 
  _ETHREAD *CurrentThread; 
  bool v8; 
  NTSTATUS v9; 
  char v10; 
  int v11; 
  wchar_t *Buffer; 
  unsigned __int64 v13; 
  unsigned __int16 v14; 
  PPRIVILEGE_SET v15; 
  INT64 v16; 
  INT8 v17; 
  PVOID *v18; 
  unsigned int v19; 
  PVOID v20; 
  INT8 v21; 
  PVOID *v22; 
  _ETHREAD *v23; 
  int v24; 
  NTSTATUS v26; 
  bool v27; 
  PADAPTER_OBJECT DmaAdapter[2]; 
  void *Src[2]; 
  int v30; 
  PPRIVILEGE_SET Privileges; 
  __int64 a6[2]; 
  PVOID Handle; 
  __int128 v34; 
  struct _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  SLIST_ENTRY *Argument[2]; 
  __int128 v37; 
  __int64 v38; 
  _UNICODE_STRING NewKeyName; 
  KAPC_STATE ApcState; 
  Handle = KeyHandle;
  *(_OWORD *)Src = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  v3 = 0;
  DmaAdapter[0] = 0i64;
  Privileges = 0i64;
  v4 = *((char *)KeGetCurrentThread() + 562);
  v5 = 0;
  *(_OWORD *)Argument = 0i64;
  v37 = 0i64;
  v38 = 0i64;
  a6[1] = (__int64)a6;
  a6[0] = (__int64)a6;
  v30 = 0;
  v6 = 0;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v8 = ExAcquireRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
  v27 = v8;
  if( !v8 )
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( !v8 )
  {
    v9 = -1073741431;
    v26 = -1073741431;
    v10 = 0;
    goto LABEL_45;
  }
  if( (_BYTE)v4 == 1 )
  {
    v34 = 0i64;
    if( (unsigned __int64)NewName >= 0x7FFFFFFF0000i64 )
      NewName = (_UNICODE_STRING *)0x7FFFFFFF0000i64;
    v11 = *(_DWORD *)&NewName->Length;
    LODWORD(v34) = v11;
    Buffer = NewName->Buffer;
    *((_QWORD *)&v34 + 1) = Buffer;
    *(_OWORD *)Src = v34;
    if( (_WORD)v11 )
    {
      if( ((unsigned __int8)Buffer & 1) != 0 )
        ExRaiseDatatypeMisalignment();
      v13 = (unsigned __int64)Buffer + (unsigned __int16)v11;
      if( v13 > 0x7FFFFFFF0000i64 || v13 < (unsigned __int64)Buffer )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
  }
  else
  {
    *(_UNICODE_STRING *)Src = *NewName;
  }
  v14 = (unsigned __int16)Src[0];
  if( (unsigned __int16)(LOWORD(Src[0]) - 1) > 0x1FFu || ((__int64)Src[0] & 1) != 0 )
  {
    v9 = -1073741811;
    v26 = -1073741811;
    v10 = 0;
    goto LABEL_45;
  }
  v15 = (PPRIVILEGE_SET)Src[1];
  if( CmpDoesBufferRequireCapturing(v4, Src[1]) )
  {
    Privileges = (PPRIVILEGE_SET)CmpAllocateTransientPoolWithQuotaTag(v16, LOWORD(Src[0]), 0x426E4D43ui64);
    if( !Privileges )
    {
      v9 = -1073741670;
      v26 = -1073741670;
      v10 = 0;
      goto LABEL_45;
    }
    v15 = Privileges;
    memmove((UINT8 *)Privileges, (UINT8 *)Src[1], LOWORD(Src[0]));
    Src[1] = Privileges;
    v14 = (unsigned __int16)Src[0];
    WORD1(Src[0]) = Src[0];
  }
  v19 = 0;
  if( v14 >> 1 )
  {
    while( LOWORD(v15->PrivilegeCount) != 92 )
    {
      ++v19;
      v15 = (PPRIVILEGE_SET)((char *)v15 + 2);
      if( v19 >= v14 >> 1 )
        goto LABEL_24;
    }
    v9 = -1073741811;
    goto LABEL_28;
  }
LABEL_24:
  LOBYTE(v18) = v4;
  v20 = Handle;
  v9 = CmObReferenceObjectByHandle(Handle, 0x20006ui64, v17, v18, (OBJECT_HANDLE_INFORMATION *)DmaAdapter);
  v26 = v9;
  if( v9 == -1073741790 )
  {
    SeCaptureSubjectContext(&SubjectContext);
    v6 = 1;
    if( !CmDoVirtualTest((UINT64 *)&SubjectContext) )
      goto LABEL_26;
    LOBYTE(v22) = v4;
    v9 = CmObReferenceObjectByHandle(v20, 0x20019ui64, v21, v22, (OBJECT_HANDLE_INFORMATION *)DmaAdapter);
    v26 = v9;
    if( v9 < 0 )
      goto LABEL_29;
    if( !CmKeyBodyNeedsVirtualImage((__int64)DmaAdapter[0]) )
    {
LABEL_26:
      v9 = -1073741790;
LABEL_28:
      v26 = v9;
LABEL_29:
      v10 = 0;
      goto LABEL_45;
    }
    v5 = 1;
  }
  v6 = v5;
  if( v9 < 0 )
    goto LABEL_29;
  v23 = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)v23 + 242);
  v10 = 1;
  if( CmpCallBackCount && !ExIsResourceAcquiredSharedLite((PERESOURCE)&CmpRegistryLock) )
  {
    Argument[0] = (SLIST_ENTRY *)DmaAdapter[0];
    Argument[1] = (SLIST_ENTRY *)Src;
    v24 = CmpCallCallBacksEx(RegNtRenameKey, Argument, 0i64, 1, RegNtPostRenameKey, (INT64)DmaAdapter[0], (INT64)a6);
    v9 = v24;
    if( v24 < 0 )
    {
      if( v24 == -1073740541 )
        v9 = 0;
      v26 = v9;
      goto LABEL_45;
    }
    v3 = 1;
  }
  if( !v5
    || (v9 = CmKeyBodyReplicateToVirtual((__int64 *)DmaAdapter, v4, 0x20006u, (__int64 *)&SubjectContext),
        v26 = v9,
        v9 >= 0) )
  {
    CmpAttachToRegistryProcess(&ApcState);
    NewKeyName = *(_UNICODE_STRING *)Src;
    v9 = CmRenameKey((_CM_KEY_BODY *)DmaAdapter[0], &NewKeyName, v4);
    v26 = v9;
    KiUnstackDetachProcess(&ApcState, 0i64);
    v6 = v5;
  }
LABEL_45:
  if( v6 )
    SeReleaseSubjectContext(&SubjectContext);
  if( v3 )
  {
    v9 = CmPostCallbackNotificationEx(
           RegNtPostRenameKey,
           (SLIST_ENTRY *)DmaAdapter[0],
           (unsigned int)v9,
           (INT64)Argument,
           0i64,
           (INT64)a6);
    v26 = v9;
  }
  if( v10 )
  {
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    v9 = v26;
  }
  if( DmaAdapter[0] )
    HalPutDmaAdapter(DmaAdapter[0]);
  if( Privileges )
    CmSiFreeMemory(Privileges);
  if( v27 )
  {
    ExReleaseRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    return v26;
  }
  return v9;
}

Referenced by:

No references.