PiDmCacheDataDecode

NTSTATUS __stdcall PiDmCacheDataDecode(
        PI_DM_CACHED_PROPERTY_DATA *CacheData,
        UINT64 *PropertyType,
        UINT8 *PropertyBuffer,
        UINT64 BufferSize,
        UINT64 *PropertySize){
  PI_DM_CACHED_PROPERTY_DATA v5; 
  NTSTATUS v6; 
  int v8; 
  int v9; 
  int v10; 
  int v11; 
  PI_DM_CACHED_PROPERTY_DATA v12; 
  __int64 v13; 
  unsigned int v14; 
  size_t v15; 
  PI_DM_CACHED_PROPERTY_DATA *v16; 
  unsigned int v18; 
  unsigned int v19; 
  _UNICODE_STRING DestinationString; 

  v5 = *CacheData;
  v6 = 0;
  DestinationString = 0i64;
  v8 = v5 - 2;
  if( !v8 )
    return -1073741275;
  v9 = v8 - 1;
  if( !v9 )
  {
    *(_DWORD *)PropertyType = CacheData[2];
    v18 = CacheData[3];
    *(_DWORD *)PropertySize = v18;
    if( (unsigned int)BufferSize >= v18 )
    {
      v15 = v18;
      v16 = CacheData + 4;
      goto LABEL_12;
    }
    return -1073741789;
  }
  v10 = v9 - 1;
  if( !v10 )
  {
    *(_DWORD *)PropertyType = 13;
    *(_DWORD *)PropertySize = 16;
    if( (unsigned int)BufferSize >= 0x10 )
    {
      *(_OWORD *)PropertyBuffer = *(_OWORD *)(CacheData + 2);
      return v6;
    }
    return -1073741789;
  }
  v11 = v10 - 1;
  if( !v11 )
  {
    *(_DWORD *)PropertyType = CacheData[2];
    v19 = CacheData[3];
    *(_DWORD *)PropertySize = v19;
    if( (unsigned int)BufferSize >= v19 )
    {
      v15 = v19;
      v16 = (PI_DM_CACHED_PROPERTY_DATA *)*((_QWORD *)CacheData + 2);
      goto LABEL_12;
    }
    return -1073741789;
  }
  if( v11 != 1 )
    return -1073741595;
  v12 = CacheData[2];
  if( v12 == 13 )
  {
    *(_DWORD *)PropertyType = 13;
    *(_DWORD *)PropertySize = 16;
    if( (unsigned int)BufferSize >= 0x10 )
    {
      RtlInitUnicodeString(&DestinationString, *(PCWSTR *)(*((_QWORD *)CacheData + 2) + 16i64));
      return RtlGUIDFromString(&DestinationString, (_GUID *)PropertyBuffer);
    }
    return -1073741789;
  }
  if( v12 != 18 )
    return -1073741595;
  *(_DWORD *)PropertyType = 18;
  v13 = -1i64;
  do
    ++v13;
  while( *(_WORD *)(*(_QWORD *)(*((_QWORD *)CacheData + 2) + 16i64) + 2 * v13) );
  v14 = 2 * v13 + 2;
  *(_DWORD *)PropertySize = v14;
  if( (unsigned int)BufferSize < v14 )
    return -1073741789;
  v15 = 2 * v13 + 2;
  v16 = *(PI_DM_CACHED_PROPERTY_DATA **)(*((_QWORD *)CacheData + 2) + 16i64);
LABEL_12:
  memmove(PropertyBuffer, v16, v15);
  return v6;
}

Referenced by:

PiDmListUpdateAggregationCountWorker
PiDmObjectGetCachedObjectPropertyData
PiDmObjectProcessPropertyChange