mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 06:22:58 +00:00
1. object type names are stored in ntoskrnl's image (which is nonpaged memory), so there's no need to allocate and copy them to new memory
2. fixed PsLookupThreadByThreadId() prototype 3. renamed the process list to PsActiveProcessHead and use fast mutexes to serialize access to it svn path=/trunk/; revision=13623
This commit is contained in:
parent
e376d4e01d
commit
6d97eb3b0f
20 changed files with 101 additions and 90 deletions
|
@ -403,7 +403,7 @@ NTSTATUS STDCALL PsLookupProcessThreadByCid(IN PCLIENT_ID Cid,
|
||||||
OUT struct _ETHREAD **Thread);
|
OUT struct _ETHREAD **Thread);
|
||||||
/* OUT PETHREAD *Thread); */
|
/* OUT PETHREAD *Thread); */
|
||||||
|
|
||||||
NTSTATUS STDCALL PsLookupThreadByThreadId(IN PVOID ThreadId,
|
NTSTATUS STDCALL PsLookupThreadByThreadId(IN HANDLE ThreadId,
|
||||||
OUT struct _ETHREAD **Thread);
|
OUT struct _ETHREAD **Thread);
|
||||||
/* OUT PETHREAD *Thread); */
|
/* OUT PETHREAD *Thread); */
|
||||||
|
|
||||||
|
|
|
@ -862,20 +862,20 @@ DbgThreadListCommand(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf)
|
||||||
ULONG
|
ULONG
|
||||||
DbgProcessListCommand(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf)
|
DbgProcessListCommand(ULONG Argc, PCH Argv[], PKTRAP_FRAME Tf)
|
||||||
{
|
{
|
||||||
extern LIST_ENTRY PsProcessListHead;
|
extern LIST_ENTRY PsActiveProcessHead;
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PEPROCESS current;
|
PEPROCESS current;
|
||||||
ULONG i = 1;
|
ULONG i = 1;
|
||||||
|
|
||||||
if (PsProcessListHead.Flink == NULL)
|
if (PsActiveProcessHead.Flink == NULL)
|
||||||
{
|
{
|
||||||
DbgPrint("No processes.\n");
|
DbgPrint("No processes.\n");
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
DbgPrint("Process list: ");
|
DbgPrint("Process list: ");
|
||||||
current_entry = PsProcessListHead.Flink;
|
current_entry = PsActiveProcessHead.Flink;
|
||||||
while (current_entry != &PsProcessListHead)
|
while (current_entry != &PsActiveProcessHead)
|
||||||
{
|
{
|
||||||
current = CONTAINING_RECORD(current_entry, EPROCESS, ProcessListEntry);
|
current = CONTAINING_RECORD(current_entry, EPROCESS, ProcessListEntry);
|
||||||
DbgPrint("%d %.8s", current->UniqueProcessId,
|
DbgPrint("%d %.8s", current->UniqueProcessId,
|
||||||
|
|
|
@ -49,7 +49,7 @@ ExpInitializeCallbacks(VOID)
|
||||||
ExCallbackObjectType = ExAllocatePoolWithTag(NonPagedPool, sizeof(OBJECT_TYPE), CALLBACK_TAG);
|
ExCallbackObjectType = ExAllocatePoolWithTag(NonPagedPool, sizeof(OBJECT_TYPE), CALLBACK_TAG);
|
||||||
|
|
||||||
/* Initialize name */
|
/* Initialize name */
|
||||||
RtlRosInitUnicodeStringFromLiteral(&ExCallbackObjectType->TypeName,L"Callback");
|
RtlInitUnicodeString(&ExCallbackObjectType->TypeName, L"Callback");
|
||||||
|
|
||||||
/* Create the Object Type */
|
/* Create the Object Type */
|
||||||
ExCallbackObjectType->Tag = CALLBACK_TAG;
|
ExCallbackObjectType->Tag = CALLBACK_TAG;
|
||||||
|
|
|
@ -295,7 +295,7 @@ ExpWin32kInit(VOID)
|
||||||
ExWindowStationObjectType->OkayToClose = NULL;
|
ExWindowStationObjectType->OkayToClose = NULL;
|
||||||
ExWindowStationObjectType->Create = ExpWinStaObjectCreate;
|
ExWindowStationObjectType->Create = ExpWinStaObjectCreate;
|
||||||
ExWindowStationObjectType->DuplicationNotify = NULL;
|
ExWindowStationObjectType->DuplicationNotify = NULL;
|
||||||
RtlRosInitUnicodeStringFromLiteral(&ExWindowStationObjectType->TypeName, L"WindowStation");
|
RtlInitUnicodeString(&ExWindowStationObjectType->TypeName, L"WindowStation");
|
||||||
|
|
||||||
ObpCreateTypeObject(ExWindowStationObjectType);
|
ObpCreateTypeObject(ExWindowStationObjectType);
|
||||||
|
|
||||||
|
@ -325,7 +325,7 @@ ExpWin32kInit(VOID)
|
||||||
ExDesktopObjectType->OkayToClose = NULL;
|
ExDesktopObjectType->OkayToClose = NULL;
|
||||||
ExDesktopObjectType->Create = ExpDesktopObjectCreate;
|
ExDesktopObjectType->Create = ExpDesktopObjectCreate;
|
||||||
ExDesktopObjectType->DuplicationNotify = NULL;
|
ExDesktopObjectType->DuplicationNotify = NULL;
|
||||||
RtlRosInitUnicodeStringFromLiteral(&ExDesktopObjectType->TypeName, L"Desktop");
|
RtlInitUnicodeString(&ExDesktopObjectType->TypeName, L"Desktop");
|
||||||
|
|
||||||
ObpCreateTypeObject(ExDesktopObjectType);
|
ObpCreateTypeObject(ExDesktopObjectType);
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,7 +110,7 @@ IopInitDriverImplementation(VOID)
|
||||||
IoDriverObjectType->OkayToClose = NULL;
|
IoDriverObjectType->OkayToClose = NULL;
|
||||||
IoDriverObjectType->Create = IopCreateDriver;
|
IoDriverObjectType->Create = IopCreateDriver;
|
||||||
IoDriverObjectType->DuplicationNotify = NULL;
|
IoDriverObjectType->DuplicationNotify = NULL;
|
||||||
RtlRosInitUnicodeStringFromLiteral(&IoDriverObjectType->TypeName, L"Driver");
|
RtlInitUnicodeString(&IoDriverObjectType->TypeName, L"Driver");
|
||||||
|
|
||||||
ObpCreateTypeObject(IoDriverObjectType);
|
ObpCreateTypeObject(IoDriverObjectType);
|
||||||
|
|
||||||
|
|
|
@ -410,7 +410,7 @@ IoInit (VOID)
|
||||||
IoDeviceObjectType->Create = IopCreateDevice;
|
IoDeviceObjectType->Create = IopCreateDevice;
|
||||||
IoDeviceObjectType->DuplicationNotify = NULL;
|
IoDeviceObjectType->DuplicationNotify = NULL;
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&IoDeviceObjectType->TypeName, L"Device");
|
RtlInitUnicodeString(&IoDeviceObjectType->TypeName, L"Device");
|
||||||
|
|
||||||
ObpCreateTypeObject(IoDeviceObjectType);
|
ObpCreateTypeObject(IoDeviceObjectType);
|
||||||
|
|
||||||
|
@ -439,7 +439,7 @@ IoInit (VOID)
|
||||||
IoFileObjectType->Create = IopCreateFile;
|
IoFileObjectType->Create = IopCreateFile;
|
||||||
IoFileObjectType->DuplicationNotify = NULL;
|
IoFileObjectType->DuplicationNotify = NULL;
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&IoFileObjectType->TypeName, L"File");
|
RtlInitUnicodeString(&IoFileObjectType->TypeName, L"File");
|
||||||
|
|
||||||
ObpCreateTypeObject(IoFileObjectType);
|
ObpCreateTypeObject(IoFileObjectType);
|
||||||
|
|
||||||
|
@ -453,7 +453,7 @@ IoInit (VOID)
|
||||||
IoAdapterObjectType->PeakObjects = 0;
|
IoAdapterObjectType->PeakObjects = 0;
|
||||||
IoAdapterObjectType->PeakHandles = 0;
|
IoAdapterObjectType->PeakHandles = 0;
|
||||||
IoDeviceObjectType->Mapping = &IopFileMapping;
|
IoDeviceObjectType->Mapping = &IopFileMapping;
|
||||||
RtlRosInitUnicodeStringFromLiteral(&IoAdapterObjectType->TypeName, L"Adapter");
|
RtlInitUnicodeString(&IoAdapterObjectType->TypeName, L"Adapter");
|
||||||
ObpCreateTypeObject(IoAdapterObjectType);
|
ObpCreateTypeObject(IoAdapterObjectType);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -106,7 +106,7 @@ static PETHREAD GspRunThread; /* NULL means run all threads */
|
||||||
static PETHREAD GspDbgThread;
|
static PETHREAD GspDbgThread;
|
||||||
static PETHREAD GspEnumThread;
|
static PETHREAD GspEnumThread;
|
||||||
|
|
||||||
extern LIST_ENTRY PsProcessListHead;
|
extern LIST_ENTRY PsActiveProcessHead;
|
||||||
|
|
||||||
/* Number of Registers. */
|
/* Number of Registers. */
|
||||||
#define NUMREGS 16
|
#define NUMREGS 16
|
||||||
|
@ -652,12 +652,14 @@ GspFindThread(PCHAR Data,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ULONG ThreadId;
|
ULONG uThreadId;
|
||||||
|
HANDLE ThreadId;
|
||||||
PCHAR ptr = &Data[0];
|
PCHAR ptr = &Data[0];
|
||||||
|
|
||||||
GspHex2Long (&ptr, (PLONG) &ThreadId);
|
GspHex2Long (&ptr, (PULONG) &uThreadId);
|
||||||
|
ThreadId = (HANDLE)uThreadId;
|
||||||
|
|
||||||
if (!NT_SUCCESS (PsLookupThreadByThreadId ((PVOID) ThreadId, &ThreadInfo)))
|
if (!NT_SUCCESS (PsLookupThreadByThreadId (ThreadId, &ThreadInfo)))
|
||||||
{
|
{
|
||||||
*Thread = NULL;
|
*Thread = NULL;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -745,8 +747,8 @@ GspQuery(PCHAR Request)
|
||||||
|
|
||||||
/* Get first thread id */
|
/* Get first thread id */
|
||||||
GspEnumThread = NULL;
|
GspEnumThread = NULL;
|
||||||
AProcess = PsProcessListHead.Flink;
|
AProcess = PsActiveProcessHead.Flink;
|
||||||
while(AProcess != &PsProcessListHead)
|
while(AProcess != &PsActiveProcessHead)
|
||||||
{
|
{
|
||||||
Process = CONTAINING_RECORD(AProcess, EPROCESS, ProcessListEntry);
|
Process = CONTAINING_RECORD(AProcess, EPROCESS, ProcessListEntry);
|
||||||
AThread = Process->ThreadListHead.Flink;
|
AThread = Process->ThreadListHead.Flink;
|
||||||
|
@ -791,7 +793,7 @@ GspQuery(PCHAR Request)
|
||||||
{
|
{
|
||||||
PETHREAD Thread = NULL;
|
PETHREAD Thread = NULL;
|
||||||
AProcess = Process->ProcessListEntry.Flink;
|
AProcess = Process->ProcessListEntry.Flink;
|
||||||
while(AProcess != &PsProcessListHead)
|
while(AProcess != &PsActiveProcessHead)
|
||||||
{
|
{
|
||||||
Process = CONTAINING_RECORD(AProcess, EPROCESS, ProcessListEntry);
|
Process = CONTAINING_RECORD(AProcess, EPROCESS, ProcessListEntry);
|
||||||
AThread = Process->ThreadListHead.Flink;
|
AThread = Process->ThreadListHead.Flink;
|
||||||
|
|
|
@ -37,7 +37,7 @@ LpcpInitSystem (VOID)
|
||||||
LpcPortObjectType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
|
LpcPortObjectType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
|
||||||
RtlZeroMemory (LpcPortObjectType, sizeof (OBJECT_TYPE));
|
RtlZeroMemory (LpcPortObjectType, sizeof (OBJECT_TYPE));
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&LpcPortObjectType->TypeName,L"Port");
|
RtlInitUnicodeString(&LpcPortObjectType->TypeName,L"Port");
|
||||||
|
|
||||||
LpcPortObjectType->Tag = TAG('L', 'P', 'R', 'T');
|
LpcPortObjectType->Tag = TAG('L', 'P', 'R', 'T');
|
||||||
LpcPortObjectType->PeakObjects = 0;
|
LpcPortObjectType->PeakObjects = 0;
|
||||||
|
|
|
@ -2127,7 +2127,7 @@ MmInitSectionImplementation(VOID)
|
||||||
{
|
{
|
||||||
MmSectionObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
MmSectionObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&MmSectionObjectType->TypeName, L"Section");
|
RtlInitUnicodeString(&MmSectionObjectType->TypeName, L"Section");
|
||||||
|
|
||||||
MmSectionObjectType->Tag = TAG('S', 'E', 'C', 'T');
|
MmSectionObjectType->Tag = TAG('S', 'E', 'C', 'T');
|
||||||
MmSectionObjectType->TotalObjects = 0;
|
MmSectionObjectType->TotalObjects = 0;
|
||||||
|
|
|
@ -391,7 +391,7 @@ ObInit(VOID)
|
||||||
ObDirectoryType->Create = ObpCreateDirectory;
|
ObDirectoryType->Create = ObpCreateDirectory;
|
||||||
ObDirectoryType->DuplicationNotify = NULL;
|
ObDirectoryType->DuplicationNotify = NULL;
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&ObDirectoryType->TypeName,
|
RtlInitUnicodeString(&ObDirectoryType->TypeName,
|
||||||
L"Directory");
|
L"Directory");
|
||||||
|
|
||||||
/* create 'type' object type*/
|
/* create 'type' object type*/
|
||||||
|
@ -416,7 +416,7 @@ ObInit(VOID)
|
||||||
ObTypeObjectType->Create = NULL;
|
ObTypeObjectType->Create = NULL;
|
||||||
ObTypeObjectType->DuplicationNotify = NULL;
|
ObTypeObjectType->DuplicationNotify = NULL;
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&ObTypeObjectType->TypeName,
|
RtlInitUnicodeString(&ObTypeObjectType->TypeName,
|
||||||
L"ObjectType");
|
L"ObjectType");
|
||||||
|
|
||||||
/* Create security descriptor */
|
/* Create security descriptor */
|
||||||
|
|
|
@ -180,7 +180,7 @@ ObInitSymbolicLinkImplementation (VOID)
|
||||||
ObSymbolicLinkType->Create = ObpCreateSymbolicLink;
|
ObSymbolicLinkType->Create = ObpCreateSymbolicLink;
|
||||||
ObSymbolicLinkType->DuplicationNotify = NULL;
|
ObSymbolicLinkType->DuplicationNotify = NULL;
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&ObSymbolicLinkType->TypeName,
|
RtlInitUnicodeString(&ObSymbolicLinkType->TypeName,
|
||||||
L"SymbolicLink");
|
L"SymbolicLink");
|
||||||
|
|
||||||
ObpCreateTypeObject(ObSymbolicLinkType);
|
ObpCreateTypeObject(ObSymbolicLinkType);
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
/* $Id:$
|
/* $Id$
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
* FILE: ntoskrnl/ps/job.c
|
* FILE: ntoskrnl/ps/job.c
|
||||||
* PURPOSE: Job Native Functions
|
* PURPOSE: Job Native Functions
|
||||||
*
|
*
|
||||||
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
|
* PROGRAMMERS: Alex Ionescu (alex@relsoft.net) (stubs)
|
||||||
|
* Thomas Weidenmueller <w3seek@reactos.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Note: Jobs are only supported on Win2K+ */
|
/* Note: Jobs are only supported on Win2K+ */
|
||||||
|
@ -74,7 +75,7 @@ PsInitJobManagment(VOID)
|
||||||
PsJobType->Create = NULL;
|
PsJobType->Create = NULL;
|
||||||
PsJobType->DuplicationNotify = NULL;
|
PsJobType->DuplicationNotify = NULL;
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&PsJobType->TypeName, L"Job");
|
RtlInitUnicodeString(&PsJobType->TypeName, L"Job");
|
||||||
|
|
||||||
ObpCreateTypeObject(PsJobType);
|
ObpCreateTypeObject(PsJobType);
|
||||||
|
|
||||||
|
|
|
@ -20,8 +20,8 @@ PEPROCESS EXPORTED PsInitialSystemProcess = NULL;
|
||||||
|
|
||||||
POBJECT_TYPE EXPORTED PsProcessType = NULL;
|
POBJECT_TYPE EXPORTED PsProcessType = NULL;
|
||||||
|
|
||||||
LIST_ENTRY PsProcessListHead;
|
LIST_ENTRY PsActiveProcessHead;
|
||||||
static KSPIN_LOCK PsProcessListLock;
|
FAST_MUTEX PspActiveProcessMutex;
|
||||||
static LARGE_INTEGER ShortPsLockDelay, PsLockTimeout;
|
static LARGE_INTEGER ShortPsLockDelay, PsLockTimeout;
|
||||||
|
|
||||||
static GENERIC_MAPPING PiProcessMapping = {STANDARD_RIGHTS_READ | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
|
static GENERIC_MAPPING PiProcessMapping = {STANDARD_RIGHTS_READ | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
|
||||||
|
@ -101,7 +101,6 @@ PsExitSpecialApc(PKAPC Apc,
|
||||||
PEPROCESS
|
PEPROCESS
|
||||||
PsGetNextProcess(PEPROCESS OldProcess)
|
PsGetNextProcess(PEPROCESS OldProcess)
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
|
||||||
PEPROCESS NextProcess;
|
PEPROCESS NextProcess;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
@ -119,13 +118,13 @@ PsGetNextProcess(PEPROCESS OldProcess)
|
||||||
return PsInitialSystemProcess;
|
return PsInitialSystemProcess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
ExAcquireFastMutex(&PspActiveProcessMutex);
|
||||||
NextProcess = OldProcess;
|
NextProcess = OldProcess;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (NextProcess->ProcessListEntry.Blink == &PsProcessListHead)
|
if (NextProcess->ProcessListEntry.Blink == &PsActiveProcessHead)
|
||||||
{
|
{
|
||||||
NextProcess = CONTAINING_RECORD(PsProcessListHead.Blink,
|
NextProcess = CONTAINING_RECORD(PsActiveProcessHead.Blink,
|
||||||
EPROCESS,
|
EPROCESS,
|
||||||
ProcessListEntry);
|
ProcessListEntry);
|
||||||
}
|
}
|
||||||
|
@ -154,7 +153,7 @@ PsGetNextProcess(PEPROCESS OldProcess)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
ExReleaseFastMutex(&PspActiveProcessMutex);
|
||||||
ObDereferenceObject(OldProcess);
|
ObDereferenceObject(OldProcess);
|
||||||
|
|
||||||
return(NextProcess);
|
return(NextProcess);
|
||||||
|
@ -281,14 +280,13 @@ PsOpenTokenOfProcess(HANDLE ProcessHandle,
|
||||||
VOID
|
VOID
|
||||||
PiKillMostProcesses(VOID)
|
PiKillMostProcesses(VOID)
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PEPROCESS current;
|
PEPROCESS current;
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
ExAcquireFastMutex(&PspActiveProcessMutex);
|
||||||
|
|
||||||
current_entry = PsProcessListHead.Flink;
|
current_entry = PsActiveProcessHead.Flink;
|
||||||
while (current_entry != &PsProcessListHead)
|
while (current_entry != &PsActiveProcessHead)
|
||||||
{
|
{
|
||||||
current = CONTAINING_RECORD(current_entry, EPROCESS,
|
current = CONTAINING_RECORD(current_entry, EPROCESS,
|
||||||
ProcessListEntry);
|
ProcessListEntry);
|
||||||
|
@ -301,7 +299,7 @@ PiKillMostProcesses(VOID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
ExReleaseFastMutex(&PspActiveProcessMutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -309,7 +307,6 @@ VOID INIT_FUNCTION
|
||||||
PsInitProcessManagment(VOID)
|
PsInitProcessManagment(VOID)
|
||||||
{
|
{
|
||||||
PKPROCESS KProcess;
|
PKPROCESS KProcess;
|
||||||
KIRQL oldIrql;
|
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
ShortPsLockDelay.QuadPart = -100LL;
|
ShortPsLockDelay.QuadPart = -100LL;
|
||||||
|
@ -339,12 +336,12 @@ PsInitProcessManagment(VOID)
|
||||||
PsProcessType->Create = NULL;
|
PsProcessType->Create = NULL;
|
||||||
PsProcessType->DuplicationNotify = NULL;
|
PsProcessType->DuplicationNotify = NULL;
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&PsProcessType->TypeName, L"Process");
|
RtlInitUnicodeString(&PsProcessType->TypeName, L"Process");
|
||||||
|
|
||||||
ObpCreateTypeObject(PsProcessType);
|
ObpCreateTypeObject(PsProcessType);
|
||||||
|
|
||||||
InitializeListHead(&PsProcessListHead);
|
InitializeListHead(&PsActiveProcessHead);
|
||||||
KeInitializeSpinLock(&PsProcessListLock);
|
ExInitializeFastMutex(&PspActiveProcessMutex);
|
||||||
|
|
||||||
RtlZeroMemory(PiProcessNotifyRoutine, sizeof(PiProcessNotifyRoutine));
|
RtlZeroMemory(PiProcessNotifyRoutine, sizeof(PiProcessNotifyRoutine));
|
||||||
RtlZeroMemory(PiLoadImageNotifyRoutine, sizeof(PiLoadImageNotifyRoutine));
|
RtlZeroMemory(PiLoadImageNotifyRoutine, sizeof(PiLoadImageNotifyRoutine));
|
||||||
|
@ -412,11 +409,9 @@ PsInitProcessManagment(VOID)
|
||||||
|
|
||||||
PsInitialSystemProcess->Win32WindowStation = (HANDLE)0;
|
PsInitialSystemProcess->Win32WindowStation = (HANDLE)0;
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
InsertHeadList(&PsActiveProcessHead,
|
||||||
InsertHeadList(&PsProcessListHead,
|
|
||||||
&PsInitialSystemProcess->ProcessListEntry);
|
&PsInitialSystemProcess->ProcessListEntry);
|
||||||
InitializeListHead(&PsInitialSystemProcess->ThreadListHead);
|
InitializeListHead(&PsInitialSystemProcess->ThreadListHead);
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
|
||||||
|
|
||||||
SepCreateSystemProcessToken(PsInitialSystemProcess);
|
SepCreateSystemProcessToken(PsInitialSystemProcess);
|
||||||
}
|
}
|
||||||
|
@ -424,7 +419,6 @@ PsInitProcessManagment(VOID)
|
||||||
VOID STDCALL
|
VOID STDCALL
|
||||||
PiDeleteProcessWorker(PVOID pContext)
|
PiDeleteProcessWorker(PVOID pContext)
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
|
||||||
PDEL_CONTEXT Context;
|
PDEL_CONTEXT Context;
|
||||||
PEPROCESS CurrentProcess;
|
PEPROCESS CurrentProcess;
|
||||||
PEPROCESS Process;
|
PEPROCESS Process;
|
||||||
|
@ -440,9 +434,9 @@ PiDeleteProcessWorker(PVOID pContext)
|
||||||
KeAttachProcess(&Process->Pcb);
|
KeAttachProcess(&Process->Pcb);
|
||||||
}
|
}
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
ExAcquireFastMutex(&PspActiveProcessMutex);
|
||||||
RemoveEntryList(&Process->ProcessListEntry);
|
RemoveEntryList(&Process->ProcessListEntry);
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
ExReleaseFastMutex(&PspActiveProcessMutex);
|
||||||
|
|
||||||
/* KDB hook */
|
/* KDB hook */
|
||||||
KDB_DELETEPROCESS_HOOK(Process);
|
KDB_DELETEPROCESS_HOOK(Process);
|
||||||
|
@ -657,7 +651,6 @@ PspCreateProcess(OUT PHANDLE ProcessHandle,
|
||||||
PEPROCESS Process;
|
PEPROCESS Process;
|
||||||
PEPROCESS pParentProcess;
|
PEPROCESS pParentProcess;
|
||||||
PKPROCESS KProcess;
|
PKPROCESS KProcess;
|
||||||
KIRQL oldIrql;
|
|
||||||
PVOID LdrStartupAddr;
|
PVOID LdrStartupAddr;
|
||||||
PVOID BaseAddress;
|
PVOID BaseAddress;
|
||||||
PMEMORY_AREA MemoryArea;
|
PMEMORY_AREA MemoryArea;
|
||||||
|
@ -863,10 +856,10 @@ exitdereferenceobjects:
|
||||||
|
|
||||||
Process->Win32WindowStation = (HANDLE)0;
|
Process->Win32WindowStation = (HANDLE)0;
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
ExAcquireFastMutex(&PspActiveProcessMutex);
|
||||||
InsertHeadList(&PsProcessListHead, &Process->ProcessListEntry);
|
InsertHeadList(&PsActiveProcessHead, &Process->ProcessListEntry);
|
||||||
InitializeListHead(&Process->ThreadListHead);
|
InitializeListHead(&Process->ThreadListHead);
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
ExReleaseFastMutex(&PspActiveProcessMutex);
|
||||||
|
|
||||||
ExInitializeFastMutex(&Process->TebLock);
|
ExInitializeFastMutex(&Process->TebLock);
|
||||||
Process->Pcb.State = PROCESS_STATE_ACTIVE;
|
Process->Pcb.State = PROCESS_STATE_ACTIVE;
|
||||||
|
@ -1261,14 +1254,13 @@ NtOpenProcess(OUT PHANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PEPROCESS current;
|
PEPROCESS current;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
ExAcquireFastMutex(&PspActiveProcessMutex);
|
||||||
current_entry = PsProcessListHead.Flink;
|
current_entry = PsActiveProcessHead.Flink;
|
||||||
while (current_entry != &PsProcessListHead)
|
while (current_entry != &PsActiveProcessHead)
|
||||||
{
|
{
|
||||||
current = CONTAINING_RECORD(current_entry, EPROCESS,
|
current = CONTAINING_RECORD(current_entry, EPROCESS,
|
||||||
ProcessListEntry);
|
ProcessListEntry);
|
||||||
|
@ -1285,7 +1277,7 @@ NtOpenProcess(OUT PHANDLE ProcessHandle,
|
||||||
PsProcessType,
|
PsProcessType,
|
||||||
UserMode);
|
UserMode);
|
||||||
}
|
}
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
ExReleaseFastMutex(&PspActiveProcessMutex);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
Status = ObCreateHandle(PsGetCurrentProcess(),
|
Status = ObCreateHandle(PsGetCurrentProcess(),
|
||||||
|
@ -1301,7 +1293,7 @@ NtOpenProcess(OUT PHANDLE ProcessHandle,
|
||||||
}
|
}
|
||||||
current_entry = current_entry->Flink;
|
current_entry = current_entry->Flink;
|
||||||
}
|
}
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
ExReleaseFastMutex(&PspActiveProcessMutex);
|
||||||
DPRINT("NtOpenProcess() = STATUS_UNSUCCESSFUL\n");
|
DPRINT("NtOpenProcess() = STATUS_UNSUCCESSFUL\n");
|
||||||
return(STATUS_UNSUCCESSFUL);
|
return(STATUS_UNSUCCESSFUL);
|
||||||
}
|
}
|
||||||
|
@ -2094,13 +2086,33 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ProcessPriorityClass:
|
||||||
|
{
|
||||||
|
PROCESS_PRIORITY_CLASS ppc;
|
||||||
|
|
||||||
|
_SEH_TRY
|
||||||
|
{
|
||||||
|
ppc = *(PPROCESS_PRIORITY_CLASS)ProcessInformation;
|
||||||
|
}
|
||||||
|
_SEH_HANDLE
|
||||||
|
{
|
||||||
|
Status = _SEH_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH_END;
|
||||||
|
|
||||||
|
if(NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case ProcessLdtInformation:
|
case ProcessLdtInformation:
|
||||||
case ProcessLdtSize:
|
case ProcessLdtSize:
|
||||||
case ProcessIoPortHandlers:
|
case ProcessIoPortHandlers:
|
||||||
case ProcessWorkingSetWatch:
|
case ProcessWorkingSetWatch:
|
||||||
case ProcessUserModeIOPL:
|
case ProcessUserModeIOPL:
|
||||||
case ProcessEnableAlignmentFaultFixup:
|
case ProcessEnableAlignmentFaultFixup:
|
||||||
case ProcessPriorityClass:
|
|
||||||
case ProcessAffinityMask:
|
case ProcessAffinityMask:
|
||||||
Status = STATUS_NOT_IMPLEMENTED;
|
Status = STATUS_NOT_IMPLEMENTED;
|
||||||
break;
|
break;
|
||||||
|
@ -2143,7 +2155,6 @@ PiQuerySystemProcessInformation(PVOID Buffer,
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
KIRQL OldIrql;
|
|
||||||
PLIST_ENTRY CurrentEntryP;
|
PLIST_ENTRY CurrentEntryP;
|
||||||
PEPROCESS CurrentP;
|
PEPROCESS CurrentP;
|
||||||
PLIST_ENTRY CurrentEntryT;
|
PLIST_ENTRY CurrentEntryT;
|
||||||
|
@ -2160,16 +2171,15 @@ PiQuerySystemProcessInformation(PVOID Buffer,
|
||||||
|
|
||||||
|
|
||||||
/* Lock the process list. */
|
/* Lock the process list. */
|
||||||
KeAcquireSpinLock(&PsProcessListLock,
|
ExAcquireFastMutex(&PspActiveProcessMutex);
|
||||||
&OldIrql);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scan the process list. Since the
|
* Scan the process list. Since the
|
||||||
* list is circular, the guard is false
|
* list is circular, the guard is false
|
||||||
* after the last process.
|
* after the last process.
|
||||||
*/
|
*/
|
||||||
for ( CurrentEntryP = PsProcessListHead.Flink;
|
for ( CurrentEntryP = PsActiveProcessHead.Flink;
|
||||||
(CurrentEntryP != & PsProcessListHead);
|
(CurrentEntryP != & PsActiveProcessHead);
|
||||||
CurrentEntryP = CurrentEntryP->Flink
|
CurrentEntryP = CurrentEntryP->Flink
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -2305,9 +2315,8 @@ PiQuerySystemProcessInformation(PVOID Buffer,
|
||||||
/*
|
/*
|
||||||
* Unlock the process list.
|
* Unlock the process list.
|
||||||
*/
|
*/
|
||||||
KeReleaseSpinLock (
|
ExReleaseFastMutex (
|
||||||
& PsProcessListLock,
|
& PspActiveProcessMutex
|
||||||
OldIrql
|
|
||||||
);
|
);
|
||||||
/*
|
/*
|
||||||
* Return the proper error status code,
|
* Return the proper error status code,
|
||||||
|
@ -2541,14 +2550,13 @@ NTSTATUS STDCALL
|
||||||
PsLookupProcessByProcessId(IN HANDLE ProcessId,
|
PsLookupProcessByProcessId(IN HANDLE ProcessId,
|
||||||
OUT PEPROCESS *Process)
|
OUT PEPROCESS *Process)
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PEPROCESS current;
|
PEPROCESS current;
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
ExAcquireFastMutex(&PspActiveProcessMutex);
|
||||||
|
|
||||||
current_entry = PsProcessListHead.Flink;
|
current_entry = PsActiveProcessHead.Flink;
|
||||||
while (current_entry != &PsProcessListHead)
|
while (current_entry != &PsActiveProcessHead)
|
||||||
{
|
{
|
||||||
current = CONTAINING_RECORD(current_entry,
|
current = CONTAINING_RECORD(current_entry,
|
||||||
EPROCESS,
|
EPROCESS,
|
||||||
|
@ -2557,13 +2565,13 @@ PsLookupProcessByProcessId(IN HANDLE ProcessId,
|
||||||
{
|
{
|
||||||
*Process = current;
|
*Process = current;
|
||||||
ObReferenceObject(current);
|
ObReferenceObject(current);
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
ExReleaseFastMutex(&PspActiveProcessMutex);
|
||||||
return(STATUS_SUCCESS);
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
current_entry = current_entry->Flink;
|
current_entry = current_entry->Flink;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
ExReleaseFastMutex(&PspActiveProcessMutex);
|
||||||
|
|
||||||
return(STATUS_INVALID_PARAMETER);
|
return(STATUS_INVALID_PARAMETER);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
/* GLOBALS ******************************************************************/
|
/* GLOBALS ******************************************************************/
|
||||||
|
|
||||||
extern LIST_ENTRY PsProcessListHead;
|
extern LIST_ENTRY PsActiveProcessHead;
|
||||||
|
|
||||||
POBJECT_TYPE EXPORTED PsThreadType = NULL;
|
POBJECT_TYPE EXPORTED PsThreadType = NULL;
|
||||||
|
|
||||||
|
@ -287,8 +287,8 @@ VOID PsDumpThreads(BOOLEAN IncludeSystem)
|
||||||
PETHREAD Thread;
|
PETHREAD Thread;
|
||||||
ULONG nThreads = 0;
|
ULONG nThreads = 0;
|
||||||
|
|
||||||
AProcess = PsProcessListHead.Flink;
|
AProcess = PsActiveProcessHead.Flink;
|
||||||
while(AProcess != &PsProcessListHead)
|
while(AProcess != &PsActiveProcessHead)
|
||||||
{
|
{
|
||||||
Process = CONTAINING_RECORD(AProcess, EPROCESS, ProcessListEntry);
|
Process = CONTAINING_RECORD(AProcess, EPROCESS, ProcessListEntry);
|
||||||
/* FIXME - skip suspended, ... processes? */
|
/* FIXME - skip suspended, ... processes? */
|
||||||
|
@ -767,7 +767,7 @@ PsInitThreadManagment(VOID)
|
||||||
PsThreadType->Create = NULL;
|
PsThreadType->Create = NULL;
|
||||||
PsThreadType->DuplicationNotify = NULL;
|
PsThreadType->DuplicationNotify = NULL;
|
||||||
|
|
||||||
RtlRosInitUnicodeStringFromLiteral(&PsThreadType->TypeName, L"Thread");
|
RtlInitUnicodeString(&PsThreadType->TypeName, L"Thread");
|
||||||
|
|
||||||
ObpCreateTypeObject(PsThreadType);
|
ObpCreateTypeObject(PsThreadType);
|
||||||
|
|
||||||
|
@ -1088,12 +1088,12 @@ PsLookupProcessThreadByCid(IN PCLIENT_ID Cid,
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
PsLookupThreadByThreadId(IN PVOID ThreadId,
|
PsLookupThreadByThreadId(IN HANDLE ThreadId,
|
||||||
OUT PETHREAD *Thread)
|
OUT PETHREAD *Thread)
|
||||||
{
|
{
|
||||||
PCID_OBJECT CidObject;
|
PCID_OBJECT CidObject;
|
||||||
|
|
||||||
CidObject = PsLockCidHandle((HANDLE)ThreadId, PsThreadType);
|
CidObject = PsLockCidHandle(ThreadId, PsThreadType);
|
||||||
if(CidObject != NULL)
|
if(CidObject != NULL)
|
||||||
{
|
{
|
||||||
*Thread = CidObject->Obj.Thread;
|
*Thread = CidObject->Obj.Thread;
|
||||||
|
|
|
@ -1138,7 +1138,7 @@ NtUserGetThreadDesktop(DWORD dwThreadId, DWORD Unknown1)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = PsLookupThreadByThreadId((PVOID)dwThreadId, &Thread);
|
Status = PsLookupThreadByThreadId((HANDLE)dwThreadId, &Thread);
|
||||||
if(!NT_SUCCESS(Status))
|
if(!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||||
|
|
|
@ -460,7 +460,7 @@ NtUserSetWindowsHookEx(
|
||||||
}
|
}
|
||||||
Mod = NULL;
|
Mod = NULL;
|
||||||
Global = FALSE;
|
Global = FALSE;
|
||||||
if (! NT_SUCCESS(PsLookupThreadByThreadId((PVOID) ThreadId, &Thread)))
|
if (! NT_SUCCESS(PsLookupThreadByThreadId((HANDLE) ThreadId, &Thread)))
|
||||||
{
|
{
|
||||||
DPRINT1("Invalid thread id 0x%x\n", ThreadId);
|
DPRINT1("Invalid thread id 0x%x\n", ThreadId);
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||||
|
|
|
@ -1173,7 +1173,7 @@ NtUserPostThreadMessage(DWORD idThread,
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PMSGMEMORY MsgMemoryEntry;
|
PMSGMEMORY MsgMemoryEntry;
|
||||||
|
|
||||||
Status = PsLookupThreadByThreadId((void *)idThread,&peThread);
|
Status = PsLookupThreadByThreadId((HANDLE)idThread,&peThread);
|
||||||
|
|
||||||
if( Status == STATUS_SUCCESS ) {
|
if( Status == STATUS_SUCCESS ) {
|
||||||
pThread = peThread->Tcb.Win32Thread;
|
pThread = peThread->Tcb.Win32Thread;
|
||||||
|
|
|
@ -1179,7 +1179,7 @@ NtUserGetGUIThreadInfo(
|
||||||
|
|
||||||
if(idThread)
|
if(idThread)
|
||||||
{
|
{
|
||||||
Status = PsLookupThreadByThreadId((PVOID)idThread, &Thread);
|
Status = PsLookupThreadByThreadId((HANDLE)idThread, &Thread);
|
||||||
if(!NT_SUCCESS(Status))
|
if(!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
SetLastWin32Error(ERROR_ACCESS_DENIED);
|
||||||
|
|
|
@ -1164,7 +1164,7 @@ NtUserBuildHwndList(
|
||||||
PLIST_ENTRY Current;
|
PLIST_ENTRY Current;
|
||||||
PWINDOW_OBJECT Window;
|
PWINDOW_OBJECT Window;
|
||||||
|
|
||||||
Status = PsLookupThreadByThreadId((PVOID)dwThreadId, &Thread);
|
Status = PsLookupThreadByThreadId((HANDLE)dwThreadId, &Thread);
|
||||||
if(!NT_SUCCESS(Status))
|
if(!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||||
|
|
|
@ -3306,7 +3306,7 @@ NTKERNELAPI
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
PsLookupThreadByThreadId (
|
PsLookupThreadByThreadId (
|
||||||
IN PVOID UniqueThreadId,
|
IN HANDLE UniqueThreadId,
|
||||||
OUT PETHREAD *Thread
|
OUT PETHREAD *Thread
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue