ExpNtUpdateWnfStateData

NTSTATUS __stdcall ExpNtUpdateWnfStateData(
        const PFN_WDFIOTARGETOPEN *a1,
        _XSTATE_FEATURE *a2,
        INT64 a3,
        StartMirroringRoutine *a4,
        INT64 ScopeInstanceId,
        _XSTATE_CONFIGURATION *MatchingChangeStamp,
        _XSTATE_CONFIGURATION *CheckStamp,
        INT64 a8){
  _ETHREAD *CurrentThread; 
  char PreviousMode; 
  unsigned __int64 v10; 
  int NameInstance; 
  VOID *v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  unsigned __int64 v15; 
  INT64 v16; 
  _ETHREAD *v17; 
  _EPROCESS *v18; 
  __int64 bf_0; 
  _WNF_SCOPE_INSTANCE *v20; 
  NTSTATUS v21; 
  unsigned int v22; 
  VOID **v24; 
  _EX_PUSH_LOCK *v25; 
  _BYTE *v26; 
  __int64 v27; 
  INT64 v28; 
  INT64 v29; 
  VOID **CapturedScopeData; 
  VOID **CapturedScopeDataa; 
  INT64 v32; 
  _WNF_DATA_SCOPE DataScope; 
  _DWORD Length[3]; 
  UINT64 BypassAccessChecks; 
  _WNF_STATE_NAME_STRUCT InternalStateName; 
  VOID **StateNameRegistration; 
  int v38; 
  VOID *CapturedScopeInstanceId; 
  _WNF_TYPE_ID *CapturedTypeId; 
  _WNF_SCOPE_INSTANCE *ScopeInstance; 
  VOID *Data; 
  _EPROCESS *Process; 
  _WNF_CAPTURED_INSTANCE_ID v44[4]; 
  INT64 v45; 
  INT64 v46; 
  __int128 v47; 

  Length[0] = a3;
  Data = a2;
  InternalStateName._bf_0 = 0i64;
  v47 = 0i64;
  CapturedScopeInstanceId = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  StateNameRegistration = 0i64;
  ScopeInstance = 0i64;
  *(_QWORD *)&Length[1] = 0i64;
  LODWORD(v10) = 0;
  *(_OWORD *)v44 = 0i64;
  CapturedTypeId = (_WNF_TYPE_ID *)a4;
  NameInstance = ExpCaptureWnfStateName((const _WNF_STATE_NAME *)a1, &InternalStateName, PreviousMode);
  if( NameInstance < 0 )
    goto LABEL_26;
  v38 = ((unsigned __int64)InternalStateName._bf_0 >> 4) & 3;
  v10 = ((unsigned __int64)InternalStateName._bf_0 >> 6) & 0xF;
  DataScope = ((unsigned __int64)InternalStateName._bf_0 >> 6) & 0xF;
  if( PreviousMode )
  {
    if( (_DWORD)v14 && (v15 + v14 > 0x7FFFFFFF0000i64 || v15 + v14 < v15) )
      MEMORY[0x7FFFFFFF0000] = 0;
    if( v13 )
    {
      if( v13 >= 0x7FFFFFFF0000i64 )
        v13 = 0x7FFFFFFF0000i64;
      v47 = *(_OWORD *)v13;
      CapturedTypeId = (_WNF_TYPE_ID *)&v47;
    }
  }
  LOBYTE(v12) = PreviousMode;
  NameInstance = ExpWnfCaptureScopeInstanceId(
                   (_WNF_DATA_SCOPE)(((unsigned __int64)InternalStateName._bf_0 >> 6) & 0xF),
                   (VOID *)ScopeInstanceId,
                   v12,
                   &CapturedScopeInstanceId,
                   (VOID **)v44);
  if( NameInstance < 0 )
    goto LABEL_26;
  if( PreviousMode )
  {
    LODWORD(BypassAccessChecks) = 0;
    if( ScopeInstanceId )
    {
      NameInstance = ExpWnfCheckCrossScopeAccess(InternalStateName);
      if( NameInstance < 0 )
        goto LABEL_26;
    }
  }
  else
  {
    LODWORD(BypassAccessChecks) = 1;
  }
  if( PreviousMode )
  {
    v17 = (_ETHREAD *)KeGetCurrentThread();
    v18 = v17->Tcb.ApcState.Process;
    Process = v18;
    LODWORD(v10) = DataScope;
    if( DataScope == WnfDataScopeProcess && (!CapturedScopeInstanceId || v18 == *(_EPROCESS **)CapturedScopeInstanceId) )
      goto LABEL_44;
  }
  else
  {
    v17 = 0i64;
    v18 = PsInitialSystemProcess;
    Process = PsInitialSystemProcess;
  }
  if( (_DWORD)v10 == 5 && (_DWORD)a8 )
  {
    if( (_DWORD)CheckStamp )
    {
LABEL_44:
      NameInstance = -1073741811;
      goto LABEL_26;
    }
    v45 = InternalStateName._bf_0 ^ 0x41C64E6DA3BC0074i64;
    LODWORD(v32) = Length[0];
    NameInstance = ExpCrossVmWnfPush(v16, 1ui64, (INT64)&v45, 0xFFFFFFFFui64, (INT64)Data, v32);
    if( NameInstance != -1073741822 )
      goto LABEL_26;
  }
  NameInstance = ExpWnfResolveScopeInstance(&ScopeInstance, v18, v17, (_WNF_DATA_SCOPE)v10, CapturedScopeInstanceId);
  if( NameInstance < 0 )
    goto LABEL_26;
  bf_0 = InternalStateName._bf_0;
  v20 = ScopeInstance;
  v21 = ExpWnfLookupNameInstance(ScopeInstance, InternalStateName, (_WNF_NAME_INSTANCE **)&Length[1]);
  NameInstance = v21;
  if( v21 != -1073741772 || v38 == 3 )
  {
    if( v21 < 0 )
      goto LABEL_26;
    LODWORD(CapturedScopeData) = BypassAccessChecks;
    v22 = Length[0];
    NameInstance = ExpWnfValidatePubSubPreconditions(
                     2ui64,
                     (_WNF_STATE_NAME_REGISTRATION *)(*(_QWORD *)&Length[1] + 56i64),
                     Length[0],
                     CapturedTypeId,
                     (UINT64)CapturedScopeData);
    if( NameInstance < 0 )
      goto LABEL_26;
  }
  else
  {
    NameInstance = ExpWnfLookupPermanentName((_WNF_STATE_NAME_STRUCT)bf_0, &StateNameRegistration);
    if( NameInstance < 0 )
      goto LABEL_26;
    LODWORD(CapturedScopeData) = BypassAccessChecks;
    v24 = StateNameRegistration;
    NameInstance = ExpWnfValidatePubSubPreconditions(
                     2ui64,
                     (_WNF_STATE_NAME_REGISTRATION *)StateNameRegistration,
                     Length[0],
                     CapturedTypeId,
                     (UINT64)CapturedScopeData);
    if( NameInstance < 0 )
      goto LABEL_26;
    NameInstance = ExpWnfCreateNameInstance(
                     v20,
                     (_WNF_STATE_NAME_STRUCT)bf_0,
                     (_WNF_STATE_NAME_REGISTRATION *)v24,
                     Process,
                     (_WNF_NAME_INSTANCE **)&Length[1]);
    ExFreePoolWithTag(v24, 0x20666E57u);
    StateNameRegistration = 0i64;
    if( NameInstance < 0 )
      goto LABEL_26;
    v22 = Length[0];
  }
  LODWORD(CapturedScopeDataa) = (_DWORD)CheckStamp;
  NameInstance = ExpWnfWriteStateData(
                   *(_WNF_NAME_INSTANCE **)&Length[1],
                   Data,
                   v22,
                   (unsigned int)MatchingChangeStamp,
                   (UINT64)CapturedScopeDataa);
  if( NameInstance >= 0 )
  {
    if( (_DWORD)v10 == 5 )
    {
      v46 = InternalStateName._bf_0 ^ 0x41C64E6DA3BC0074i64;
      v25 = (_EX_PUSH_LOCK *)(*(_QWORD *)&Length[1] + 80i64);
      v26 = KeAbPreAcquire((VOID *)(*(_QWORD *)&Length[1] + 80i64), 0i64, 0i64);
      if( _InterlockedCompareExchange64(&v25->_bf_0, 17i64, 0i64) )
        ExfAcquirePushLockSharedEx(v25, v26, v25);
      if( v26 )
        v26[26] |= 1u;
      v27 = 0i64;
      if( *(_QWORD *)(*(_QWORD *)&Length[1] + 88i64) != 1i64 )
        v27 = *(_QWORD *)(*(_QWORD *)&Length[1] + 88i64);
      if( v27 )
      {
        v28 = v27 + 16;
        v29 = *(unsigned int *)(v27 + 8);
      }
      else
      {
        v28 = 0i64;
        v29 = 0i64;
      }
      LODWORD(v32) = v29;
      ExpCrossVmWnfPush(v29, 0i64, (INT64)&v46, *(unsigned int *)(*(_QWORD *)&Length[1] + 96i64), v28, v32);
      if( _InterlockedCompareExchange64(&v25->_bf_0, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(v25);
      KeAbPostRelease(v25);
      LODWORD(v10) = DataScope;
    }
    ExpWnfNotifyNameSubscribers(*(_WNF_NAME_INSTANCE **)&Length[1], 1ui64, 1ui64, PreviousMode != 0);
    NameInstance = 0;
  }
LABEL_26:
  if( *(_QWORD *)&Length[1] )
    ExReleaseRundownProtection((_EX_RUNDOWN_REF *)(*(_QWORD *)&Length[1] + 8i64));
  if( ScopeInstance )
    ExReleaseRundownProtection(&ScopeInstance->RunRef);
  if( StateNameRegistration )
    ExFreePoolWithTag(StateNameRegistration, 0x20666E57u);
  KeLeaveCriticalRegion();
  ExpWnfReleaseCapturedScopeInstanceId((_WNF_DATA_SCOPE)v10, v44, PreviousMode);
  return NameInstance;
}

Referenced by:

ExWnfCrossVmCallback
NtUpdateWnfStateData
PfSnPowerBoostUpdate