PiCMGetObjectPropertyKeys

NTSTATUS __stdcall PiCMGetObjectPropertyKeys(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        VOID *IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  UINT64 *v5; 
  unsigned int v6; 
  VOID **PoolWithTag; 
  int ObjectPropertyKeys; 
  unsigned int v10; 
  int v11; 
  UINT64 v12; 
  unsigned __int64 v13; 
  NTSTATUS v14; 
  unsigned __int64 v16; 
  UINT64 v17; 
  UINT64 ExpectedOutputSize; 
  UINT64 IoctlOutputBufferSizea; 
  _CMAPI_INPUT_OBJECT_DATA ObjectData[4]; 
  INT64 v21[2]; 
  UINT64 v22; 
  INT64 v23; 

  v5 = (UINT64 *)v23;
  LODWORD(v23) = 0;
  v6 = IoctlOutputBufferSize;
  v22 = 0i64;
  PoolWithTag = 0i64;
  *(_DWORD *)v5 = 0;
  *(_OWORD *)ObjectData = 0i64;
  *(_OWORD *)v21 = 0i64;
  ObjectPropertyKeys = PiCMCaptureObjectInputData(
                         IoctlInputBuffer,
                         IoctlInputBufferSize,
                         (_CMAPI_INPUT_OBJECT_DATA *)(unsigned int)BytesUsed);
  if( ObjectPropertyKeys < 0 )
    goto LABEL_42;
  if( !v21[0] || ObjectData[1] || HIDWORD(v21[1]) )
  {
    ObjectPropertyKeys = -1073741811;
    goto LABEL_48;
  }
  if( !IoctlOutputBuffer || v6 < 0x14 )
  {
    ObjectPropertyKeys = -1073741811;
    goto LABEL_39;
  }
  v10 = 0;
  if( ObjectData[2] > 6 )
  {
    switch( ObjectData[2] )
    {
      case 65537:
        v11 = 7;
        break;
      case 65538:
        v11 = 8;
        break;
      case 65539:
        v11 = 9;
        break;
      case 65540:
        v11 = 10;
        break;
      case 65541:
        v11 = 11;
        break;
      default:
        goto LABEL_31;
    }
    v10 = *(&stru_140CF2E80 + 608) != 0i64 ? v11 : 0;
LABEL_31:
    if( !v10 )
      ObjectPropertyKeys = -1073741811;
    goto LABEL_33;
  }
  switch( ObjectData[2] )
  {
    case 6:
      v10 = 6;
      goto LABEL_33;
    case 1:
      v10 = 1;
      goto LABEL_33;
    case 2:
      v10 = 2;
      goto LABEL_33;
    case 3:
      v10 = 4;
      goto LABEL_33;
    case 4:
      v10 = 3;
      goto LABEL_33;
  }
  if( ObjectData[2] != 5 )
    goto LABEL_31;
  v10 = 5;
LABEL_33:
  if( ObjectPropertyKeys < 0 )
  {
LABEL_39:
    LODWORD(IoctlOutputBufferSizea) = v6;
    LODWORD(ExpectedOutputSize) = v22;
    LODWORD(v17) = 0;
    v14 = PiCMReturnBufferResultData(
            (unsigned int)ObjectPropertyKeys,
            (unsigned int)(20 * v23),
            0i64,
            0i64,
            v17,
            ExpectedOutputSize,
            IoctlOutputBuffer,
            IoctlOutputBufferSizea,
            v5);
    goto LABEL_40;
  }
  v12 = 0i64;
  if( v6 - 20 >= 0x14 )
    v12 = v6 - 20;
  if( (_DWORD)v12 )
  {
    v13 = (unsigned int)v12;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, v12, 879783504i64);
    if( !PoolWithTag )
    {
      ObjectPropertyKeys = -1073741670;
      goto LABEL_39;
    }
    v16 = v13 / 0x14;
  }
  else
  {
    LODWORD(v16) = 0;
  }
  LODWORD(IoctlOutputBufferSizea) = v16;
  LODWORD(v23) = v16;
  ObjectPropertyKeys = PnpGetObjectPropertyKeys(
                         *(&stru_140CF2E80 + 607),
                         v21[0],
                         v10,
                         0i64,
                         v17,
                         0,
                         (INT64)PoolWithTag,
                         IoctlOutputBufferSizea,
                         (INT64)&v23);
LABEL_48:
  if( ObjectPropertyKeys < 0 )
    goto LABEL_39;
  LODWORD(IoctlOutputBufferSizea) = v6;
  LODWORD(ExpectedOutputSize) = v22;
  LODWORD(v17) = 20 * v23;
  v14 = PiCMReturnBufferResultData(
          (unsigned int)ObjectPropertyKeys,
          (unsigned int)(20 * v23),
          0i64,
          PoolWithTag,
          v17,
          ExpectedOutputSize,
          IoctlOutputBuffer,
          IoctlOutputBufferSizea,
          v5);
LABEL_40:
  ObjectPropertyKeys = v14;
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_42:
  PiCMReleaseObjectInputData(ObjectData);
  return ObjectPropertyKeys;
}

Referenced by:

PiCMHandleIoctl