CmGetDeviceCompoundFiltersWorker

NTSTATUS __stdcall CmGetDeviceCompoundFiltersWorker(
        INT64 a1,
        WCHAR *rdx0,
        INT64 a3,
        VOID *r9,
        INT64 arg20,
        INT64 arg28,
        INT64 a7,
        WCHAR *a4,
        INT64 a9,
        INT64 a10){
  WCHAR *v13; 
  VOID **v14; 
  VOID **v15; 
  __int64 v16; 
  __int64 *v17; 
  __int64 *v18; 
  __int64 *v19; 
  VOID **PoolWithTag; 
  int ObjectProperty; 
  _REPARSE_DATA_BUFFER *v22; 
  int v23; 
  NTSTATUS v24; 
  VOID **v25; 
  int v26; 
  char *a5; 
  INT64 a6; 
  INT64 v30; 
  INT64 v31; 
  UINT64 NumberOfBytes; 
  INT64 v33; 
  PVOID P; 
  INT64 v35; 
  WCHAR *a2; 

  LODWORD(v33) = 0;
  v13 = 0i64;
  v14 = 0i64;
  a2 = 0i64;
  v15 = 0i64;
  P = 0i64;
  NumberOfBytes = 0i64;
  if( (int)PnpCtxRegQueryInfoKey(0i64, r9, &v33, 0i64, 0i64, 0i64, 0i64) < 0 || !(_DWORD)v33 )
    goto LABEL_46;
  if( *(_DWORD *)(arg20 + 16) != 22 )
    goto LABEL_8;
  v16 = *(_QWORD *)arg20 - DEVPKEY_Device_CompoundUpperFilters;
  if( *(_QWORD *)arg20 == DEVPKEY_Device_CompoundUpperFilters )
    v16 = *(_QWORD *)(arg20 + 8) - 0x293B573F92A15394i64;
  if( v16 )
  {
LABEL_8:
    v17 = DEVPKEY_Device_LowerFilterCache;
    v18 = DEVPKEY_Device_LowerFilterLevels;
    v19 = DEVPKEY_Device_LowerFilterDefaultLevel;
    v13 = L"*Lower";
  }
  else
  {
    v17 = (__int64 *)&DEVPKEY_Device_UpperFilterCache;
    v18 = DEVPKEY_Device_UpperFilterLevels;
    v19 = (__int64 *)&DEVPKEY_Device_UpperFilterDefaultLevel;
    v13 = (WCHAR *)L"*Upper";
  }
  v33 = (INT64)v18;
  v35 = (INT64)v17;
  if( PnpGetObjectProperty(a1, (INT64)rdx0, 1i64, a3, 0i64, (INT64)v17, (INT64)&NumberOfBytes + 4, 0i64) == -1073741789
    && HIDWORD(NumberOfBytes) == 8210 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
    v15 = PoolWithTag;
    if( !PoolWithTag )
      return -1073741801;
    ObjectProperty = PnpGetObjectProperty(
                       a1,
                       (INT64)rdx0,
                       1i64,
                       a3,
                       0i64,
                       v35,
                       (INT64)&NumberOfBytes + 4,
                       (INT64)PoolWithTag);
    if( ObjectProperty < 0 )
      goto LABEL_50;
    v22 = (_REPARSE_DATA_BUFFER *)a3;
LABEL_15:
    a5 = (char *)&NumberOfBytes + 4;
    CmGetDeviceMappedPropertyFromRegProp((_IRP *)a1, (_FILE_OBJECT *)rdx0, v22);
    ObjectProperty = v23;
    if( v23 == -1073741275 )
    {
      LODWORD(NumberOfBytes) = 0;
      goto LABEL_39;
    }
    if( v23 != -1073741789 )
    {
LABEL_47:
      if( v14 && v14 != (VOID **)v13 )
        ExFreePoolWithTag(v14, 0);
LABEL_50:
      if( v15 )
        ExFreePoolWithTag(v15, 0);
      if( a2 )
        ExFreePoolWithTag(a2, 0);
      if( P )
        ExFreePoolWithTag(P, 0);
      return ObjectProperty;
    }
    if( !(_DWORD)NumberOfBytes || !(_DWORD)a9 )
    {
LABEL_39:
      LODWORD(a5) = a9;
      ObjectProperty = CmMergeFilterLists((WCHAR *)v15, a2, v13, a4, (INT64)a5, a10);
      if( (int)(ObjectProperty + 0x80000000) < 0 || ObjectProperty == -1073741789 )
        *(_DWORD *)a7 = 8210;
      goto LABEL_47;
    }
    a2 = (WCHAR *)ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
    if( a2 )
    {
      a5 = (char *)&NumberOfBytes + 4;
      CmGetDeviceMappedPropertyFromRegProp((_IRP *)a1, (_FILE_OBJECT *)rdx0, v22);
      ObjectProperty = v26;
      if( v26 >= 0 )
        goto LABEL_39;
      goto LABEL_47;
    }
LABEL_23:
    ObjectProperty = -1073741801;
    goto LABEL_47;
  }
  v24 = PnpGetObjectProperty(a1, (INT64)rdx0, 1i64, a3, 0i64, (INT64)v19, (INT64)&NumberOfBytes + 4, 0i64);
  ObjectProperty = v24;
  if( v24 == -1073741789 )
  {
    if( HIDWORD(NumberOfBytes) == 18 )
    {
      v14 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
      if( !v14 )
        return -1073741801;
      a6 = (INT64)v19;
      v22 = (_REPARSE_DATA_BUFFER *)a3;
      ObjectProperty = PnpGetObjectProperty(a1, (INT64)rdx0, 1i64, a3, 0i64, a6, (INT64)&NumberOfBytes + 4, (INT64)v14);
      if( ObjectProperty < 0 )
        goto LABEL_47;
      if( PnpGetObjectProperty(a1, (INT64)rdx0, 1i64, a3, 0i64, v33, (INT64)&NumberOfBytes + 4, 0i64) == -1073741789 )
      {
        v25 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
        P = v25;
        if( !v25 )
          goto LABEL_23;
        ObjectProperty = PnpGetObjectProperty(
                           a1,
                           (INT64)rdx0,
                           1i64,
                           a3,
                           0i64,
                           v33,
                           (INT64)&NumberOfBytes + 4,
                           (INT64)v25);
        if( ObjectProperty < 0 )
          goto LABEL_47;
        goto LABEL_28;
      }
LABEL_46:
      ObjectProperty = -1073741275;
      goto LABEL_47;
    }
  }
  else if( v24 == -1073741275 )
  {
    v22 = (_REPARSE_DATA_BUFFER *)a3;
    v14 = (VOID **)v13;
LABEL_28:
    LODWORD(v30) = 0;
    ObjectProperty = CmGetDeclarativeFilterList(
                       a1,
                       (INT64)r9,
                       (const WCHAR *)P,
                       (const WCHAR *)v14,
                       v13,
                       0i64,
                       v30,
                       &NumberOfBytes);
    if( !ObjectProperty )
      ObjectProperty = -1073741762;
    if( ObjectProperty != -1073741789 )
      goto LABEL_47;
    v15 = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1380994640i64);
    if( !v15 )
      goto LABEL_23;
    LODWORD(v31) = NumberOfBytes;
    ObjectProperty = CmGetDeclarativeFilterList(
                       a1,
                       (INT64)r9,
                       (const WCHAR *)P,
                       (const WCHAR *)v14,
                       v13,
                       v15,
                       v31,
                       &NumberOfBytes);
    if( ObjectProperty < 0 )
      goto LABEL_47;
    PnpSetObjectProperty(a1, (INT64)rdx0, 1u, (INT64)v22, 0i64, v35, 8210, (__int64)v15, NumberOfBytes, 0);
    goto LABEL_15;
  }
  if( HIDWORD(NumberOfBytes) != 8210 || v24 == -1073739509 || !v24 )
    return -1073741275;
  return ObjectProperty;
}

Referenced by:

CmGetDeviceCompoundFilters