PiDevCfgEnforceDevicePolicy

NTSTATUS __stdcall PiDevCfgEnforceDevicePolicy(
        _DEVICE_NODE *DeviceNode,
        PI_DEVCFG_DEVICE_CONTEXT *DeviceContext,
        WCHAR *ClassGuidString){
  INT64 v3; 
  int v6; 
  NTSTATUS v7; 
  INT64 v8; 
  NTSTATUS v9; 
  char v10; 
  unsigned int v11; 
  NTSTATUS v12; 
  WCHAR *v13; 
  NTSTATUS v14; 
  WCHAR *v15; 
  const wchar_t *v16; 
  __int64 v17; 
  const wchar_t *v18; 
  __int64 v19; 
  NTSTATUS v20; 
  WCHAR *v21; 
  NTSTATUS v22; 
  WCHAR *v23; 
  WCHAR *v24; 
  WCHAR *v25; 
  const wchar_t *v26; 
  WCHAR *v27; 
  char v28; 
  const wchar_t *v29; 
  __int64 v30; 
  const wchar_t *v31; 
  __int64 v32; 
  __int64 v33; 
  NTSTATUS v34; 
  WCHAR *v35; 
  NTSTATUS v36; 
  WCHAR *v37; 
  const wchar_t *v38; 
  __int64 v39; 
  const wchar_t *v40; 
  __int64 v41; 
  char v42; 
  WCHAR *v43; 
  unsigned int v44; 
  INT64 v46; 
  INT64 v47; 
  char v48; 
  char v49; 
  char v50; 
  char v51; 
  char v52; 
  char v53; 
  VOID *PolicyKeyHandle; 
  WCHAR *PolicyStringList; 
  INT64 v56; 
  __int64 v57; 
  const wchar_t *v58; 
  VOID *KeyHandle; 
  WCHAR *Str1; 
  WCHAR *v61; 
  WCHAR *v62; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  WCHAR *v64; 
  WCHAR *v65; 
  PVOID P; 
  UINT8 PolicyEnabled; 

  v57 = 8913030i64;
  v58 = L"\\Registry\\Machine\\Software\\Policies\\Microsoft\\Windows\\DeviceInstall";
  ObjectAttributes.ObjectName = (_UNICODE_STRING *)&v57;
  Str1 = 0i64;
  v61 = 0i64;
  v62 = 0i64;
  v64 = 0i64;
  v65 = 0i64;
  PolicyEnabled = 0;
  v6 = 576;
  *(_QWORD *)&ObjectAttributes.Length = 48i64;
  *(_QWORD *)&ObjectAttributes.Attributes = 576i64;
  KeyHandle = 0i64;
  ObjectAttributes.RootDirectory = 0i64;
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  v7 = ZwOpenKey(&KeyHandle, 0x20019ui64, &ObjectAttributes, v3, v46, 0i64, 0i64, v56);
  if( v7 == -1073741772 )
  {
    if( !PnpBootMode )
    {
LABEL_5:
      v9 = 0;
      goto LABEL_129;
    }
    LODWORD(v57) = 6422624;
    v58 = L"\\Registry\\Machine\\System\\DriverDatabase\\Policies";
    *(_QWORD *)&ObjectAttributes.Length = 48i64;
    ObjectAttributes.ObjectName = (_UNICODE_STRING *)&v57;
    *(_QWORD *)&ObjectAttributes.Attributes = 576i64;
    KeyHandle = 0i64;
    ObjectAttributes.RootDirectory = 0i64;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    v7 = ZwOpenKey(
           &KeyHandle,
           0x20019ui64,
           &ObjectAttributes,
           v8,
           v47,
           (INT64)PolicyKeyHandle,
           (INT64)PolicyStringList,
           v56);
  }
  if( v7 < 0 )
    goto LABEL_5;
  LODWORD(v57) = 1703960;
  v58 = L"Restrictions";
  ObjectAttributes.RootDirectory = KeyHandle;
  *(_QWORD *)&ObjectAttributes.Length = 48i64;
  ObjectAttributes.ObjectName = (_UNICODE_STRING *)&v57;
  *(_QWORD *)&ObjectAttributes.Attributes = 576i64;
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  if( ZwOpenKey(
         &PolicyKeyHandle,
         0x20019ui64,
         &ObjectAttributes,
         v8,
         v47,
         (INT64)PolicyKeyHandle,
         (INT64)PolicyStringList,
         v56) < 0 )
    goto LABEL_5;
  LOBYTE(v6) = 0;
  v10 = 0;
  LODWORD(v56) = v6;
  v48 = 0;
  v51 = 0;
  v50 = 0;
  v49 = 0;
  v52 = 0;
  v53 = 0;
  v11 = 1;
  if( PiDevCfgQueryPolicyEnabled(PolicyKeyHandle, (WCHAR *)L"AllowDenyLayered", &PolicyEnabled) >= 0 )
    LODWORD(v56) = PolicyEnabled != 0;
  if( PiDevCfgQueryPolicyEnabled(PolicyKeyHandle, (WCHAR *)L"DenyRemovableDevices", &PolicyEnabled) >= 0
    && PolicyEnabled
    && (DeviceNode->CapabilityFlags & 0x10) != 0 )
  {
    v10 = 1;
  }
  v12 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"AllowDeviceClasses", &PolicyStringList);
  v13 = PolicyStringList;
  if( v12 < 0 )
    v13 = 0i64;
  PolicyStringList = v13;
  v14 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"DenyDeviceClasses", &Str1);
  v15 = Str1;
  if( v14 < 0 )
    v15 = 0i64;
  P = v15;
  if( ClassGuidString )
  {
    if( v13 )
    {
      v16 = v13;
      if( *v13 )
      {
        while( wcsicmp(v16, ClassGuidString) )
        {
          v17 = -1i64;
          do
            ++v17;
          while( v16[v17] );
          v16 += v17 + 1;
          if( !*v16 )
            goto LABEL_28;
        }
        v48 = 1;
      }
    }
    else if( !v15 )
    {
      goto LABEL_36;
    }
LABEL_28:
    if( v15 )
    {
      v18 = v15;
      if( *v15 )
      {
        while( wcsicmp(v18, ClassGuidString) )
        {
          v19 = -1i64;
          do
            ++v19;
          while( v18[v19] );
          v18 += v19 + 1;
          if( !*v18 )
            goto LABEL_36;
        }
        v51 = 1;
        v10 = 1;
      }
    }
  }
LABEL_36:
  v20 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"AllowDeviceIDs", &v61);
  v21 = v61;
  if( v20 < 0 )
    v21 = 0i64;
  Str1 = v21;
  v22 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"DenyDeviceIDs", &v62);
  v23 = v62;
  if( v22 < 0 )
    v23 = 0i64;
  if( v21 || v23 )
  {
    v24 = (WCHAR *)2;
    v25 = (WCHAR *)(DeviceContext + 8);
    v61 = (WCHAR *)2;
    v62 = (WCHAR *)(DeviceContext + 8);
    do
    {
      v26 = *(const wchar_t **)v25;
      if( *(_QWORD *)v25 && *v26 )
      {
        v27 = Str1;
        v28 = v49;
        do
        {
          if( v27 )
          {
            if( !v28 )
            {
              v29 = v27;
              if( *v27 )
              {
                while( wcsicmp(v29, v26) )
                {
                  v30 = -1i64;
                  do
                    ++v30;
                  while( v29[v30] );
                  v29 += v30 + 1;
                  if( !*v29 )
                    goto LABEL_55;
                }
                v28 = 1;
                v48 = 1;
              }
            }
          }
LABEL_55:
          if( v23 )
          {
            if( !v50 )
            {
              v31 = v23;
              if( *v23 )
              {
                while( wcsicmp(v31, v26) )
                {
                  v32 = -1i64;
                  do
                    ++v32;
                  while( v31[v32] );
                  v31 += v32 + 1;
                  if( !*v31 )
                    goto LABEL_64;
                }
                v50 = 1;
                v10 = 1;
              }
            }
          }
LABEL_64:
          v33 = -1i64;
          do
            ++v33;
          while( v26[v33] );
          v26 += v33 + 1;
        }
        while( *v26 );
        v24 = v61;
        v49 = v28;
        v25 = v62;
      }
      v25 += 8;
      v24 = (WCHAR *)((char *)v24 - 1);
      v62 = v25;
      v61 = v24;
    }
    while( v24 );
    v21 = Str1;
  }
  v34 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"AllowInstanceIDs", &v64);
  v35 = v64;
  if( v34 < 0 )
    v35 = 0i64;
  v36 = PiDevCfgQueryPolicyStringList(PolicyKeyHandle, (WCHAR *)L"DenyInstanceIDs", &v65);
  v37 = v65;
  if( v36 < 0 )
    v37 = 0i64;
  if( v35 )
  {
    v38 = v35;
    if( *v35 )
    {
      while( wcsicmp(v38, *((const wchar_t **)DeviceContext + 1)) )
      {
        v39 = -1i64;
        do
          ++v39;
        while( v38[v39] );
        v38 += v39 + 1;
        if( !*v38 )
          goto LABEL_84;
      }
      v53 = 1;
      v48 = 1;
    }
  }
  else if( !v37 )
  {
    goto LABEL_92;
  }
LABEL_84:
  if( v37 )
  {
    v40 = v37;
    if( *v37 )
    {
      while( wcsicmp(v40, *((const wchar_t **)DeviceContext + 1)) )
      {
        v41 = -1i64;
        do
          ++v41;
        while( v40[v41] );
        v40 += v41 + 1;
        if( !*v40 )
          goto LABEL_92;
      }
      v52 = 1;
      v10 = 1;
    }
  }
LABEL_92:
  if( v10 )
  {
    v43 = PolicyStringList;
    v42 = v56;
    goto LABEL_105;
  }
  if( v48 )
  {
    v43 = PolicyStringList;
    goto LABEL_101;
  }
  v42 = v56;
  if( (_BYTE)v56
    || PiDevCfgQueryPolicyEnabled(PolicyKeyHandle, (WCHAR *)L"DenyUnspecified", &PolicyEnabled) < 0
    || !PolicyEnabled )
  {
    v43 = PolicyStringList;
    v9 = 0;
    goto LABEL_117;
  }
  v43 = PolicyStringList;
  if( (ClassGuidString || !PolicyStringList) && (!BYTE6(qword_140C50A2C) || !BYTE4(qword_140C50A2C)) )
  {
LABEL_105:
    if( v42 && v48 )
    {
      if( v52 )
      {
        v11 = 0;
      }
      else if( !v50 )
      {
        v11 = 3 - (v51 != 0);
      }
      if( v53 )
        v44 = 0;
      else
        v44 = 2 - (v49 != 0);
      v9 = v44 >= v11 ? 0xC0000361 : 0;
    }
    else
    {
      v9 = -1073740959;
    }
    goto LABEL_117;
  }
LABEL_101:
  v9 = 0;
LABEL_117:
  if( v43 )
    ExFreePoolWithTag(v43, 0);
  if( P )
    ExFreePoolWithTag(P, 0);
  if( v21 )
    ExFreePoolWithTag(v21, 0);
  if( v23 )
    ExFreePoolWithTag(v23, 0);
  if( v35 )
    ExFreePoolWithTag(v35, 0);
  if( v37 )
    ExFreePoolWithTag(v37, 0);
LABEL_129:
  if( PolicyKeyHandle )
    ZwClose((_HANDLE)PolicyKeyHandle);
  if( KeyHandle )
    ZwClose((_HANDLE)KeyHandle);
  return v9;
}

Referenced by:

PiDevCfgConfigureDevice