- Work with screen buffer data using pointers rather than offsets; remove confusing GET_CELL_BUFFER and SET_CELL_BUFFER macros.

- CsrFreeProcessData: Merge two ifs with the same condition.
- Use the pointer-to-pointer trick to simplify linked list handling in CsrFreeProcessData, IntInsertAliasHeader, IntInsertAliasEntry, and IntDeleteAliasEntry.

svn path=/trunk/; revision=34858
This commit is contained in:
Jeffrey Morlan 2008-07-27 20:08:18 +00:00
parent 027390f247
commit 8054941a9f
6 changed files with 57 additions and 113 deletions

View file

@ -129,18 +129,16 @@ NTSTATUS STDCALL CsrFreeProcessData(HANDLE Pid)
{ {
ULONG hash; ULONG hash;
UINT c; UINT c;
PCSRSS_PROCESS_DATA pProcessData, pPrevProcessData = NULL; PCSRSS_PROCESS_DATA pProcessData, *pPrevLink;
hash = ((ULONG_PTR)Pid >> 2) % (sizeof(ProcessData) / sizeof(*ProcessData)); hash = ((ULONG_PTR)Pid >> 2) % (sizeof(ProcessData) / sizeof(*ProcessData));
pPrevLink = &ProcessData[hash];
LOCK; LOCK;
pProcessData = ProcessData[hash]; while ((pProcessData = *pPrevLink) && pProcessData->ProcessId != Pid)
while (pProcessData && pProcessData->ProcessId != Pid)
{ {
pPrevProcessData = pProcessData; pPrevLink = &pProcessData->next;
pProcessData = pProcessData->next;
} }
if (pProcessData) if (pProcessData)
@ -150,10 +148,6 @@ NTSTATUS STDCALL CsrFreeProcessData(HANDLE Pid)
{ {
NtClose(pProcessData->Process); NtClose(pProcessData->Process);
} }
if (pProcessData->Console)
{
RemoveEntryList(&pProcessData->ProcessEntry);
}
if (pProcessData->HandleTable) if (pProcessData->HandleTable)
{ {
for (c = 0; c < pProcessData->HandleTableSize; c++) for (c = 0; c < pProcessData->HandleTableSize; c++)
@ -168,6 +162,7 @@ NTSTATUS STDCALL CsrFreeProcessData(HANDLE Pid)
RtlDeleteCriticalSection(&pProcessData->HandleTableLock); RtlDeleteCriticalSection(&pProcessData->HandleTableLock);
if (pProcessData->Console) if (pProcessData->Console)
{ {
RemoveEntryList(&pProcessData->ProcessEntry);
CsrReleaseObjectByPointer((Object_t *) pProcessData->Console); CsrReleaseObjectByPointer((Object_t *) pProcessData->Console);
} }
if (pProcessData->CsrSectionViewBase) if (pProcessData->CsrSectionViewBase)
@ -178,14 +173,7 @@ NTSTATUS STDCALL CsrFreeProcessData(HANDLE Pid)
{ {
NtClose(pProcessData->ServerCommunicationPort); NtClose(pProcessData->ServerCommunicationPort);
} }
if (pPrevProcessData) *pPrevLink = pProcessData->next;
{
pPrevProcessData->next = pProcessData->next;
}
else
{
ProcessData[hash] = pProcessData->next;
}
RtlFreeHeap(CsrssApiHeap, 0, pProcessData); RtlFreeHeap(CsrssApiHeap, 0, pProcessData);
UNLOCK; UNLOCK;

View file

@ -90,7 +90,7 @@ NTSTATUS FASTCALL ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, P
VOID STDCALL ConioDeleteConsole(Object_t *Object); VOID STDCALL ConioDeleteConsole(Object_t *Object);
VOID STDCALL ConioDeleteScreenBuffer(Object_t *Buffer); VOID STDCALL ConioDeleteScreenBuffer(Object_t *Buffer);
void STDCALL ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode); 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 ConioDrawConsole(PCSRSS_CONSOLE Console);
VOID FASTCALL ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData); VOID FASTCALL ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData);
VOID FASTCALL ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData, VOID FASTCALL ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData,

View file

@ -86,35 +86,20 @@ VOID
IntInsertAliasHeader(PALIAS_HEADER * RootHeader, PALIAS_HEADER NewHeader) IntInsertAliasHeader(PALIAS_HEADER * RootHeader, PALIAS_HEADER NewHeader)
{ {
PALIAS_HEADER CurrentHeader; PALIAS_HEADER CurrentHeader;
PALIAS_HEADER LastHeader = NULL; PALIAS_HEADER *LastLink = RootHeader;
if (*RootHeader == 0) while ((CurrentHeader = *LastLink) != NULL)
{
*RootHeader = NewHeader;
return;
}
CurrentHeader = *RootHeader;
while(CurrentHeader)
{ {
INT Diff = _wcsicmp(NewHeader->lpExeName, CurrentHeader->lpExeName); INT Diff = _wcsicmp(NewHeader->lpExeName, CurrentHeader->lpExeName);
if (Diff < 0) if (Diff < 0)
{ {
if (!LastHeader) break;
*RootHeader = NewHeader;
else
LastHeader->Next = NewHeader;
NewHeader->Next = CurrentHeader;
return;
} }
LastHeader = CurrentHeader; LastLink = &CurrentHeader->Next;
CurrentHeader = CurrentHeader->Next;
} }
LastHeader->Next = NewHeader; *LastLink = NewHeader;
NewHeader->Next = NULL; NewHeader->Next = CurrentHeader;
} }
PALIAS_ENTRY PALIAS_ENTRY
@ -144,35 +129,20 @@ VOID
IntInsertAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY NewEntry) IntInsertAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY NewEntry)
{ {
PALIAS_ENTRY CurrentEntry; PALIAS_ENTRY CurrentEntry;
PALIAS_ENTRY LastEntry = NULL; PALIAS_ENTRY *LastLink = &Header->Data;
CurrentEntry = Header->Data; while ((CurrentEntry = *LastLink) != NULL)
if (!CurrentEntry)
{
Header->Data = NewEntry;
NewEntry->Next = NULL;
return;
}
while(CurrentEntry)
{ {
INT Diff = _wcsicmp(NewEntry->lpSource, CurrentEntry->lpSource); INT Diff = _wcsicmp(NewEntry->lpSource, CurrentEntry->lpSource);
if (Diff < 0) if (Diff < 0)
{ {
if (!LastEntry) break;
Header->Data = NewEntry;
else
LastEntry->Next = NewEntry;
NewEntry->Next = CurrentEntry;
return;
} }
LastEntry = CurrentEntry; LastLink = &CurrentEntry->Next;
CurrentEntry = CurrentEntry->Next;
} }
LastEntry->Next = NewEntry; *LastLink = NewEntry;
NewEntry->Next = NULL; NewEntry->Next = CurrentEntry;
} }
PALIAS_ENTRY PALIAS_ENTRY
@ -289,28 +259,18 @@ IntGetAllConsoleAliases(PALIAS_HEADER Header, LPWSTR TargetBuffer, UINT TargetBu
VOID VOID
IntDeleteAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY Entry) IntDeleteAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY Entry)
{ {
PALIAS_ENTRY LastEntry; PALIAS_ENTRY *LastLink = &Header->Data;
PALIAS_ENTRY CurEntry; PALIAS_ENTRY CurEntry;
if (Header->Data == Entry) while ((CurEntry = *LastLink) != NULL)
{
Header->Data = Entry->Next;
RtlFreeHeap(Win32CsrApiHeap, 0, Entry);
return;
}
LastEntry = Header->Data;
CurEntry = LastEntry->Next;
while(CurEntry)
{ {
if (CurEntry == Entry) if (CurEntry == Entry)
{ {
LastEntry->Next = Entry->Next; *LastLink = Entry->Next;
RtlFreeHeap(Win32CsrApiHeap, 0, Entry); RtlFreeHeap(Win32CsrApiHeap, 0, Entry);
return; return;
} }
LastEntry = CurEntry; LastLink = &CurEntry->Next;
CurEntry = CurEntry->Next;
} }
} }
VOID VOID

View file

@ -83,29 +83,23 @@ ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData)
ConioConsoleCtrlEventTimeout(Event, ProcessData, 0); ConioConsoleCtrlEventTimeout(Event, ProcessData, 0);
} }
DWORD FASTCALL PBYTE FASTCALL
ConioGetBufferOffset(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y) 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 static VOID FASTCALL
ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff) ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff)
{ {
DWORD Offset = ConioGetBufferOffset(Buff, 0, Buff->CurrentY); PBYTE Ptr = ConioCoordToPointer(Buff, 0, Buff->CurrentY);
UINT Pos; UINT Pos;
for (Pos = 0; Pos < Buff->MaxX; Pos++) for (Pos = 0; Pos < Buff->MaxX; Pos++)
{ {
/* Fill the cell: Offset is incremented by the macro */ /* Fill the cell */
SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib); *Ptr++ = ' ';
*Ptr++ = Buff->DefaultAttrib;
} }
} }
@ -433,7 +427,7 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
CHAR *Buffer, DWORD Length, BOOL Attrib) CHAR *Buffer, DWORD Length, BOOL Attrib)
{ {
UINT i; UINT i;
DWORD Offset; PBYTE Ptr;
RECT UpdateRect; RECT UpdateRect;
LONG CursorStartX, CursorStartY; LONG CursorStartX, CursorStartY;
UINT ScrolledLines; UINT ScrolledLines;
@ -474,8 +468,9 @@ ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff,
{ {
Buff->CurrentX--; Buff->CurrentX--;
} }
Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY);
SET_CELL_BUFFER(Buff, Offset, ' ', Buff->DefaultAttrib); Ptr[0] = ' ';
Ptr[1] = Buff->DefaultAttrib;
UpdateRect.left = min(UpdateRect.left, (LONG) Buff->CurrentX); UpdateRect.left = min(UpdateRect.left, (LONG) Buff->CurrentX);
UpdateRect.right = max(UpdateRect.right, (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; EndX = Buff->MaxX;
} }
Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY);
while (Buff->CurrentX < EndX) while (Buff->CurrentX < EndX)
{ {
Buff->Buffer[Offset] = ' '; *Ptr++ = ' ';
Buff->Buffer[Offset + 1] = Buff->DefaultAttrib; *Ptr++ = Buff->DefaultAttrib;
Offset += 2;
Buff->CurrentX++; Buff->CurrentX++;
} }
UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX - 1); 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.left = min(UpdateRect.left, (LONG)Buff->CurrentX);
UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX); UpdateRect.right = max(UpdateRect.right, (LONG) Buff->CurrentX);
Offset = ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY); Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY);
Buff->Buffer[Offset++] = Buffer[i]; Ptr[0] = Buffer[i];
if (Attrib) if (Attrib)
{ {
Buff->Buffer[Offset] = Buff->DefaultAttrib; Ptr[1] = Buff->DefaultAttrib;
} }
Buff->CurrentX++; Buff->CurrentX++;
if (Buff->CurrentX == Buff->MaxX) if (Buff->CurrentX == Buff->MaxX)
@ -786,8 +780,8 @@ ConioMoveRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer,
} }
for (i = 0; i < Height; i++) for (i = 0; i < Height; i++)
{ {
PWORD SRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, SY)]; PWORD SRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, SY);
PWORD DRow = (PWORD)&ScreenBuffer->Buffer[ConioGetBufferOffset(ScreenBuffer, 0, DY)]; PWORD DRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, DY);
SX = SrcRegion->left; SX = SrcRegion->left;
DX = DstRegion->left; DX = DstRegion->left;
@ -2210,7 +2204,7 @@ CSR_API(CsrWriteConsoleOutput)
COORD BufferCoord; COORD BufferCoord;
COORD BufferSize; COORD BufferSize;
NTSTATUS Status; NTSTATUS Status;
DWORD Offset; PBYTE Ptr;
DWORD PSize; DWORD PSize;
DPRINT("CsrWriteConsoleOutput\n"); DPRINT("CsrWriteConsoleOutput\n");
@ -2270,19 +2264,20 @@ CSR_API(CsrWriteConsoleOutput)
for (i = 0, Y = WriteRegion.top; Y <= WriteRegion.bottom; i++, Y++) for (i = 0, Y = WriteRegion.top; Y <= WriteRegion.bottom; i++, Y++)
{ {
CurCharInfo = CharInfo + (i + BufferCoord.Y) * BufferSize.X + BufferCoord.X; 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++) for (X = WriteRegion.left; X <= WriteRegion.right; X++)
{ {
CHAR AsciiChar;
if (Request->Data.WriteConsoleOutputRequest.Unicode) if (Request->Data.WriteConsoleOutputRequest.Unicode)
{ {
CHAR AsciiChar;
ConsoleUnicodeCharToAnsiChar(Console, &AsciiChar, &CurCharInfo->Char.UnicodeChar); ConsoleUnicodeCharToAnsiChar(Console, &AsciiChar, &CurCharInfo->Char.UnicodeChar);
SET_CELL_BUFFER(Buff, Offset, AsciiChar, CurCharInfo->Attributes);
} }
else else
{ {
SET_CELL_BUFFER(Buff, Offset, CurCharInfo->Char.AsciiChar, CurCharInfo->Attributes); AsciiChar = CurCharInfo->Char.AsciiChar;
} }
*Ptr++ = AsciiChar;
*Ptr++ = CurCharInfo->Attributes;
CurCharInfo++; CurCharInfo++;
} }
} }
@ -2716,7 +2711,8 @@ CSR_API(CsrReadConsoleOutput)
COORD BufferCoord; COORD BufferCoord;
RECT ReadRegion; RECT ReadRegion;
RECT ScreenRect; RECT ScreenRect;
DWORD i, Offset; DWORD i;
PBYTE Ptr;
LONG X, Y; LONG X, Y;
UINT CodePage; UINT CodePage;
@ -2769,20 +2765,20 @@ CSR_API(CsrReadConsoleOutput)
{ {
CurCharInfo = CharInfo + (i * BufferSize.X); 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) for (X = ReadRegion.left; X < ReadRegion.right; ++X)
{ {
if (Request->Data.ReadConsoleOutputRequest.Unicode) if (Request->Data.ReadConsoleOutputRequest.Unicode)
{ {
MultiByteToWideChar(CodePage, 0, MultiByteToWideChar(CodePage, 0,
(PCHAR)&GET_CELL_BUFFER(Buff, Offset), 1, (PCHAR)Ptr++, 1,
&CurCharInfo->Char.UnicodeChar, 1); &CurCharInfo->Char.UnicodeChar, 1);
} }
else else
{ {
CurCharInfo->Char.AsciiChar = GET_CELL_BUFFER(Buff, Offset); CurCharInfo->Char.AsciiChar = *Ptr++;
} }
CurCharInfo->Attributes = GET_CELL_BUFFER(Buff, Offset); CurCharInfo->Attributes = *Ptr++;
++CurCharInfo; ++CurCharInfo;
} }
} }

View file

@ -880,7 +880,7 @@ GuiConsolePaint(PCSRSS_CONSOLE Console,
for (Line = TopLine; Line <= BottomLine; Line++) for (Line = TopLine; Line <= BottomLine; Line++)
{ {
From = Buff->Buffer + ConioGetBufferOffset(Buff, LeftChar, Line); From = ConioCoordToPointer(Buff, LeftChar, Line);
Start = LeftChar; Start = LeftChar;
To = GuiData->LineBuffer; To = GuiData->LineBuffer;
@ -934,7 +934,7 @@ GuiConsolePaint(PCSRSS_CONSOLE Console,
{ {
CursorHeight = 1; CursorHeight = 1;
} }
From = Buff->Buffer + ConioGetBufferOffset(Buff, Buff->CurrentX, Buff->CurrentY) + 1; From = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY) + 1;
if (*From != DEFAULT_ATTRIB) if (*From != DEFAULT_ATTRIB)
{ {

View file

@ -86,7 +86,7 @@ TuiCopyRect(char *Dest, PCSRSS_SCREEN_BUFFER Buff, RECT *Region)
LONG i; LONG i;
PBYTE Src, SrcEnd; PBYTE Src, SrcEnd;
Src = Buff->Buffer + ConioGetBufferOffset(Buff, Region->left, Region->top); Src = ConioCoordToPointer(Buff, Region->left, Region->top);
SrcDelta = Buff->MaxX * 2; SrcDelta = Buff->MaxX * 2;
SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2; SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2;
DestDelta = ConioRectWidth(Region) * 2; DestDelta = ConioRectWidth(Region) * 2;