CmGetMatchingFilteredDeviceInterfaceListWorker

NTSTATUS __stdcall CmGetMatchingFilteredDeviceInterfaceListWorker(
        HPNPCTX *hPnpCtx,
        const WCHAR *ClassGuid,
        const WCHAR *DeviceInstanceId,
        INT64 FilterFlags,
        UINT8 *MatchCallbackRoutine,
        HPNPCTX *a6,
        const WCHAR *a7,
        _CM_OBJECT_TYPE a8,
        VOID *a9,
        VOID *MatchCallbackContext,
        WCHAR *Buffer,
        UINT64 BufferLength,
        UINT64 *RequiredLength,
        UINT64 Flags){
  WCHAR *v17; 
  char v18; 
  int CachedContextBaseKey; 
  __int64 v20; 
  NTSTATUS v21; 
  VOID **PoolWithTag; 
  NTSTATUS v23; 
  void *v24; 
  int v25; 
  unsigned int v26; 
  UINT64 dwFlags; 
  VOID *Handle; 
  INT64 v30; 
  _UNICODE_STRING UnicodeString; 
  _CM_OBJECT_TYPE v33; 

  v30 = 0i64;
  *(_DWORD *)a9 = 0;
  Handle = 0i64;
  v17 = 0i64;
  UnicodeString = 0i64;
  if( a8 )
    *a7 = 0;
  if( (FilterFlags & 0xFFFFFFFE) != 0 || (_WORD)MatchCallbackContext )
    goto LABEL_26;
  v18 = FilterFlags & 1;
  CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(hPnpCtx, PNPCTX_BASE_KEY_TYPE_DEVICECONTAINERS, (VOID **)&v30);
  if( CachedContextBaseKey < 0 )
    goto LABEL_20;
  if( !ClassGuid )
  {
    v33 = CM_OBJECT_TYPE_DEVICE;
    goto LABEL_8;
  }
  if( !PnpIsValidGuidString(ClassGuid) )
  {
LABEL_26:
    CachedContextBaseKey = -1073741811;
    goto LABEL_20;
  }
  v33 = CM_OBJECT_TYPE_DEVICE_INSTALLER_CLASS;
LABEL_8:
  if( hPnpCtx )
    v20 = *((_QWORD *)hPnpCtx + 28);
  else
    v20 = 0i64;
  v21 = SysCtxRegOpenKey(v20, (VOID *)v30, ClassGuid, 0, 8u, &Handle);
  CachedContextBaseKey = v21;
  if( v21 == -1073741444 )
  {
    CachedContextBaseKey = -1073741595;
  }
  else if( v21 >= 0 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x5B8ui64, 1380994640i64);
    v17 = (WCHAR *)PoolWithTag;
    if( PoolWithTag )
    {
      memset((char *)PoolWithTag + 4, 0i64, 0x5B4u);
      LODWORD(dwFlags) = 2304;
      *(_DWORD *)v17 = v33;
      RtlStringCchCopyExW(v17 + 506, 0xC8ui64, (WCHAR *)DeviceInstanceId, 0i64, 0i64, dwFlags);
      *((_QWORD *)v17 + 179) = MatchCallbackRoutine;
      *((_QWORD *)v17 + 180) = a6;
      *((_QWORD *)v17 + 177) = 0i64;
      *((_DWORD *)v17 + 356) = 0;
      *((_BYTE *)v17 + 1428) = v18;
      *((_QWORD *)v17 + 181) = a7;
      *((_DWORD *)v17 + 364) = a8;
      *((_DWORD *)v17 + 365) = 0;
      v23 = PnpCtxRegEnumKeyWithCallback((INT64)hPnpCtx, Handle, (INT64)CmDeviceClassesSubkeyCallback, (INT64)v17);
      v24 = (void *)*((_QWORD *)v17 + 177);
      CachedContextBaseKey = v23;
      if( v24 )
        ExFreePoolWithTag(v24, 0);
      if( CachedContextBaseKey >= 0 )
      {
        v25 = *((_DWORD *)v17 + 365);
        *(_DWORD *)a9 = v25;
        if( v25 )
        {
          v26 = v25 + 1;
          *(_DWORD *)a9 = v26;
          if( a7 && a8 >= v26 )
            a7[v26 - 1] = 0;
          else
            CachedContextBaseKey = -1073741789;
        }
      }
    }
    else
    {
      CachedContextBaseKey = -1073741801;
    }
  }
LABEL_20:
  RtlFreeAnsiString(&UnicodeString);
  if( v17 )
    ExFreePoolWithTag(v17, 0);
  if( Handle )
    ZwClose((_HANDLE)Handle);
  return CachedContextBaseKey;
}

Referenced by:

CmGetMatchingFilteredDeviceInterfaceList