PiDevCfgResolveMultiSzValue

INT64 __stdcall PiDevCfgResolveMultiSzValue(
        UINT64 ValueType,
        UINT64 ValueSize,
        PVOID ValueData,
        UINT64 ValueModifiers,
        PVOID KeyHandle,
        WCHAR *ValueName,
        UINT64 *ValueSizeResult,
        PVOID *ValueDataResult){
  UINT8 *v8; 
  UINT64 v9; 
  int v10; 
  UINT8 *v11; 
  int v12; 
  unsigned int *v13; 
  UINT8 v14; 
  NTSTATUS RegistryValue; 
  unsigned int v16; 
  unsigned int v17; 
  UINT8 *v18; 
  WCHAR v19; 
  UINT8 v20; 
  unsigned int v21; 
  int v22; 
  WCHAR *v23; 
  __int64 v24; 
  unsigned int v25; 
  WCHAR v27; 
  const WCHAR *v28; 
  int v29; 
  WCHAR v30; 
  UINT8 v31; 
  bool v32; 
  unsigned int v33; 
  unsigned int v34; 
  UINT8 *PoolWithTag; 
  unsigned int v36; 
  unsigned int v37; 
  PVOID P; 
  void *Src[2]; 
  struct _UNICODE_STRING DestinationString; 
  int v41; 
  v41 = ValueType;
  v8 = 0i64;
  v9 = (unsigned int)ValueSize;
  P = 0i64;
  v10 = ValueModifiers;
  v11 = (UINT8 *)ValueData;
  *(_DWORD *)ValueSizeResult = 0;
  v12 = ValueType;
  v13 = 0i64;
  DestinationString = 0i64;
  *(_OWORD *)Src = 0i64;
  *ValueDataResult = 0i64;
  if( !(_DWORD)ValueType )
    goto LABEL_58;
  if( (unsigned int)ValueType <= 2 )
  {
    v14 = PnpValidateStringData((PWCHAR)ValueData, (unsigned int)ValueSize);
  }
  else
  {
    if( (_DWORD)ValueType != 7 )
      goto LABEL_58;
    v14 = PnpValidateMultiSzData((PWCHAR)ValueData, (unsigned int)ValueSize);
  }
  if( !v14 )
    return(unsigned int)-1073741823;
  RegistryValue = IopGetRegistryValue(KeyHandle, ValueName, 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
  v13 = (unsigned int *)P;
  v16 = RegistryValue;
  v36 = RegistryValue;
  if( RegistryValue < 0 )
  {
    if( RegistryValue == -1073741772 )
    {
      v16 = 0;
      if( (v10 & 0x40000) == 0 )
      {
        v17 = 0;
        goto LABEL_24;
      }
      v34 = v9 + 2;
      if( v12 == 7 )
        v34 = v9;
      v17 = v34;
      PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v34, 0x63647050ui64);
      v8 = PoolWithTag;
      if( PoolWithTag )
      {
        memmove(PoolWithTag, v11, v9);
        goto LABEL_24;
      }
      v13 = (unsigned int *)P;
      v16 = -1073741670;
    }
    goto LABEL_27;
  }
  if( !PnpValidateRegistryMultiSz((KEY_VALUE_FULL_INFORMATION *)P) )
  {
LABEL_58:
    v16 = -1073741823;
    goto LABEL_27;
  }
  if( (v10 & 0x40000) != 0 )
  {
    v17 = v13[3];
    Src[0] = (char *)v13 + v13[2];
    if( !v17 )
      v17 = 2;
    v18 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v17 + (unsigned int)v9, 0x63647050ui64);
    v21 = 0;
    v8 = v18;
    if( v18 )
    {
      if( v17 > 2 )
      {
        memmove(v18, (UINT8 *)Src[0], v17);
        v21 = v17 - 2;
      }
      v22 = v10 & 0x20000;
      v37 = v21;
      if( v41 != 7 )
      {
        if( v22 || v17 == 2 || !PnpMultiSzContainsString((PWCHAR)Src[0], (PWCHAR)v11, v19, v20) )
        {
          memmove(&v8[v37], v11, v9);
          v17 += v9;
        }
        goto LABEL_24;
      }
      if( v22 )
      {
        memmove(&v8[v21], v11, v9);
        v17 = v17 + v9 - 2;
        goto LABEL_24;
      }
      if( !*(_WORD *)v11 )
      {
LABEL_24:
        if( v8 )
          *(_WORD *)&v8[2 * ((unsigned __int64)v17 >> 1) - 2] = 0;
        *(_DWORD *)ValueSizeResult = v17;
        *ValueDataResult = v8;
        goto LABEL_27;
      }
      v23 = (WCHAR *)Src[0];
      do
      {
        v24 = -1i64;
        do
          ++v24;
        while( *(_WORD *)&v11[2 * v24] );
        v25 = 2 * v24 + 2;
        if( !PnpMultiSzContainsString(v23, (PWCHAR)v11, v19, v20) )
        {
          memmove(&v8[v37], v11, v25);
          v37 += v25;
          v17 += v25;
        }
        v11 += 2 * ((unsigned __int64)v25 >> 1);
      }
      while( *(_WORD *)v11 );
LABEL_23:
      v13 = (unsigned int *)P;
      goto LABEL_24;
    }
  }
  else
  {
    v8 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v13[3], 0x63647050ui64);
    if( v8 )
    {
      if( v12 != 7 )
        RtlInitUnicodeString(&DestinationString, (PCWSTR)v11, v27);
      v17 = 2;
      v28 = (const WCHAR *)((char *)v13 + v13[2]);
      if( !*v28 )
        goto LABEL_24;
      v29 = 0;
      do
      {
        RtlInitUnicodeString((PUNICODE_STRING)Src, v28, v27);
        if( v41 == 7 )
          v32 = PnpMultiSzContainsString((PWCHAR)v11, (PWCHAR)Src[1], v30, v31) == 0i64;
        else
          v32 = RtlEqualUnicodeString(&DestinationString, (UNICODE_STRING *)Src, 1u) == 0;
        if( v32 )
        {
          v33 = LOWORD(Src[0]) + 2;
          memmove(&v8[v29], (UINT8 *)Src[1], v33);
          v29 += v33;
          v17 += v33;
        }
        v28 += ((unsigned __int64)LOWORD(Src[0]) >> 1) + 1;
      }
      while( *v28 );
      v16 = v36;
      goto LABEL_23;
    }
  }
  v16 = -1073741670;
LABEL_27:
  if( v13 )
    ExFreePoolWithTag(v13, 0);
  return v16;
}

Referenced by:

PiDevCfgCopyDeviceKey