PiDevCfgResolveVariableFormatString

NTSTATUS __stdcall PiDevCfgResolveVariableFormatString(
        _PI_DEVCFG_RESOLVE_CONTEXT *ResolveContext,
        VOID *VariableKeyHandle,
        _PI_DEVCFG_VARIABLE_ENTRY *VariableEntryResult){
  __int64 v5; 
  int RegistryValue; 
  unsigned __int16 *v7; 
  NTSTATUS v8; 
  unsigned int *v9; 
  unsigned int v10; 
  WCHAR *v11; 
  WCHAR *v12; 
  __int64 v13; 
  __int64 v14; 
  VOID **PoolWithTag; 
  unsigned int i; 
  NTSTATUS v17; 
  __int64 v18; 
  unsigned __int16 v19; 
  int v20; 
  unsigned __int16 *v21; 
  _QWORD *v22; 
  unsigned __int16 v23; 
  unsigned int v24; 
  __int64 v25; 
  unsigned int v26; 
  __int64 v27; 
  NTSTATUS v28; 
  unsigned int v29; 
  VOID **v30; 
  VOID **v31; 
  unsigned __int16 *v32; 
  _WORD *v33; 
  unsigned __int16 v34; 
  unsigned __int16 v35; 
  unsigned int v36; 
  int v37; 
  __int64 v38; 
  unsigned int v39; 
  __int16 *v40; 
  __int64 v41; 
  size_t v42; 
  __int64 v43; 
  __int64 v44; 
  int v46; 
  unsigned int v47; 
  unsigned int v48; 
  PVOID v49; 
  unsigned __int16 *v50; 
  PVOID P; 
  _KEY_VALUE_FULL_INFORMATION *Information; 
  _PI_DEVCFG_VARIABLE_ENTRY *v53; 
  __int16 pszDest[12]; 

  v53 = VariableEntryResult;
  Information = 0i64;
  v49 = 0i64;
  v48 = 0;
  P = 0i64;
  LODWORD(v5) = 0;
  RegistryValue = IopGetRegistryValue(VariableKeyHandle, (PWCHAR)L"Format", 0i64, &Information);
  if( RegistryValue < 0 )
    goto LABEL_106;
  if( !PnpValidateRegistryString(Information) )
  {
    RegistryValue = -1073741823;
    goto LABEL_106;
  }
  v7 = (unsigned __int16 *)((char *)Information + Information->DataOffset);
  v50 = v7;
  v8 = IopGetRegistryValue(VariableKeyHandle, (PWCHAR)L"Variables", 0i64, (_KEY_VALUE_FULL_INFORMATION **)&v49);
  v9 = (unsigned int *)v49;
  v10 = 0;
  v46 = v8;
  RegistryValue = v8;
  if( v8 >= 0 )
  {
    if( !PnpValidateRegistryMultiSz(v49) )
    {
      RegistryValue = -1073741823;
      goto LABEL_104;
    }
  }
  else
  {
    if( v8 != -1073741772 )
      goto LABEL_104;
    RegistryValue = 0;
    v46 = 0;
  }
  if( v9 )
  {
    v11 = (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 )
      {
        v14 = 8 * v5;
        PoolWithTag = ExAllocatePoolWithTag(1ui64, v14, 1667526736i64);
        P = PoolWithTag;
        if( !PoolWithTag )
        {
          RegistryValue = -1073741670;
          goto LABEL_104;
        }
        memset(PoolWithTag, 0i64, v14);
        v10 = 0;
        for( i = 0; *v11 && i < v48; ++i )
        {
          v17 = PiDevCfgResolveVariable(ResolveContext, v11, (_PI_DEVCFG_VARIABLE_ENTRY **)P + i);
          v10 = 0;
          v46 = v17;
          RegistryValue = v17;
          if( v17 < 0 )
          {
            if( v17 == -1073741772 )
              RegistryValue = -1073741823;
            v46 = RegistryValue;
            break;
          }
          v18 = -1i64;
          do
            ++v18;
          while( v11[v18] );
          v11 += v18 + 1;
        }
        if( RegistryValue < 0 )
          goto LABEL_102;
      }
    }
  }
  v19 = *v7;
  v20 = v10;
  v21 = v7;
  if( !*v7 )
    goto LABEL_56;
  v22 = P;
  do
  {
    ++v21;
    if( v19 != 37 )
      goto LABEL_34;
    v23 = *v21;
    if( *v21 == 37 )
    {
      ++v21;
LABEL_34:
      v20 += 2;
      goto LABEL_54;
    }
    if( (unsigned __int16)(v23 - 48) <= 9u )
    {
      v24 = v10;
      while( v23 && (unsigned __int16)(v23 - 48) <= 9u )
      {
        ++v21;
        v24 = v23 + 2 * (5 * v24 - 24);
        v23 = *v21;
      }
      if( v24 < v48 )
      {
        _mm_lfence();
        v25 = v22[v24];
        if( v25 )
        {
          v26 = *(_DWORD *)(v25 + 32);
          if( v26 )
          {
            if( v26 <= 2 )
            {
              v20 = *(_DWORD *)(v25 + 36) + v20 - 2;
            }
            else
            {
              if( v26 != 4 )
              {
                if( v26 != 7 )
                  goto LABEL_54;
                v27 = -1i64;
                do
                  ++v27;
                while( *(_WORD *)(*(_QWORD *)(v25 + 40) + 2 * v27) != (_WORD)v10 );
                goto LABEL_48;
              }
              v28 = RtlStringCchPrintfW((WCHAR *)pszDest, 0xBui64, (WCHAR *)L"%u");
              v10 = 0;
              if( v28 >= 0 )
              {
                v27 = -1i64;
                do
                  ++v27;
                while( pszDest[v27] );
LABEL_48:
                v20 += 2 * v27;
              }
            }
          }
        }
      }
    }
LABEL_54:
    v19 = *v21;
  }
  while( *v21 );
  v9 = (unsigned int *)v49;
  RegistryValue = v46;
LABEL_56:
  v29 = v20 + 2;
  v47 = v29;
  v30 = ExAllocatePoolWithTag(1ui64, v29, 1667526736i64);
  v31 = v30;
  if( !v30 )
  {
    RegistryValue = -1073741670;
    goto LABEL_102;
  }
  v32 = v50;
  v33 = v30;
  v34 = *v50;
  if( !*v50 )
    goto LABEL_96;
  while( 2 )
  {
    if( v34 == 37 )
    {
      v50 = ++v32;
      v35 = *v32;
      if( *v32 == 37 )
      {
        if( v29 <= 2 )
          goto LABEL_93;
        *v33 = 37;
LABEL_63:
        ++v33;
        ++v32;
        v29 -= 2;
LABEL_89:
        v34 = *v32;
        if( !*v32 )
          goto LABEL_95;
        continue;
      }
      if( (unsigned __int16)(v35 - 48) > 9u )
        goto LABEL_89;
      v36 = 0;
      if( v35 )
      {
        do
        {
          if( (unsigned __int16)(v35 - 48) > 9u )
            break;
          ++v32;
          v37 = v35;
          v35 = *v32;
          v36 = v37 + 2 * (5 * v36 - 24);
        }
        while( *v32 );
        v50 = v32;
      }
      if( v36 >= v48 )
        goto LABEL_89;
      _mm_lfence();
      v38 = *((_QWORD *)P + v36);
      if( !v38 )
        goto LABEL_89;
      v39 = *(_DWORD *)(v38 + 32);
      if( !v39 )
        goto LABEL_83;
      if( v39 <= 2 )
      {
        v40 = *(__int16 **)(v38 + 40);
        v42 = *(_DWORD *)(v38 + 36) - 2;
        goto LABEL_84;
      }
      if( v39 == 4 )
      {
        if( RtlStringCchPrintfW((WCHAR *)pszDest, 0xBui64, (WCHAR *)L"%u") >= 0 )
        {
          v40 = pszDest;
          v43 = -1i64;
          do
            ++v43;
          while( pszDest[v43] );
          v32 = v50;
          v42 = 2 * v43;
          goto LABEL_85;
        }
      }
      else
      {
        if( v39 == 7 )
        {
          v40 = *(__int16 **)(v38 + 40);
          v41 = -1i64;
          do
            ++v41;
          while( v40[v41] );
          v42 = 2 * v41;
          goto LABEL_84;
        }
LABEL_83:
        v40 = 0i64;
        v42 = 0;
LABEL_84:
        if( !v40 )
          goto LABEL_89;
LABEL_85:
        if( !v42 )
          goto LABEL_89;
        if( v29 <= v42 )
        {
LABEL_93:
          v9 = (unsigned int *)v49;
          RegistryValue = -1073741823;
          goto LABEL_100;
        }
        memmove(v33, v40, v42);
        v29 -= v42;
        v33 += (unsigned __int64)v42 >> 1;
      }
      v32 = v50;
      goto LABEL_89;
    }
    break;
  }
  if( v29 > 2 )
  {
    *v33 = v34;
    goto LABEL_63;
  }
  RegistryValue = -1073741823;
LABEL_95:
  v9 = (unsigned int *)v49;
LABEL_96:
  if( RegistryValue >= 0 )
  {
    if( v29 == 2 )
    {
      v44 = (__int64)v53;
      *v33 = 0;
      *(_QWORD *)(v44 + 40) = v31;
      v31 = 0i64;
      *(_DWORD *)(v44 + 32) = 1;
      *(_DWORD *)(v44 + 36) = v47;
    }
    else
    {
      RegistryValue = -1073741823;
    }
  }
LABEL_100:
  if( v31 )
    ExFreePoolWithTag(v31, 0);
LABEL_102:
  if( P )
    ExFreePoolWithTag(P, 0);
LABEL_104:
  if( v9 )
    ExFreePoolWithTag(v9, 0);
LABEL_106:
  if( Information )
    ExFreePoolWithTag(Information, 0);
  return RegistryValue;
}

Referenced by:

No references.