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