CmGetInstallerClassRegPropWorker

NTSTATUS __stdcall CmGetInstallerClassRegPropWorker(
        HPNPCTX *hPnpCtx,
        WCHAR *ClassGuid,
        VOID *BaseKeyHandle,
        _CM_REG_PROP CmRegProp,
        UINT64 *CmRegPropType,
        UINT8 *PropertyBuffer,
        UINT64 *PropertySize,
        UINT64 Flags){
  NTSTATUS v8; 
  VOID *v10; 
  int v11; 
  UINT8 *v12; 
  WCHAR *v13; 
  HPNPCTX *v14; 
  UINT64 v15; 
  UINT8 v16; 
  HPNPCTX *v17; 
  WCHAR *v18; 
  NTSTATUS ValueIndirect; 
  int v21; 
  VOID *v22; 
  VOID **ClassKey; 
  VOID **ClassKeya; 
  UINT64 *Disposition; 
  UINT64 *Dispositiona; 
  INT64 v27; 
  VOID *v28; 
  VOID *hKey[2]; 
  VOID *Handle[7]; 

  v8 = 0;
  HIDWORD(hKey[1]) = 0;
  Handle[0] = 0i64;
  v10 = BaseKeyHandle;
  *(VOID **)((char *)hKey + 4) = 0i64;
  hKey[0] = 0i64;
  if( (_WORD)Flags )
    return -1073741811;
  if( !PropertySize || !CmRegPropType )
  {
    v8 = -1073741811;
    goto LABEL_18;
  }
  v11 = *(_DWORD *)PropertySize;
  if( !*(_DWORD *)PropertySize )
  {
    v12 = 0i64;
    goto LABEL_6;
  }
  v12 = PropertyBuffer;
  if( !PropertyBuffer )
    return -1073741811;
LABEL_6:
  *(_DWORD *)PropertySize = 0;
  *(_DWORD *)CmRegPropType = 0;
  if( (unsigned int)(CmRegProp - 1) > 0x24
    || !(unsigned __int8)CmClassPropertyRead(
                           (VOID *)(unsigned int)CmRegProp,
                           (INT8)ClassGuid,
                           (_LARGE_INTEGER *)BaseKeyHandle,
                           *(VOID **)&CmRegProp,
                           ClassKey,
                           (UINT64)Disposition,
                           v27,
                           v28,
                           (_DIAGNOSTIC_CONTEXT *)hKey[0],
                           (INT64)hKey[1],
                           (UINT64)Handle[0],
                           (UINT64)Handle[1],
                           (UINT8 *)Handle[2]) )
  {
    return -1073741264;
  }
  if( !v10 )
  {
    LOBYTE(Dispositiona) = 0;
    LODWORD(ClassKeya) = 33554433;
    v8 = CmOpenInstallerClassRegKey(v17, v13, v15, v16, ClassKeya, Dispositiona);
    if( v8 < 0 )
      goto LABEL_18;
    v17 = hPnpCtx;
  }
  if( CmRegProp == CM_REG_PROP_CLASS
    || CmRegProp == CM_REG_PROP_FRIENDLYNAME
    || CmRegProp <= CM_REG_PROP_LOWERFILTERS && CmRegProp > CM_REG_PROP_UI_NUMBER )
  {
    if( !v10 )
      v10 = hKey[1];
  }
  else
  {
    v22 = hKey[1];
    if( v10 )
      v22 = v10;
    v8 = PnpOpenPropertiesKey((__int64)v17, v22, 0i64, 1u, 0, (int)Dispositiona, (INT64)Handle);
    if( v8 < 0 )
      goto LABEL_17;
    v10 = Handle[0];
  }
  v18 = MapCmClassPropertyToRegValue(v14, CmRegProp);
  if( !v18 )
  {
    v8 = -1073741264;
    goto LABEL_18;
  }
  LODWORD(hKey[0]) = v11;
  ValueIndirect = PnpCtxRegQueryValueIndirect(
                    hPnpCtx,
                    v10,
                    v18,
                    (UINT64 *)((char *)hKey + 4),
                    v12,
                    (UINT64 *)hKey,
                    0i64);
  if( ValueIndirect != -1073741772 && ValueIndirect != -1073741444 )
  {
    if( (int)(ValueIndirect + 0x80000000) >= 0 && ValueIndirect != -1073741789 )
    {
      v8 = ValueIndirect;
      goto LABEL_18;
    }
    v21 = HIDWORD(hKey[0]);
    if( (HIDWORD(hKey[0]) != 1 || LODWORD(hKey[0]) >= 2)
      && (LODWORD(hKey[0]) >= 2 || HIDWORD(hKey[0]) != 7)
      && (HIDWORD(hKey[0]) != 4 || LODWORD(hKey[0]) == 4) )
    {
      if( CmRegProp == CM_REG_PROP_CLASS && LODWORD(hKey[0]) > 0x40 )
      {
        v8 = -1073741595;
      }
      else
      {
        *(_DWORD *)PropertySize = hKey[0];
        *(_DWORD *)CmRegPropType = v21;
        if( ValueIndirect || !v11 )
          v8 = -1073741789;
      }
      goto LABEL_18;
    }
  }
LABEL_17:
  v8 = -1073741275;
LABEL_18:
  if( Handle[0] )
    ZwClose((_HANDLE)Handle[0]);
  if( hKey[1] )
    ZwClose((_HANDLE)hKey[1]);
  return v8;
}

Referenced by:

CmGetInstallerClassRegProp