text: /*
   * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/
   *
   * You can redistribute this file and/or modify it under the terms of the 
   * Attribution 4.0 International (CC BY 4.0) license. 
   * 
   * You must give appropriate credit, provide a link to the license, and 
   * indicate if changes were made. You may do so in any reasonable manner, but 
   * not in any way that suggests the licensor endorses you or your use.
   */
  
  #ifndef _NTKEAPI_H
  #define _NTKEAPI_H
  
  #if (PHNT_MODE != PHNT_MODE_KERNEL)
  #define LOW_PRIORITY 0 // Lowest thread priority level
  #define LOW_REALTIME_PRIORITY 16 // Lowest realtime priority level
  #define HIGH_PRIORITY 31 // Highest thread priority level
  #define MAXIMUM_PRIORITY 32 // Number of thread priority levels
  #endif
  
  typedef enum _KTHREAD_STATE
  {
      Initialized,
      Ready,
      Running,
      Standby,
      Terminated,
      Waiting,
      Transition,
      DeferredReady,
      GateWaitObsolete,
      WaitingForProcessInSwap,
      MaximumThreadState
  } KTHREAD_STATE, *PKTHREAD_STATE;
  
  // private
  typedef enum _KHETERO_CPU_POLICY
  {
      KHeteroCpuPolicyAll = 0,
      KHeteroCpuPolicyLarge = 1,
      KHeteroCpuPolicyLargeOrIdle = 2,
      KHeteroCpuPolicySmall = 3,
      KHeteroCpuPolicySmallOrIdle = 4,
      KHeteroCpuPolicyDynamic = 5,
      KHeteroCpuPolicyStaticMax = 5, // valid
      KHeteroCpuPolicyBiasedSmall = 6,
      KHeteroCpuPolicyBiasedLarge = 7,
      KHeteroCpuPolicyDefault = 8,
      KHeteroCpuPolicyMax = 9
  } KHETERO_CPU_POLICY, *PKHETERO_CPU_POLICY;
  
  #if (PHNT_MODE != PHNT_MODE_KERNEL)
  
  typedef enum _KWAIT_REASON
  {
      Executive,
      FreePage,
      PageIn,
      PoolAllocation,
      DelayExecution,
      Suspended,
      UserRequest,
      WrExecutive,
      WrFreePage,
      WrPageIn,
      WrPoolAllocation,
      WrDelayExecution,
      WrSuspended,
      WrUserRequest,
      WrEventPair,
      WrQueue,
      WrLpcReceive,
      WrLpcReply,
      WrVirtualMemory,
      WrPageOut,
      WrRendezvous,
      WrKeyedEvent,
      WrTerminated,
      WrProcessInSwap,
      WrCpuRateControl,
      WrCalloutStack,
      WrKernel,
      WrResource,
      WrPushLock,
      WrMutex,
      WrQuantumEnd,
      WrDispatchInt,
      WrPreempted,
      WrYieldExecution,
      WrFastMutex,
      WrGuardedMutex,
      WrRundown,
      WrAlertByThreadId,
      WrDeferredPreempt,
      WrPhysicalFault,
      WrIoRing,
      WrMdlCache,
      MaximumWaitReason
  } KWAIT_REASON, *PKWAIT_REASON;
  
  typedef enum _KPROFILE_SOURCE
  {
      ProfileTime,
      ProfileAlignmentFixup,
      ProfileTotalIssues,
      ProfilePipelineDry,
      ProfileLoadInstructions,
      ProfilePipelineFrozen,
      ProfileBranchInstructions,
      ProfileTotalNonissues,
      ProfileDcacheMisses,
      ProfileIcacheMisses,
      ProfileCacheMisses,
      ProfileBranchMispredictions,
      ProfileStoreInstructions,
      ProfileFpInstructions,
      ProfileIntegerInstructions,
      Profile2Issue,
      Profile3Issue,
      Profile4Issue,
      ProfileSpecialInstructions,
      ProfileTotalCycles,
      ProfileIcacheIssues,
      ProfileDcacheAccesses,
      ProfileMemoryBarrierCycles,
      ProfileLoadLinkedIssues,
      ProfileMaximum
  } KPROFILE_SOURCE;
  
  #endif
  
  #if (PHNT_MODE != PHNT_MODE_KERNEL)
  
  NTSYSCALLAPI
  NTSTATUS
  NTAPI
  NtCallbackReturn(
      _In_reads_bytes_opt_(OutputLength) PVOID OutputBuffer,
      _In_ ULONG OutputLength,
      _In_ NTSTATUS Status
      );
  
  #if (PHNT_VERSION >= PHNT_VISTA)
  NTSYSCALLAPI
  VOID
  NTAPI
  NtFlushProcessWriteBuffers(
      VOID
      );
  #endif
  
  NTSYSCALLAPI
  NTSTATUS
  NTAPI
  NtQueryDebugFilterState(
      _In_ ULONG ComponentId,
      _In_ ULONG Level
      );
  
  NTSYSCALLAPI
  NTSTATUS
  NTAPI
  NtSetDebugFilterState(
      _In_ ULONG ComponentId,
      _In_ ULONG Level,
      _In_ BOOLEAN State
      );
  
  NTSYSCALLAPI
  NTSTATUS
  NTAPI
  NtYieldExecution(
      VOID
      );
  
  #endif
  
  #endif
  