PiCMGetObjectList

NTSTATUS __stdcall PiCMGetObjectList(
        PVOID IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        PVOID IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  UINT64 *v5; 
  unsigned int v6; 
  UINT8 *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; 
  INT64 v21[2]; 
  __int128 v22; 
  UINT64 v23; 
  UINT64 *v24; 
  v5 = v24;
  LODWORD(v24) = 0;
  v6 = IoctlOutputBufferSize;
  v23 = 0i64;
  PoolWithTag = 0i64;
  *(_DWORD *)v5 = 0;
  *(_OWORD *)v21 = 0i64;
  v22 = 0i64;
  ObjectList = PiCMCaptureObjectInputData(
                 (UINT64)IoctlInputBuffer,
                 IoctlInputBufferSize,
                 (unsigned int)BytesUsed,
                 (INT64)v21);
  if( ObjectList < 0 )
    goto LABEL_23;
  if( (_QWORD)v22 || __PAIR64__(DWORD2(v22), 0) != HIDWORD(v21[0]) || HIDWORD(v22) )
  {
    ObjectList = -1073741811;
    goto LABEL_19;
  }
  if( !IoctlOutputBuffer || v6 < 0x14 )
  {
LABEL_46:
    ObjectList = -1073741811;
    goto LABEL_25;
  }
  v11 = LODWORD(v21[1]);
  v12 = 1i64;
  v13 = 0;
  if( SLODWORD(v21[1]) <= 6 )
  {
    if( LODWORD(v21[1]) == 6 )
    {
      v13 = 6;
      goto LABEL_12;
    }
    v11 = (unsigned int)(LODWORD(v21[1]) - 1);
    if( LODWORD(v21[1]) == 1 )
    {
      v13 = 1;
      ObjectList = -1073741637;
      goto LABEL_12;
    }
    v11 = (unsigned int)(LODWORD(v21[1]) - 2);
    if( LODWORD(v21[1]) == 2 )
    {
      v13 = 2;
      goto LABEL_12;
    }
    v11 = (unsigned int)(LODWORD(v21[1]) - 3);
    if( LODWORD(v21[1]) == 3 )
    {
      v13 = 4;
      goto LABEL_12;
    }
    v11 = (unsigned int)(LODWORD(v21[1]) - 4);
    if( LODWORD(v21[1]) == 4 )
    {
      v13 = 3;
      goto LABEL_12;
    }
    if( LODWORD(v21[1]) == 5 )
    {
      v13 = 5;
      goto LABEL_12;
    }
  }
  else
  {
    switch( LODWORD(v21[1]) )
    {
      case 0x10001:
        v11 = 7i64;
LABEL_10:
        v13 = PiDrvDbCtx != 0 ? v11 : 0;
        goto LABEL_11;
      case 0x10002:
        v11 = 8i64;
        goto LABEL_10;
      case 0x10003:
        v11 = 9i64;
        goto LABEL_10;
    }
    v11 = (unsigned int)(LODWORD(v21[1]) - 65540);
    if( LODWORD(v21[1]) == 65540 )
    {
      v11 = 10i64;
      goto LABEL_10;
    }
    if( LODWORD(v21[1]) == 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 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v14, 0x34706E50ui64);
    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((INT64)v21);
  return ObjectList;
}

Referenced by:

No references.