NtQueryWnfStateNameInformation

NTSTATUS __stdcall NtQueryWnfStateNameInformation(
        _WNF_STATE_NAME *StateName,
        _WNF_STATE_NAME_INFORMATION NameInfoClass,
        VOID *ExplicitScope,
        VOID *InfoBuffer,
        UINT64 InfoBufferSize){
  _DWORD *v5; 
  _ETHREAD *CurrentThread; 
  char PreviousMode; 
  int v10; 
  VOID *v11; 
  __int64 bf_0; 
  int v13; 
  int v14; 
  unsigned int v15; 
  _ETHREAD *v16; 
  _ETHREAD *v17; 
  _EPROCESS *Process; 
  NTSTATUS v19; 
  _SECURITY_DESCRIPTOR *SecurityDescriptor; 
  int v22; 
  _WNF_DATA_SCOPE DataScope; 
  int v24; 
  _WNF_NAME_INSTANCE *NameInstance; 
  _WNF_STATE_NAME_STRUCT StateNamea; 
  int v27; 
  _WNF_SCOPE_INSTANCE *ScopeInstance; 
  VOID **StateNameRegistration; 
  VOID *CapturedScopeInstanceId; 
  _WNF_CAPTURED_INSTANCE_ID CapturedScopeData[14]; 

  v5 = InfoBuffer;
  StateNamea._bf_0 = 0i64;
  CapturedScopeInstanceId = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  StateNameRegistration = 0i64;
  ScopeInstance = 0i64;
  NameInstance = 0i64;
  DataScope = WnfDataScopeSystem;
  *(_OWORD *)CapturedScopeData = 0i64;
  v10 = ExpCaptureWnfStateName(StateName, &StateNamea, PreviousMode);
  if( v10 >= 0 )
  {
    bf_0 = StateNamea._bf_0;
    v27 = ((unsigned __int64)StateNamea._bf_0 >> 4) & 3;
    DataScope = ((unsigned __int64)StateNamea._bf_0 >> 6) & 0xF;
    v10 = ExpWnfCaptureScopeInstanceId(
            DataScope,
            ExplicitScope,
            v11,
            &CapturedScopeInstanceId,
            (VOID **)CapturedScopeData);
    if( v10 >= 0 )
    {
      if( (unsigned int)NameInfoClass > WnfInfoIsQuiescent )
      {
        v10 = -1073741821;
      }
      else
      {
        if( (unsigned int)InfoBufferSize >= 4 )
        {
          if( PreviousMode )
            ProbeForWrite((UINT64)v5, (unsigned int)InfoBufferSize, 4i64);
          v13 = 1;
          if( NameInfoClass )
          {
            v24 = 0;
          }
          else
          {
            v24 = 1;
            if( ExplicitScope )
            {
              v10 = -1073741811;
              goto LABEL_52;
            }
          }
          if( PreviousMode && NameInfoClass )
          {
            v14 = 0;
            v22 = 0;
            if( ExplicitScope )
            {
              v10 = ExpWnfCheckCrossScopeAccess((_WNF_STATE_NAME_STRUCT)bf_0);
              if( v10 < 0 )
                goto LABEL_52;
              v14 = 0;
            }
          }
          else
          {
            v14 = 1;
            v22 = 1;
          }
          v15 = 0;
          if( !v14 && (unsigned int)(NameInfoClass - 1) <= 1 )
            v15 = 2;
          v16 = 0i64;
          if( PreviousMode )
          {
            v17 = (_ETHREAD *)KeGetCurrentThread();
            Process = v17->Tcb.ApcState.Process;
            bf_0 = StateNamea._bf_0;
            if( !v24 )
              v16 = v17;
          }
          else
          {
            Process = PsInitialSystemProcess;
          }
          v10 = ExpWnfResolveScopeInstance(&ScopeInstance, Process, v16, DataScope, CapturedScopeInstanceId);
          if( v10 < 0 )
            goto LABEL_52;
          v19 = ExpWnfLookupNameInstance(ScopeInstance, (_WNF_STATE_NAME_STRUCT)bf_0, &NameInstance);
          v10 = v19;
          if( v19 != -1073741772 || v27 == 3 )
          {
            if( v19 < 0 )
              goto LABEL_52;
            if( v22 )
              goto LABEL_29;
            SecurityDescriptor = NameInstance->StateNameInfo.SecurityDescriptor;
          }
          else
          {
            v10 = ExpWnfLookupPermanentName((_WNF_STATE_NAME_STRUCT)bf_0, &StateNameRegistration);
            if( v10 < 0 )
              goto LABEL_52;
            if( v22 )
            {
LABEL_29:
              if( NameInfoClass )
              {
                if( NameInfoClass == WnfInfoSubscribersPresent )
                {
                  if( NameInstance && NameInstance->DataSubscribersCount )
                    goto LABEL_36;
                }
                else if( !NameInstance || !NameInstance->CurrentDeliveryCount )
                {
                  goto LABEL_36;
                }
                v13 = 0;
              }
LABEL_36:
              *(_DWORD *)InfoBuffer = v13;
              v10 = 0;
              v5 = InfoBuffer;
              goto LABEL_37;
            }
            SecurityDescriptor = (_SECURITY_DESCRIPTOR *)StateNameRegistration[2];
          }
          v10 = ExpWnfCheckCallerAccess(SecurityDescriptor, v15);
          if( v10 >= 0 )
            goto LABEL_29;
LABEL_52:
          v5 = InfoBuffer;
          goto LABEL_37;
        }
        v10 = -1073741811;
      }
    }
  }
LABEL_37:
  if( v10 == -1073741772 && NameInfoClass == WnfInfoStateNameExist )
  {
    *v5 = 0;
    v10 = 0;
  }
  if( NameInstance )
    ExReleaseRundownProtection(&NameInstance->RunRef);
  if( ScopeInstance )
    ExReleaseRundownProtection(&ScopeInstance->RunRef);
  if( StateNameRegistration )
    ExFreePoolWithTag(StateNameRegistration, 0x20666E57u);
  KeLeaveCriticalRegion();
  ExpWnfReleaseCapturedScopeInstanceId(DataScope, CapturedScopeData, PreviousMode);
  return v10;
}

Referenced by:

No references.