mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 18:23:21 +00:00
- 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:
parent
027390f247
commit
8054941a9f
6 changed files with 57 additions and 113 deletions
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue