2020-09-30 17:17:25 +02:00

197 lines
3.9 KiB
C

/*++ BUILD Version: 0009 // Increment this if a change has global effects
Copyright (c) 1989 Microsoft Corporation
Module Name:
ps.h
Abstract:
This module contains the process structure public data structures and
procedure prototypes to be used within the NT system.
Author:
Mark Lucovsky 16-Feb-1989
Revision History:
--*/
#ifndef _PS_
#define _PS_
//
// Specifies the base address of XBOXKRNL.EXE.
//
#define PsNtosImageBase ((PVOID)0x80010000)
//
// Thread Object
//
// Thread object body. A pointer to this structure is returned when a handle
// to a thread object is referenced. This structure contains a thread control
// block (TCB) which is the kernel's representation of a thread.
//
// If you remove a field from this structure, please also
// remove the reference to it from within the kernel debugger
// (nt\private\sdktools\ntsd\ntkext.c)
//
typedef struct _ETHREAD {
KTHREAD Tcb;
LARGE_INTEGER CreateTime;
LARGE_INTEGER ExitTime;
union {
NTSTATUS ExitStatus;
PVOID OfsChain; // needed for the nt build of the C runtime
};
union {
LIST_ENTRY ReaperListEntry;
LIST_ENTRY ActiveTimerListHead;
};
HANDLE UniqueThread;
PVOID StartAddress;
//
// Io
//
LIST_ENTRY IrpList;
#ifdef DEVKIT
//
// Dm
//
// keep this at the end so kd exts don't get confused
//
PVOID DebugData;
#endif
} ETHREAD, *PETHREAD;
//
// Global Variables
//
extern LIST_ENTRY PsReaperListHead;
extern KDPC PsReaperDpc;
BOOLEAN
PsInitSystem (
VOID
);
//
// Get Gurrent Prototypes
//
#define THREAD_TO_PROCESS(thread) ((thread)->Tcb.ApcState.Process)
#define PsGetCurrentProcess() (KeGetCurrentThread()->ApcState.Process)
#define PsGetCurrentThread() (CONTAINING_RECORD((KeGetCurrentThread()),ETHREAD,Tcb))
#define PsGetCurrentThreadId() (PsGetCurrentThread()->UniqueThread)
// begin_ntddk begin_wdm
//
// System Thread and Process Creation and Termination
//
NTKERNELAPI
NTSTATUS
PsCreateSystemThread(
OUT PHANDLE ThreadHandle,
OUT PHANDLE ThreadId OPTIONAL,
IN PKSTART_ROUTINE StartRoutine,
IN PVOID StartContext,
IN BOOLEAN DebuggerThread
);
NTKERNELAPI
NTSTATUS
PsCreateSystemThreadEx(
OUT PHANDLE ThreadHandle,
IN SIZE_T ThreadExtensionSize,
IN SIZE_T KernelStackSize,
IN SIZE_T TlsDataSize,
OUT PHANDLE ThreadId OPTIONAL,
IN PKSTART_ROUTINE StartRoutine,
IN PVOID StartContext,
IN BOOLEAN CreateSuspended,
IN BOOLEAN DebuggerThread,
IN PKSYSTEM_ROUTINE SystemRoutine OPTIONAL
);
DECLSPEC_NORETURN
NTKERNELAPI
VOID
PsTerminateSystemThread(
IN NTSTATUS ExitStatus
);
// end_ntddk end_wdm
// begin_ntddk
typedef
VOID
(*PCREATE_THREAD_NOTIFY_ROUTINE)(
IN PETHREAD Thread,
IN HANDLE ThreadId,
IN BOOLEAN Create
);
NTSTATUS
PsSetCreateThreadNotifyRoutine(
IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
);
// end_ntddk
//
// BOOLEAN
// PsIsThreadTerminating(
// IN PETHREAD Thread
// )
//
// Returns TRUE if thread is in the process of terminating.
//
#define PsIsThreadTerminating(T) \
(T)->Tcb.HasTerminated
//
// Cid
//
#if !defined(_NTSYSTEM_)
#define PsLookupThreadByThreadId(ThreadId, Thread) \
ObReferenceObjectByHandle(ThreadId, PsThreadObjectType, Thread);
#else
#define PsLookupThreadByThreadId(ThreadId, Thread) \
ObReferenceObjectByHandle(ThreadId, &PsThreadObjectType, Thread);
#endif
//
// Process statistics.
//
typedef struct _PS_STATISTICS {
ULONG Length;
ULONG ThreadCount;
ULONG HandleCount;
} PS_STATISTICS, *PPS_STATISTICS;
NTKERNELAPI
NTSTATUS
PsQueryStatistics(
IN OUT PPS_STATISTICS ProcessStatistics
);
#endif // _PS_