PiDevCfgResolveVariableFormatString

INT64 __stdcall PiDevCfgResolveVariableFormatString(WCHAR **CapturedString, UNICODE_STRING *SourceString){
  __int64 v2; 
  __int64 v5; 
  NTSTATUS RegistryValue; 
  unsigned __int16 *v7; 
  NTSTATUS v8; 
  unsigned int *v9; 
  unsigned int v10; 
  const WCHAR *v11; 
  const WCHAR *v12; 
  __int64 v13; 
  void *PoolWithTag; 
  unsigned int i; 
  int v16; 
  __int64 v17; 
  unsigned __int16 v18; 
  int v19; 
  unsigned __int16 *v20; 
  _QWORD *v21; 
  unsigned __int16 v22; 
  unsigned int v23; 
  __int64 v24; 
  unsigned int v25; 
  __int64 v26; 
  int v27; 
  unsigned int v28; 
  VOID *v29; 
  void *v30; 
  unsigned __int16 *v31; 
  UINT8 *v32; 
  unsigned __int16 v33; 
  unsigned __int16 v34; 
  unsigned int v35; 
  int v36; 
  __int64 v37; 
  unsigned int v38; 
  __int16 *v39; 
  __int64 v40; 
  unsigned int v41; 
  int v42; 
  __int64 v43; 
  __int64 v44; 
  NTSTATUS v46; 
  unsigned int v47; 
  unsigned int v48; 
  PVOID v49; 
  unsigned __int16 *v50; 
  PVOID P; 
  PVOID v52; 
  __int64 v53; 
  __int16 pszDest[12]; 
  v53 = v2;
  v52 = 0i64;
  v49 = 0i64;
  v48 = 0;
  P = 0i64;
  LODWORD(v5) = 0;
  RegistryValue = IopGetRegistryValue(SourceString, (PWCHAR)L"Format", 0i64, (KEY_VALUE_FULL_INFORMATION **)&v52);
  if( RegistryValue < 0 )
    goto LABEL_106;
  if( !PnpValidateRegistryString((KEY_VALUE_FULL_INFORMATION *)v52) )
  {
    RegistryValue = -1073741823;
    goto LABEL_106;
  }
  v7 = (unsigned __int16 *)((char *)v52 + *((unsigned int *)v52 + 2));
  v50 = v7;
  v8 = IopGetRegistryValue(SourceString, (PWCHAR)L"Variables", 0i64, (KEY_VALUE_FULL_INFORMATION **)&v49);
  v9 = (unsigned int *)v49;
  v10 = 0;
  v46 = v8;
  RegistryValue = v8;
  if( v8 >= 0 )
  {
    if( !PnpValidateRegistryMultiSz((KEY_VALUE_FULL_INFORMATION *)v49) )
    {
      RegistryValue = -1073741823;
      goto LABEL_104;
    }
  }
  else
  {
    if( v8 != -1073741772 )
      goto LABEL_104;
    RegistryValue = 0;
    v46 = 0;
  }
  if( v9 )
  {
    v11 = (const WCHAR *)((char *)v9 + v9[2]);
    v12 = v11;
    if( *v11 != (_WORD)v10 )
    {
      do
      {
        v5 = (unsigned int)(v5 + 1);
        v13 = -1i64;
        do
          ++v13;
        while( v12[v13] != (_WORD)v10 );
        v12 += v13 + 1;
      }
      while( *v12 != (_WORD)v10 );
      v48 = v5;
      if( (_DWORD)v5 )
      {
        PoolWithTag = ExAllocatePoolWithTag(PagedPool, 8 * v5, 0x63647050ui64);
        P = PoolWithTag;
        if( !PoolWithTag )
        {
          RegistryValue = -1073741670;
          goto LABEL_104;
        }
        memset((INT64)PoolWithTag, 0i64);
        v10 = 0;
        for( i = 0; *v11 && i < v48; ++i )
        {
          v16 = PiDevCfgResolveVariable((INT64)CapturedString, v11, (CHAR **)P + i);
          v10 = 0;
          v46 = v16;
          RegistryValue = v16;
          if( v16 < 0 )
          {
            if( v16 == -1073741772 )
              RegistryValue = -1073741823;
            v46 = RegistryValue;
            break;
          }
          v17 = -1i64;
          do
            ++v17;
          while( v11[v17] );
          v11 += v17 + 1;
        }
        if( RegistryValue < 0 )
          goto LABEL_102;
      }
    }
  }
  v18 = *v7;
  v19 = v10;
  v20 = v7;
  if( !*v7 )
    goto LABEL_56;
  v21 = P;
  do
  {
    ++v20;
    if( v18 != 37 )
      goto LABEL_34;
    v22 = *v20;
    if( *v20 == 37 )
    {
      ++v20;
LABEL_34:
      v19 += 2;
      goto LABEL_54;
    }
    if( (unsigned __int16)(v22 - 48) <= 9u )
    {
      v23 = v10;
      while( v22 && (unsigned __int16)(v22 - 48) <= 9u )
      {
        ++v20;
        v23 = v22 + 2 * (5 * v23 - 24);
        v22 = *v20;
      }
      if( v23 < v48 )
      {
        _mm_lfence();
        v24 = v21[v23];
        if( v24 )
        {
          v25 = *(_DWORD *)(v24 + 32);
          if( v25 )
          {
            if( v25 <= 2 )
            {
              v19 = *(_DWORD *)(v24 + 36) + v19 - 2;
            }
            else
            {
              if( v25 != 4 )
              {
                if( v25 != 7 )
                  goto LABEL_54;
                v26 = -1i64;
                do
                  ++v26;
                while( *(_WORD *)(*(_QWORD *)(v24 + 40) + 2 * v26) != (_WORD)v10 );
                goto LABEL_48;
              }
              RtlStringCchPrintfW((WCHAR *)pszDest, 0xBui64, (WCHAR *)L"%u");
              v10 = 0;
              if( v27 >= 0 )
              {
                v26 = -1i64;
                do
                  ++v26;
                while( pszDest[v26] );
LABEL_48:
                v19 += 2 * v26;
              }
            }
          }
        }
      }
    }
LABEL_54:
    v18 = *v20;
  }
  while( *v20 );
  v9 = (unsigned int *)v49;
  RegistryValue = v46;
LABEL_56:
  v28 = v19 + 2;
  v47 = v28;
  v29 = ExAllocatePoolWithTag(PagedPool, v28, 0x63647050ui64);
  v30 = v29;
  if( !v29 )
  {
    RegistryValue = -1073741670;
    goto LABEL_102;
  }
  v31 = v50;
  v32 = (UINT8 *)v29;
  v33 = *v50;
  if( !*v50 )
    goto LABEL_96;
  while( 2 )
  {
    if( v33 == 37 )
    {
      v50 = ++v31;
      v34 = *v31;
      if( *v31 == 37 )
      {
        if( v28 <= 2 )
          goto LABEL_93;
        *(_WORD *)v32 = 37;
LABEL_63:
        v32 += 2;
        ++v31;
        v28 -= 2;
LABEL_89:
        v33 = *v31;
        if( !*v31 )
          goto LABEL_95;
        continue;
      }
      if( (unsigned __int16)(v34 - 48) > 9u )
        goto LABEL_89;
      v35 = 0;
      if( v34 )
      {
        do
        {
          if( (unsigned __int16)(v34 - 48) > 9u )
            break;
          ++v31;
          v36 = v34;
          v34 = *v31;
          v35 = v36 + 2 * (5 * v35 - 24);
        }
        while( *v31 );
        v50 = v31;
      }
      if( v35 >= v48 )
        goto LABEL_89;
      _mm_lfence();
      v37 = *((_QWORD *)P + v35);
      if( !v37 )
        goto LABEL_89;
      v38 = *(_DWORD *)(v37 + 32);
      if( !v38 )
        goto LABEL_83;
      if( v38 <= 2 )
      {
        v39 = *(__int16 **)(v37 + 40);
        v41 = *(_DWORD *)(v37 + 36) - 2;
        goto LABEL_84;
      }
      if( v38 == 4 )
      {
        RtlStringCchPrintfW((WCHAR *)pszDest, 0xBui64, (WCHAR *)L"%u");
        if( v42 >= 0 )
        {
          v39 = pszDest;
          v43 = -1i64;
          do
            ++v43;
          while( pszDest[v43] );
          v31 = v50;
          v41 = 2 * v43;
          goto LABEL_85;
        }
      }
      else
      {
        if( v38 == 7 )
        {
          v39 = *(__int16 **)(v37 + 40);
          v40 = -1i64;
          do
            ++v40;
          while( v39[v40] );
          v41 = 2 * v40;
          goto LABEL_84;
        }
LABEL_83:
        v39 = 0i64;
        v41 = 0;
LABEL_84:
        if( !v39 )
          goto LABEL_89;
LABEL_85:
        if( !v41 )
          goto LABEL_89;
        if( v28 <= v41 )
        {
LABEL_93:
          v9 = (unsigned int *)v49;
          RegistryValue = -1073741823;
          goto LABEL_100;
        }
        memmove(v32, (UINT8 *)v39, v41);
        v28 -= v41;
        v32 += 2 * ((unsigned __int64)v41 >> 1);
      }
      v31 = v50;
      goto LABEL_89;
    }
    break;
  }
  if( v28 > 2 )
  {
    *(_WORD *)v32 = v33;
    goto LABEL_63;
  }
  RegistryValue = -1073741823;
LABEL_95:
  v9 = (unsigned int *)v49;
LABEL_96:
  if( RegistryValue >= 0 )
  {
    if( v28 == 2 )
    {
      v44 = v53;
      *(_WORD *)v32 = 0;
      *(_QWORD *)(v44 + 40) = v30;
      v30 = 0i64;
      *(_DWORD *)(v44 + 32) = 1;
      *(_DWORD *)(v44 + 36) = v47;
    }
    else
    {
      RegistryValue = -1073741823;
    }
  }
LABEL_100:
  if( v30 )
    ExFreePoolWithTag(v30, 0);
LABEL_102:
  if( P )
    ExFreePoolWithTag(P, 0);
LABEL_104:
  if( v9 )
    ExFreePoolWithTag(v9, 0);
LABEL_106:
  if( v52 )
    ExFreePoolWithTag(v52, 0);
  return(unsigned int)RegistryValue;
}

Referenced by:

No references.