diff --git a/reactos/subsystems/win32/csrss/api/process.c b/reactos/subsystems/win32/csrss/api/process.c index f78e3ef2bb1..d96651ff980 100644 --- a/reactos/subsystems/win32/csrss/api/process.c +++ b/reactos/subsystems/win32/csrss/api/process.c @@ -129,18 +129,16 @@ NTSTATUS STDCALL CsrFreeProcessData(HANDLE Pid) { ULONG hash; UINT c; - PCSRSS_PROCESS_DATA pProcessData, pPrevProcessData = NULL; + PCSRSS_PROCESS_DATA pProcessData, *pPrevLink; hash = ((ULONG_PTR)Pid >> 2) % (sizeof(ProcessData) / sizeof(*ProcessData)); + pPrevLink = &ProcessData[hash]; LOCK; - pProcessData = ProcessData[hash]; - - while (pProcessData && pProcessData->ProcessId != Pid) + while ((pProcessData = *pPrevLink) && pProcessData->ProcessId != Pid) { - pPrevProcessData = pProcessData; - pProcessData = pProcessData->next; + pPrevLink = &pProcessData->next; } if (pProcessData) @@ -150,10 +148,6 @@ NTSTATUS STDCALL CsrFreeProcessData(HANDLE Pid) { NtClose(pProcessData->Process); } - if (pProcessData->Console) - { - RemoveEntryList(&pProcessData->ProcessEntry); - } if (pProcessData->HandleTable) { for (c = 0; c < pProcessData->HandleTableSize; c++) @@ -168,6 +162,7 @@ NTSTATUS STDCALL CsrFreeProcessData(HANDLE Pid) RtlDeleteCriticalSection(&pProcessData->HandleTableLock); if (pProcessData->Console) { + RemoveEntryList(&pProcessData->ProcessEntry); CsrReleaseObjectByPointer((Object_t *) pProcessData->Console); } if (pProcessData->CsrSectionViewBase) @@ -178,14 +173,7 @@ NTSTATUS STDCALL CsrFreeProcessData(HANDLE Pid) { NtClose(pProcessData->ServerCommunicationPort); } - if (pPrevProcessData) - { - pPrevProcessData->next = pProcessData->next; - } - else - { - ProcessData[hash] = pProcessData->next; - } + *pPrevLink = pProcessData->next; RtlFreeHeap(CsrssApiHeap, 0, pProcessData); UNLOCK; diff --git a/reactos/subsystems/win32/csrss/include/conio.h b/reactos/subsystems/win32/csrss/include/conio.h index 48b8b92eaa0..38c18b201cf 100644 --- a/reactos/subsystems/win32/csrss/include/conio.h +++ b/reactos/subsystems/win32/csrss/include/conio.h @@ -90,7 +90,7 @@ NTSTATUS FASTCALL ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, P VOID STDCALL ConioDeleteConsole(Object_t *Object); VOID STDCALL ConioDeleteScreenBuffer(Object_t *Buffer); void STDCALL ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode); -DWORD FASTCALL ConioGetBufferOffset(PCSRSS_SCREEN_BUFFER Buf, ULONG X, ULONG Y); +PBYTE FASTCALL ConioCoordToPointer(PCSRSS_SCREEN_BUFFER Buf, ULONG X, ULONG Y); VOID FASTCALL ConioDrawConsole(PCSRSS_CONSOLE Console); VOID FASTCALL ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData); VOID FASTCALL ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData, diff --git a/reactos/subsystems/win32/csrss/win32csr/alias.c b/reactos/subsystems/win32/csrss/win32csr/alias.c index a653c34eb8d..8b3254bc66b 100644 --- a/reactos/subsystems/win32/csrss/win32csr/alias.c +++ b/reactos/subsystems/win32/csrss/win32csr/alias.c @@ -86,35 +86,20 @@ VOID IntInsertAliasHeader(PALIAS_HEADER * RootHeader, PALIAS_HEADER NewHeader) { PALIAS_HEADER CurrentHeader; - PALIAS_HEADER LastHeader = NULL; + PALIAS_HEADER *LastLink = RootHeader; - if (*RootHeader == 0) - { - *RootHeader = NewHeader; - return; - } - - CurrentHeader = *RootHeader; - - while(CurrentHeader) + while ((CurrentHeader = *LastLink) != NULL) { INT Diff = _wcsicmp(NewHeader->lpExeName, CurrentHeader->lpExeName); if (Diff < 0) { - if (!LastHeader) - *RootHeader = NewHeader; - else - LastHeader->Next = NewHeader; - - NewHeader->Next = CurrentHeader; - return; + break; } - LastHeader = CurrentHeader; - CurrentHeader = CurrentHeader->Next; + LastLink = &CurrentHeader->Next; } - LastHeader->Next = NewHeader; - NewHeader->Next = NULL; + *LastLink = NewHeader; + NewHeader->Next = CurrentHeader; } PALIAS_ENTRY @@ -144,35 +129,20 @@ VOID IntInsertAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY NewEntry) { PALIAS_ENTRY CurrentEntry; - PALIAS_ENTRY LastEntry = NULL; + PALIAS_ENTRY *LastLink = &Header->Data; - CurrentEntry = Header->Data; - - if (!CurrentEntry) - { - Header->Data = NewEntry; - NewEntry->Next = NULL; - return; - } - - while(CurrentEntry) + while ((CurrentEntry = *LastLink) != NULL) { INT Diff = _wcsicmp(NewEntry->lpSource, CurrentEntry->lpSource); if (Diff < 0) { - if (!LastEntry) - Header->Data = NewEntry; - else - LastEntry->Next = NewEntry; - NewEntry->Next = CurrentEntry; - return; + break; } - LastEntry = CurrentEntry; - CurrentEntry = CurrentEntry->Next; + LastLink = &CurrentEntry->Next; } - LastEntry->Next = NewEntry; - NewEntry->Next = NULL; + *LastLink = NewEntry; + NewEntry->Next = CurrentEntry; } PALIAS_ENTRY @@ -289,28 +259,18 @@ IntGetAllConsoleAliases(PALIAS_HEADER Header, LPWSTR TargetBuffer, UINT TargetBu VOID IntDeleteAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY Entry) { - PALIAS_ENTRY LastEntry; + PALIAS_ENTRY *LastLink = &Header->Data; PALIAS_ENTRY CurEntry; - if (Header->Data == Entry) - { - Header->Data = Entry->Next; - RtlFreeHeap(Win32CsrApiHeap, 0, Entry); - return; - } - LastEntry = Header->Data; - CurEntry = LastEntry->Next; - - while(CurEntry) + while ((CurEntry = *LastLink) != NULL) { if (CurEntry == Entry) { - LastEntry->Next = Entry->Next; + *LastLink = Entry->Next; RtlFreeHeap(Win32CsrApiHeap, 0, Entry); return; } - LastEntry = CurEntry; - CurEntry = CurEntry->Next; + LastLink = &CurEntry->Next; } } VOID diff --git a/reactos/subsystems/win32/csrss/win32csr/conio.c b/reactos/subsystems/win32/csrss/win32csr/conio.c index 0db7c91f5d5..a3552543889 100644 --- a/reactos/subsystems/win32/csrss/win32csr/conio.c +++ b/reactos/subsystems/win32/csrss/win32csr/conio.c @@ -83,29 +83,23 @@ ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData) ConioConsoleCtrlEventTimeout(Event, ProcessData, 0); } -DWORD FASTCALL -ConioGetBufferOffset(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y) +PBYTE FASTCALL +ConioCoordToPointer(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y) { - return 2 * (((Y + Buff->VirtualY) % Buff->MaxY) * Buff->MaxX + X); + return &Buff->Buffer[2 * (((Y + Buff->VirtualY) % Buff->MaxY) * Buff->MaxX + X)]; } -#define GET_CELL_BUFFER(b,o)\ -(b)->Buffer[(o)++] - -#define SET_CELL_BUFFER(b,o,c,a)\ -(b)->Buffer[(o)++]=(c),\ -(b)->Buffer[(o)++]=(a) - static VOID FASTCALL ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff) { - DWORD Offset = ConioGetBufferOffset(Buff, 0, Buff->CurrentY); + PBYTE Ptr = ConioCoordToPointer(Buff, 0, Buff->CurrentY); UINT Pos; for (Pos = 0; Pos < Buff->MaxX; Pos++) { - /* Fill the cell: Offset is incremented by the macro */ - SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib); + /* Fill the cell */ + *Ptr++ = ' '; + *Ptr++ = Buff->DefaultAttrib; } } @@ -433,7 +427,7 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, CHAR *Buffer, DWORD Length, BOOL Attrib) { UINT i; - DWORD Offset; + PBYTE Ptr; RECT UpdateRect; LONG CursorStartX, CursorStartY; UINT ScrolledLines; @@ -474,8 +468,9 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, { Buff->CurrentX--; } - Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); - SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib); + Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); + Ptr[0] = ' '; + Ptr[1] = Buff->DefaultAttrib; UpdateRect.left = min(UpdateRect.left, (LONG) Buff->CurrentX); UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX); } @@ -500,12 +495,11 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, { EndX = Buff->MaxX; } - Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); + Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); while (Buff->CurrentX < EndX) { - Buff->Buffer[Offset] = ' '; - Buff->Buffer[Offset + 1] = Buff->DefaultAttrib; - Offset += 2; + *Ptr++ = ' '; + *Ptr++ = Buff->DefaultAttrib; Buff->CurrentX++; } UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX - 1); @@ -526,11 +520,11 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, } UpdateRect.left = min(UpdateRect.left, (LONG)Buff->CurrentX); UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX); - Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); - Buff->Buffer[Offset++] = Buffer[i]; + Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); + Ptr[0] = Buffer[i]; if (Attrib) { - Buff->Buffer[Offset] = Buff->DefaultAttrib; + Ptr[1] = Buff->DefaultAttrib; } Buff->CurrentX++; if (Buff->CurrentX == Buff->MaxX) @@ -786,8 +780,8 @@ ConioMoveRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer, } for (i = 0; i < Height; i++) { - PWORD SRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, SY)]; - PWORD DRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, DY)]; + PWORD SRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, SY); + PWORD DRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, DY); SX = SrcRegion->left; DX = DstRegion->left; @@ -2210,7 +2204,7 @@ CSR_API(CsrWriteConsoleOutput) COORD BufferCoord; COORD BufferSize; NTSTATUS Status; - DWORD Offset; + PBYTE Ptr; DWORD PSize; DPRINT("CsrWriteConsoleOutput\n"); @@ -2270,19 +2264,20 @@ CSR_API(CsrWriteConsoleOutput) for (i = 0, Y = WriteRegion.top; Y <= WriteRegion.bottom; i++, Y++) { CurCharInfo = CharInfo + (i + BufferCoord.Y) * BufferSize.X + BufferCoord.X; - Offset = ConioGetBufferOffset(Buff, WriteRegion.left, Y); + Ptr = ConioCoordToPointer(Buff, WriteRegion.left, Y); for (X = WriteRegion.left; X <= WriteRegion.right; X++) { + CHAR AsciiChar; if (Request->Data.WriteConsoleOutputRequest.Unicode) { - CHAR AsciiChar; ConsoleUnicodeCharToAnsiChar(Console, &AsciiChar, &CurCharInfo->Char.UnicodeChar); - SET_CELL_BUFFER(Buff, Offset, AsciiChar, CurCharInfo->Attributes); } else { - SET_CELL_BUFFER(Buff, Offset, CurCharInfo->Char.AsciiChar, CurCharInfo->Attributes); + AsciiChar = CurCharInfo->Char.AsciiChar; } + *Ptr++ = AsciiChar; + *Ptr++ = CurCharInfo->Attributes; CurCharInfo++; } } @@ -2716,7 +2711,8 @@ CSR_API(CsrReadConsoleOutput) COORD BufferCoord; RECT ReadRegion; RECT ScreenRect; - DWORD i, Offset; + DWORD i; + PBYTE Ptr; LONG X, Y; UINT CodePage; @@ -2769,20 +2765,20 @@ CSR_API(CsrReadConsoleOutput) { CurCharInfo = CharInfo + (i * BufferSize.X); - Offset = ConioGetBufferOffset(Buff, ReadRegion.left, Y); + Ptr = ConioCoordToPointer(Buff, ReadRegion.left, Y); for (X = ReadRegion.left; X < ReadRegion.right; ++X) { if (Request->Data.ReadConsoleOutputRequest.Unicode) { MultiByteToWideChar(CodePage, 0, - (PCHAR)&GET_CELL_BUFFER(Buff, Offset), 1, + (PCHAR)Ptr++, 1, &CurCharInfo->Char.UnicodeChar, 1); } else { - CurCharInfo->Char.AsciiChar = GET_CELL_BUFFER(Buff, Offset); + CurCharInfo->Char.AsciiChar = *Ptr++; } - CurCharInfo->Attributes = GET_CELL_BUFFER(Buff, Offset); + CurCharInfo->Attributes = *Ptr++; ++CurCharInfo; } } diff --git a/reactos/subsystems/win32/csrss/win32csr/guiconsole.c b/reactos/subsystems/win32/csrss/win32csr/guiconsole.c index cf119a46435..1103ed3caa9 100644 --- a/reactos/subsystems/win32/csrss/win32csr/guiconsole.c +++ b/reactos/subsystems/win32/csrss/win32csr/guiconsole.c @@ -880,7 +880,7 @@ GuiConsolePaint(PCSRSS_CONSOLE Console, for (Line = TopLine; Line <= BottomLine; Line++) { - From = Buff->Buffer + ConioGetBufferOffset(Buff, LeftChar, Line); + From = ConioCoordToPointer(Buff, LeftChar, Line); Start = LeftChar; To = GuiData->LineBuffer; @@ -934,7 +934,7 @@ GuiConsolePaint(PCSRSS_CONSOLE Console, { CursorHeight = 1; } - From = Buff->Buffer + ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY) + 1; + From = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY) + 1; if (*From != DEFAULT_ATTRIB) { diff --git a/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c b/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c index 1a7d5b7b5df..972da8f223e 100644 --- a/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c +++ b/reactos/subsystems/win32/csrss/win32csr/tuiconsole.c @@ -86,7 +86,7 @@ TuiCopyRect(char *Dest, PCSRSS_SCREEN_BUFFER Buff, RECT *Region) LONG i; PBYTE Src, SrcEnd; - Src = Buff->Buffer + ConioGetBufferOffset(Buff, Region->left, Region->top); + Src = ConioCoordToPointer(Buff, Region->left, Region->top); SrcDelta = Buff->MaxX * 2; SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2; DestDelta = ConioRectWidth(Region) * 2;