PipGetRegistrySecurityWithFallback
VOID *__stdcall PipGetRegistrySecurityWithFallback(
WCHAR *DeviceInstanceId,
VOID *DeviceInstanceKey,
WCHAR *ClassGuid,
VOID *InstallerClassKey){
bool v7;
VOID **PoolWithTag;
NTSTATUS DeviceRegProp;
VOID *v10;
NTSTATUS InstallerClassRegProp;
UINT8 *PropertyBuffer;
UINT8 *PropertyBuffera;
UINT64 *PropertySize;
UINT64 *PropertySizea;
UINT64 v17;
UINT64 v18;
UINT64 v19;
UINT64 CmRegPropType;
VOID *OutputSecurityDescriptor;
UINT64 NumberOfBytes;
VOID *BaseKeyHandle;
LODWORD(CmRegPropType) = 0;
OutputSecurityDescriptor = 0i64;
LODWORD(NumberOfBytes) = 128;
v7 = 0;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x80ui64, 1852141648i64);
if( !PoolWithTag )
return 0i64;
LODWORD(v17) = 0;
DeviceRegProp = CmGetDeviceRegProp(
*(&stru_140CF2E80 + 607),
(const WCHAR *)DeviceInstanceKey,
ClassGuid,
24i64,
&CmRegPropType,
(UINT8 *)PoolWithTag,
&NumberOfBytes,
v17);
if( DeviceRegProp == -1073741789 )
{
ExFreePoolWithTag(PoolWithTag, 0);
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1852141648i64);
if( !PoolWithTag )
return 0i64;
LODWORD(v18) = 0;
DeviceRegProp = CmGetDeviceRegProp(
*(&stru_140CF2E80 + 607),
(const WCHAR *)DeviceInstanceKey,
ClassGuid,
24i64,
&CmRegPropType,
(UINT8 *)PoolWithTag,
&NumberOfBytes,
v18);
}
if( DeviceRegProp >= 0
&& (_DWORD)CmRegPropType == 3
&& RtlValidRelativeSecurityDescriptor((INT64)PoolWithTag, (unsigned int)NumberOfBytes, 0)
&& SeCaptureSecurityDescriptor(
PoolWithTag,
0,
PagedPool,
1u,
&OutputSecurityDescriptor,
(INT64)PropertyBuffer,
(INT64)PropertySize) >= 0 )
{
v7 = 1;
}
else
{
v10 = BaseKeyHandle;
if( BaseKeyHandle )
{
InstallerClassRegProp = CmGetInstallerClassRegProp(
*(&stru_140CF2E80 + 607),
(const WCHAR *)InstallerClassKey,
BaseKeyHandle,
24i64,
&CmRegPropType,
(UINT8 *)PoolWithTag,
&NumberOfBytes,
v18);
if( InstallerClassRegProp == -1073741789 )
{
ExFreePoolWithTag(PoolWithTag, 0);
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)NumberOfBytes, 1852141648i64);
if( !PoolWithTag )
return 0i64;
InstallerClassRegProp = CmGetInstallerClassRegProp(
*(&stru_140CF2E80 + 607),
(const WCHAR *)InstallerClassKey,
v10,
24i64,
&CmRegPropType,
(UINT8 *)PoolWithTag,
&NumberOfBytes,
v19);
}
if( InstallerClassRegProp >= 0 && (_DWORD)CmRegPropType == 3 )
{
if( RtlValidRelativeSecurityDescriptor((INT64)PoolWithTag, (unsigned int)NumberOfBytes, 0) )
v7 = SeCaptureSecurityDescriptor(
PoolWithTag,
0,
PagedPool,
1u,
&OutputSecurityDescriptor,
(INT64)PropertyBuffera,
(INT64)PropertySizea) >= 0;
}
}
}
ExFreePoolWithTag(PoolWithTag, 0);
if( !v7 )
return 0i64;
return OutputSecurityDescriptor;
}Referenced by:
PipChangeDeviceObjectFromRegistryProperties