PfpParametersWatcher

VOID __stdcall PfpParametersWatcher(_PFP_SUPERFETCH_PARAMETERS *SuperfetchParameters){
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v3; 
  __int64 v4; 
  NTSTATUS v5; 
  __int64 v6; 
  char v7; 
  UINT64 CompletionFilter; 
  _UNICODE_STRING DestinationString; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  VOID *KeyHandle; 

  KeyHandle = 0i64;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  DestinationString = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v3 = (_EX_PUSH_LOCK *)(SuperfetchParameters + 126);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)SuperfetchParameters + 63, 0i64);
  v4 = *((_QWORD *)SuperfetchParameters + 1);
  if( v4 )
  {
    v5 = ZwNotifyChangeKey(
           v4,
           0,
           (PIO_APC_ROUTINE)(SuperfetchParameters + 8),
           (PVOID)1,
           (PIO_STATUS_BLOCK)SuperfetchParameters + 1,
           0x1000000Fu,
           0,
           SuperfetchParameters + 16,
           4u,
           1u);
    if( v5 >= 0 )
      goto LABEL_8;
    if( v5 == -1073741444 )
    {
      RtlInitUnicodeString(
        &DestinationString,
        L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Session Manager\\Memory Management\\PrefetchParameters");
      LODWORD(CompletionFilter) = 0;
      ObjectAttributes.RootDirectory = 0i64;
      ObjectAttributes.ObjectName = &DestinationString;
      ObjectAttributes.Length = 48;
      *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
      ObjectAttributes.Attributes = 576;
      if( ZwCreateKey(&KeyHandle, 0xF003Fui64, &ObjectAttributes, 0i64, 0i64, CompletionFilter, 0i64) >= 0 )
      {
        v6 = *((_QWORD *)SuperfetchParameters + 1);
        *((_QWORD *)SuperfetchParameters + 1) = KeyHandle;
        if( v6 )
          ZwClose(v6);
        if( ZwNotifyChangeKey(
               *((_QWORD *)SuperfetchParameters + 1),
               0,
               (PIO_APC_ROUTINE)(SuperfetchParameters + 8),
               (PVOID)1,
               (PIO_STATUS_BLOCK)SuperfetchParameters + 1,
               0x1000000Fu,
               0,
               SuperfetchParameters + 16,
               4u,
               1u) >= 0 )
        {
LABEL_8:
          v7 = 0;
          if( PfpParametersRead(SuperfetchParameters) >= 0 )
          {
            PfpParametersPropagate(SuperfetchParameters);
            v7 = 1;
          }
          if( PfSnParametersRead(SuperfetchParameters) >= 0 )
          {
            PfSnDetermineEnablePrefetcher();
            v7 = 1;
          }
          if( v7 && *(_QWORD *)SuperfetchParameters )
            KeSetEvent(*(PRKEVENT *)SuperfetchParameters, 0, 0);
        }
      }
    }
  }
  if( (_InterlockedExchangeAdd64(&v3->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v3);
  KeAbPostRelease(v3);
  KeLeaveCriticalRegion();
}

Referenced by:

No references.