PiCMGetRegistryProperty

NTSTATUS __stdcall PiCMGetRegistryProperty(
        PVOID IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        PVOID IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize,
        UINT64 *BytesUsed){
  UINT64 *v5; 
  unsigned int v6; 
  VOID **PoolWithTag; 
  int v9; 
  NTSTATUS DeviceRegProp; 
  NTSTATUS v11; 
  UINT64 *CmRegPropType; 
  UINT8 *PropertyBuffer; 
  UINT64 IoctlOutputBufferSizea; 
  UINT64 Type; 
  _CMAPI_INPUT_REGISTRY_PROPERTY_DATA RegistryPropertyData[4]; 
  _CMAPI_REG_PROP CmapiRegistryProperty[4]; 
  __int128 v19; 
  UINT64 ExpectedOutputSize; 
  UINT64 BufferSize; 

  v5 = (UINT64 *)BufferSize;
  Type = 0i64;
  v6 = IoctlOutputBufferSize;
  LODWORD(BufferSize) = 0;
  *(_DWORD *)v5 = 0;
  PoolWithTag = 0i64;
  *(_OWORD *)RegistryPropertyData = 0i64;
  ExpectedOutputSize = 0i64;
  *(_OWORD *)CmapiRegistryProperty = 0i64;
  v19 = 0i64;
  v9 = PiCMCaptureRegistryPropertyInputData(
         IoctlInputBuffer,
         IoctlInputBufferSize,
         (unsigned int)BytesUsed,
         RegistryPropertyData);
  if( v9 < 0 )
    goto LABEL_21;
  if( *(_QWORD *)CmapiRegistryProperty
    && !RegistryPropertyData[1]
    && !*((_QWORD *)&v19 + 1)
    && !(_DWORD)ExpectedOutputSize
    && !(_DWORD)v19 )
  {
    if( !IoctlOutputBuffer || v6 < 0x14 )
    {
      v9 = -1073741811;
      goto LABEL_22;
    }
    if( v6 != 20 )
    {
      PoolWithTag = ExAllocatePoolWithTag(1ui64, v6 - 20, 879783504i64);
      if( !PoolWithTag )
        v9 = -1073741670;
    }
    if( v9 < 0 )
      goto LABEL_22;
    v9 = PiCMConvertRegistryProperty(CmapiRegistryProperty[3], (_CM_REG_PROP *)&Type + 1);
    if( v9 < 0 )
      goto LABEL_22;
    LODWORD(BufferSize) = v6 - 20;
    if( RegistryPropertyData[2] == 1 )
    {
      LODWORD(IoctlOutputBufferSizea) = 0;
      DeviceRegProp = CmGetDeviceRegProp(
                        *(&stru_140CF2E80 + 607),
                        *(const WCHAR **)CmapiRegistryProperty,
                        0i64,
                        HIDWORD(Type),
                        &Type,
                        (UINT8 *)PoolWithTag,
                        &BufferSize,
                        IoctlOutputBufferSizea);
LABEL_16:
      v9 = DeviceRegProp;
      goto LABEL_17;
    }
    if( RegistryPropertyData[2] == 2 )
    {
      DeviceRegProp = CmGetInstallerClassRegProp(
                        *(&stru_140CF2E80 + 607),
                        *(const WCHAR **)CmapiRegistryProperty,
                        0i64,
                        HIDWORD(Type),
                        &Type,
                        (UINT8 *)PoolWithTag,
                        &BufferSize,
                        IoctlOutputBufferSizea);
      goto LABEL_16;
    }
  }
  v9 = -1073741811;
LABEL_17:
  if( v9 >= 0 )
  {
    LODWORD(IoctlOutputBufferSizea) = v6;
    LODWORD(PropertyBuffer) = HIDWORD(ExpectedOutputSize);
    LODWORD(CmRegPropType) = BufferSize;
    v11 = PiCMReturnBufferResultData(
            (unsigned int)v9,
            (unsigned int)BufferSize,
            (unsigned int)Type,
            PoolWithTag,
            (UINT64)CmRegPropType,
            (UINT64)PropertyBuffer,
            IoctlOutputBuffer,
            IoctlOutputBufferSizea,
            v5);
    goto LABEL_19;
  }
LABEL_22:
  LODWORD(IoctlOutputBufferSizea) = v6;
  LODWORD(PropertyBuffer) = HIDWORD(ExpectedOutputSize);
  LODWORD(CmRegPropType) = 0;
  v11 = PiCMReturnBufferResultData(
          (unsigned int)v9,
          (unsigned int)BufferSize,
          (unsigned int)Type,
          0i64,
          (UINT64)CmRegPropType,
          (UINT64)PropertyBuffer,
          IoctlOutputBuffer,
          IoctlOutputBufferSizea,
          v5);
LABEL_19:
  v9 = v11;
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
LABEL_21:
  PiCMReleaseRegistryPropertyInputData(RegistryPropertyData);
  return v9;
}

Referenced by:

PiCMHandleIoctl