PiCMGetObjectPropertyKeys

INT64 __stdcall PiCMGetObjectPropertyKeys(
        PVOID IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        PVOID IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  UINT64 *v5; 
  unsigned int v6; 
  UINT8 *PoolWithTag; 
  int ObjectPropertyKeys; 
  unsigned int v10; 
  int v11; 
  UINT64 v12; 
  unsigned __int64 v13; 
  int v14; 
  unsigned __int64 v16; 
  UINT64 v17; 
  UINT64 ExpectedOutputSize; 
  UINT64 IoctlOutputBufferSizea; 
  INT64 v20[2]; 
  __int128 v21; 
  UINT64 v22; 
  UINT64 *v23; 
  v5 = v23;
  LODWORD(v23) = 0;
  v6 = IoctlOutputBufferSize;
  v22 = 0i64;
  PoolWithTag = 0i64;
  *(_DWORD *)v5 = 0;
  *(_OWORD *)v20 = 0i64;
  v21 = 0i64;
  ObjectPropertyKeys = PiCMCaptureObjectInputData(
                         (UINT64)IoctlInputBuffer,
                         IoctlInputBufferSize,
                         (unsigned int)BytesUsed,
                         (INT64)v20);
  if( ObjectPropertyKeys < 0 )
    goto LABEL_42;
  if( !(_QWORD)v21 || HIDWORD(v20[0]) || HIDWORD(v21) )
  {
    ObjectPropertyKeys = -1073741811;
    goto LABEL_48;
  }
  if( !IoctlOutputBuffer || v6 < 0x14 )
  {
    ObjectPropertyKeys = -1073741811;
    goto LABEL_39;
  }
  v10 = 0;
  if( SLODWORD(v20[1]) > 6 )
  {
    switch( LODWORD(v20[1]) )
    {
      case 0x10001:
        v11 = 7;
        break;
      case 0x10002:
        v11 = 8;
        break;
      case 0x10003:
        v11 = 9;
        break;
      case 0x10004:
        v11 = 10;
        break;
      case 0x10005:
        v11 = 11;
        break;
      default:
        goto LABEL_31;
    }
    v10 = PiDrvDbCtx != 0 ? v11 : 0;
LABEL_31:
    if( !v10 )
      ObjectPropertyKeys = -1073741811;
    goto LABEL_33;
  }
  switch( LODWORD(v20[1]) )
  {
    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( LODWORD(v20[1]) != 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 * (_DWORD)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 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v12, 0x34706E50ui64);
    if( !PoolWithTag )
    {
      ObjectPropertyKeys = -1073741670;
      goto LABEL_39;
    }
    v16 = v13 / 0x14;
  }
  else
  {
    LODWORD(v16) = 0;
  }
  LODWORD(v23) = v16;
  ObjectPropertyKeys = PnpGetObjectPropertyKeys(
                         PiPnpRtlCtx,
                         v21,
                         v10,
                         0i64,
                         v17,
                         0,
                         (__int64)PoolWithTag,
                         v16,
                         (__int64)&v23);
LABEL_48:
  if( ObjectPropertyKeys < 0 )
    goto LABEL_39;
  LODWORD(IoctlOutputBufferSizea) = v6;
  LODWORD(ExpectedOutputSize) = v22;
  LODWORD(v17) = 20 * (_DWORD)v23;
  v14 = PiCMReturnBufferResultData(
          (unsigned int)ObjectPropertyKeys,
          (unsigned int)(20 * (_DWORD)v23),
          0i64,
          PoolWithTag,
          v17,
          ExpectedOutputSize,
          IoctlOutputBuffer,
          IoctlOutputBufferSizea,
          v5);
LABEL_40:
  ObjectPropertyKeys = v14;
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_42:
  PiCMReleaseObjectInputData((INT64)v20);
  return(unsigned int)ObjectPropertyKeys;
}

Referenced by:

No references.