PfpSourceGetPrefetchSupport

VOID __stdcall PfpSourceGetPrefetchSupport(UINT8 Rundown, GUID *SettingGuid, UINT64 ValueLength, PVOID Value){
  PVOID v4; 
  void *v5; 
  void *UniqueProcess; 
  __int64 v7; 
  int v8; 
  int v10; 
  void *v11; 
  int v12; 
  __int64 v13; 
  WCHAR v14; 
  int v15; 
  PVOID Object; 
  void *ProcessHandle; 
  struct _CLIENT_ID ClientId; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  struct _UNICODE_STRING DestinationString; 
  wchar_t pszDest[40]; 
  v4 = 0i64;
  SettingGuid->Data1 = *(_DWORD *)Rundown;
  v5 = 0i64;
  Object = 0i64;
  UniqueProcess = 0i64;
  ProcessHandle = 0i64;
  v7 = Rundown;
  ClientId.UniqueProcess = 0i64;
  v8 = *(_DWORD *)Rundown;
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  DestinationString = 0i64;
  if( !v8 )
  {
    *(_QWORD *)SettingGuid->Data4 = 0i64;
    goto LABEL_9;
  }
  v10 = v8 - 1;
  if( v10 )
  {
    if( v10 != 1 )
      return;
    ObjectAttributes.RootDirectory = 0i64;
    ObjectAttributes.ObjectName = 0i64;
    ClientId.UniqueThread = 0i64;
    v11 = (void *)*(unsigned int *)(v7 + 4);
    ObjectAttributes.Length = 48;
    ObjectAttributes.Attributes = 512;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    ClientId.UniqueProcess = v11;
    if( NtOpenProcess(&ProcessHandle, 0x1FFFFFui64, &ObjectAttributes, &ClientId) < 0 )
    {
      v5 = ProcessHandle;
LABEL_11:
      if( !v5 )
        return;
      NtClose(v5);
      goto LABEL_21;
    }
    v5 = ProcessHandle;
    v12 = ObpReferenceObjectByHandleWithTag(
            (ULONG_PTR)ProcessHandle,
            0x1FFFFF,
            (__int64)PsProcessType,
            0,
            0x73576650u,
            (__int64)&Object,
            0i64,
            0i64);
    v4 = Object;
    if( v12 >= 0 )
    {
      v13 = *(_QWORD *)(v7 + 16);
      if( !v13 || v13 == ((*((_QWORD *)Object + 136) ^ *((_QWORD *)Object + 141)) & 0x1FFFFFFFFFFFFFFFi64) )
      {
        *(_QWORD *)SettingGuid->Data4 = v5;
        v5 = 0i64;
      }
    }
LABEL_9:
    if( v4 )
      ObfDereferenceObjectWithTag(v4, 0x73576650ui64);
    goto LABEL_11;
  }
  RtlStringCbPrintfW(pszDest, 0x50ui64, (WCHAR *)L"\\KernelObjects\\Session%d");
  RtlInitUnicodeString(&DestinationString, pszDest, v14);
  ObjectAttributes.RootDirectory = 0i64;
  ObjectAttributes.ObjectName = &DestinationString;
  ObjectAttributes.Length = 48;
  ObjectAttributes.Attributes = 512;
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  NtOpenSession(&ClientId.UniqueProcess, 0xF0003ui64, &ObjectAttributes);
  if( v15 >= 0 )
  {
    *(_QWORD *)SettingGuid->Data4 = ClientId.UniqueProcess;
    goto LABEL_9;
  }
  UniqueProcess = ClientId.UniqueProcess;
LABEL_21:
  if( UniqueProcess )
    NtClose(UniqueProcess);
}

Referenced by:

PfpPrefetchPrivatePages