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