From a9bae8fa65b370458e5b9205b465c8506e02c2a4 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Tue, 31 Aug 2004 20:17:18 +0000 Subject: [PATCH] - Removed the member OldProcess from the ETHREAD structure. svn path=/trunk/; revision=10759 --- reactos/drivers/video/videoprt/videoprt.c | 4 +- reactos/ntoskrnl/include/internal/i386/ps.h | 2 +- reactos/ntoskrnl/include/internal/ps.h | 9 +- reactos/ntoskrnl/ke/i386/tskswitch.S | 4 +- reactos/ntoskrnl/ke/main.c | 4 +- reactos/ntoskrnl/ke/process.c | 26 ++--- reactos/ntoskrnl/ldr/sysdll.c | 40 ++++++-- reactos/ntoskrnl/lpc/send.c | 6 +- reactos/ntoskrnl/mm/virtual.c | 103 ++++++++++++-------- reactos/ntoskrnl/ps/kill.c | 14 ++- reactos/ntoskrnl/ps/process.c | 14 ++- 11 files changed, 139 insertions(+), 87 deletions(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 32a0236a9b6..7e7e1673f0d 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -18,7 +18,7 @@ * If not, write to the Free Software Foundation, * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: videoprt.c,v 1.26 2004/07/03 17:40:21 navaraf Exp $ + * $Id: videoprt.c,v 1.27 2004/08/31 20:17:17 hbirr Exp $ */ #include "videoprt.h" @@ -457,7 +457,7 @@ IntAttachToCSRSS(PEPROCESS *CallingProcess, PEPROCESS *PrevAttachedProcess) *CallingProcess = PsGetCurrentProcess(); if (*CallingProcess != Csrss) { - if (PsGetCurrentThread()->OldProcess != NULL) + if (PsGetCurrentThread()->ThreadsProcess != *CallingProcess) { *PrevAttachedProcess = *CallingProcess; KeDetachProcess(); diff --git a/reactos/ntoskrnl/include/internal/i386/ps.h b/reactos/ntoskrnl/include/internal/i386/ps.h index 69e501e9d46..16c6eda465d 100644 --- a/reactos/ntoskrnl/include/internal/i386/ps.h +++ b/reactos/ntoskrnl/include/internal/i386/ps.h @@ -26,12 +26,12 @@ #define KTHREAD_STACK_LIMIT 0x1C #define KTHREAD_TEB 0x20 #define KTHREAD_KERNEL_STACK 0x28 +#define KTHREAD_APCSTATE_PROCESS 0x44 #define KTHREAD_SERVICE_TABLE 0xDC #define KTHREAD_PREVIOUS_MODE 0x137 #define KTHREAD_TRAP_FRAME 0x128 #define KTHREAD_CALLBACK_STACK 0x120 -#define ETHREAD_THREADS_PROCESS 0x234 #define KPROCESS_DIRECTORY_TABLE_BASE 0x18 #define KPROCESS_LDT_DESCRIPTOR0 0x20 diff --git a/reactos/ntoskrnl/include/internal/ps.h b/reactos/ntoskrnl/include/internal/ps.h index e94d773ca3a..94c3b26f536 100644 --- a/reactos/ntoskrnl/include/internal/ps.h +++ b/reactos/ntoskrnl/include/internal/ps.h @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: ps.h,v 1.65 2004/08/21 12:34:58 tamlin Exp $ +/* $Id: ps.h,v 1.66 2004/08/31 20:17:17 hbirr Exp $ * * FILE: ntoskrnl/ke/kthread.c * PURPOSE: Process manager definitions @@ -62,7 +62,8 @@ typedef struct _KAPC_STATE struct _KPROCESS* Process; UCHAR KernelApcInProgress; UCHAR KernelApcPending; - USHORT UserApcPending; + UCHAR UserApcPending; + UCHAR Reserved; } KAPC_STATE, *PKAPC_STATE, *__restrict PRKAPC_STATE; #include @@ -223,10 +224,6 @@ typedef struct _ETHREAD BOOLEAN ActiveImpersonationInfo; /* 23B/267 */ ULONG PerformanceCountHigh; /* 23C/268 */ - /* - * Added by David Welch (welch@cwcom.net) - */ - struct _EPROCESS* OldProcess; /* 240/26C */ struct _W32THREAD* Win32Thread; diff --git a/reactos/ntoskrnl/ke/i386/tskswitch.S b/reactos/ntoskrnl/ke/i386/tskswitch.S index aa4e61640b9..c35c930deb5 100644 --- a/reactos/ntoskrnl/ke/i386/tskswitch.S +++ b/reactos/ntoskrnl/ke/i386/tskswitch.S @@ -87,7 +87,7 @@ _Ki386ContextSwitch: * Set the current LDT */ xorl %eax, %eax - movl ETHREAD_THREADS_PROCESS(%ebx), %edi + movl KTHREAD_APCSTATE_PROCESS(%ebx), %edi testw $0xFFFF, KPROCESS_LDT_DESCRIPTOR0(%edi) jz .L4 @@ -141,7 +141,7 @@ _Ki386ContextSwitch: /* * Change the address space */ - movl ETHREAD_THREADS_PROCESS(%ebx), %ebx + movl KTHREAD_APCSTATE_PROCESS(%ebx), %ebx movl KPROCESS_DIRECTORY_TABLE_BASE(%ebx), %eax movl %eax, %cr3 diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index da58ecc01e8..dbda6c0f76e 100644 --- a/reactos/ntoskrnl/ke/main.c +++ b/reactos/ntoskrnl/ke/main.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: main.c,v 1.192 2004/08/15 16:39:05 chorns Exp $ +/* $Id: main.c,v 1.193 2004/08/31 20:17:18 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -292,7 +292,7 @@ ExpInitializeExecutive(VOID) assert(FIELD_OFFSET(KTHREAD, PreviousMode) == KTHREAD_PREVIOUS_MODE); assert(FIELD_OFFSET(KTHREAD, TrapFrame) == KTHREAD_TRAP_FRAME); assert(FIELD_OFFSET(KTHREAD, CallbackStack) == KTHREAD_CALLBACK_STACK); - assert(FIELD_OFFSET(ETHREAD, ThreadsProcess) == ETHREAD_THREADS_PROCESS); + assert(FIELD_OFFSET(KTHREAD, ApcState.Process) == KTHREAD_APCSTATE_PROCESS); assert(FIELD_OFFSET(KPROCESS, DirectoryTableBase) == KPROCESS_DIRECTORY_TABLE_BASE); assert(FIELD_OFFSET(KPROCESS, IopmOffset) == KPROCESS_IOPM_OFFSET); diff --git a/reactos/ntoskrnl/ke/process.c b/reactos/ntoskrnl/ke/process.c index d79b641e7c4..38208f8bc53 100644 --- a/reactos/ntoskrnl/ke/process.c +++ b/reactos/ntoskrnl/ke/process.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: process.c,v 1.26 2004/08/27 10:24:04 hbirr Exp $ +/* $Id: process.c,v 1.27 2004/08/31 20:17:18 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/process.c @@ -49,11 +49,17 @@ KeAttachProcess (PEPROCESS Process) CurrentThread = PsGetCurrentThread(); - if (CurrentThread->OldProcess != NULL) + if (&CurrentThread->ThreadsProcess->Pcb != CurrentThread->Tcb.ApcState.Process) { - DbgPrint("Invalid attach (thread is already attached)\n"); + DPRINT1("Invalid attach (thread is already attached)\n"); KEBUGCHECK(INVALID_PROCESS_ATTACH_ATTEMPT); } + if (&Process->Pcb == CurrentThread->Tcb.ApcState.Process) + { + DPRINT1("Invalid attach (process is the same)\n"); + KEBUGCHECK(INVALID_PROCESS_ATTACH_ATTEMPT); + } + /* The stack and the thread structure of the current process may be located in a page which is not present in the page directory of @@ -71,8 +77,7 @@ KeAttachProcess (PEPROCESS Process) KiSwapApcEnvironment(&CurrentThread->Tcb, &Process->Pcb); - CurrentThread->OldProcess = PsGetCurrentProcess(); - CurrentThread->ThreadsProcess = Process; + CurrentThread->Tcb.ApcState.Process = &Process->Pcb; PageDir = Process->Pcb.DirectoryTableBase.u.LowPart; DPRINT("Switching process context to %x\n",PageDir); Ke386SetPageTableDirectory(PageDir); @@ -93,19 +98,16 @@ KeDetachProcess (VOID) CurrentThread = PsGetCurrentThread(); - if (CurrentThread->OldProcess == NULL) + if (&CurrentThread->ThreadsProcess->Pcb == CurrentThread->Tcb.ApcState.Process) { - DbgPrint("Invalid detach (thread was not attached)\n"); + DPRINT1("Invalid detach (thread was not attached)\n"); KEBUGCHECK(INVALID_PROCESS_DETACH_ATTEMPT); } KeRaiseIrql(DISPATCH_LEVEL, &oldlvl); - KiSwapApcEnvironment(&CurrentThread->Tcb, &CurrentThread->OldProcess->Pcb); - - CurrentThread->ThreadsProcess = CurrentThread->OldProcess; - CurrentThread->OldProcess = NULL; - PageDir = CurrentThread->ThreadsProcess->Pcb.DirectoryTableBase.u.LowPart; + KiSwapApcEnvironment(&CurrentThread->Tcb, CurrentThread->Tcb.SavedApcState.Process); + PageDir = CurrentThread->Tcb.ApcState.Process->DirectoryTableBase.u.LowPart; Ke386SetPageTableDirectory(PageDir); KeLowerIrql(oldlvl); diff --git a/reactos/ntoskrnl/ldr/sysdll.c b/reactos/ntoskrnl/ldr/sysdll.c index 00e693ead23..67e28749d12 100644 --- a/reactos/ntoskrnl/ldr/sysdll.c +++ b/reactos/ntoskrnl/ldr/sysdll.c @@ -77,7 +77,7 @@ NTSTATUS LdrpMapSystemDll(HANDLE ProcessHandle, UNICODE_STRING DllPathname = ROS_STRING_INITIALIZER(L"\\SystemRoot\\system32\\ntdll.dll"); PIMAGE_DOS_HEADER DosHeader; PIMAGE_NT_HEADERS NTHeaders; - PEPROCESS Process; + PEPROCESS Process, CurrentProcess; ANSI_STRING ProcedureName; ULONG ViewSize; IO_STATUS_BLOCK Iosb; @@ -190,8 +190,12 @@ NTSTATUS LdrpMapSystemDll(HANDLE ProcessHandle, return(Status); } - DPRINT("Attaching to Process\n"); - KeAttachProcess(Process); + CurrentProcess = PsGetCurrentProcess(); + if (Process != CurrentProcess) + { + DPRINT("Attaching to Process\n"); + KeAttachProcess(Process); + } /* * retrieve ntdll's startup address @@ -207,7 +211,10 @@ NTSTATUS LdrpMapSystemDll(HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { DbgPrint ("LdrGetProcedureAddress failed (Status %x)\n", Status); - KeDetachProcess(); + if (Process != CurrentProcess) + { + KeDetachProcess(); + } ObDereferenceObject(Process); ZwClose(NTDllSectionHandle); return (Status); @@ -229,7 +236,10 @@ NTSTATUS LdrpMapSystemDll(HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { DbgPrint ("LdrGetProcedureAddress failed (Status %x)\n", Status); - KeDetachProcess(); + if (Process != CurrentProcess) + { + KeDetachProcess(); + } ObDereferenceObject(Process); ZwClose(NTDllSectionHandle); return (Status); @@ -250,7 +260,10 @@ NTSTATUS LdrpMapSystemDll(HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { DbgPrint ("LdrGetProcedureAddress failed (Status %x)\n", Status); - KeDetachProcess(); + if (Process != CurrentProcess) + { + KeDetachProcess(); + } ObDereferenceObject(Process); ZwClose(NTDllSectionHandle); return (Status); @@ -271,7 +284,10 @@ NTSTATUS LdrpMapSystemDll(HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { DbgPrint ("LdrGetProcedureAddress failed (Status %x)\n", Status); - KeDetachProcess(); + if (Process != CurrentProcess) + { + KeDetachProcess(); + } ObDereferenceObject(Process); ZwClose(NTDllSectionHandle); return (Status); @@ -292,14 +308,20 @@ NTSTATUS LdrpMapSystemDll(HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { DbgPrint ("LdrGetProcedureAddress failed (Status %x)\n", Status); - KeDetachProcess(); + if (Process != CurrentProcess) + { + KeDetachProcess(); + } ObDereferenceObject(Process); ZwClose(NTDllSectionHandle); return (Status); } } - KeDetachProcess(); + if (Process != CurrentProcess) + { + KeDetachProcess(); + } ObDereferenceObject(Process); ZwClose(NTDllSectionHandle); diff --git a/reactos/ntoskrnl/lpc/send.c b/reactos/ntoskrnl/lpc/send.c index 48fa904df4a..d29d2166a17 100644 --- a/reactos/ntoskrnl/lpc/send.c +++ b/reactos/ntoskrnl/lpc/send.c @@ -1,4 +1,4 @@ -/* $Id: send.c,v 1.16 2004/08/15 16:39:06 chorns Exp $ +/* $Id: send.c,v 1.17 2004/08/31 20:17:18 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -245,13 +245,13 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, handle we can undo this, so everything is normal again. Need to re-KeAttach() before returning though */ CurrentThread = PsGetCurrentThread(); - if (NULL == CurrentThread->OldProcess) + if (&CurrentThread->ThreadsProcess->Pcb == CurrentThread->Tcb.ApcState.Process) { AttachedProcess = NULL; } else { - AttachedProcess = CurrentThread->ThreadsProcess; + AttachedProcess = (PEPROCESS)CurrentThread->Tcb.ApcState.Process; KeDetachProcess(); } diff --git a/reactos/ntoskrnl/mm/virtual.c b/reactos/ntoskrnl/mm/virtual.c index d2eae03a13b..76407485906 100644 --- a/reactos/ntoskrnl/mm/virtual.c +++ b/reactos/ntoskrnl/mm/virtual.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: virtual.c,v 1.79 2004/07/17 03:03:52 ion Exp $ +/* $Id: virtual.c,v 1.80 2004/08/31 20:17:18 hbirr Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/virtual.c @@ -376,7 +376,8 @@ NtReadVirtualMemory(IN HANDLE ProcessHandle, NTSTATUS Status; PMDL Mdl; PVOID SystemAddress; - PEPROCESS Process; + PEPROCESS Process, CurrentProcess; + DPRINT("NtReadVirtualMemory(ProcessHandle %x, BaseAddress %x, " "Buffer %x, NumberOfBytesToRead %d)\n",ProcessHandle,BaseAddress, @@ -393,31 +394,40 @@ NtReadVirtualMemory(IN HANDLE ProcessHandle, return(Status); } - Mdl = MmCreateMdl(NULL, - Buffer, - NumberOfBytesToRead); - if(Mdl == NULL) + CurrentProcess = PsGetCurrentProcess(); + + if (Process == CurrentProcess) { - ObDereferenceObject(Process); - return(STATUS_NO_MEMORY); + memcpy(Buffer, BaseAddress, NumberOfBytesToRead); } - MmProbeAndLockPages(Mdl, - UserMode, - IoWriteAccess); - - KeAttachProcess(Process); - - SystemAddress = MmGetSystemAddressForMdl(Mdl); - memcpy(SystemAddress, BaseAddress, NumberOfBytesToRead); - - KeDetachProcess(); - - if (Mdl->MappedSystemVa != NULL) + else { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); + Mdl = MmCreateMdl(NULL, + Buffer, + NumberOfBytesToRead); + if(Mdl == NULL) + { + ObDereferenceObject(Process); + return(STATUS_NO_MEMORY); + } + MmProbeAndLockPages(Mdl, + UserMode, + IoWriteAccess); + + KeAttachProcess(Process); + + SystemAddress = MmGetSystemAddressForMdl(Mdl); + memcpy(SystemAddress, BaseAddress, NumberOfBytesToRead); + + KeDetachProcess(); + + if (Mdl->MappedSystemVa != NULL) + { + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); + } + MmUnlockPages(Mdl); + ExFreePool(Mdl); } - MmUnlockPages(Mdl); - ExFreePool(Mdl); ObDereferenceObject(Process); @@ -515,33 +525,40 @@ NtWriteVirtualMemory(IN HANDLE ProcessHandle, return(Status); } - Mdl = MmCreateMdl(NULL, - Buffer, - NumberOfBytesToWrite); - MmProbeAndLockPages(Mdl, - UserMode, - IoReadAccess); - if(Mdl == NULL) + if (Process == PsGetCurrentProcess()) { - ObDereferenceObject(Process); - return(STATUS_NO_MEMORY); + memcpy(BaseAddress, Buffer, NumberOfBytesToWrite); } - KeAttachProcess(Process); + else + { + Mdl = MmCreateMdl(NULL, + Buffer, + NumberOfBytesToWrite); + MmProbeAndLockPages(Mdl, + UserMode, + IoReadAccess); + if(Mdl == NULL) + { + ObDereferenceObject(Process); + return(STATUS_NO_MEMORY); + } + KeAttachProcess(Process); - SystemAddress = MmGetSystemAddressForMdl(Mdl); - memcpy(BaseAddress, SystemAddress, NumberOfBytesToWrite); + SystemAddress = MmGetSystemAddressForMdl(Mdl); + memcpy(BaseAddress, SystemAddress, NumberOfBytesToWrite); - KeDetachProcess(); + KeDetachProcess(); + + if (Mdl->MappedSystemVa != NULL) + { + MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); + } + MmUnlockPages(Mdl); + ExFreePool(Mdl); + } ObDereferenceObject(Process); - if (Mdl->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); - } - MmUnlockPages(Mdl); - ExFreePool(Mdl); - *NumberOfBytesWritten = NumberOfBytesToWrite; return(STATUS_SUCCESS); diff --git a/reactos/ntoskrnl/ps/kill.c b/reactos/ntoskrnl/ps/kill.c index c132fdabe76..3b020d46c07 100644 --- a/reactos/ntoskrnl/ps/kill.c +++ b/reactos/ntoskrnl/ps/kill.c @@ -1,4 +1,4 @@ -/* $Id: kill.c,v 1.73 2004/08/15 16:39:10 chorns Exp $ +/* $Id: kill.c,v 1.74 2004/08/31 20:17:18 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -254,6 +254,7 @@ PiTerminateProcess(PEPROCESS Process, NTSTATUS ExitStatus) { KIRQL OldIrql; + PEPROCESS CurrentProcess; DPRINT("PiTerminateProcess(Process %x, ExitStatus %x) PC %d HC %d\n", Process, ExitStatus, ObGetObjectPointerCount(Process), @@ -267,9 +268,16 @@ PiTerminateProcess(PEPROCESS Process, ObDereferenceObject(Process); return(STATUS_SUCCESS); } - KeAttachProcess( Process ); + CurrentProcess = PsGetCurrentProcess(); + if (Process != CurrentProcess) + { + KeAttachProcess( Process ); + } ObCloseAllHandles(Process); - KeDetachProcess(); + if (Process != CurrentProcess) + { + KeDetachProcess(); + } OldIrql = KeAcquireDispatcherDatabaseLock (); Process->Pcb.DispatcherHeader.SignalState = TRUE; KeDispatcherObjectWake(&Process->Pcb.DispatcherHeader); diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index 54cb0fb9c7f..9a49c44584e 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1,4 +1,4 @@ -/* $Id: process.c,v 1.139 2004/08/15 16:39:10 chorns Exp $ +/* $Id: process.c,v 1.140 2004/08/31 20:17:18 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -387,7 +387,13 @@ PiDeleteProcess(PVOID ObjectBody) Context.Process = (PEPROCESS)ObjectBody; - if (PsGetCurrentProcess() == Context.Process || PsGetCurrentThread()->OldProcess == NULL) + if (PsGetCurrentProcess() == Context.Process || + PsGetCurrentThread()->ThreadsProcess == Context.Process) + { + KEBUGCHECK(0); + } + + if (PsGetCurrentThread()->ThreadsProcess == PsGetCurrentProcess()) { Context.IsWorkerQueue = FALSE; PiDeleteProcessWorker(&Context); @@ -525,13 +531,13 @@ PEPROCESS STDCALL IoGetCurrentProcess(VOID) { if (PsGetCurrentThread() == NULL || - PsGetCurrentThread()->ThreadsProcess == NULL) + PsGetCurrentThread()->Tcb.ApcState.Process == NULL) { return(PsInitialSystemProcess); } else { - return(PsGetCurrentThread()->ThreadsProcess); + return(PEPROCESS)(PsGetCurrentThread()->Tcb.ApcState.Process); } }