CmDumpKey
NTSTATUS __stdcall CmDumpKey(_CM_KEY_BODY *KeyBody, PVOID FileHandle){
KPROCESSOR_MODE v2;
KPROCESSOR_MODE v3;
_CM_KEY_CONTROL_BLOCK *KeyControlBlock;
char v7;
NTSTATUS v8;
INT64 v9;
_HHIVE *KeyHive;
CMP_OFFSET_ARRAY *v11;
unsigned int v12;
UINT64 v13;
_HHIVE *v14;
HANDLE FileHandlea;
UINT64 FileLength;
INT64 v18;
UINT64 v19;
v3 = v2;
LODWORD(v19) = 0;
LODWORD(v18) = 0;
FileLength = 0i64;
CmpLockRegistry();
KeyControlBlock = KeyBody->KeyControlBlock;
v7 = 1;
if( KeyControlBlock->KeyHash.KeyHive == (_HHIVE *)CmpMasterHive )
{
v8 = -1073741790;
LABEL_23:
CmpUnlockRegistry();
return v8;
}
ExAcquirePushLockSharedEx((UINT64)&KeyControlBlock->KcbPushlock, 0i64);
_InterlockedAdd((volatile signed __int32 *)&KeyControlBlock->56, 1u);
v8 = CmpPerformKeyBodyDeletionCheck((__int64)KeyBody, 0i64);
if( v8 < 0 )
{
LABEL_22:
CmpUnlockKcb((UINT64)KeyControlBlock);
goto LABEL_23;
}
if( (*((_DWORD *)KeyControlBlock + 46) & 0x40000) == 0 )
{
v8 = -1073741811;
goto LABEL_22;
}
if( KeyControlBlock->LayerHeight )
{
CmpUnlockKcb((UINT64)KeyControlBlock);
CmpUnlockRegistry();
return CmSaveKey((__int64)KeyBody, (__int64)FileHandle, 5, v3);
}
else
{
ExAcquirePushLockExclusiveEx((UINT64)&KeyControlBlock->KeyHash.KeyHive->FlusherLock, 0i64);
ExAcquirePushLockSharedEx((UINT64)&KeyControlBlock->KeyHash.KeyHive[1].ViewMap.ProcessTuple, 0i64);
LOBYTE(v9) = v3;
LODWORD(FileHandlea) = 3;
v8 = CmpDoAccessCheckOnSubtree(
(INT64)KeyControlBlock->KeyHash.KeyHive,
KeyControlBlock->KeyHash.KeyCell,
v9,
131097i64,
(INT64)FileHandlea);
ExReleasePushLockEx((UINT64)&KeyControlBlock->KeyHash.KeyHive[1].ViewMap.ProcessTuple, 0i64);
if( v8 < 0 )
goto LABEL_19;
v8 = HvSnapshotHiveToOffsetArray((INT64)KeyControlBlock->KeyHash.KeyHive, &v18, (CHAR **)&FileLength, &v19);
if( v8 < 0 )
{
v12 = v18;
v11 = (CMP_OFFSET_ARRAY *)FileLength;
}
else
{
KeyHive = KeyControlBlock->KeyHash.KeyHive;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&KeyHive->FlusherLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&KeyHive->FlusherLock);
KeAbPostRelease(&KeyHive->FlusherLock);
CmpUnlockKcb((UINT64)KeyControlBlock);
CmpUnlockRegistry();
v11 = (CMP_OFFSET_ARRAY *)FileLength;
v7 = 0;
v12 = v18;
v8 = CmpWriteOffsetArrayToFile(v13, (CMP_OFFSET_ARRAY *)(unsigned int)v18, FileLength, (PVOID)(unsigned int)v19);
if( v8 >= 0 )
v8 = 0;
}
if( v11 )
CmpFreeOffsetArray(v12, v11);
if( v7 )
{
LABEL_19:
v14 = KeyControlBlock->KeyHash.KeyHive;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&v14->FlusherLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&v14->FlusherLock);
KeAbPostRelease(&v14->FlusherLock);
goto LABEL_22;
}
}
return v8;
}Referenced by:
NtSaveKeyEx