PfSnParametersRead

NTSTATUS __stdcall PfSnParametersRead(PFP_SUPERFETCH_PARAMETERS *ParamContext){
  __int64 v1; 
  PFP_SUPERFETCH_PARAMETERS *v3; 
  PF_SYSTEM_PREFETCH_PARAMETERS *p_Parameters; 
  __int64 v5; 
  __int128 v6; 
  __int128 v7; 
  __int128 v8; 
  __int128 v9; 
  __int128 v10; 
  __int128 v11; 
  __int128 v12; 
  __int128 v13; 
  __int64 v14; 
  VOID *v15; 
  bool v16; 
  _DWORD *v17; 
  WCHAR **v18; 
  int v19; 
  PF_SYSTEM_PREFETCH_PARAMETERS *v20; 
  char *v21; 
  WCHAR *v22; 
  int v23; 
  __int16 *v24; 
  __int64 v25; 
  __int64 v26; 
  __int16 *v27; 
  __int64 v28; 
  __int64 v29; 
  char *v30; 
  __int16 v31; 
  __int16 *v32; 
  __int16 *v33; 
  __int64 v34; 
  __int64 v35; 
  __int16 *v36; 
  __int64 v37; 
  __int64 v38; 
  char *v39; 
  __int16 v40; 
  __int16 *v41; 
  __int16 *v42; 
  __int64 v43; 
  __int64 v44; 
  __int16 *v45; 
  __int64 v46; 
  __int64 v47; 
  char *v48; 
  __int16 v49; 
  __int16 *v50; 
  NTSTATUS result; 
  PFP_SUPERFETCH_PARAMETERS *v52; 
  PF_SYSTEM_PREFETCH_PARAMETERS *v53; 
  __int128 v54; 
  __int128 v55; 
  __int128 v56; 
  __int128 v57; 
  __int128 v58; 
  __int128 v59; 
  __int128 v60; 
  __int128 v61; 
  __int64 v62; 
  UINT64 Value; 
  PFP_SUPERFETCH_PARAMETERS *v64; 
  PFP_SUPERFETCH_PARAMETERS *v65; 
  PF_SYSTEM_PREFETCH_PARAMETERS Parameters; 
  char v67; 
  char v68[4]; 
  char v69[4]; 
  char v70[96]; 
  wchar_t String[128]; 
  char v72[4]; 
  char v73[12]; 
  __int16 pszDest[80]; 

  v1 = 3i64;
  v65 = ParamContext + 24;
  v3 = ParamContext + 24;
  p_Parameters = &Parameters;
  v5 = 3i64;
  do
  {
    v6 = *((_OWORD *)v3 + 1);
    *(_OWORD *)p_Parameters = *(_OWORD *)v3;
    v7 = *((_OWORD *)v3 + 2);
    *((_OWORD *)p_Parameters + 1) = v6;
    v8 = *((_OWORD *)v3 + 3);
    *((_OWORD *)p_Parameters + 2) = v7;
    v9 = *((_OWORD *)v3 + 4);
    *((_OWORD *)p_Parameters + 3) = v8;
    v10 = *((_OWORD *)v3 + 5);
    *((_OWORD *)p_Parameters + 4) = v9;
    v11 = *((_OWORD *)v3 + 6);
    *((_OWORD *)p_Parameters + 5) = v10;
    v12 = *((_OWORD *)v3 + 7);
    v3 += 32;
    *((_OWORD *)p_Parameters + 6) = v11;
    p_Parameters += 32;
    *((_OWORD *)p_Parameters - 1) = v12;
    --v5;
  }
  while( v5 );
  v13 = *(_OWORD *)v3;
  v14 = *((_QWORD *)v3 + 2);
  v15 = (VOID *)*((_QWORD *)ParamContext + 1);
  *(_OWORD *)p_Parameters = v13;
  *((_QWORD *)p_Parameters + 2) = v14;
  Value = 4i64;
  v16 = PfpGetParameter(v15, (WCHAR *)L"EnablePrefetcher", 4ui64, (char *)&Value + 4, &Value) < 0;
  v17 = (_DWORD *)&Value + 1;
  v18 = (WCHAR **)(ParamContext + 130);
  v19 = 0;
  if( v16 )
    v17 = 0i64;
  v64 = ParamContext + 130;
  v20 = &Parameters;
  v21 = &v67;
  do
  {
    v22 = *v18;
    if( v17 )
      v23 = 2 - ((*v17 & (1 << v19)) != 0);
    else
      v23 = 0;
    *v20 = v23;
    RtlStringCbCopyW((WCHAR *)pszDest, 0xA0ui64, v22);
    v24 = pszDest;
    v25 = 80i64;
    do
    {
      if( !*v24 )
        break;
      ++v24;
      --v25;
    }
    while( v25 );
    if( v25 )
      v26 = 80 - v25;
    else
      v26 = 0i64;
    if( v25 )
    {
      v27 = &pszDest[v26];
      v28 = 80 - v26;
      if( 80 != v26 )
      {
        v29 = 2147483646i64;
        v30 = (char *)((char *)L"MaxNumPages" - (char *)v27);
        do
        {
          if( !v29 )
            break;
          v31 = *(_WORD *)&v30[(_QWORD)v27];
          if( !v31 )
            break;
          *v27 = v31;
          --v29;
          ++v27;
          --v28;
        }
        while( v28 );
      }
      v32 = v27 - 1;
      if( v28 )
        v32 = v27;
      *v32 = 0;
    }
    LODWORD(Value) = 4;
    PfpGetParameter(v15, (WCHAR *)pszDest, 4ui64, v21, &Value);
    RtlStringCbCopyW((WCHAR *)pszDest, 0xA0ui64, v22);
    v33 = pszDest;
    v34 = 80i64;
    do
    {
      if( !*v33 )
        break;
      ++v33;
      --v34;
    }
    while( v34 );
    if( v34 )
      v35 = 80 - v34;
    else
      v35 = 0i64;
    if( v34 )
    {
      v36 = &pszDest[v35];
      v37 = 80 - v35;
      if( 80 != v35 )
      {
        v38 = 2147483646i64;
        v39 = (char *)((char *)L"MaxNumSections" - (char *)v36);
        do
        {
          if( !v38 )
            break;
          v40 = *(__int16 *)((char *)v36 + (_QWORD)v39);
          if( !v40 )
            break;
          *v36 = v40;
          --v38;
          ++v36;
          --v37;
        }
        while( v37 );
      }
      v41 = v36 - 1;
      if( v37 )
        v41 = v36;
      *v41 = 0;
    }
    LODWORD(Value) = 4;
    PfpGetParameter(v15, (WCHAR *)pszDest, 4ui64, v21 + 4, &Value);
    RtlStringCbCopyW((WCHAR *)pszDest, 0xA0ui64, v22);
    v42 = pszDest;
    v43 = 80i64;
    do
    {
      if( !*v42 )
        break;
      ++v42;
      --v43;
    }
    while( v43 );
    if( v43 )
      v44 = 80 - v43;
    else
      v44 = 0i64;
    if( v43 )
    {
      v45 = &pszDest[v44];
      v46 = 80 - v44;
      if( 80 != v44 )
      {
        v47 = 2147483646i64;
        v48 = (char *)((char *)L"TimerPeriod" - (char *)v45);
        do
        {
          if( !v47 )
            break;
          v49 = *(_WORD *)&v48[(_QWORD)v45];
          if( !v49 )
            break;
          *v45 = v49;
          --v47;
          ++v45;
          --v46;
        }
        while( v46 );
      }
      v50 = v45 - 1;
      if( v46 )
        v50 = v45;
      *v50 = 0;
    }
    LODWORD(Value) = 8;
    PfpGetParameter(v15, (WCHAR *)pszDest, 3ui64, v21 + 8, &Value);
    ++v19;
    v18 = (WCHAR **)(v64 + 2);
    v21 += 16;
    ++v20;
    v64 += 2;
  }
  while( v19 < 2 );
  LODWORD(Value) = 96;
  PfpGetParameter(v15, (WCHAR *)L"PrefetchRoot", 1ui64, v70, &Value);
  LODWORD(Value) = 4;
  PfpGetParameter(v15, (WCHAR *)L"PrefetchFlags", 4ui64, v72, &Value);
  LODWORD(Value) = 4;
  PfpGetParameter(v15, (WCHAR *)L"MaxNumActiveTraces", 4ui64, v68, &Value);
  LODWORD(Value) = 4;
  PfpGetParameter(v15, (WCHAR *)L"MaxNumSavedTraces", 4ui64, v69, &Value);
  LODWORD(Value) = 256;
  PfpGetParameter(v15, (WCHAR *)L"HostingAppList", 1ui64, String, &Value);
  String[127] = 0;
  wcsupr(String);
  LODWORD(Value) = 4;
  PfpGetParameter(v15, (WCHAR *)L"NumTracePeriods", 4ui64, v73, &Value);
  result = PfSnParametersVerify(&Parameters);
  v52 = v65;
  if( result >= 0 )
  {
    v53 = &Parameters;
    do
    {
      v54 = *((_OWORD *)v53 + 1);
      *(_OWORD *)v52 = *(_OWORD *)v53;
      v55 = *((_OWORD *)v53 + 2);
      *((_OWORD *)v52 + 1) = v54;
      v56 = *((_OWORD *)v53 + 3);
      *((_OWORD *)v52 + 2) = v55;
      v57 = *((_OWORD *)v53 + 4);
      *((_OWORD *)v52 + 3) = v56;
      v58 = *((_OWORD *)v53 + 5);
      *((_OWORD *)v52 + 4) = v57;
      v59 = *((_OWORD *)v53 + 6);
      *((_OWORD *)v52 + 5) = v58;
      v60 = *((_OWORD *)v53 + 7);
      v53 += 32;
      *((_OWORD *)v52 + 6) = v59;
      v52 += 32;
      *((_OWORD *)v52 - 1) = v60;
      --v1;
    }
    while( v1 );
    v61 = *(_OWORD *)v53;
    v62 = *((_QWORD *)v53 + 2);
    *(_OWORD *)v52 = v61;
    *((_QWORD *)v52 + 2) = v62;
    return 0;
  }
  return result;
}

Referenced by:

PfpParametersInitialize
PfpParametersWatcher