NtFlushKey

NTSTATUS __stdcall NtFlushKey(VOID *KeyHandle){
  _DMA_OPERATIONS *DmaOperations; 
  char v3; 
  _ETHREAD *CurrentThread; 
  UINT8 v5; 
  INT8 v6; 
  PVOID *v7; 
  _ETHREAD *v8; 
  UINT8 v9; 
  INT64 v10; 
  NTSTATUS v11; 
  INT64 v12; 
  _ETHREAD *v13; 
  PADAPTER_OBJECT v14; 
  int v15; 
  _DMA_OPERATIONS *v16; 
  _CM_KEY_CONTROL_BLOCK *v17; 
  CMHIVE *KeyHive; 
  _EX_RUNDOWN_REF *p_HiveRundown; 
  PADAPTER_OBJECT v20; 
  PADAPTER_OBJECT DmaAdapter; 
  INT64 a6[2]; 
  _SLIST_ENTRY *Argument[2]; 
  __int128 v25; 
  _KAPC_STATE ApcState; 
  _LARGE_INTEGER TimeStamp[2]; 
  __int128 v28; 

  DmaOperations = 0i64;
  *(_OWORD *)Argument = 0i64;
  v25 = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  *(_OWORD *)&TimeStamp[0].anonymous_0.LowPart = 0i64;
  v28 = 0i64;
  if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
    EtwGetKernelTraceTimestamp(TimeStamp, 0x20000ui64);
  DmaAdapter = 0i64;
  a6[1] = (INT64)a6;
  v3 = 0;
  a6[0] = (INT64)a6;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v5 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
  v8 = (_ETHREAD *)KeGetCurrentThread();
  v9 = v5;
  if( !v5 )
  {
    KeLeaveCriticalRegionThread(&v8->Tcb);
    v11 = -1073741431;
    goto LABEL_21;
  }
  LOBYTE(v7) = v8->Tcb.PreviousMode;
  v11 = CmObReferenceObjectByHandle(KeyHandle, 0i64, v6, v7, (OBJECT_HANDLE_INFORMATION *)&DmaAdapter);
  if( v11 >= 0 )
  {
    if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) && DmaAdapter )
      DmaOperations = DmaAdapter->AdapterObject.DmaHeader.DmaOperations;
    v13 = (_ETHREAD *)KeGetCurrentThread();
    --v13->Tcb.KernelApcDisable;
    v14 = DmaAdapter;
    if( dword_140C5083C && !ExIsResourceAcquiredSharedLite((UINT64)&CmpRegistryLock, v10, v12) )
    {
      Argument[0] = (_SLIST_ENTRY *)v14;
      v15 = CmpCallCallBacksEx(RegNtPreFlushKey, Argument, 0i64, 1, RegNtPostFlushKey, (INT64)v14, (INT64)a6);
      v11 = v15;
      if( v15 < 0 )
      {
        if( v15 == -1073740541 )
          v11 = 0;
        goto LABEL_18;
      }
      v3 = 1;
    }
    CmpLockRegistryFreezeAware(0);
    v16 = v14->AdapterObject.DmaHeader.DmaOperations;
    ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&v16->FreeAdapterChannel, 0i64);
    _InterlockedIncrement((volatile signed __int32 *)&v16->FreeMapRegisters);
    v11 = CmpPerformKeyBodyDeletionCheck((CM_KEY_BODY *)DmaAdapter, 0i64);
    if( v11 >= 0 )
    {
      v17 = (_CM_KEY_CONTROL_BLOCK *)v14->AdapterObject.DmaHeader.DmaOperations;
      KeyHive = (CMHIVE *)v17->KeyHash.KeyHive;
      if( KeyHive == *(CMHIVE **)&CmpMasterHive )
      {
        CmpUnlockKcb(v17);
        CmpUnlockRegistry();
        CmpAttachToRegistryProcess(&ApcState);
        CmpDoFlushAll(0i64);
        KiUnstackDetachProcess(&ApcState, 0i64);
        v11 = 0;
        goto LABEL_16;
      }
      p_HiveRundown = &KeyHive->HiveRundown;
      if( ExAcquireRundownProtection(&KeyHive->HiveRundown) )
      {
        CmpUnlockKcb((_CM_KEY_CONTROL_BLOCK *)v14->AdapterObject.DmaHeader.DmaOperations);
        CmpUnlockRegistry();
        CmpAttachToRegistryProcess(&ApcState);
        v11 = CmpFlushHive(KeyHive, 0i64);
        if( v11 < 0 )
          v11 = -1073741491;
        KiUnstackDetachProcess(&ApcState, 0i64);
        ExReleaseRundownProtection(p_HiveRundown);
        goto LABEL_16;
      }
      v11 = -1073740763;
    }
    CmpUnlockKcb((_CM_KEY_CONTROL_BLOCK *)v14->AdapterObject.DmaHeader.DmaOperations);
    CmpUnlockRegistry();
LABEL_16:
    if( v3 )
      v11 = CmPostCallbackNotificationEx(
              RegNtPostFlushKey,
              (_SLIST_ENTRY *)DmaAdapter,
              (unsigned int)v11,
              (INT64)Argument,
              0i64,
              (INT64)a6);
LABEL_18:
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  v20 = DmaAdapter;
  if( DmaAdapter )
    HalPutDmaAdapter(DmaAdapter);
LABEL_21:
  if( *(BOOLEAN **)((char *)&NlsMbCodePageTag + 7) )
  {
    LOBYTE(v20) = 21;
    (*(void(__fastcall **)(PADAPTER_OBJECT, _LARGE_INTEGER *, _QWORD, _QWORD, _DMA_OPERATIONS *, _QWORD))((char *)&NlsMbCodePageTag + 7))(
      v20,
      TimeStamp,
      (unsigned int)v11,
      0i64,
      DmaOperations,
      0i64);
  }
  if( v9 )
  {
    ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CmpDummyThreadEvent + 132);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  return v11;
}

Referenced by:

ExpWatchProductTypeWork