NtDeleteKey
NTSTATUS __stdcall NtDeleteKey(PVOID Handle){
__int64 v1;
char v3;
char v4;
char v5;
char v6;
_ETHREAD *CurrentThread;
INT8 v8;
PVOID *v9;
_DMA_OPERATIONS *v10;
NTSTATUS v11;
PADAPTER_OBJECT v12;
_ETHREAD *v13;
unsigned int(__fastcall *GetDmaAlignment)(_DMA_ADAPTER *);
INT8 v16;
PVOID *v17;
NTSTATUS v18;
int v19;
GUID *p_TransactionId;
bool v21;
PADAPTER_OBJECT DmaAdapter;
int v23;
__int64 v24;
_DMA_OPERATIONS *DmaOperations;
_CM_TRANS *CmTrans;
INT64 a6[2];
struct _SECURITY_SUBJECT_CONTEXT SubjectContext;
SLIST_ENTRY *Argument[2];
__int128 v30;
GUID TransactionId;
LARGE_INTEGER v32[2];
__int128 v33;
v1 = 0i64;
v24 = 0i64;
DmaOperations = 0i64;
v3 = 0;
v23 = 0;
*(_OWORD *)Argument = 0i64;
CmTrans = 0i64;
v30 = 0i64;
*(_OWORD *)&v32[0].LowPart = 0i64;
v33 = 0i64;
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
EtwGetKernelTraceTimestamp(v32, 0x20000ui64);
DmaAdapter = 0i64;
a6[1] = (INT64)a6;
v4 = 0;
a6[0] = (INT64)a6;
v5 = 0;
memset(&SubjectContext, 0, sizeof(SubjectContext));
v6 = *((_BYTE *)KeGetCurrentThread() + 562);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v21 = ExAcquireRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
if( !v21 )
{
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v11 = -1073741431;
goto LABEL_32;
}
LOBYTE(v9) = v6;
v11 = CmObReferenceObjectByHandle(Handle, 0x10000ui64, v8, v9, (OBJECT_HANDLE_INFORMATION *)&DmaAdapter);
if( v11 == -1073741790 )
{
SeCaptureSubjectContext(&SubjectContext);
if( !CmDoVirtualTest((UINT64 *)&SubjectContext) )
{
v11 = -1073741790;
v12 = DmaAdapter;
goto LABEL_40;
}
LOBYTE(v17) = v6;
v18 = CmObReferenceObjectByHandle(Handle, 0x20019ui64, v16, v17, (OBJECT_HANDLE_INFORMATION *)&DmaAdapter);
v12 = DmaAdapter;
v11 = v18;
if( v18 < 0 )
goto LABEL_40;
if( !CmKeyBodyNeedsVirtualImage((__int64)DmaAdapter) )
{
v11 = -1073741790;
goto LABEL_40;
}
v3 = 1;
}
else
{
v12 = DmaAdapter;
}
if( v11 >= 0 )
{
v13 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v13 + 242);
v12 = DmaAdapter;
v11 = 0;
v5 = 1;
if( CmpCallBackCount && !ExIsResourceAcquiredSharedLite((PERESOURCE)&CmpRegistryLock) )
{
Argument[0] = (SLIST_ENTRY *)v12;
v11 = CmpCallCallBacksEx(RegNtDeleteKey, Argument, 0i64, 1, RegNtPostDeleteKey, (INT64)v12, (INT64)a6);
if( v11 < 0 )
{
if( v11 == -1073740541 )
v11 = 0;
goto LABEL_24;
}
v4 = 1;
v11 = 0;
}
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) && v12 )
DmaOperations = v12->DmaOperations;
ExAcquirePushLockSharedEx((UINT64)&ExpKeyManipLock, 0i64);
if( ExpControlKey && v12->DmaOperations == ExpControlKey->DmaOperations
|| ::DmaAdapter && v12->DmaOperations == ::DmaAdapter->DmaOperations )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)&ExpKeyManipLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&ExpKeyManipLock);
KeAbPostRelease(&ExpKeyManipLock);
v12 = DmaAdapter;
}
else
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)&ExpKeyManipLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&ExpKeyManipLock);
KeAbPostRelease(&ExpKeyManipLock);
v12 = DmaAdapter;
v10 = DmaAdapter->DmaOperations;
if( (LODWORD(v10->PutDmaAdapter) & 0x80u) != 0 )
goto LABEL_55;
GetDmaAlignment = v10->GetDmaAlignment;
if( GetDmaAlignment )
{
if( (*((_DWORD *)GetDmaAlignment + 2) & 0x80u) != 0 )
goto LABEL_55;
}
if( !v3 )
goto LABEL_22;
v19 = CmKeyBodyRemapToVirtual((__int64 *)&DmaAdapter, v6, 0x10000u, (__int64)&SubjectContext, &v23);
v12 = DmaAdapter;
v11 = v19;
if( v19 < 0 )
goto LABEL_24;
if( CmpVEEnabled && ((__int64)DmaAdapter->DmaOperations->MapTransferEx & 0x1000000) != 0 )
{
LABEL_22:
v11 = CmDeleteKey(v12);
if( v11 >= 0 && (v24 & 4) != 0 )
{
if( v12[3].DmaOperations || *(_QWORD *)&v12[4].Version )
{
CmpLockRegistry();
CmpTransSearchAddTransFromKeyBody((_CM_KEY_BODY *)v12, &CmTrans);
TransactionId = CmTrans->KtmUow;
CmpUnlockRegistry();
p_TransactionId = &TransactionId;
}
else
{
p_TransactionId = 0i64;
}
SeDeleteObjectAuditAlarmWithTransaction(v12, Handle, p_TransactionId);
}
}
else
{
LABEL_55:
v11 = -1073741790;
}
}
}
LABEL_24:
if( v3 )
LABEL_40:
SeReleaseSubjectContext(&SubjectContext);
if( v4 )
v11 = CmPostCallbackNotificationEx(
RegNtPostDeleteKey,
(SLIST_ENTRY *)v12,
(unsigned int)v11,
(INT64)Argument,
0i64,
(INT64)a6);
if( v5 )
{
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v12 = DmaAdapter;
}
if( v12 )
HalPutDmaAdapter(v12);
v1 = (__int64)DmaOperations;
LABEL_32:
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
LOBYTE(v10) = 12;
(*(void(__fastcall **)(_DMA_OPERATIONS *, LARGE_INTEGER *, _QWORD, _QWORD, __int64, _QWORD))((char *)&NlsMbCodePageTag
+ 7))(
v10,
v32,
(unsigned int)v11,
0i64,
v1,
0i64);
}
if( v21 )
{
ExReleaseRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
return v11;
}Referenced by:
No references.