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:
Thomas Bluemel 2005-02-17 16:41:28 +00:00
parent e376d4e01d
commit 6d97eb3b0f
20 changed files with 101 additions and 90 deletions

View file

@ -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); */

View file

@ -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,

View file

@ -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;

View file

@ -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);
} }

View file

@ -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);

View file

@ -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);
/* /*

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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 */

View file

@ -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);

View file

@ -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);

View file

@ -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);
} }

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -3306,7 +3306,7 @@ NTKERNELAPI
NTSTATUS NTSTATUS
NTAPI NTAPI
PsLookupThreadByThreadId ( PsLookupThreadByThreadId (
IN PVOID UniqueThreadId, IN HANDLE UniqueThreadId,
OUT PETHREAD *Thread OUT PETHREAD *Thread
); );