From 8fd78223cb6bb1bfe0a474ec2b8e1c1039760b7a Mon Sep 17 00:00:00 2001 From: David Welch Date: Sun, 25 Nov 2001 15:21:11 +0000 Subject: [PATCH] include/csrss/csrss.h: Include a define for the size of the common part of the csrss message header. lib/kernel32/misc/console.c: WriteConsole: Use the same meanings for the Length argument to CsrClientCallServer as all other callers. lib/kernel32/misc/console.c: WriteConsoleOutput: Break up long requests (not very efficently). lib/ntdll/csr/lpc.c: CsrClientCallServer: Fill out DataSize and MessageSize correctly. lib/kernel32/misc/dllmain.c: DllMain: Die if we can't connect to csrss. ntoskrnl/include/internal/ntoskrnl.c: Increase size of non-paged pool ntoskrnl/ke/i386/exp.c: On double fault print loops in the stack trace only once. ntoskrnl/ke/i386/usertrap.c: Corrected checking in stack trace. ntoskrnl/lpc/send.c: NtRequestWaitReplyPort: Check message consistency and copy in safely. ntoskrnl/mm/aspace.c: MmLockAddressSpace: Don't bother locking if we are the only thread running. ntoskrnl/mm/kmap.c: Implementing support functions for whole page allocation. ntoskrnl/mm/npool.c: Implementing allocation mode where every block is allocated in a whole page and placed against the end so writes beyond the allocated portion are caught immediately. svn path=/trunk/; revision=2393 --- reactos/include/csrss/csrss.h | 112 ++++---- reactos/install.bochs | 10 +- reactos/lib/kernel32/misc/console.c | 222 +++++++++------ reactos/lib/kernel32/misc/dllmain.c | 7 +- reactos/lib/ntdll/csr/lpc.c | 26 +- reactos/lib/ntdll/rtl/error.c | 7 +- reactos/ntoskrnl/Makefile | 4 +- reactos/ntoskrnl/include/internal/ntoskrnl.h | 2 +- reactos/ntoskrnl/include/internal/port.h | 3 + reactos/ntoskrnl/ke/i386/exp.c | 133 ++++++--- reactos/ntoskrnl/ke/i386/usertrap.c | 8 +- reactos/ntoskrnl/ke/kthread.c | 279 +++++++++---------- reactos/ntoskrnl/ke/main.c | 16 +- reactos/ntoskrnl/ke/wait.c | 2 +- reactos/ntoskrnl/lpc/queue.c | 10 +- reactos/ntoskrnl/lpc/reply.c | 17 +- reactos/ntoskrnl/lpc/send.c | 71 ++++- reactos/ntoskrnl/mm/aspace.c | 28 +- reactos/ntoskrnl/mm/kmap.c | 59 ++-- reactos/ntoskrnl/mm/mminit.c | 36 +-- reactos/ntoskrnl/mm/npool.c | 129 ++++++++- reactos/tools/wmc/makefile | 29 +- 22 files changed, 768 insertions(+), 442 deletions(-) diff --git a/reactos/include/csrss/csrss.h b/reactos/include/csrss/csrss.h index c6a76a72055..0bb8d0cf5a0 100644 --- a/reactos/include/csrss/csrss.h +++ b/reactos/include/csrss/csrss.h @@ -237,16 +237,17 @@ typedef struct typedef struct { - HANDLE ConsoleHandle; - SMALL_RECT ScrollRectangle; - BOOLEAN UseClipRectangle; - SMALL_RECT ClipRectangle; - COORD DestinationOrigin; - CHAR_INFO Fill; + HANDLE ConsoleHandle; + SMALL_RECT ScrollRectangle; + BOOLEAN UseClipRectangle; + SMALL_RECT ClipRectangle; + COORD DestinationOrigin; + CHAR_INFO Fill; } CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST, *PCSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST; -#define CSRSS_MAX_WRITE_CONSOLE_REQUEST (MAX_MESSAGE_DATA - sizeof( ULONG ) - sizeof( CSRSS_WRITE_CONSOLE_REQUEST)) +#define CSRSS_MAX_WRITE_CONSOLE_REQUEST \ + (MAX_MESSAGE_DATA - sizeof(ULONG) - sizeof(CSRSS_WRITE_CONSOLE_REQUEST)) #define CSRSS_MAX_SET_TITLE_REQUEST (MAX_MESSAGE_DATA - sizeof( HANDLE ) - sizeof( DWORD ) - sizeof( ULONG ) - sizeof( LPC_MESSAGE_HEADER )) @@ -286,60 +287,63 @@ typedef struct #define CSRSS_FLUSH_INPUT_BUFFER (0x18) #define CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER (0x19) +/* Keep in sync with definition below. */ +#define CSRSS_REQUEST_HEADER_SIZE (sizeof(LPC_MESSAGE_HEADER) + sizeof(ULONG)) typedef struct { - LPC_MESSAGE_HEADER Header; - ULONG Type; - union - { - CSRSS_CREATE_PROCESS_REQUEST CreateProcessRequest; - CSRSS_CONNECT_PROCESS_REQUEST ConnectRequest; - CSRSS_WRITE_CONSOLE_REQUEST WriteConsoleRequest; - CSRSS_READ_CONSOLE_REQUEST ReadConsoleRequest; - CSRSS_SCREEN_BUFFER_INFO_REQUEST ScreenBufferInfoRequest; - CSRSS_SET_CURSOR_REQUEST SetCursorRequest; - CSRSS_FILL_OUTPUT_REQUEST FillOutputRequest; - CSRSS_READ_INPUT_REQUEST ReadInputRequest; - CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REQUEST WriteConsoleOutputCharRequest; - CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REQUEST WriteConsoleOutputAttribRequest; - CSRSS_FILL_OUTPUT_ATTRIB_REQUEST FillOutputAttribRequest; - CSRSS_SET_CURSOR_INFO_REQUEST SetCursorInfoRequest; - CSRSS_GET_CURSOR_INFO_REQUEST GetCursorInfoRequest; - CSRSS_SET_ATTRIB_REQUEST SetAttribRequest; - CSRSS_SET_CONSOLE_MODE_REQUEST SetConsoleModeRequest; - CSRSS_GET_CONSOLE_MODE_REQUEST GetConsoleModeRequest; - CSRSS_CREATE_SCREEN_BUFFER_REQUEST CreateScreenBufferRequest; - CSRSS_SET_ACTIVE_SCREEN_BUFFER_REQUEST SetActiveScreenBufferRequest; - CSRSS_SET_TITLE_REQUEST SetTitleRequest; - CSRSS_GET_TITLE_REQUEST GetTitleRequest; - CSRSS_WRITE_CONSOLE_OUTPUT_REQUEST WriteConsoleOutputRequest; - CSRSS_FLUSH_INPUT_BUFFER_REQUEST FlushInputBufferRequest; - CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST ScrollConsoleScreenBufferRequest; - } Data; + LPC_MESSAGE_HEADER Header; + ULONG Type; + union + { + CSRSS_CREATE_PROCESS_REQUEST CreateProcessRequest; + CSRSS_CONNECT_PROCESS_REQUEST ConnectRequest; + CSRSS_WRITE_CONSOLE_REQUEST WriteConsoleRequest; + CSRSS_READ_CONSOLE_REQUEST ReadConsoleRequest; + CSRSS_SCREEN_BUFFER_INFO_REQUEST ScreenBufferInfoRequest; + CSRSS_SET_CURSOR_REQUEST SetCursorRequest; + CSRSS_FILL_OUTPUT_REQUEST FillOutputRequest; + CSRSS_READ_INPUT_REQUEST ReadInputRequest; + CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REQUEST WriteConsoleOutputCharRequest; + CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REQUEST WriteConsoleOutputAttribRequest; + CSRSS_FILL_OUTPUT_ATTRIB_REQUEST FillOutputAttribRequest; + CSRSS_SET_CURSOR_INFO_REQUEST SetCursorInfoRequest; + CSRSS_GET_CURSOR_INFO_REQUEST GetCursorInfoRequest; + CSRSS_SET_ATTRIB_REQUEST SetAttribRequest; + CSRSS_SET_CONSOLE_MODE_REQUEST SetConsoleModeRequest; + CSRSS_GET_CONSOLE_MODE_REQUEST GetConsoleModeRequest; + CSRSS_CREATE_SCREEN_BUFFER_REQUEST CreateScreenBufferRequest; + CSRSS_SET_ACTIVE_SCREEN_BUFFER_REQUEST SetActiveScreenBufferRequest; + CSRSS_SET_TITLE_REQUEST SetTitleRequest; + CSRSS_GET_TITLE_REQUEST GetTitleRequest; + CSRSS_WRITE_CONSOLE_OUTPUT_REQUEST WriteConsoleOutputRequest; + CSRSS_FLUSH_INPUT_BUFFER_REQUEST FlushInputBufferRequest; + CSRSS_SCROLL_CONSOLE_SCREEN_BUFFER_REQUEST + ScrollConsoleScreenBufferRequest; + } Data; } CSRSS_API_REQUEST, *PCSRSS_API_REQUEST; typedef struct { - LPC_MESSAGE_HEADER Header; - NTSTATUS Status; - union - { - CSRSS_CREATE_PROCESS_REPLY CreateProcessReply; - CSRSS_CONNECT_PROCESS_REPLY ConnectReply; - CSRSS_WRITE_CONSOLE_REPLY WriteConsoleReply; - CSRSS_READ_CONSOLE_REPLY ReadConsoleReply; - CSRSS_ALLOC_CONSOLE_REPLY AllocConsoleReply; - CSRSS_SCREEN_BUFFER_INFO_REPLY ScreenBufferInfoReply; - CSRSS_READ_INPUT_REPLY ReadInputReply; - CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REPLY WriteConsoleOutputCharReply; - CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REPLY WriteConsoleOutputAttribReply; - CSRSS_GET_CURSOR_INFO_REPLY GetCursorInfoReply; - CSRSS_GET_CONSOLE_MODE_REPLY GetConsoleModeReply; - CSRSS_CREATE_SCREEN_BUFFER_REPLY CreateScreenBufferReply; - CSRSS_GET_TITLE_REPLY GetTitleReply; - CSRSS_WRITE_CONSOLE_OUTPUT_REPLY WriteConsoleOutputReply; - } Data; + LPC_MESSAGE_HEADER Header; + NTSTATUS Status; + union + { + CSRSS_CREATE_PROCESS_REPLY CreateProcessReply; + CSRSS_CONNECT_PROCESS_REPLY ConnectReply; + CSRSS_WRITE_CONSOLE_REPLY WriteConsoleReply; + CSRSS_READ_CONSOLE_REPLY ReadConsoleReply; + CSRSS_ALLOC_CONSOLE_REPLY AllocConsoleReply; + CSRSS_SCREEN_BUFFER_INFO_REPLY ScreenBufferInfoReply; + CSRSS_READ_INPUT_REPLY ReadInputReply; + CSRSS_WRITE_CONSOLE_OUTPUT_CHAR_REPLY WriteConsoleOutputCharReply; + CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB_REPLY WriteConsoleOutputAttribReply; + CSRSS_GET_CURSOR_INFO_REPLY GetCursorInfoReply; + CSRSS_GET_CONSOLE_MODE_REPLY GetConsoleModeReply; + CSRSS_CREATE_SCREEN_BUFFER_REPLY CreateScreenBufferReply; + CSRSS_GET_TITLE_REPLY GetTitleReply; + CSRSS_WRITE_CONSOLE_OUTPUT_REPLY WriteConsoleOutputReply; + } Data; } CSRSS_API_REPLY, *PCSRSS_API_REPLY; #endif /* __INCLUDE_CSRSS_CSRSS_H */ diff --git a/reactos/install.bochs b/reactos/install.bochs index 677ea43d184..ee86aa5e15b 100644 --- a/reactos/install.bochs +++ b/reactos/install.bochs @@ -1,14 +1,6 @@ #!/bin/sh /sbin/modprobe loop -echo "Installing to floppy." -mount -t vfat /bochs/1.44a.dos /mnt/floppy -o loop,rw -./install-system.sh /mnt/floppy -umount /mnt/floppy echo "Installing to disk." -mount -t vfat /bochs/10M.vga.dos /mnt/floppy -o loop,offset=8704,rw +mount -t vfat /mnt/hda3/bochs/10M.vga.dos /mnt/floppy -o loop,offset=8704,rw ./install.sh /mnt/floppy umount /mnt/floppy -echo "Installing to minix disk." -#mount -t minix /bochs/10M.vga.minix /mnt/floppy -o loop,offset=8704,rw -#./install.sh /mnt/floppy -#umount /mnt/floppy diff --git a/reactos/lib/kernel32/misc/console.c b/reactos/lib/kernel32/misc/console.c index ea74eb49f33..e4103e58e54 100644 --- a/reactos/lib/kernel32/misc/console.c +++ b/reactos/lib/kernel32/misc/console.c @@ -1,4 +1,4 @@ -/* $Id: console.c,v 1.36 2001/11/20 02:29:44 dwelch Exp $ +/* $Id: console.c,v 1.37 2001/11/25 15:21:09 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -643,57 +643,64 @@ SetStdHandle(DWORD nStdHandle, /*-------------------------------------------------------------- * WriteConsoleA */ -WINBOOL STDCALL WriteConsoleA(HANDLE hConsoleOutput, - CONST VOID *lpBuffer, - DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCharsWritten, - LPVOID lpReserved) +WINBOOL STDCALL +WriteConsoleA(HANDLE hConsoleOutput, + CONST VOID *lpBuffer, + DWORD nNumberOfCharsToWrite, + LPDWORD lpNumberOfCharsWritten, + LPVOID lpReserved) { - PCSRSS_API_REQUEST Request; - CSRSS_API_REPLY Reply; - NTSTATUS Status; - WORD Size; - - Request = RtlAllocateHeap(GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(CSRSS_API_REQUEST) + CSRSS_MAX_WRITE_CONSOLE_REQUEST); - if (Request == NULL) - { - return(FALSE); - } + PCSRSS_API_REQUEST Request; + CSRSS_API_REPLY Reply; + NTSTATUS Status; + USHORT Size; + ULONG MessageSize; + + Request = RtlAllocateHeap(GetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(CSRSS_API_REQUEST) + + CSRSS_MAX_WRITE_CONSOLE_REQUEST); + if (Request == NULL) + { + return(FALSE); + } + + Request->Type = CSRSS_WRITE_CONSOLE; + Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput; + if (lpNumberOfCharsWritten != NULL) + *lpNumberOfCharsWritten = nNumberOfCharsToWrite; + while (nNumberOfCharsToWrite) + { + if (nNumberOfCharsToWrite > CSRSS_MAX_WRITE_CONSOLE_REQUEST) + { + Size = CSRSS_MAX_WRITE_CONSOLE_REQUEST; + } + else + { + Size = nNumberOfCharsToWrite; + } + Request->Data.WriteConsoleRequest.NrCharactersToWrite = Size; + + memcpy(Request->Data.WriteConsoleRequest.Buffer, lpBuffer, Size); - Request->Type = CSRSS_WRITE_CONSOLE; - Request->Data.WriteConsoleRequest.ConsoleHandle = hConsoleOutput; - if (lpNumberOfCharsWritten != NULL) - *lpNumberOfCharsWritten = nNumberOfCharsToWrite; - while( nNumberOfCharsToWrite ) - { - Size = nNumberOfCharsToWrite > CSRSS_MAX_WRITE_CONSOLE_REQUEST ? CSRSS_MAX_WRITE_CONSOLE_REQUEST : nNumberOfCharsToWrite; - - Request->Data.WriteConsoleRequest.NrCharactersToWrite = Size; - - // DbgPrint("nNumberOfCharsToWrite %d\n", nNumberOfCharsToWrite); - // DbgPrint("Buffer %s\n", Request->Data.WriteConsoleRequest.Buffer); - - memcpy( Request->Data.WriteConsoleRequest.Buffer, lpBuffer, Size ); - - Status = CsrClientCallServer(Request, - &Reply, - sizeof(CSRSS_WRITE_CONSOLE_REQUEST) + - Size, - sizeof(CSRSS_API_REPLY)); - - if (!NT_SUCCESS(Status) || !NT_SUCCESS( Status = Reply.Status ) ) - { - RtlFreeHeap( GetProcessHeap(), 0, Request ); - SetLastErrorByStatus (Status); - return(FALSE); - } - nNumberOfCharsToWrite -= Size; - lpBuffer += Size; - } - RtlFreeHeap( GetProcessHeap(), 0, Request ); - return TRUE; + MessageSize = CSRSS_REQUEST_HEADER_SIZE + + sizeof(CSRSS_WRITE_CONSOLE_REQUEST) + Size; + Status = CsrClientCallServer(Request, + &Reply, + MessageSize, + sizeof(CSRSS_API_REPLY)); + + if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status)) + { + RtlFreeHeap(GetProcessHeap(), 0, Request); + SetLastErrorByStatus(Status); + return(FALSE); + } + nNumberOfCharsToWrite -= Size; + lpBuffer += Size; + } + RtlFreeHeap(GetProcessHeap(), 0, Request); + return TRUE; } @@ -1133,48 +1140,91 @@ ReadConsoleOutputW( /*-------------------------------------------------------------- * WriteConsoleOutputA */ -WINBASEAPI -BOOL -WINAPI -WriteConsoleOutputA( - HANDLE hConsoleOutput, - CONST CHAR_INFO *lpBuffer, - COORD dwBufferSize, - COORD dwBufferCoord, - PSMALL_RECT lpWriteRegion - ) +WINBASEAPI BOOL WINAPI +WriteConsoleOutputA(HANDLE hConsoleOutput, + CONST CHAR_INFO *lpBuffer, + COORD dwBufferSize, + COORD dwBufferCoord, + PSMALL_RECT lpWriteRegion) { - PCSRSS_API_REQUEST Request; - CSRSS_API_REPLY Reply; - NTSTATUS Status; - DWORD Size; + PCSRSS_API_REQUEST Request; + CSRSS_API_REPLY Reply; + NTSTATUS Status; + ULONG Size; + BOOLEAN Result; + ULONG i, j; - Size = dwBufferSize.Y * dwBufferSize.X * sizeof(CHAR_INFO); + Size = dwBufferSize.Y * dwBufferSize.X * sizeof(CHAR_INFO); - Request = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(CSRSS_API_REQUEST) + Size); - if( !Request ) - { - SetLastError( ERROR_OUTOFMEMORY ); - return FALSE; - } - Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT; - Request->Data.WriteConsoleOutputRequest.ConsoleHandle = hConsoleOutput; - Request->Data.WriteConsoleOutputRequest.BufferSize = dwBufferSize; - Request->Data.WriteConsoleOutputRequest.BufferCoord = dwBufferCoord; - Request->Data.WriteConsoleOutputRequest.WriteRegion = *lpWriteRegion; - RtlCopyMemory(&Request->Data.WriteConsoleOutputRequest.CharInfo, lpBuffer, Size); + if ((sizeof(CSRSS_API_REQUEST) + Size) > + (sizeof(LPC_MESSAGE) + MAX_MESSAGE_DATA)) + { + COORD FragDim, FragCoord; + SMALL_RECT FragRegion; + DWORD SizeX, SizeY; + CONST CHAR_INFO* lpFragBuffer; - Status = CsrClientCallServer( Request, &Reply, sizeof( CSRSS_API_REQUEST ) + Size, sizeof( CSRSS_API_REPLY ) ); - if( !NT_SUCCESS( Status ) || !NT_SUCCESS( Status = Reply.Status ) ) + SizeX = min(dwBufferSize.X - dwBufferCoord.X, + lpWriteRegion->Right - lpWriteRegion->Left); + SizeY = min(dwBufferSize.Y - dwBufferCoord.Y, + lpWriteRegion->Bottom - lpWriteRegion->Top); + + for (i = dwBufferCoord.Y; i < (dwBufferCoord.Y + SizeY); i++) + { + for (j = dwBufferCoord.X; j < (dwBufferCoord.X + SizeX); j++) { - RtlFreeHeap( GetProcessHeap(), 0, Request ); - SetLastErrorByStatus ( Status ); - return FALSE; + FragDim.X = 1; + FragDim.Y = 1; + FragCoord.X = 0; + FragCoord.Y = 0; + FragRegion.Left = lpWriteRegion->Left + j; + FragRegion.Right = lpWriteRegion->Left + j + 1; + FragRegion.Top = lpWriteRegion->Top + i; + FragRegion.Bottom = lpWriteRegion->Bottom + i + 1; + + lpFragBuffer = lpBuffer + (i * dwBufferSize.X) + j; + Result = WriteConsoleOutputA(hConsoleOutput, + lpFragBuffer, + FragDim, + FragCoord, + &FragRegion); + if (!Result) + { + return(FALSE); + } } - - *lpWriteRegion = Reply.Data.WriteConsoleOutputReply.WriteRegion; - - return TRUE; + } + return(TRUE); + } + + Request = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(CSRSS_API_REQUEST) + Size); + if (Request == NULL) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + Request->Type = CSRSS_WRITE_CONSOLE_OUTPUT; + Request->Data.WriteConsoleOutputRequest.ConsoleHandle = hConsoleOutput; + Request->Data.WriteConsoleOutputRequest.BufferSize = dwBufferSize; + Request->Data.WriteConsoleOutputRequest.BufferCoord = dwBufferCoord; + Request->Data.WriteConsoleOutputRequest.WriteRegion = *lpWriteRegion; + RtlCopyMemory(&Request->Data.WriteConsoleOutputRequest.CharInfo, lpBuffer, + Size); + + Status = CsrClientCallServer(Request, &Reply, + sizeof(CSRSS_API_REQUEST) + Size, + sizeof(CSRSS_API_REPLY)); + if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Reply.Status)) + { + RtlFreeHeap(GetProcessHeap(), 0, Request); + SetLastErrorByStatus(Status); + return FALSE; + } + + *lpWriteRegion = Reply.Data.WriteConsoleOutputReply.WriteRegion; + RtlFreeHeap(GetProcessHeap(), 0, Request); + return(TRUE); } diff --git a/reactos/lib/kernel32/misc/dllmain.c b/reactos/lib/kernel32/misc/dllmain.c index d36331bb4dc..fe0dd2deb4e 100644 --- a/reactos/lib/kernel32/misc/dllmain.c +++ b/reactos/lib/kernel32/misc/dllmain.c @@ -1,4 +1,4 @@ -/* $Id: dllmain.c,v 1.18 2001/04/04 22:21:30 dwelch Exp $ +/* $Id: dllmain.c,v 1.19 2001/11/25 15:21:09 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -108,8 +108,9 @@ DllMain(HANDLE hInst, Status = CsrClientConnectToServer(); if (!NT_SUCCESS(Status)) { - DbgPrint("Failed to connect to csrss.exe: expect trouble\n"); - // ZwTerminateProcess(NtCurrentProcess(), Status); + DbgPrint("Failed to connect to csrss.exe: expect trouble " + "Status was %X\n", Status); + ZwTerminateProcess(NtCurrentProcess(), Status); } hProcessHeap = RtlGetProcessHeap(); diff --git a/reactos/lib/ntdll/csr/lpc.c b/reactos/lib/ntdll/csr/lpc.c index 7ef0b8ff371..dcfe2de8146 100644 --- a/reactos/lib/ntdll/csr/lpc.c +++ b/reactos/lib/ntdll/csr/lpc.c @@ -1,4 +1,4 @@ -/* $Id: lpc.c,v 1.2 2001/08/31 20:06:17 ea Exp $ +/* $Id: lpc.c,v 1.3 2001/11/25 15:21:09 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -57,27 +57,21 @@ CsrClientCallServer(PCSRSS_API_REQUEST Request, ULONG Length, ULONG ReplyLength) { - NTSTATUS Status; - - if (INVALID_HANDLE_VALUE == WindowsApiPort) - { - DbgPrint ("NTDLL.%s: client not connected to CSRSS!\n", __FUNCTION__); - return (STATUS_UNSUCCESSFUL); - } - -// DbgPrint("CsrClientCallServer(Request %x, Reply %x, Length %d, " -// "ReplyLength %d)\n", Request, Reply, Length, ReplyLength); - - Request->Header.DataSize = Length; - Request->Header.MessageSize = sizeof(LPC_MESSAGE_HEADER) + Length; + NTSTATUS Status; + if (INVALID_HANDLE_VALUE == WindowsApiPort) + { + DbgPrint ("NTDLL.%s: client not connected to CSRSS!\n", __FUNCTION__); + return (STATUS_UNSUCCESSFUL); + } + + Request->Header.DataSize = Length - sizeof(LPC_MESSAGE_HEADER); + Request->Header.MessageSize = Length; Status = NtRequestWaitReplyPort(WindowsApiPort, &Request->Header, (Reply?&Reply->Header:&Request->Header)); -// DbgPrint("Status %x\n", Status); - return(Status); } diff --git a/reactos/lib/ntdll/rtl/error.c b/reactos/lib/ntdll/rtl/error.c index 19639ee4622..c95f9019c9f 100644 --- a/reactos/lib/ntdll/rtl/error.c +++ b/reactos/lib/ntdll/rtl/error.c @@ -1,4 +1,4 @@ -/* $Id: error.c,v 1.8 2001/08/03 17:18:50 ekohl Exp $ +/* $Id: error.c,v 1.9 2001/11/25 15:21:09 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -881,7 +881,9 @@ RtlNtStatusToDosErrorNoTeb(NTSTATUS Status) if (!ret) ret = Status; /* 0 means 1:1 mapping */ else if (ret == ERROR_MR_MID_NOT_FOUND) - DbgPrint("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); + { + DbgPrint("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); + } return ret; } Table++; @@ -894,7 +896,6 @@ RtlNtStatusToDosErrorNoTeb(NTSTATUS Status) return LOWORD(Status); DbgPrint("RTL: RtlNtStatusToDosErrorNoTeb(0x%lx): no valid W32 error mapping\n", Status); - return ERROR_MR_MID_NOT_FOUND; } diff --git a/reactos/ntoskrnl/Makefile b/reactos/ntoskrnl/Makefile index 9a8b31dbedd..8f8a88f69b9 100644 --- a/reactos/ntoskrnl/Makefile +++ b/reactos/ntoskrnl/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.57 2001/11/03 16:48:07 chorns Exp $ +# $Id: Makefile,v 1.58 2001/11/25 15:21:10 dwelch Exp $ # # ReactOS Operating System # @@ -623,7 +623,7 @@ clean: .PHONY: clean -install: $(INSTALL_DIR)/system32/$(TARGETNAME).exe +install: all $(INSTALL_DIR)/system32/$(TARGETNAME).exe $(INSTALL_DIR)/system32/$(TARGETNAME).exe: $(TARGETNAME).exe $(CP) $(TARGETNAME).exe $(INSTALL_DIR)/system32/$(TARGETNAME).exe diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h index 712de53d110..6f65225d8fa 100644 --- a/reactos/ntoskrnl/include/internal/ntoskrnl.h +++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h @@ -22,7 +22,7 @@ /* * Maximum size of the kmalloc area (this is totally arbitary) */ -#define NONPAGED_POOL_SIZE (4*1024*1024) +#define NONPAGED_POOL_SIZE (400*1024*1024) /* * Defines a descriptor as it appears in the processor tables diff --git a/reactos/ntoskrnl/include/internal/port.h b/reactos/ntoskrnl/include/internal/port.h index e71722887c7..b47eb13d187 100644 --- a/reactos/ntoskrnl/include/internal/port.h +++ b/reactos/ntoskrnl/include/internal/port.h @@ -85,6 +85,9 @@ EiEnqueueMessagePort ( IN OUT PEPORT Port, IN PQUEUEDMESSAGE Message ); +VOID STDCALL +EiEnqueueMessageAtHeadPort (IN OUT PEPORT Port, + IN PQUEUEDMESSAGE Message); PQUEUEDMESSAGE STDCALL EiDequeueConnectMessagePort ( diff --git a/reactos/ntoskrnl/ke/i386/exp.c b/reactos/ntoskrnl/ke/i386/exp.c index b3fcecbf3cb..02d9c77e375 100644 --- a/reactos/ntoskrnl/ke/i386/exp.c +++ b/reactos/ntoskrnl/ke/i386/exp.c @@ -219,16 +219,22 @@ ULONG KiDoubleFaultHandler(VOID) { unsigned int cr2; - unsigned int i; - PULONG stack; + ULONG i, j; ULONG StackLimit; + ULONG StackBase; ULONG Esp0; ULONG ExceptionNr = 8; KTSS* OldTss; + PULONG Frame; + static PVOID StackTrace[MM_STACK_SIZE / sizeof(PVOID)]; + static ULONG StackRepeatCount[MM_STACK_SIZE / sizeof(PVOID)]; + static ULONG StackRepeatLength[MM_STACK_SIZE / sizeof(PVOID)]; + ULONG TraceLength; + BOOLEAN FoundRepeat; /* Use the address of the trap frame as approximation to the ring0 esp */ OldTss = KeGetCurrentKPCR()->TSS; - Esp0 = OldTss->Esp0; + Esp0 = OldTss->Esp; /* Get CR2 */ __asm__("movl %%cr2,%0\n\t" : "=d" (cr2)); @@ -296,38 +302,95 @@ KiDoubleFaultHandler(VOID) } if ((OldTss->Cs & 0xffff) == KERNEL_CS) { - DbgPrint("ESP %x\n", Esp0); - stack = (PULONG) (Esp0 + 24); - stack = (PULONG)(((ULONG)stack) & (~0x3)); - if (PsGetCurrentThread() != NULL) - { - StackLimit = (ULONG)PsGetCurrentThread()->Tcb.StackBase; - } - else - { - StackLimit = (ULONG)&init_stack_top; - } - - DbgPrint("stack<%p>: ", stack); - - for (i = 0; i < 18 && (((ULONG)&stack[i+5]) < StackLimit); i = i + 6) - { - DbgPrint("%.8x %.8x %.8x %.8x\n", - stack[i], stack[i+1], - stack[i+2], stack[i+3], - stack[i+4], stack[i+5]); - } - DbgPrint("Frames:\n"); - for (i = 0; i < 32 && (((ULONG)&stack[i]) < StackLimit); i++) - { - if (stack[i] > ((unsigned int) &_text_start__) && - !(stack[i] >= ((ULONG)&init_stack) && - stack[i] <= ((ULONG)&init_stack_top))) - { - print_address((PVOID)stack[i]); - DbgPrint(" "); - } - } + DbgPrint("ESP %x\n", Esp0); + if (PsGetCurrentThread() != NULL) + { + StackLimit = (ULONG)PsGetCurrentThread()->Tcb.StackBase; + StackBase = (ULONG)PsGetCurrentThread()->Tcb.StackLimit; + } + else + { + StackLimit = (ULONG)&init_stack_top; + StackBase = (ULONG)&init_stack; + } + + DbgPrint("Frames: "); + i = 0; + Frame = (PULONG)OldTss->Ebp; + while (Frame != NULL && (ULONG)Frame >= StackBase) + { + StackTrace[i] = (PVOID)Frame[1]; + Frame = (PULONG)Frame[0]; + i++; + } + TraceLength = i; + + i = 0; + while (i < TraceLength) + { + StackRepeatCount[i] = 0; + j = i + 1; + FoundRepeat = FALSE; + while ((j - i) <= (TraceLength - j) && FoundRepeat == FALSE) + { + if (memcmp(&StackTrace[i], &StackTrace[j], + (j - i) * sizeof(PVOID)) == 0) + { + StackRepeatCount[i] = 2; + StackRepeatLength[i] = j - i; + FoundRepeat = TRUE; + } + else + { + j++; + } + } + if (FoundRepeat == FALSE) + { + i++; + continue; + } + j = j + StackRepeatLength[i]; + while ((TraceLength - j) >= StackRepeatLength[i] && + FoundRepeat == TRUE) + { + if (memcmp(&StackTrace[i], &StackTrace[j], + StackRepeatLength[i] * sizeof(PVOID)) == 0) + { + StackRepeatCount[i]++; + j = j + StackRepeatLength[i]; + } + else + { + FoundRepeat = FALSE; + } + } + i = j; + } + + i = 0; + while (i < TraceLength) + { + if (StackRepeatCount[i] == 0) + { + print_address(StackTrace[i]); + i++; + } + else + { + DbgPrint("{"); + if (StackRepeatLength[i] == 0) + { + for(;;); + } + for (j = 0; j < StackRepeatLength[i]; j++) + { + print_address(StackTrace[i + j]); + } + DbgPrint("}*%d", StackRepeatCount[i]); + i = i + StackRepeatLength[i] * StackRepeatCount[i]; + } + } } DbgPrint("\n"); diff --git a/reactos/ntoskrnl/ke/i386/usertrap.c b/reactos/ntoskrnl/ke/i386/usertrap.c index 5f1ec1e1f5d..6582a588745 100644 --- a/reactos/ntoskrnl/ke/i386/usertrap.c +++ b/reactos/ntoskrnl/ke/i386/usertrap.c @@ -262,14 +262,14 @@ KiUserTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2) Frame = (PULONG)Tf->Ebp; while (Frame != NULL && i < 50) { - Status = MmCopyFromCaller(&ReturnAddress, &Frame[1], sizeof(ULONG)); + Status = MmSafeCopyFromUser(&ReturnAddress, &Frame[1], sizeof(ULONG)); if (!NT_SUCCESS(Status)) { DbgPrint("????????\n"); break; } print_user_address((PVOID)ReturnAddress); - Status = MmCopyFromCaller(&NextFrame, &Frame[0], sizeof(ULONG)); + Status = MmSafeCopyFromUser(&NextFrame, &Frame[0], sizeof(ULONG)); if (!NT_SUCCESS(Status)) { DbgPrint("Frame is inaccessible.\n"); @@ -280,9 +280,9 @@ KiUserTrapHandler(PKTRAP_FRAME Tf, ULONG ExceptionNr, PVOID Cr2) DbgPrint("Next frame is in kernel space!\n"); break; } - if (NextFrame >= (ULONG)Frame) + if (NextFrame != 0 && NextFrame <= (ULONG)Frame) { - DbgPrint("Next frame is not below current frame!\n"); + DbgPrint("Next frame is not above current frame!\n"); break; } Frame = (PULONG)NextFrame; diff --git a/reactos/ntoskrnl/ke/kthread.c b/reactos/ntoskrnl/ke/kthread.c index bb6e4a390d0..93c15a1d3d0 100644 --- a/reactos/ntoskrnl/ke/kthread.c +++ b/reactos/ntoskrnl/ke/kthread.c @@ -82,145 +82,145 @@ KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First) * FUNCTION: Initialize the microkernel state of the thread */ { - PVOID KernelStack; - NTSTATUS Status; - extern unsigned int init_stack_top; - extern unsigned int init_stack; - PMEMORY_AREA StackArea; - ULONG i; - - KeInitializeDispatcherHeader(&Thread->DispatcherHeader, - InternalThreadType, - sizeof(ETHREAD), - FALSE); - InitializeListHead(&Thread->MutantListHead); - if (!First) - { - KernelStack = NULL; - - MmLockAddressSpace(MmGetKernelAddressSpace()); - Status = MmCreateMemoryArea(NULL, - MmGetKernelAddressSpace(), - MEMORY_AREA_KERNEL_STACK, - &KernelStack, - MM_STACK_SIZE, - 0, - &StackArea, - FALSE); - MmUnlockAddressSpace(MmGetKernelAddressSpace()); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create thread stack\n"); - KeBugCheck(0); - } - for (i = 0; i < (MM_STACK_SIZE / PAGESIZE); i++) - { - Status = MmCreateVirtualMapping(NULL, - KernelStack + (i * PAGESIZE), - PAGE_EXECUTE_READWRITE, - (ULONG)MmAllocPage(0)); - } - Thread->InitialStack = KernelStack + MM_STACK_SIZE; - Thread->StackBase = KernelStack + MM_STACK_SIZE; - Thread->StackLimit = (ULONG)KernelStack; - Thread->KernelStack = KernelStack + MM_STACK_SIZE; - } - else - { - Thread->InitialStack = (PVOID)&init_stack_top; - Thread->StackBase = (PVOID)&init_stack_top; - Thread->StackLimit = (ULONG)&init_stack; - Thread->KernelStack = (PVOID)&init_stack_top; - } - - /* - * The Native API function will initialize the TEB field later - */ - Thread->Teb = NULL; - Thread->TlsArray = NULL; - Thread->DebugActive = 0; - Thread->State = THREAD_STATE_BLOCKED; - Thread->Alerted[0] = 0; - Thread->Alerted[1] = 0; - Thread->Iopl = 0; - /* - * FIXME: Think how this might work - */ - Thread->NpxState = 0; - - Thread->Saturation = 0; - Thread->Priority = 0; - InitializeListHead(&Thread->ApcState.ApcListHead[0]); - InitializeListHead(&Thread->ApcState.ApcListHead[1]); - Thread->ApcState.Process = Process; - Thread->ApcState.KernelApcInProgress = 0; - Thread->ApcState.KernelApcPending = 0; - Thread->ApcState.UserApcPending = 0; - Thread->ContextSwitches = 0; - Thread->WaitStatus = STATUS_SUCCESS; - Thread->WaitIrql = 0; - Thread->WaitMode = 0; - Thread->WaitNext = 0; - Thread->WaitBlockList = NULL; - Thread->WaitListEntry.Flink = NULL; - Thread->WaitListEntry.Blink = NULL; - Thread->WaitTime = 0; - Thread->BasePriority = 0; - Thread->DecrementCount = 0; - Thread->PriorityDecrement = 0; - Thread->Quantum = 0; - memset(Thread->WaitBlock, 0, sizeof(KWAIT_BLOCK)*4); - Thread->LegoData = 0; - /* - * FIXME: Why this? - */ - Thread->KernelApcDisable = 1; - Thread->UserAffinity = Process->Affinity; - Thread->SystemAffinityActive = 0; - Thread->Queue = NULL; - KeInitializeSpinLock(&Thread->ApcQueueLock); - memset(&Thread->Timer, 0, sizeof(KTIMER)); - Thread->QueueListEntry.Flink = NULL; - Thread->QueueListEntry.Blink = NULL; - Thread->Affinity = Process->Affinity; - Thread->Preempted = 0; - Thread->ProcessReadyQueue = 0; - Thread->KernelStackResident = 1; - Thread->NextProcessor = 0; - Thread->CallbackStack = NULL; - Thread->Win32Thread = 0; - Thread->TrapFrame = NULL; - Thread->ApcStatePointer[0] = NULL; - Thread->ApcStatePointer[1] = NULL; - Thread->EnableStackSwap = 0; - Thread->LargeStack = 0; - Thread->ResourceIndex = 0; - Thread->PreviousMode = KernelMode; - Thread->KernelTime = 0; - Thread->UserTime = 0; - memset(&Thread->SavedApcState, 0, sizeof(KAPC_STATE)); - Thread->Alertable = 1; - Thread->ApcStateIndex = 0; - Thread->ApcQueueable = 0; - Thread->AutoAlignment = 0; - KeInitializeApc(&Thread->SuspendApc, - Thread, - 0, - PiSuspendThreadKernelRoutine, - PiSuspendThreadRundownRoutine, - PiSuspendThreadNormalRoutine, - KernelMode, - NULL); - KeInitializeSemaphore(&Thread->SuspendSemaphore, 0, 255); - Thread->ThreadListEntry.Flink = NULL; - Thread->ThreadListEntry.Blink = NULL; - Thread->FreezeCount = 0; - Thread->SuspendCount = 0; - - /* - * Initialize ReactOS specific members - */ + PVOID KernelStack; + NTSTATUS Status; + extern unsigned int init_stack_top; + extern unsigned int init_stack; + PMEMORY_AREA StackArea; + ULONG i; + + KeInitializeDispatcherHeader(&Thread->DispatcherHeader, + InternalThreadType, + sizeof(ETHREAD), + FALSE); + InitializeListHead(&Thread->MutantListHead); + if (!First) + { + KernelStack = NULL; + + MmLockAddressSpace(MmGetKernelAddressSpace()); + Status = MmCreateMemoryArea(NULL, + MmGetKernelAddressSpace(), + MEMORY_AREA_KERNEL_STACK, + &KernelStack, + MM_STACK_SIZE, + 0, + &StackArea, + FALSE); + MmUnlockAddressSpace(MmGetKernelAddressSpace()); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create thread stack\n"); + KeBugCheck(0); + } + for (i = 0; i < (MM_STACK_SIZE / PAGESIZE); i++) + { + Status = MmCreateVirtualMapping(NULL, + KernelStack + (i * PAGESIZE), + PAGE_EXECUTE_READWRITE, + (ULONG)MmAllocPage(0)); + } + Thread->InitialStack = KernelStack + MM_STACK_SIZE; + Thread->StackBase = KernelStack + MM_STACK_SIZE; + Thread->StackLimit = (ULONG)KernelStack; + Thread->KernelStack = KernelStack + MM_STACK_SIZE; + } + else + { + Thread->InitialStack = (PVOID)&init_stack_top; + Thread->StackBase = (PVOID)&init_stack_top; + Thread->StackLimit = (ULONG)&init_stack; + Thread->KernelStack = (PVOID)&init_stack_top; + } + + /* + * The Native API function will initialize the TEB field later + */ + Thread->Teb = NULL; + Thread->TlsArray = NULL; + Thread->DebugActive = 0; + Thread->State = THREAD_STATE_BLOCKED; + Thread->Alerted[0] = 0; + Thread->Alerted[1] = 0; + Thread->Iopl = 0; + /* + * FIXME: Think how this might work + */ + Thread->NpxState = 0; + + Thread->Saturation = 0; + Thread->Priority = 0; + InitializeListHead(&Thread->ApcState.ApcListHead[0]); + InitializeListHead(&Thread->ApcState.ApcListHead[1]); + Thread->ApcState.Process = Process; + Thread->ApcState.KernelApcInProgress = 0; + Thread->ApcState.KernelApcPending = 0; + Thread->ApcState.UserApcPending = 0; + Thread->ContextSwitches = 0; + Thread->WaitStatus = STATUS_SUCCESS; + Thread->WaitIrql = 0; + Thread->WaitMode = 0; + Thread->WaitNext = 0; + Thread->WaitBlockList = NULL; + Thread->WaitListEntry.Flink = NULL; + Thread->WaitListEntry.Blink = NULL; + Thread->WaitTime = 0; + Thread->BasePriority = 0; + Thread->DecrementCount = 0; + Thread->PriorityDecrement = 0; + Thread->Quantum = 0; + memset(Thread->WaitBlock, 0, sizeof(KWAIT_BLOCK)*4); + Thread->LegoData = 0; + /* + * FIXME: Why this? + */ + Thread->KernelApcDisable = 1; + Thread->UserAffinity = Process->Affinity; + Thread->SystemAffinityActive = 0; + Thread->Queue = NULL; + KeInitializeSpinLock(&Thread->ApcQueueLock); + memset(&Thread->Timer, 0, sizeof(KTIMER)); + Thread->QueueListEntry.Flink = NULL; + Thread->QueueListEntry.Blink = NULL; + Thread->Affinity = Process->Affinity; + Thread->Preempted = 0; + Thread->ProcessReadyQueue = 0; + Thread->KernelStackResident = 1; + Thread->NextProcessor = 0; + Thread->CallbackStack = NULL; + Thread->Win32Thread = 0; + Thread->TrapFrame = NULL; + Thread->ApcStatePointer[0] = NULL; + Thread->ApcStatePointer[1] = NULL; + Thread->EnableStackSwap = 0; + Thread->LargeStack = 0; + Thread->ResourceIndex = 0; + Thread->PreviousMode = KernelMode; + Thread->KernelTime = 0; + Thread->UserTime = 0; + memset(&Thread->SavedApcState, 0, sizeof(KAPC_STATE)); + Thread->Alertable = 1; + Thread->ApcStateIndex = 0; + Thread->ApcQueueable = 0; + Thread->AutoAlignment = 0; + KeInitializeApc(&Thread->SuspendApc, + Thread, + 0, + PiSuspendThreadKernelRoutine, + PiSuspendThreadRundownRoutine, + PiSuspendThreadNormalRoutine, + KernelMode, + NULL); + KeInitializeSemaphore(&Thread->SuspendSemaphore, 0, 255); + Thread->ThreadListEntry.Flink = NULL; + Thread->ThreadListEntry.Blink = NULL; + Thread->FreezeCount = 0; + Thread->SuspendCount = 0; + + /* + * Initialize ReactOS specific members + */ Thread->ProcessThreadListEntry.Flink = NULL; Thread->ProcessThreadListEntry.Blink = NULL; KeInitializeDpc(&Thread->TimerDpc, @@ -231,6 +231,5 @@ KeInitializeThread(PKPROCESS Process, PKTHREAD Thread, BOOLEAN First) /* * Do x86 specific part */ - } diff --git a/reactos/ntoskrnl/ke/main.c b/reactos/ntoskrnl/ke/main.c index d431d12c647..03836aa503a 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.108 2001/11/02 09:09:50 ekohl Exp $ +/* $Id: main.c,v 1.109 2001/11/25 15:21:10 dwelch Exp $ * * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/main.c @@ -960,7 +960,7 @@ ExpInitializeExecutive(VOID) KeInit2(); KeLowerIrql(PASSIVE_LEVEL); - + ObInit(); PiInitProcessManager(); @@ -991,8 +991,10 @@ ExpInitializeExecutive(VOID) } /* Allocate a stack for use when booting the processor */ /* FIXME: The nonpaged memory for the stack is not released after use */ - ProcessorStack = ExAllocatePool(NonPagedPool, MM_STACK_SIZE) + MM_STACK_SIZE; - Ki386InitialStackArray[((int)KeNumberProcessors)] = (PVOID)(ProcessorStack - MM_STACK_SIZE); + ProcessorStack = + ExAllocatePool(NonPagedPool, MM_STACK_SIZE) + MM_STACK_SIZE; + Ki386InitialStackArray[((int)KeNumberProcessors)] = + (PVOID)(ProcessorStack - MM_STACK_SIZE); HalInitializeProcessor(KeNumberProcessors, ProcessorStack); KeNumberProcessors++; } @@ -1028,8 +1030,6 @@ ExpInitializeExecutive(VOID) /* Report all resources used by hal */ HalReportResourceUsage(); -// DumpBIOSMemoryMap(); - /* * Initalize services loaded at boot time */ @@ -1163,10 +1163,6 @@ ExpInitializeExecutive(VOID) */ InitSystemSharedUserPage ((PUCHAR)KeLoaderBlock.CommandLine); -#if 0 - SEHTest(); -#endif - /* * Launch initial process */ diff --git a/reactos/ntoskrnl/ke/wait.c b/reactos/ntoskrnl/ke/wait.c index 04f39af2650..34741238bcb 100644 --- a/reactos/ntoskrnl/ke/wait.c +++ b/reactos/ntoskrnl/ke/wait.c @@ -134,7 +134,7 @@ static VOID KiSideEffectsBeforeWake(DISPATCHER_HEADER* hdr, if (Thread == NULL) { DPRINT1("Thread == NULL!\n"); -// KeBugCheck(0); + KeBugCheck(0); } if (Abandoned != NULL) *Abandoned = Mutex->Abandoned; diff --git a/reactos/ntoskrnl/lpc/queue.c b/reactos/ntoskrnl/lpc/queue.c index 1abe36f0a41..5674be39edd 100644 --- a/reactos/ntoskrnl/lpc/queue.c +++ b/reactos/ntoskrnl/lpc/queue.c @@ -1,4 +1,4 @@ -/* $Id: queue.c,v 1.3 2000/12/28 03:38:07 dwelch Exp $ +/* $Id: queue.c,v 1.4 2001/11/25 15:21:10 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,6 +29,14 @@ EiEnqueueMessagePort (IN OUT PEPORT Port, Port->QueueLength++; } +VOID STDCALL +EiEnqueueMessageAtHeadPort (IN OUT PEPORT Port, + IN PQUEUEDMESSAGE Message) +{ + InsertTailList (&Port->QueueListHead, + &Message->QueueListEntry); + Port->QueueLength++; +} PQUEUEDMESSAGE STDCALL EiDequeueMessagePort (IN OUT PEPORT Port) diff --git a/reactos/ntoskrnl/lpc/reply.c b/reactos/ntoskrnl/lpc/reply.c index fe8b0690e40..0470336be4a 100644 --- a/reactos/ntoskrnl/lpc/reply.c +++ b/reactos/ntoskrnl/lpc/reply.c @@ -1,4 +1,4 @@ -/* $Id: reply.c,v 1.7 2001/06/23 19:13:33 phreak Exp $ +/* $Id: reply.c,v 1.8 2001/11/25 15:21:10 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -16,6 +16,7 @@ #include #include #include +#include #define NDEBUG #include @@ -227,7 +228,19 @@ NtReplyWaitReceivePortEx(IN HANDLE PortHandle, Request = EiDequeueMessagePort(Port); assert( Request ); - memcpy(LpcMessage, &Request->Message, Request->Message.MessageSize); + Status = MmCopyToCaller(LpcMessage, &Request->Message, + Request->Message.MessageSize); + if (!NT_SUCCESS(Status)) + { + /* + * Copying the message to the caller's buffer failed so + * undo what we did and return. + */ + EiEnqueueMessageAtHeadPort(Port, Request); + KeReleaseSpinLock(&Port->Lock, oldIrql); + ObDereferenceObject(Port); + return(Status); + } if (Request->Message.MessageType == LPC_CONNECTION_REQUEST) { EiEnqueueConnectMessagePort(Port, Request); diff --git a/reactos/ntoskrnl/lpc/send.c b/reactos/ntoskrnl/lpc/send.c index dab467bdce6..9221fc34da9 100644 --- a/reactos/ntoskrnl/lpc/send.c +++ b/reactos/ntoskrnl/lpc/send.c @@ -1,4 +1,4 @@ -/* $Id: send.c,v 1.5 2001/06/23 19:13:33 phreak Exp $ +/* $Id: send.c,v 1.6 2001/11/25 15:21:10 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -15,6 +15,7 @@ #include #include #include +#include #define NDEBUG #include @@ -75,8 +76,8 @@ LpcSendDebugMessagePort (IN PEPORT Port, ObDereferenceObject(Port); return(Status); } - KeReleaseSemaphore( &Port->OtherPort->Semaphore, IO_NO_INCREMENT, 1, FALSE ); - + KeReleaseSemaphore(&Port->OtherPort->Semaphore, IO_NO_INCREMENT, 1, FALSE); + /* * Wait for a reply */ @@ -183,17 +184,19 @@ NTSTATUS STDCALL NtRequestPort (IN HANDLE PortHandle, */ NTSTATUS STDCALL NtRequestWaitReplyPort (IN HANDLE PortHandle, - PLPC_MESSAGE LpcRequest, - PLPC_MESSAGE LpcReply) + PLPC_MESSAGE UnsafeLpcRequest, + PLPC_MESSAGE UnsafeLpcReply) { NTSTATUS Status; PEPORT Port; PQUEUEDMESSAGE Message; KIRQL oldIrql; - + PLPC_MESSAGE LpcRequest; + USHORT LpcRequestMessageSize; + DPRINT("NtRequestWaitReplyPort(PortHandle %x, LpcRequest %x, " "LpcReply %x)\n", PortHandle, LpcRequest, LpcReply); - + Status = ObReferenceObjectByHandle(PortHandle, PORT_ALL_ACCESS, ExPortType, @@ -204,8 +207,48 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, { return(Status); } - - + + Status = MmCopyFromCaller(&LpcRequestMessageSize, + &UnsafeLpcRequest->MessageSize, + sizeof(USHORT)); + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(Port); + return(Status); + } + if (LpcRequestMessageSize > (sizeof(LPC_MESSAGE) + MAX_MESSAGE_DATA)) + { + ObDereferenceObject(Port); + return(STATUS_PORT_MESSAGE_TOO_LONG); + } + LpcRequest = ExAllocatePool(NonPagedPool, LpcRequestMessageSize); + if (LpcRequest == NULL) + { + ObDereferenceObject(Port); + return(STATUS_NO_MEMORY); + } + Status = MmCopyFromCaller(LpcRequest, UnsafeLpcRequest, + LpcRequestMessageSize); + if (!NT_SUCCESS(Status)) + { + ExFreePool(LpcRequest); + ObDereferenceObject(Port); + return(Status); + } + LpcRequestMessageSize = LpcRequest->MessageSize; + if (LpcRequestMessageSize > (sizeof(LPC_MESSAGE) + MAX_MESSAGE_DATA)) + { + ExFreePool(LpcRequest); + ObDereferenceObject(Port); + return(STATUS_PORT_MESSAGE_TOO_LONG); + } + if (LpcRequest->DataSize != (LpcRequest->MessageSize - sizeof(LPC_MESSAGE))) + { + ExFreePool(LpcRequest); + ObDereferenceObject(Port); + return(STATUS_PORT_MESSAGE_TOO_LONG); + } + Status = EiReplyOrRequestPort(Port->OtherPort, LpcRequest, LPC_REQUEST, @@ -213,10 +256,13 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, if (!NT_SUCCESS(Status)) { DbgPrint("Enqueue failed\n"); + ExFreePool(LpcRequest); ObDereferenceObject(Port); return(Status); } - KeReleaseSemaphore( &Port->OtherPort->Semaphore, IO_NO_INCREMENT, 1, FALSE); + ExFreePool(LpcRequest); + KeReleaseSemaphore (&Port->OtherPort->Semaphore, IO_NO_INCREMENT, + 1, FALSE); /* * Wait for a reply @@ -235,12 +281,13 @@ NtRequestWaitReplyPort (IN HANDLE PortHandle, KeReleaseSpinLock(&Port->Lock, oldIrql); DPRINT("Message->Message.MessageSize %d\n", Message->Message.MessageSize); - memcpy(LpcReply, &Message->Message, Message->Message.MessageSize); + Status = MmCopyToCaller(UnsafeLpcReply, &Message->Message, + Message->Message.MessageSize); ExFreePool(Message); ObDereferenceObject(Port); - return(STATUS_SUCCESS); + return(Status); } diff --git a/reactos/ntoskrnl/mm/aspace.c b/reactos/ntoskrnl/mm/aspace.c index e51e2050795..545842fa930 100644 --- a/reactos/ntoskrnl/mm/aspace.c +++ b/reactos/ntoskrnl/mm/aspace.c @@ -1,4 +1,4 @@ -/* $Id: aspace.c,v 1.6 2001/03/07 16:48:43 dwelch Exp $ +/* $Id: aspace.c,v 1.7 2001/11/25 15:21:11 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -29,17 +29,31 @@ STATIC MADDRESS_SPACE KernelAddressSpace; VOID MmLockAddressSpace(PMADDRESS_SPACE AddressSpace) { - (VOID)KeWaitForMutexObject(&AddressSpace->Lock, - 0, - KernelMode, - FALSE, - NULL); + /* + * Don't bother with locking if we are the first thread. + */ + if (KeGetCurrentThread() == NULL) + { + return; + } + (VOID)KeWaitForMutexObject(&AddressSpace->Lock, + 0, + KernelMode, + FALSE, + NULL); } VOID MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace) { - KeReleaseMutex(&AddressSpace->Lock, FALSE); + /* + * Don't bother locking if we are the first thread. + */ + if (KeGetCurrentThread() == NULL) + { + return; + } + KeReleaseMutex(&AddressSpace->Lock, FALSE); } VOID diff --git a/reactos/ntoskrnl/mm/kmap.c b/reactos/ntoskrnl/mm/kmap.c index f06428116c1..7431e23819a 100644 --- a/reactos/ntoskrnl/mm/kmap.c +++ b/reactos/ntoskrnl/mm/kmap.c @@ -1,4 +1,4 @@ -/* $Id: kmap.c,v 1.10 2001/05/05 19:13:10 chorns Exp $ +/* $Id: kmap.c,v 1.11 2001/11/25 15:21:11 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -92,7 +92,7 @@ MiCopyFromUserPage(ULONG DestPhysPage, PVOID SourceAddress) return(STATUS_SUCCESS); } -PVOID +PVOID ExAllocatePageWithPhysPage(ULONG PhysPage) { KIRQL oldlvl; @@ -101,25 +101,25 @@ ExAllocatePageWithPhysPage(ULONG PhysPage) NTSTATUS Status; KeAcquireSpinLock(&AllocMapLock, &oldlvl); - for (i=1; iTickCountLow = 0xdeadbeef; -#if 0 - for (i = 0; i < 0x100; i++) - { - Status = MmCreateVirtualMapping(NULL, - (PVOID)(i*PAGESIZE), - PAGE_READWRITE, - (ULONG)(i*PAGESIZE)); - if (!NT_SUCCESS(Status)) - { - DbgPrint("Unable to create virtual mapping\n"); - KeBugCheck(0); - } - } -#endif -// MmDumpMemoryAreas(); - DPRINT("MmInitVirtualMemory() done\n"); } VOID MmInit1(ULONG FirstKrnlPhysAddr, diff --git a/reactos/ntoskrnl/mm/npool.c b/reactos/ntoskrnl/mm/npool.c index f46a30dc684..20a78e5e069 100644 --- a/reactos/ntoskrnl/mm/npool.c +++ b/reactos/ntoskrnl/mm/npool.c @@ -1,4 +1,4 @@ -/* $Id: npool.c,v 1.48 2001/10/29 02:39:38 dwelch Exp $ +/* $Id: npool.c,v 1.49 2001/11/25 15:21:11 dwelch Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -35,9 +35,8 @@ * Put each block in its own range of pages and position the block at the * end of the range so any accesses beyond the end of block are to invalid * memory locations. - * FIXME: Not implemented yet. */ -/* #define WHOLE_PAGE_ALLOCATIONS */ +//#define WHOLE_PAGE_ALLOCATIONS #ifdef ENABLE_VALIDATE_POOL #define VALIDATE_POOL validate_kernel_pool() @@ -70,6 +69,11 @@ typedef struct _BLOCK_HDR BOOLEAN Dumped; } BLOCK_HDR; +PVOID STDCALL +ExAllocateWholePageBlock(ULONG Size); +VOID STDCALL +ExFreeWholePageBlock(PVOID Addr); + /* GLOBALS *****************************************************************/ /* @@ -87,6 +91,7 @@ static LIST_ENTRY FreeBlockListHead; */ static LIST_ENTRY UsedBlockListHead; +#ifndef WHOLE_PAGE_ALLOCATIONS /* * Count of free blocks */ @@ -96,6 +101,7 @@ static ULONG EiNrFreeBlocks = 0; * Count of used blocks */ static ULONG EiNrUsedBlocks = 0; +#endif /* * Lock that protects the non-paged pool data structures @@ -118,6 +124,9 @@ ULONG EiUsedNonPagedPool = 0; PVOID MiAllocNonPagedPoolRegion(unsigned int nr_pages); +VOID +MiFreeNonPagedPoolRegion(PVOID Addr, ULONG Count, BOOLEAN Free); + #ifdef TAG_STATISTICS_TRACKING #define TAG_HASH_TABLE_SIZE (1024) static BLOCK_HDR* tag_hash_table[TAG_HASH_TABLE_SIZE]; @@ -355,6 +364,8 @@ MiDebugDumpNonPagedPool(BOOLEAN NewOnly) KeReleaseSpinLock(&MmNpoolLock, oldIrql); } +#ifndef WHOLE_PAGE_ALLOCATIONS + #ifdef ENABLE_VALIDATE_POOL static void validate_free_list(void) /* @@ -813,6 +824,8 @@ static void* take_block(BLOCK_HDR* current, unsigned int size, return(block_to_address(current)); } +#endif /* not WHOLE_PAGE_ALLOCATIONS */ + VOID STDCALL ExFreePool (PVOID block) /* * FUNCTION: Releases previously allocated memory @@ -820,11 +833,13 @@ VOID STDCALL ExFreePool (PVOID block) * block = block to free */ { - BLOCK_HDR* blk=address_to_block(block); +#ifdef WHOLE_PAGE_ALLOCATIONS /* WHOLE_PAGE_ALLOCATIONS */ KIRQL oldIrql; - if( !block ) - return; + if (block == NULL) + { + return; + } DPRINT("freeing block %x\n",blk); @@ -832,7 +847,27 @@ VOID STDCALL ExFreePool (PVOID block) ((PULONG)&block)[-1]); KeAcquireSpinLock(&MmNpoolLock, &oldIrql); - + + ExFreeWholePageBlock(block); + KeReleaseSpinLock(&MmNpoolLock, oldIrql); + +#else /* not WHOLE_PAGE_ALLOCATIONS */ + + BLOCK_HDR* blk=address_to_block(block); + KIRQL oldIrql; + + if (block == NULL) + { + return; + } + + DPRINT("freeing block %x\n",blk); + + POOL_TRACE("ExFreePool(block %x), size %d, caller %x\n",block,blk->size, + ((PULONG)&block)[-1]); + + KeAcquireSpinLock(&MmNpoolLock, &oldIrql); + VALIDATE_POOL; if (blk->Magic != BLOCK_HDR_USED_MAGIC) @@ -861,16 +896,40 @@ VOID STDCALL ExFreePool (PVOID block) merge_free_block(blk); EiUsedNonPagedPool = EiUsedNonPagedPool - blk->Size; - EiFreeNonPagedPool = EiFreeNonPagedPool + blk->Size; - + EiFreeNonPagedPool = EiFreeNonPagedPool + blk->Size; VALIDATE_POOL; - KeReleaseSpinLock(&MmNpoolLock, oldIrql); + +#endif /* WHOLE_PAGE_ALLOCATIONS */ } PVOID STDCALL ExAllocateNonPagedPoolWithTag(ULONG Type, ULONG Size, ULONG Tag, PVOID Caller) { +#ifdef WHOLE_PAGE_ALLOCATIONS + PVOID block; + KIRQL oldIrql; + + POOL_TRACE("ExAllocatePool(NumberOfBytes %d) caller %x ", + Size,Caller); + + KeAcquireSpinLock(&MmNpoolLock, &oldIrql); + + /* + * accomodate this useful idiom + */ + if (Size == 0) + { + POOL_TRACE("= NULL\n"); + KeReleaseSpinLock(&MmNpoolLock, oldIrql); + return(NULL); + } + + block = ExAllocateWholePageBlock(Size); + KeReleaseSpinLock(&MmNpoolLock, oldIrql); + return(block); + +#else /* not WHOLE_PAGE_ALLOCATIONS */ BLOCK_HDR* current = NULL; PLIST_ENTRY current_entry; PVOID block; @@ -928,7 +987,57 @@ ExAllocateNonPagedPoolWithTag(ULONG Type, ULONG Size, ULONG Tag, PVOID Caller) memset(block, 0, Size); KeReleaseSpinLock(&MmNpoolLock, oldIrql); return(block); +#endif /* WHOLE_PAGE_ALLOCATIONS */ } +#ifdef WHOLE_PAGE_ALLOCATIONS + +PVOID STDCALL +ExAllocateWholePageBlock(ULONG UserSize) +{ + PVOID Address; + PVOID Page; + ULONG i; + ULONG Size; + ULONG NrPages; + + Size = sizeof(ULONG) + UserSize; + NrPages = ROUND_UP(Size, PAGESIZE) / PAGESIZE; + + Address = MiAllocNonPagedPoolRegion(NrPages + 1); + + for (i = 0; i < NrPages; i++) + { + Page = MmAllocPage(0); + if (Page == NULL) + { + KeBugCheck(0); + } + MmCreateVirtualMapping(NULL, + Address + (i * PAGESIZE), + PAGE_READWRITE | PAGE_SYSTEM, + (ULONG)Page); + } + + *((PULONG)((ULONG)Address + (NrPages * PAGESIZE) - Size)) = NrPages; + return((PVOID)((ULONG)Address + (NrPages * PAGESIZE) - UserSize)); +} + +VOID STDCALL +ExFreeWholePageBlock(PVOID Addr) +{ + ULONG NrPages; + + if ((ULONG)Addr < kernel_pool_base || + (ULONG)Addr >= (kernel_pool_base + NONPAGED_POOL_SIZE)) + { + DbgPrint("Block %x found outside pool area\n", Addr); + KeBugCheck(0); + } + NrPages = *(PULONG)((ULONG)Addr - sizeof(ULONG)); + MiFreeNonPagedPoolRegion((PVOID)PAGE_ROUND_DOWN((ULONG)Addr), NrPages, TRUE); +} + +#endif /* WHOLE_PAGE_ALLOCATIONS */ /* EOF */ diff --git a/reactos/tools/wmc/makefile b/reactos/tools/wmc/makefile index 2b0428a6917..f43b9e127ec 100644 --- a/reactos/tools/wmc/makefile +++ b/reactos/tools/wmc/makefile @@ -12,12 +12,35 @@ OBJECTS = getopt.o lang.o mcl.o utils.o wmc.o write.o y_tab.o CLEAN_FILES = *.o wmc$(EXE_POSTFIX) wmc$(EXE_POSTFIX): $(OBJECTS) - $(HOST_CC) $(OBJECTS) -lkernel32 -lcrtdll -luser32 -o wmc$(EXE_POSTFIX) + $(HOST_CC) $(OBJECTS) -o wmc$(EXE_POSTFIX) + +HOST_CFLAGS = -I. + +getopt.o: getopt.c + $(HOST_CC) $(HOST_CFLAGS) -c getopt.c -o getopt.o + +lang.o: lang.c + $(HOST_CC) $(HOST_CFLAGS) -c lang.c -o lang.o + +mcl.o: mcl.c + $(HOST_CC) $(HOST_CFLAGS) -c mcl.c -o mcl.o + +utils.o: utils.c + $(HOST_CC) $(HOST_CFLAGS) -c utils.c -o utils.o + +wmc.o: wmc.c + $(HOST_CC) $(HOST_CFLAGS) -c wmc.c -o wmc.o + +write.o: write.c + $(HOST_CC) $(HOST_CFLAGS) -c write.c -o write.o + +y_tab.o: y_tab.c + $(HOST_CC) $(HOST_CFLAGS) -c y_tab.c -o y_tab.o ifeq ($(HOST),mingw32-linux) clean: - rm *.o - rm wmc$(EXE_POSTFIX) + rm -f *.o + rm -f wmc$(EXE_POSTFIX) endif ifeq ($(HOST),mingw32-windows) clean: