NtCompressKey
NTSTATUS __stdcall NtCompressKey(VOID *Key){
NTSTATUS v2;
char PreviousMode;
INT8 v4;
PVOID *v5;
int v6;
_ETHREAD *CurrentThread;
CM_KEY_BODY *v8;
_CM_KEY_CONTROL_BLOCK *KeyControlBlock;
_HHIVE *KeyHive;
_HIVE_WRITE_WAIT_QUEUE *p_Display;
UINT64 v12;
PADAPTER_OBJECT DmaAdapter;
_KAPC_STATE ApcState;
DmaAdapter = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
v2 = CmCheckNoTxContext();
if( v2 >= 0 )
{
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( SeSinglePrivilegeCheck(*(_QWORD *)&SeBackupPrivilege, PreviousMode) )
{
LOBYTE(v5) = PreviousMode;
v6 = (unsigned __int8)Key & 3;
v2 = CmObReferenceObjectByHandle(Key, 0x20006ui64, v4, v5, (OBJECT_HANDLE_INFORMATION *)&DmaAdapter);
if( v2 >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
if( ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132) )
{
v8 = (CM_KEY_BODY *)DmaAdapter;
while( 1 )
{
CmpLockRegistryExclusive();
v2 = CmpPerformKeyBodyDeletionCheck(v8, 0i64);
if( v2 < 0 )
break;
KeyControlBlock = v8->KeyControlBlock;
KeyHive = KeyControlBlock->KeyHash.KeyHive;
if( KeyControlBlock->KeyHash.KeyCell != KeyHive->BaseBlock->RootCell )
{
v2 = -1073741811;
break;
}
p_Display = (_HIVE_WRITE_WAIT_QUEUE *)&KeyHive[2].Storage[1].FreeDisplay[10];
if( !PoIsInitializedStopWatch(&KeyHive[2].Storage[1].FreeDisplay[10].RealVectorSize) )
{
p_Display = (_HIVE_WRITE_WAIT_QUEUE *)&KeyHive[2].Storage[1].FreeDisplay[9].Display;
if( !PoIsInitializedStopWatch(&KeyHive[2].Storage[1].FreeDisplay[9].Display.SizeOfBitMap) )
{
CmpAttachToRegistryProcess(&ApcState);
v2 = CmCompressKey(v8->KeyControlBlock->KeyHash.KeyHive, v6);
KiUnstackDetachProcess(&ApcState, 0i64);
break;
}
}
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&KeyHive->FlusherLock, 0i64);
CmpWaitOnHiveWriteQueue((_CMHIVE *)KeyHive, p_Display, v12);
}
CmpUnlockRegistry();
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
else
{
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v2 = -1073741431;
}
}
if( DmaAdapter )
HalPutDmaAdapter(DmaAdapter);
}
else
{
return -1073741727;
}
}
return v2;
}Referenced by:
No references.