NtFlushKey
NTSTATUS __stdcall NtFlushKey(PVOID KeyHandle){
_DMA_OPERATIONS *DmaOperations;
char v3;
_ETHREAD *CurrentThread;
bool v5;
INT8 v6;
PVOID *v7;
_ETHREAD *v8;
bool v9;
NTSTATUS v10;
_ETHREAD *v11;
PADAPTER_OBJECT v12;
int v13;
_DMA_OPERATIONS *v14;
UINT64 v15;
struct _EX_RUNDOWN_REF *v16;
struct _EX_RUNDOWN_REF *v17;
EVENT_DESCRIPTOR *v18;
PADAPTER_OBJECT v19;
PADAPTER_OBJECT DmaAdapter;
INT64 a6[2];
SLIST_ENTRY *Argument[2];
__int128 v24;
KAPC_STATE ApcState;
LARGE_INTEGER v26[2];
__int128 v27;
DmaOperations = 0i64;
*(_OWORD *)Argument = 0i64;
v24 = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
*(_OWORD *)&v26[0].LowPart = 0i64;
v27 = 0i64;
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
EtwGetKernelTraceTimestamp(v26, 0x20000ui64);
DmaAdapter = 0i64;
a6[1] = (INT64)a6;
v3 = 0;
a6[0] = (INT64)a6;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v5 = ExAcquireRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
v8 = (_ETHREAD *)KeGetCurrentThread();
v9 = v5;
if( !v5 )
{
KeLeaveCriticalRegionThread((__int64)v8);
v10 = -1073741431;
goto LABEL_21;
}
LOBYTE(v7) = *((_BYTE *)v8 + 562);
v10 = CmObReferenceObjectByHandle(KeyHandle, 0i64, v6, v7, (OBJECT_HANDLE_INFORMATION *)&DmaAdapter);
if( v10 >= 0 )
{
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) && DmaAdapter )
DmaOperations = DmaAdapter->DmaOperations;
v11 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v11 + 242);
v12 = DmaAdapter;
if( CmpCallBackCount && !ExIsResourceAcquiredSharedLite((PERESOURCE)&CmpRegistryLock) )
{
Argument[0] = (SLIST_ENTRY *)v12;
v13 = CmpCallCallBacksEx(RegNtPreFlushKey, Argument, 0i64, 1, RegNtPostFlushKey, (INT64)v12, (INT64)a6);
v10 = v13;
if( v13 < 0 )
{
if( v13 == -1073740541 )
v10 = 0;
goto LABEL_18;
}
v3 = 1;
}
CmpLockRegistryFreezeAware(0);
v14 = v12->DmaOperations;
ExAcquirePushLockSharedEx((UINT64)&v14->FreeAdapterChannel, 0i64);
_InterlockedIncrement((volatile signed __int32 *)&v14->FreeMapRegisters);
v10 = CmpPerformKeyBodyDeletionCheck((__int64)DmaAdapter, 0i64);
if( v10 >= 0 )
{
v15 = (UINT64)v12->DmaOperations;
v16 = *(struct _EX_RUNDOWN_REF **)(v15 + 32);
if( v16 == (struct _EX_RUNDOWN_REF *)CmpMasterHive )
{
CmpUnlockKcb(v15);
CmpUnlockRegistry();
CmpAttachToRegistryProcess(&ApcState);
CmpDoFlushAll(0i64);
KiUnstackDetachProcess(&ApcState, 0i64);
v10 = 0;
goto LABEL_16;
}
v17 = v16 + 204;
if( ExAcquireRundownProtection(v16 + 204) )
{
CmpUnlockKcb((UINT64)v12->DmaOperations);
CmpUnlockRegistry();
CmpAttachToRegistryProcess(&ApcState);
v10 = CmpFlushHive((ULONG_PTR)v16, 0, v18);
if( v10 < 0 )
v10 = -1073741491;
KiUnstackDetachProcess(&ApcState, 0i64);
ExReleaseRundownProtection(v17);
goto LABEL_16;
}
v10 = -1073740763;
}
CmpUnlockKcb((UINT64)v12->DmaOperations);
CmpUnlockRegistry();
LABEL_16:
if( v3 )
v10 = CmPostCallbackNotificationEx(
RegNtPostFlushKey,
(SLIST_ENTRY *)DmaAdapter,
(unsigned int)v10,
(INT64)Argument,
0i64,
(INT64)a6);
LABEL_18:
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
v19 = DmaAdapter;
if( DmaAdapter )
HalPutDmaAdapter(DmaAdapter);
LABEL_21:
if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
{
LOBYTE(v19) = 21;
(*(void(__fastcall **)(PADAPTER_OBJECT, LARGE_INTEGER *, _QWORD, _QWORD, _DMA_OPERATIONS *, _QWORD))((char *)&NlsMbCodePageTag + 7))(
v19,
v26,
(unsigned int)v10,
0i64,
DmaOperations,
0i64);
}
if( v9 )
{
ExReleaseRundownProtection((PEX_RUNDOWN_REF)&CmpShutdownRundown);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}
return v10;
}Referenced by:
ExpWatchProductTypeWork