PipGetRegistrySecurityWithFallback
PVOID __fastcall PipGetRegistrySecurityWithFallback(__int64 a1, const wchar_t *a2, __int64 a3, __int64 a4, __int64 a5){
bool v8;
void *PoolWithTag;
int DeviceRegProp;
__int64 v11;
int InstallerClassRegProp;
int v14;
PVOID OutputSecurityDescriptor;
SIZE_T NumberOfBytes;
v14 = 0;
OutputSecurityDescriptor = 0i64;
LODWORD(NumberOfBytes) = 128;
v8 = 0;
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x80ui64, 0x6E657050ui64);
if( !PoolWithTag )
return 0i64;
DeviceRegProp = CmGetDeviceRegProp(
PiPnpRtlCtx,
a2,
a3,
24,
(__int64)&v14,
(__int64)PoolWithTag,
(__int64)&NumberOfBytes,
0);
if( DeviceRegProp == -1073741789 )
{
ExFreePoolWithTag(PoolWithTag, 0);
PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)NumberOfBytes, 0x6E657050ui64);
if( !PoolWithTag )
return 0i64;
DeviceRegProp = CmGetDeviceRegProp(
PiPnpRtlCtx,
a2,
a3,
24,
(__int64)&v14,
(__int64)PoolWithTag,
(__int64)&NumberOfBytes,
0);
}
if( DeviceRegProp >= 0
&& v14 == 3
&& RtlValidRelativeSecurityDescriptor(PoolWithTag, (unsigned int)NumberOfBytes, 0i64)
&& SeCaptureSecurityDescriptor(PoolWithTag, 0, PagedPool, 1u, &OutputSecurityDescriptor) >= 0 )
{
v8 = 1;
}
else
{
v11 = a5;
if( a5 )
{
InstallerClassRegProp = CmGetInstallerClassRegProp(
PiPnpRtlCtx,
a4,
a5,
24,
(__int64)&v14,
(__int64)PoolWithTag,
(__int64)&NumberOfBytes);
if( InstallerClassRegProp == -1073741789 )
{
ExFreePoolWithTag(PoolWithTag, 0);
PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)NumberOfBytes, 0x6E657050ui64);
if( !PoolWithTag )
return 0i64;
InstallerClassRegProp = CmGetInstallerClassRegProp(
PiPnpRtlCtx,
a4,
v11,
24,
(__int64)&v14,
(__int64)PoolWithTag,
(__int64)&NumberOfBytes);
}
if( InstallerClassRegProp >= 0 && v14 == 3 )
{
if( RtlValidRelativeSecurityDescriptor(PoolWithTag, (unsigned int)NumberOfBytes, 0i64) )
v8 = SeCaptureSecurityDescriptor(PoolWithTag, 0, PagedPool, 1u, &OutputSecurityDescriptor) >= 0;
}
}
}
ExFreePoolWithTag(PoolWithTag, 0);
if( !v8 )
return 0i64;
return OutputSecurityDescriptor;
}Referenced by:
PipChangeDeviceObjectFromRegistryProperties