CmGetInstallerClassCompoundFiltersWorker

NTSTATUS __stdcall CmGetInstallerClassCompoundFiltersWorker(
        INT64 a1,
        INT64 rdx0,
        VOID *r8,
        VOID *r9,
        INT64 arg20,
        INT64 arg28,
        INT64 a7,
        WCHAR *a4,
        INT64 a5,
        INT64 a10){
  VOID **v10; 
  __int64 v14; 
  __int64 *v15; 
  __int64 *v16; 
  VOID **PoolWithTag; 
  int ObjectProperty; 
  WCHAR *v19; 
  NTSTATUS InstallerClassMappedPropertyFromRegProp; 
  NTSTATUS v21; 
  INT64 v22; 
  VOID **v23; 
  UINT64 *PropertyType; 
  INT64 a6; 
  INT64 v27; 
  INT64 v28; 
  INT64 v29; 
  INT64 v30; 
  UINT64 NumberOfBytes; 
  WCHAR *a3; 
  PVOID P; 
  PVOID v34; 
  INT64 v35; 
  WCHAR *a2; 
  INT64 v37; 

  v10 = 0i64;
  LODWORD(a3) = 0;
  P = 0i64;
  NumberOfBytes = 0i64;
  a2 = 0i64;
  v34 = 0i64;
  if( (int)PnpCtxRegQueryInfoKey(a1, r9, &a3, 0i64, 0i64, 0i64, 0i64) < 0 || !(_DWORD)a3 )
    goto LABEL_44;
  if( *(_DWORD *)(arg20 + 16) != 20 )
    goto LABEL_8;
  v14 = *(_QWORD *)arg20 - DEVPKEY_DeviceClass_CompoundUpperFilters;
  if( *(_QWORD *)arg20 == DEVPKEY_DeviceClass_CompoundUpperFilters )
    v14 = *(_QWORD *)(arg20 + 8) - 0x4B88D2ECD9DBB9A9i64;
  if( v14 )
  {
LABEL_8:
    v37 = (INT64)DEVPKEY_DeviceClass_LowerFilterLevels;
    v15 = DEVPKEY_DeviceClass_LowerFilterCache;
    a3 = L"*Lower";
    v16 = DEVPKEY_DeviceClass_LowerFilterDefaultLevel;
  }
  else
  {
    v37 = (INT64)DEVPKEY_DeviceClass_UpperFilterLevels;
    v15 = (__int64 *)&DEVPKEY_DeviceClass_UpperFilterCache;
    a3 = (WCHAR *)L"*Upper";
    v16 = (__int64 *)&DEVPKEY_DeviceClass_UpperFilterDefaultLevel;
  }
  v35 = (INT64)v15;
  if( PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, (INT64)v15, (INT64)&NumberOfBytes + 4, 0i64) == -1073741789
    && HIDWORD(NumberOfBytes) == 8210 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
    v10 = PoolWithTag;
    if( !PoolWithTag )
      return -1073741801;
    ObjectProperty = PnpGetObjectProperty(
                       a1,
                       rdx0,
                       2i64,
                       (INT64)r8,
                       0i64,
                       v35,
                       (INT64)&NumberOfBytes + 4,
                       (INT64)PoolWithTag);
    if( ObjectProperty < 0 )
      goto LABEL_47;
    v19 = (WCHAR *)rdx0;
    goto LABEL_15;
  }
  v21 = PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, (INT64)v16, (INT64)&NumberOfBytes + 4, 0i64);
  ObjectProperty = v21;
  if( v21 == -1073741789 && HIDWORD(NumberOfBytes) == 18 )
  {
    P = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
    if( !P )
      return -1073741801;
    a6 = (INT64)v16;
    v19 = (WCHAR *)rdx0;
    ObjectProperty = PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, a6, (INT64)&NumberOfBytes + 4, (INT64)P);
    if( ObjectProperty < 0 )
      goto LABEL_45;
    v22 = v37;
    if( PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, v37, (INT64)&NumberOfBytes + 4, 0i64) == -1073741789 )
    {
      v23 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
      v34 = v23;
      if( !v23 )
        goto LABEL_23;
      ObjectProperty = PnpGetObjectProperty(a1, rdx0, 2i64, (INT64)r8, 0i64, v22, (INT64)&NumberOfBytes + 4, (INT64)v23);
      if( ObjectProperty < 0 )
        goto LABEL_45;
      LODWORD(v29) = 0;
      ObjectProperty = CmGetDeclarativeFilterList(
                         a1,
                         (INT64)r9,
                         (const WCHAR *)v34,
                         (const WCHAR *)P,
                         a3,
                         0i64,
                         v29,
                         &NumberOfBytes);
      if( !ObjectProperty )
        ObjectProperty = -1073741762;
      if( ObjectProperty != -1073741789 )
        goto LABEL_45;
      v10 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
      if( !v10 )
        goto LABEL_23;
      LODWORD(v30) = NumberOfBytes;
      ObjectProperty = CmGetDeclarativeFilterList(
                         a1,
                         (INT64)r9,
                         (const WCHAR *)v34,
                         (const WCHAR *)P,
                         a3,
                         v10,
                         v30,
                         &NumberOfBytes);
      if( ObjectProperty < 0 )
        goto LABEL_45;
      PnpSetObjectProperty(a1, rdx0, 2u, (INT64)r8, 0i64, v35, 8210, (__int64)v10, NumberOfBytes, 0);
LABEL_15:
      LODWORD(v27) = 0;
      InstallerClassMappedPropertyFromRegProp = CmGetInstallerClassMappedPropertyFromRegProp(
                                                  (HPNPCTX *)a1,
                                                  v19,
                                                  r8,
                                                  (_DEVPROPKEY *)arg28,
                                                  (UINT64 *)((char *)&NumberOfBytes + 4),
                                                  0i64,
                                                  v27,
                                                  &NumberOfBytes);
      if( InstallerClassMappedPropertyFromRegProp == -1073741275 )
      {
        LODWORD(NumberOfBytes) = 0;
        goto LABEL_37;
      }
      if( InstallerClassMappedPropertyFromRegProp != -1073741789 )
      {
        ObjectProperty = InstallerClassMappedPropertyFromRegProp;
        goto LABEL_45;
      }
      if( !(_DWORD)NumberOfBytes || !(_DWORD)a5 )
      {
LABEL_37:
        LODWORD(PropertyType) = a5;
        ObjectProperty = CmMergeFilterLists((WCHAR *)v10, a2, a3, a4, (INT64)PropertyType, a10);
        if( (int)(ObjectProperty + 0x80000000) < 0 || ObjectProperty == -1073741789 )
          *(_DWORD *)a7 = 8210;
        goto LABEL_45;
      }
      a2 = (WCHAR *)ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
      if( a2 )
      {
        LODWORD(v28) = NumberOfBytes;
        ObjectProperty = CmGetInstallerClassMappedPropertyFromRegProp(
                           (HPNPCTX *)a1,
                           v19,
                           r8,
                           (_DEVPROPKEY *)arg28,
                           (UINT64 *)((char *)&NumberOfBytes + 4),
                           (UINT8 *)a2,
                           v28,
                           &NumberOfBytes);
        if( ObjectProperty >= 0 )
          goto LABEL_37;
LABEL_45:
        if( P )
          ExFreePoolWithTag(P, 0);
LABEL_47:
        if( v10 )
          ExFreePoolWithTag(v10, 0);
        if( a2 )
          ExFreePoolWithTag(a2, 0);
        if( v34 )
          ExFreePoolWithTag(v34, 0);
        return ObjectProperty;
      }
LABEL_23:
      ObjectProperty = -1073741801;
      goto LABEL_45;
    }
LABEL_44:
    ObjectProperty = -1073741275;
    goto LABEL_45;
  }
  if( HIDWORD(NumberOfBytes) != 8210 || v21 == -1073739509 || !v21 )
    return -1073741275;
  return ObjectProperty;
}

Referenced by:

CmGetInstallerClassCompoundFilters