PiCMGetDeviceIdList

NTSTATUS __stdcall PiCMGetDeviceIdList(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        VOID *IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  UINT64 *v5; 
  unsigned int v6; 
  VOID **PoolWithTag; 
  INT64 v9; 
  __int64 v10; 
  int v11; 
  INT64 v12; 
  unsigned __int16 v13; 
  unsigned int v14; 
  unsigned int v15; 
  NTSTATUS DeviceRelationsList; 
  int v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  NTSTATUS v20; 
  const WCHAR *v22; 
  UINT64 v23; 
  UINT64 BufferSize; 
  UINT64 ExpectedOutputSize; 
  UINT64 v26; 
  UINT64 IoctlOutputBufferSizea; 
  UINT64 *v28; 
  WCHAR *v29; 
  UINT64 v30; 
  _CMAPI_DEVICE_LIST_FILTER CmapiFilter[4]; 
  UINT64 v32; 
  _SECURITY_SUBJECT_CONTEXT SubjectContext; 
  UINT64 *v34; 

  v5 = v34;
  v30 = 0i64;
  v6 = IoctlOutputBufferSize;
  *(_DWORD *)v34 = 0;
  memset(&SubjectContext, 0, sizeof(SubjectContext));
  v32 = 0i64;
  PoolWithTag = 0i64;
  *(_OWORD *)CmapiFilter = 0i64;
  v11 = PiCMCaptureDeviceListInputData(
          IoctlInputBuffer,
          IoctlInputBufferSize,
          (_CMAPI_INPUT_DEVICE_LIST_DATA *)(unsigned int)BytesUsed);
  if( v11 < 0 )
    goto LABEL_22;
  v13 = CmapiFilter[1];
  if( (byte_140C130BB & 2) != 0 )
  {
    if( LOWORD(CmapiFilter[1]) )
    {
      switch( LOWORD(CmapiFilter[1]) )
      {
        case 1u:
          v22 = L"Enum";
          break;
        case 2u:
          v22 = L"Service";
          break;
        case 4u:
          v22 = L"EjectRelations";
          break;
        case 8u:
          v22 = L"RemovalRelations";
          break;
        case 0x10u:
          v22 = L"PowerRelations";
          break;
        case 0x20u:
          v22 = L"BusRelations";
          break;
        case 0x40u:
          v22 = L"TransportRelations";
          break;
        case 0x80u:
          v22 = L"Class";
          break;
        default:
          v22 = L"Unknown";
          break;
      }
    }
    else
    {
      v22 = (const WCHAR *)L"None";
    }
    McTemplateK0zzt_EtwWriteTransfer(
      (INT64)v22,
      v9,
      v12,
      *(const WCHAR **)&CmapiFilter[2],
      v22,
      BYTE2(CmapiFilter[1]) & 1);
  }
  if( !IoctlOutputBuffer || v6 < 0x14 )
  {
    DeviceRelationsList = -1073741811;
LABEL_18:
    if( DeviceRelationsList >= 0 )
    {
      LODWORD(IoctlOutputBufferSizea) = v6;
      LODWORD(ExpectedOutputSize) = HIDWORD(v32);
      LODWORD(BufferSize) = 2 * v30;
      v20 = PiCMReturnBufferResultData(
              (unsigned int)DeviceRelationsList,
              (unsigned int)(2 * v30),
              0i64,
              PoolWithTag,
              BufferSize,
              ExpectedOutputSize,
              IoctlOutputBuffer,
              IoctlOutputBufferSizea,
              v5);
      goto LABEL_20;
    }
    goto LABEL_28;
  }
  v14 = 0;
  if( v6 - 20 >= 2 )
    v14 = v6 - 20;
  if( v14 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, v14, 879783504i64);
    if( !PoolWithTag )
    {
      DeviceRelationsList = -1073741670;
      goto LABEL_28;
    }
    v15 = v14 >> 1;
  }
  else
  {
    v15 = 0;
  }
  LODWORD(v30) = v15;
  DeviceRelationsList = PiCMConvertDeviceListFilters(CmapiFilter[1], (_CM_DEVICE_LIST_FILTER *)&v30 + 1);
  if( DeviceRelationsList >= 0 )
  {
    v18 = (unsigned int)v13 - 4;
    if( (unsigned int)v18 <= 0x3C && (v19 = 0x1000000010001011i64, _bittest64(&v19, v18)) )
    {
      if( !*(_QWORD *)&CmapiFilter[2] )
      {
        DeviceRelationsList = -1073741811;
        goto LABEL_28;
      }
      v23 = HIDWORD(v30);
      LODWORD(v23) = HIDWORD(v30) & 0xFFFFFEFF;
      LODWORD(BufferSize) = v17;
      DeviceRelationsList = CmGetDeviceRelationsList(
                              *(&stru_140CF2E80 + 607),
                              *(const WCHAR **)&CmapiFilter[2],
                              v23,
                              (WCHAR *)PoolWithTag,
                              BufferSize,
                              &v30,
                              v26);
      if( DeviceRelationsList < 0 )
        goto LABEL_28;
    }
    else
    {
      SeCaptureSubjectContext((INT64)&SubjectContext);
      DeviceRelationsList = CmGetMatchingFilteredDeviceList(
                              *(&stru_140CF2E80 + 607),
                              *(const WCHAR **)&CmapiFilter[2],
                              SHIDWORD(v30),
                              (UINT8 *)PiCMMandatoryFilterCallback,
                              (HPNPCTX *)&SubjectContext,
                              (const WCHAR *)PoolWithTag,
                              (_CM_OBJECT_TYPE)v30,
                              &v30,
                              v28,
                              v29,
                              v30,
                              *(UINT64 **)CmapiFilter,
                              *(UINT64 *)&CmapiFilter[2]);
      SeReleaseSubjectContext(&SubjectContext);
      if( DeviceRelationsList < 0 )
      {
LABEL_17:
        v5 = v34;
        goto LABEL_18;
      }
    }
    if( !(_DWORD)v30 )
    {
      LODWORD(v30) = 1;
      if( v14 < 2 )
      {
        DeviceRelationsList = -1073741789;
        goto LABEL_28;
      }
      *(_WORD *)PoolWithTag = 0;
    }
    goto LABEL_17;
  }
LABEL_28:
  LODWORD(IoctlOutputBufferSizea) = v6;
  LODWORD(ExpectedOutputSize) = HIDWORD(v32);
  LODWORD(BufferSize) = 0;
  v20 = PiCMReturnBufferResultData(
          (unsigned int)DeviceRelationsList,
          (unsigned int)(2 * v30),
          0i64,
          0i64,
          BufferSize,
          ExpectedOutputSize,
          IoctlOutputBuffer,
          IoctlOutputBufferSizea,
          v34);
LABEL_20:
  v11 = v20;
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_22:
  if( *(_QWORD *)&CmapiFilter[2] )
    PiControlFreeUserModeCallersBuffer(KeGetCurrentThread()->PreviousMode, *(PVOID *)&CmapiFilter[2]);
  if( (byte_140C130BB & 2) != 0 )
    McTemplateK0d_EtwWriteTransfer(v10, (const _EVENT_DESCRIPTOR *)&CmFcpWnfTypeId.TypeId[7], v12, v11);
  return v11;
}

Referenced by:

PiCMHandleIoctl