CmDumpKey

__int64 __fastcall CmDumpKey(__int64 a1, __int64 rdx0, char r8_0){
  __int64 v6; 
  char v7; 
  int v8; 
  INT64 v9; 
  _EX_PUSH_LOCK *v10; 
  UINT8 *v11; 
  unsigned int v12; 
  __int64 v13; 
  _EX_PUSH_LOCK *v14; 
  VOID *FileHandle; 
  VOID *FileHandlea; 
  UINT8 *a3; 
  INT64 a2; 
  UINT64 a4; 

  LODWORD(a4) = 0;
  LODWORD(a2) = 0;
  a3 = 0i64;
  CmpLockRegistry();
  v6 = *(_QWORD *)(a1 + 8);
  v7 = 1;
  if( *(_QWORD *)(v6 + 32) == *(_QWORD *)&CmpMasterHive )
  {
    v8 = -1073741790;
LABEL_23:
    CmpUnlockRegistry();
    return(unsigned int)v8;
  }
  ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(v6 + 48), 0i64);
  _InterlockedAdd((volatile signed __int32 *)(v6 + 56), 1u);
  v8 = CmpPerformKeyBodyDeletionCheck((CM_KEY_BODY *)a1, 0i64);
  if( v8 < 0 )
  {
LABEL_22:
    CmpUnlockKcb((_CM_KEY_CONTROL_BLOCK *)v6);
    goto LABEL_23;
  }
  if( (*(_DWORD *)(v6 + 184) & 0x40000) == 0 )
  {
    v8 = -1073741811;
    goto LABEL_22;
  }
  if( *(_WORD *)(v6 + 66) )
  {
    CmpUnlockKcb((_CM_KEY_CONTROL_BLOCK *)v6);
    CmpUnlockRegistry();
    return(unsigned int)CmSaveKey((CM_KEY_BODY *)a1, (PVOID)rdx0, 5ui64);
  }
  else
  {
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(*(_QWORD *)(v6 + 32) + 72i64), 0i64);
    ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(*(_QWORD *)(v6 + 32) + 1776i64), 0i64);
    LOBYTE(v9) = r8_0;
    LODWORD(FileHandle) = 3;
    v8 = CmpDoAccessCheckOnSubtree(*(_QWORD *)(v6 + 32), *(unsigned int *)(v6 + 40), v9, 131097i64, (INT64)FileHandle);
    ExReleasePushLockEx(*(_QWORD *)(v6 + 32) + 1776, 0);
    if( v8 < 0 )
      goto LABEL_19;
    v8 = HvSnapshotHiveToOffsetArray(*(_HHIVE **)(v6 + 32), &a2, &a3, &a4);
    if( v8 < 0 )
    {
      v12 = a2;
      v11 = a3;
    }
    else
    {
      v10 = *(_EX_PUSH_LOCK **)(v6 + 32);
      if( (_InterlockedExchangeAdd64(&v10[9]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v10 + 9);
      KeAbPostRelease(&v10[9]);
      CmpUnlockKcb((_CM_KEY_CONTROL_BLOCK *)v6);
      CmpUnlockRegistry();
      v11 = a3;
      v7 = 0;
      FileHandlea = (VOID *)rdx0;
      v12 = a2;
      v8 = CmpWriteOffsetArrayToFile(v13, a2, (__int64)a3, a4, FileHandlea);
      if( v8 >= 0 )
        v8 = 0;
    }
    if( v11 )
      CmpFreeOffsetArray(v12, (PVOID *)v11);
    if( v7 )
    {
LABEL_19:
      v14 = *(_EX_PUSH_LOCK **)(v6 + 32);
      if( (_InterlockedExchangeAdd64(&v14[9]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v14 + 9);
      KeAbPostRelease(&v14[9]);
      goto LABEL_22;
    }
  }
  return(unsigned int)v8;
}

Referenced by:

NtSaveKeyEx