PiCMGetObjectList

NTSTATUS __stdcall PiCMGetObjectList(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        VOID *IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  UINT64 *v5; 
  unsigned int v6; 
  VOID **PoolWithTag; 
  NTSTATUS ObjectList; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  int v15; 
  NTSTATUS v16; 
  UINT64 BufferSize; 
  UINT64 ExpectedOutputSize; 
  UINT64 IoctlOutputBufferSizea; 
  _CMAPI_INPUT_OBJECT_DATA ObjectData[4]; 
  __int128 v22; 
  UINT64 v23; 
  UINT64 *v24; 

  v5 = v24;
  LODWORD(v24) = 0;
  v6 = IoctlOutputBufferSize;
  v23 = 0i64;
  PoolWithTag = 0i64;
  *(_DWORD *)v5 = 0;
  *(_OWORD *)ObjectData = 0i64;
  v22 = 0i64;
  ObjectList = PiCMCaptureObjectInputData(
                 IoctlInputBuffer,
                 IoctlInputBufferSize,
                 (_CMAPI_INPUT_OBJECT_DATA *)(unsigned int)BytesUsed);
  if( ObjectList < 0 )
    goto LABEL_23;
  if( (_QWORD)v22 || __PAIR64__(DWORD2(v22), 0) != ObjectData[1] || HIDWORD(v22) )
  {
    ObjectList = -1073741811;
    goto LABEL_19;
  }
  if( !IoctlOutputBuffer || v6 < 0x14 )
  {
LABEL_46:
    ObjectList = -1073741811;
    goto LABEL_25;
  }
  v11 = (unsigned int)ObjectData[2];
  v12 = 1i64;
  v13 = 0;
  if( ObjectData[2] <= 6 )
  {
    if( ObjectData[2] == 6 )
    {
      v13 = 6;
      goto LABEL_12;
    }
    v11 = (unsigned int)(ObjectData[2] - 1);
    if( ObjectData[2] == 1 )
    {
      v13 = 1;
      ObjectList = -1073741637;
      goto LABEL_12;
    }
    v11 = (unsigned int)(ObjectData[2] - 2);
    if( ObjectData[2] == 2 )
    {
      v13 = 2;
      goto LABEL_12;
    }
    v11 = (unsigned int)(ObjectData[2] - 3);
    if( ObjectData[2] == 3 )
    {
      v13 = 4;
      goto LABEL_12;
    }
    v11 = (unsigned int)(ObjectData[2] - 4);
    if( ObjectData[2] == 4 )
    {
      v13 = 3;
      goto LABEL_12;
    }
    if( ObjectData[2] == 5 )
    {
      v13 = 5;
      goto LABEL_12;
    }
  }
  else
  {
    switch( ObjectData[2] )
    {
      case 65537:
        v11 = 7i64;
LABEL_10:
        v13 = *(&stru_140CF2E80 + 608) != 0i64 ? v11 : 0;
        goto LABEL_11;
      case 65538:
        v11 = 8i64;
        goto LABEL_10;
      case 65539:
        v11 = 9i64;
        goto LABEL_10;
    }
    v11 = (unsigned int)(ObjectData[2] - 65540);
    if( ObjectData[2] == 65540 )
    {
      v11 = 10i64;
      goto LABEL_10;
    }
    if( ObjectData[2] == 65541 )
    {
      v11 = 11i64;
      goto LABEL_10;
    }
  }
LABEL_11:
  if( !v13 )
    goto LABEL_46;
LABEL_12:
  if( ObjectList < 0 )
    goto LABEL_25;
  v14 = 0;
  if( v6 - 20 >= 2 )
    v14 = v6 - 20;
  if( v14 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, v14, 879783504i64);
    if( !PoolWithTag )
    {
      ObjectList = -1073741670;
      goto LABEL_25;
    }
    v15 = v14 >> 1;
  }
  else
  {
    v15 = 0;
  }
  LODWORD(v24) = v15;
  ObjectList = PnpGetObjectList(v11, v13, v10, v12, (INT64)PoolWithTag, v15, (INT64)&v24, 0);
LABEL_19:
  if( ObjectList >= 0 )
  {
    LODWORD(IoctlOutputBufferSizea) = v6;
    LODWORD(ExpectedOutputSize) = v23;
    LODWORD(BufferSize) = 2 * (_DWORD)v24;
    v16 = PiCMReturnBufferResultData(
            (unsigned int)ObjectList,
            (unsigned int)(2 * (_DWORD)v24),
            0i64,
            PoolWithTag,
            BufferSize,
            ExpectedOutputSize,
            IoctlOutputBuffer,
            IoctlOutputBufferSizea,
            v5);
    goto LABEL_21;
  }
LABEL_25:
  LODWORD(IoctlOutputBufferSizea) = v6;
  LODWORD(ExpectedOutputSize) = v23;
  LODWORD(BufferSize) = 0;
  v16 = PiCMReturnBufferResultData(
          (unsigned int)ObjectList,
          (unsigned int)(2 * (_DWORD)v24),
          0i64,
          0i64,
          BufferSize,
          ExpectedOutputSize,
          IoctlOutputBuffer,
          IoctlOutputBufferSizea,
          v5);
LABEL_21:
  ObjectList = v16;
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_23:
  PiCMReleaseObjectInputData(ObjectData);
  return ObjectList;
}

Referenced by:

PiCMHandleIoctl