diff --git a/reactos/include/ddk/pstypes.h b/reactos/include/ddk/pstypes.h index 92742bf233d..e3955a83301 100644 --- a/reactos/include/ddk/pstypes.h +++ b/reactos/include/ddk/pstypes.h @@ -312,6 +312,7 @@ typedef struct _KPROCESS */ LIST_ENTRY MemoryAreaList; HANDLE_TABLE HandleTable; + LIST_ENTRY ProcessListEntry; } KPROCESS, *PKPROCESS; typedef struct _EPROCESS diff --git a/reactos/makefile_rex b/reactos/makefile_rex index f2d411cce57..c8ce9590b58 100644 --- a/reactos/makefile_rex +++ b/reactos/makefile_rex @@ -15,7 +15,7 @@ include rules.mak # Required to run the system # COMPONENTS = iface_native ntoskrnl -DLLS = ntdll kernel32 crtdll user32 fmifs +DLLS = ntdll kernel32 crtdll fmifs #DLLS = crtdll mingw32 SUBSYS = win32k diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 3fff4cbfd14..103108e28dc 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -29,6 +29,8 @@ HANDLE SystemProcessHandle = NULL; POBJECT_TYPE PsProcessType = NULL; +static LIST_ENTRY PsProcessListHead; +static KSPIN_LOCK PsProcessListLock; static ULONG PiNextProcessUniqueId = 0; /* FUNCTIONS *****************************************************************/ @@ -37,6 +39,7 @@ VOID PsInitProcessManagment(VOID) { ANSI_STRING AnsiString; PKPROCESS KProcess; + KIRQL oldIrql; /* * Register the process object type @@ -62,6 +65,9 @@ VOID PsInitProcessManagment(VOID) RtlInitAnsiString(&AnsiString,"Process"); RtlAnsiStringToUnicodeString(&PsProcessType->TypeName,&AnsiString,TRUE); + InitializeListHead(&PsProcessListHead); + KeInitializeSpinLock(&PsProcessListLock); + /* * Initialize the system process */ @@ -83,6 +89,10 @@ VOID PsInitProcessManagment(VOID) SystemProcess->UniqueProcessId = InterlockedIncrement(&PiNextProcessUniqueId); + KeAcquireSpinLock(&PsProcessListLock, &oldIrql); + InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry); + KeReleaseSpinLock(&PsProcessListLock, oldIrql); + ObCreateHandle(SystemProcess, SystemProcess, PROCESS_ALL_ACCESS, @@ -169,6 +179,7 @@ NTSTATUS STDCALL ZwCreateProcess( PEPROCESS ParentProcess; PKPROCESS KProcess; NTSTATUS Status; + KIRQL oldIrql; DPRINT("ZwCreateProcess(ObjectAttributes %x)\n",ObjectAttributes); @@ -203,7 +214,11 @@ NTSTATUS STDCALL ZwCreateProcess( Process); MmCopyMmInfo(ParentProcess, Process); Process->UniqueProcessId = InterlockedIncrement(&PiNextProcessUniqueId); - + + KeAcquireSpinLock(&PsProcessListLock, &oldIrql); + InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry); + KeReleaseSpinLock(&PsProcessListLock, oldIrql); + /* * FIXME: I don't what I'm supposed to know with a section handle */ @@ -236,7 +251,71 @@ NTSTATUS STDCALL ZwOpenProcess (OUT PHANDLE ProcessHandle, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId) { - UNIMPLEMENTED; + /* + * Not of the exact semantics + */ + if (ObjectAttributes != NULL) + { + NTSTATUS Status; + PEPROCESS Process; + + Status = ObReferenceObjectByName(ObjectAttributes->ObjectName, + ObjectAttributes->Attributes, + NULL, + DesiredAccess, + PsProcessType, + UserMode, + NULL, + (PVOID*)&Process); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + Status = ObCreateHandle(PsGetCurrentProcess(), + Process, + DesiredAccess, + FALSE, + ProcessHandle); + ObDereferenceObject(Process); + + return(Status); + } + else + { + KIRQL oldIrql; + PLIST_ENTRY current_entry; + PEPROCESS current; + NTSTATUS Status; + + KeAcquireSpinLock(&PsProcessListLock, &oldIrql); + current_entry = PsProcessListHead.Flink; + while (current_entry != &PsProcessListHead) + { + current = CONTAINING_RECORD(current_entry, EPROCESS, + Pcb.ProcessListEntry); + if (current->UniqueProcessId == (ULONG)ClientId->UniqueProcess) + { + ObReferenceObjectByPointer(current, + DesiredAccess, + PsProcessType, + UserMode); + KeReleaseSpinLock(&PsProcessListLock, oldIrql); + Status = ObCreateHandle(PsGetCurrentProcess(), + current, + DesiredAccess, + FALSE, + ProcessHandle); + ObDereferenceObject(current); + + return(Status); + } + current_entry = current_entry->Flink; + } + KeReleaseSpinLock(&PsProcessListLock, oldIrql); + return(STATUS_UNSUCCESSFUL); + } + return(STATUS_UNSUCCESSFUL); } NTSTATUS STDCALL NtQueryInformationProcess(IN HANDLE ProcessHandle, diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index 79ff7e5a797..636a1b7e027 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -180,6 +180,10 @@ VOID PsDispatchThread(VOID) if (Candidate == CurrentThread) { DPRINT("Scheduling current thread\n"); + if (PiNrRunnableThreads > 2) + { + DbgPrint("."); + } KeQueryTickCount(&TickCount); CurrentThread->Tcb.LastTick = TickCount.u.LowPart; CurrentThread->Tcb.State = THREAD_STATE_RUNNING;