618 lines
8.4 KiB
C
618 lines
8.4 KiB
C
/*++
|
||
|
||
Copyright (c) 1999 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
pshelper.c
|
||
|
||
Abstract:
|
||
|
||
EPROCESS and ETHREAD field access for NTOS-external components
|
||
|
||
Author:
|
||
|
||
Gerardo Bermudez (gerardob) 10-Aug-1999
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "psp.h"
|
||
|
||
#ifdef ALLOC_PRAGMA
|
||
#pragma alloc_text (PAGE, PsIsProcessBeingDebugged)
|
||
#pragma alloc_text (PAGE, PsIsThreadImpersonating)
|
||
#pragma alloc_text (PAGE, PsReferenceProcessFilePointer)
|
||
#pragma alloc_text (PAGE, PsSetProcessWin32Process)
|
||
#pragma alloc_text (PAGE, PsSetProcessSecurityPort)
|
||
#pragma alloc_text (PAGE, PsSetJobUIRestrictionsClass)
|
||
#pragma alloc_text (PAGE, PsSetProcessWindowStation)
|
||
#pragma alloc_text (PAGE, PsGetProcessSecurityPort)
|
||
#pragma alloc_text (PAGE, PsSetThreadWin32Thread)
|
||
#pragma alloc_text (PAGE, PsGetProcessExitProcessCalled)
|
||
#pragma alloc_text (PAGE, PsGetThreadSessionId)
|
||
#pragma alloc_text (PAGE, PsSetProcessPriorityClass)
|
||
#endif
|
||
|
||
/*++
|
||
--*/
|
||
#undef PsGetCurrentProcess
|
||
PEPROCESS
|
||
PsGetCurrentProcess(
|
||
VOID
|
||
)
|
||
{
|
||
return _PsGetCurrentProcess();
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
ULONG PsGetCurrentProcessSessionId(
|
||
VOID
|
||
)
|
||
{
|
||
return MmGetSessionId (_PsGetCurrentProcess());
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
#undef PsGetCurrentThread
|
||
PETHREAD
|
||
PsGetCurrentThread(
|
||
VOID
|
||
)
|
||
{
|
||
return _PsGetCurrentThread();
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
PVOID
|
||
PsGetCurrentThreadStackBase(
|
||
VOID
|
||
)
|
||
{
|
||
return KeGetCurrentThread()->StackBase;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
PVOID
|
||
PsGetCurrentThreadStackLimit(
|
||
VOID
|
||
)
|
||
{
|
||
return KeGetCurrentThread()->StackLimit;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
CCHAR
|
||
PsGetCurrentThreadPreviousMode(
|
||
VOID
|
||
)
|
||
{
|
||
return KeGetPreviousMode();
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
PERESOURCE
|
||
PsGetJobLock(
|
||
PEJOB Job
|
||
)
|
||
{
|
||
return &Job->JobLock;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
ULONG
|
||
PsGetJobSessionId(
|
||
PEJOB Job
|
||
)
|
||
{
|
||
return Job->SessionId;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
ULONG
|
||
PsGetJobUIRestrictionsClass(
|
||
PEJOB Job
|
||
)
|
||
{
|
||
return Job->UIRestrictionsClass;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
LONGLONG
|
||
PsGetProcessCreateTimeQuadPart(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->CreateTime.QuadPart;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
PVOID
|
||
PsGetProcessDebugPort(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->DebugPort;
|
||
}
|
||
|
||
|
||
BOOLEAN
|
||
PsIsProcessBeingDebugged(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
if (Process->DebugPort != NULL) {
|
||
return TRUE;
|
||
} else {
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
BOOLEAN
|
||
PsGetProcessExitProcessCalled(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return (BOOLEAN) ((Process->Flags&PS_PROCESS_FLAGS_PROCESS_EXITING) != 0);
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
NTSTATUS
|
||
PsGetProcessExitStatus(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->ExitStatus;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
HANDLE
|
||
PsGetProcessId(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->UniqueProcessId;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
UCHAR *
|
||
PsGetProcessImageFileName(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->ImageFileName;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
|
||
HANDLE
|
||
PsGetProcessInheritedFromUniqueProcessId(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->InheritedFromUniqueProcessId;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
PEJOB
|
||
PsGetProcessJob(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->Job;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
ULONG
|
||
PsGetProcessSessionId(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return MmGetSessionId (Process);
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
PVOID
|
||
PsGetProcessSectionBaseAddress(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->SectionBaseAddress;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
PPEB
|
||
PsGetProcessPeb(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->Peb;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
UCHAR
|
||
PsGetProcessPriorityClass(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->PriorityClass;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
HANDLE
|
||
PsGetProcessWin32WindowStation(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->Win32WindowStation;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
|
||
PVOID
|
||
PsGetProcessWin32Process(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->Win32Process;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
|
||
PVOID
|
||
PsGetProcessWow64Process(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return PS_GET_WOW64_PROCESS (Process);
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
HANDLE
|
||
PsGetThreadId(
|
||
PETHREAD Thread
|
||
)
|
||
{
|
||
return Thread->Cid.UniqueThread;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
CCHAR
|
||
PsGetThreadFreezeCount(
|
||
PETHREAD Thread
|
||
)
|
||
{
|
||
return Thread->Tcb.FreezeCount;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
BOOLEAN
|
||
PsGetThreadHardErrorsAreDisabled(
|
||
PETHREAD Thread)
|
||
{
|
||
return (BOOLEAN) (Thread->CrossThreadFlags&PS_CROSS_THREAD_FLAGS_HARD_ERRORS_DISABLED) != 0;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
PEPROCESS
|
||
PsGetThreadProcess(
|
||
PETHREAD Thread
|
||
)
|
||
{
|
||
return THREAD_TO_PROCESS(Thread);
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
|
||
HANDLE
|
||
PsGetThreadProcessId(
|
||
PETHREAD Thread
|
||
)
|
||
{
|
||
return Thread->Cid.UniqueProcess;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
|
||
ULONG
|
||
PsGetThreadSessionId(
|
||
PETHREAD Thread
|
||
)
|
||
{
|
||
return MmGetSessionId (THREAD_TO_PROCESS(Thread));
|
||
}
|
||
|
||
|
||
|
||
/*++
|
||
--*/
|
||
PVOID
|
||
PsGetThreadTeb(
|
||
PETHREAD Thread
|
||
)
|
||
{
|
||
return Thread->Tcb.Teb;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
PVOID
|
||
PsGetThreadWin32Thread(
|
||
PETHREAD Thread
|
||
)
|
||
{
|
||
return Thread->Tcb.Win32Thread;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
BOOLEAN
|
||
PsIsSystemThread(
|
||
PETHREAD Thread
|
||
)
|
||
{
|
||
return (BOOLEAN)(IS_SYSTEM_THREAD(Thread));
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
|
||
VOID
|
||
PsSetJobUIRestrictionsClass(
|
||
PEJOB Job,
|
||
ULONG UIRestrictionsClass
|
||
)
|
||
{
|
||
Job->UIRestrictionsClass = UIRestrictionsClass;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
|
||
VOID
|
||
PsSetProcessPriorityClass(
|
||
PEPROCESS Process,
|
||
UCHAR PriorityClass
|
||
)
|
||
{
|
||
Process->PriorityClass = PriorityClass;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
NTSTATUS
|
||
PsSetProcessWin32Process(
|
||
PEPROCESS Process,
|
||
PVOID Win32Process,
|
||
PVOID PrevWin32Process
|
||
)
|
||
{
|
||
NTSTATUS Status;
|
||
PETHREAD CurrentThread;
|
||
|
||
Status = STATUS_SUCCESS;
|
||
|
||
CurrentThread = PsGetCurrentThread ();
|
||
|
||
PspLockProcessExclusive (Process, CurrentThread);
|
||
|
||
if (Win32Process != NULL) {
|
||
if ((Process->Flags&PS_PROCESS_FLAGS_PROCESS_DELETE) == 0 && Process->Win32Process == NULL) {
|
||
Process->Win32Process = Win32Process;
|
||
} else {
|
||
Status = STATUS_PROCESS_IS_TERMINATING;
|
||
}
|
||
} else {
|
||
if (Process->Win32Process == PrevWin32Process) {
|
||
Process->Win32Process = NULL;
|
||
} else {
|
||
Status = STATUS_UNSUCCESSFUL;
|
||
}
|
||
}
|
||
|
||
PspUnlockProcessExclusive (Process, CurrentThread);
|
||
|
||
return Status;
|
||
}
|
||
|
||
|
||
|
||
/*++
|
||
--*/
|
||
VOID
|
||
PsSetProcessWindowStation(
|
||
PEPROCESS Process,
|
||
HANDLE Win32WindowStation
|
||
)
|
||
{
|
||
Process->Win32WindowStation = Win32WindowStation;
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
VOID
|
||
PsSetThreadHardErrorsAreDisabled(
|
||
PETHREAD Thread,
|
||
BOOLEAN HardErrorsAreDisabled
|
||
)
|
||
{
|
||
if (HardErrorsAreDisabled) {
|
||
PS_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_HARD_ERRORS_DISABLED);
|
||
} else {
|
||
PS_CLEAR_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_HARD_ERRORS_DISABLED);
|
||
}
|
||
}
|
||
|
||
|
||
/*++
|
||
--*/
|
||
VOID
|
||
PsSetThreadWin32Thread(
|
||
PETHREAD Thread,
|
||
PVOID Win32Thread,
|
||
PVOID PrevWin32Thread
|
||
)
|
||
{
|
||
if (Win32Thread != NULL) {
|
||
InterlockedExchangePointer(&Thread->Tcb.Win32Thread, Win32Thread);
|
||
} else {
|
||
InterlockedCompareExchangePointer(&Thread->Tcb.Win32Thread, Win32Thread, PrevWin32Thread);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
/*++
|
||
--*/
|
||
PVOID
|
||
PsGetProcessSecurityPort(
|
||
PEPROCESS Process
|
||
)
|
||
{
|
||
return Process->SecurityPort ;
|
||
}
|
||
|
||
/*++
|
||
--*/
|
||
NTSTATUS
|
||
PsSetProcessSecurityPort(
|
||
PEPROCESS Process,
|
||
PVOID Port
|
||
)
|
||
{
|
||
Process->SecurityPort = Port ;
|
||
return STATUS_SUCCESS ;
|
||
}
|
||
|
||
BOOLEAN
|
||
PsIsThreadImpersonating (
|
||
IN PETHREAD Thread
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine returns TRUE if the specified thread is impersonating otherwise it returns false.
|
||
|
||
Arguments:
|
||
|
||
Thread - Thread to be queried
|
||
|
||
Return Value:
|
||
|
||
BOOLEAN - TRUE: Thread is impersonating, FALSE: Thread is not impersonating.
|
||
|
||
--*/
|
||
{
|
||
PAGED_CODE ();
|
||
|
||
return (BOOLEAN) (PS_IS_THREAD_IMPERSONATING (Thread));
|
||
}
|
||
|
||
|
||
NTSTATUS
|
||
PsReferenceProcessFilePointer (
|
||
IN PEPROCESS Process,
|
||
OUT PVOID *OutFileObject
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine returns a referenced pointer to the FilePointer of Process.
|
||
This is a rundown protected wrapper around MmGetFileObjectForSection.
|
||
|
||
Arguments:
|
||
|
||
Process - Supplies the process to query.
|
||
|
||
OutFileObject - Returns the file object backing the requested section if
|
||
success is returned.
|
||
|
||
Return Value:
|
||
|
||
NTSTATUS.
|
||
|
||
Environment:
|
||
|
||
Kernel mode, PASSIVE_LEVEL.
|
||
|
||
--*/
|
||
|
||
{
|
||
PFILE_OBJECT FileObject;
|
||
|
||
PAGED_CODE();
|
||
|
||
if (!ExAcquireRundownProtection (&Process->RundownProtect)) {
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
if (Process->SectionObject == NULL) {
|
||
ExReleaseRundownProtection (&Process->RundownProtect);
|
||
return STATUS_UNSUCCESSFUL;
|
||
}
|
||
|
||
FileObject = MmGetFileObjectForSection ((PVOID)Process->SectionObject);
|
||
|
||
*OutFileObject = FileObject;
|
||
|
||
ObReferenceObject (FileObject);
|
||
|
||
ExReleaseRundownProtection (&Process->RundownProtect);
|
||
|
||
return STATUS_SUCCESS;
|
||
}
|