NtDeleteWnfStateName

NTSTATUS __stdcall NtDeleteWnfStateName(_WNF_STATE_NAME *StateName){
  _ETHREAD *CurrentThread; 
  _WNF_SCOPE_INSTANCE *v2; 
  NTSTATUS v3; 
  CHAR v4; 
  _WNF_STATE_NAME_STRUCT v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  _BOOL8 v9; 
  _EPROCESS *v10; 
  int v11; 
  _WNF_NAME_INSTANCE *NameInstance; 
  _WNF_SCOPE_INSTANCE *ScopeInstance; 
  _WNF_STATE_NAME_STRUCT StateNamea; 
  PVOID P; 
  UINT64 v17; 
  CHAR v18; 
  int v19; 
  _EPROCESS *v20; 
  StateNamea = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v18 = *((_BYTE *)KeGetCurrentThread() + 562);
  v19 = 0;
  P = 0i64;
  v2 = 0i64;
  ScopeInstance = 0i64;
  NameInstance = 0i64;
  v3 = ExpCaptureWnfStateName(StateName, &StateNamea, v18);
  if( v3 >= 0 )
  {
    v5 = StateNamea;
    v6 = *(unsigned __int64 *)&StateNamea >> 4;
    v7 = (*(unsigned __int64 *)&StateNamea >> 6) & 0xF;
    v17 = v7;
    v8 = (*(unsigned __int64 *)&StateNamea >> 4) & 3;
    if( ((*(unsigned __int64 *)&StateNamea >> 4) & 3) == 0 )
    {
      v3 = -1073741811;
      goto LABEL_19;
    }
    v9 = v4 == 0;
    if( (_DWORD)v8 != 3 )
    {
      if( v4 )
      {
        v3 = ExpWnfLookupPermanentName(StateNamea, (_WNF_STATE_NAME_REGISTRATION **)&P);
        if( v3 < 0 )
          goto LABEL_19;
        v3 = ExpWnfCheckCallerAccess(*((PVOID *)P + 2), 0x10000ui64);
        if( v3 < 0 )
          goto LABEL_19;
        LODWORD(v9) = 1;
      }
      v3 = ExpWnfDeletePermanentName(*(_QWORD *)&v5);
      if( v3 < 0 )
        goto LABEL_19;
      v19 = 1;
      v7 = v17;
      v4 = v18;
    }
    if( v4 )
    {
      v10 = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
      v5 = StateNamea;
    }
    else
    {
      v10 = (_EPROCESS *)PsInitialSystemProcess;
    }
    v20 = v10;
    if( (_DWORD)v8 == 3 )
    {
      v3 = ExpWnfResolveScopeInstance((struct _EX_RUNDOWN_REF **)&ScopeInstance, (__int64)v10, 0i64, v7, 0i64);
      v2 = ScopeInstance;
      if( v3 < 0 )
        goto LABEL_19;
    }
    else
    {
      v3 = 0;
      v2 = (_WNF_SCOPE_INSTANCE *)ExpWnfEnumerateScopeInstances(v7, 0i64);
    }
    if( v2 )
    {
      v11 = v6 & 3;
      while( 1 )
      {
        v3 = ExpWnfLookupNameInstance(v2, v5, &NameInstance);
        if( v3 >= 0 )
        {
          if( !v9 )
          {
            v3 = ExpWnfCheckCallerAccess(NameInstance->StateNameInfo.SecurityDescriptor, 0x10000ui64);
            if( v3 < 0 )
              goto LABEL_19;
            LODWORD(v9) = 1;
          }
          if( v11 == 3i64 && NameInstance->CreatorProcess != v20 )
          {
            v3 = -1073741790;
            goto LABEL_19;
          }
          ExpWnfNotifyNameSubscribers((INT64)NameInstance, 0x10ui64, 1i64, v18 != 0);
          if( (unsigned int)ExpWnfDeleteNameInstance(v2, NameInstance, 1u) )
            NameInstance = 0i64;
          else
            v3 = -1073741772;
        }
        if( v11 != 3i64 )
        {
          if( NameInstance )
          {
            ExReleaseRundownProtection(&NameInstance->RunRef);
            NameInstance = 0i64;
          }
          v2 = (_WNF_SCOPE_INSTANCE *)ExpWnfEnumerateScopeInstances((unsigned int)v17, (EX_RUNDOWN_REF *)v2);
          if( v2 )
            continue;
        }
        break;
      }
    }
    if( (*(_WORD *)&v5 & 0x400) != 0 )
      ExpWnfDeletePermanentStateData(0i64, *(_QWORD *)&v5);
  }
LABEL_19:
  if( v19 )
    v3 = 0;
  if( NameInstance )
    ExReleaseRundownProtection(&NameInstance->RunRef);
  if( v2 )
    ExReleaseRundownProtection(&v2->RunRef);
  if( P )
    ExFreePoolWithTag(P, 0x20666E57u);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v3;
}

Referenced by:

No references.