NTSTATUS NTAPI ConDrvSetConsoleCursorPosition(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN PCOORD Position) { SHORT OldCursorX, OldCursorY; if (Console == NULL || Buffer == NULL || Position == NULL) return STATUS_INVALID_PARAMETER; /* Validity check */ ASSERT(Console == Buffer->Header.Console); if ( Position->X < 0 || Position->X >= Buffer->ScreenBufferSize.X || Position->Y < 0 || Position->Y >= Buffer->ScreenBufferSize.Y ) { return STATUS_INVALID_PARAMETER; } OldCursorX = Buffer->CursorPosition.X; OldCursorY = Buffer->CursorPosition.Y; Buffer->CursorPosition = *Position; // Buffer->CursorPosition.X = Position->X; // Buffer->CursorPosition.Y = Position->Y; if ( ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer) && (!ConioSetScreenInfo(Console, (PCONSOLE_SCREEN_BUFFER)Buffer, OldCursorX, OldCursorY)) ) { return STATUS_UNSUCCESSFUL; } return STATUS_SUCCESS; }
static VOID LineInputSetPos(PCSRSS_CONSOLE Console, UINT Pos) { if (Pos != Console->LinePos && Console->Mode & ENABLE_ECHO_INPUT) { PCSRSS_SCREEN_BUFFER Buffer = Console->ActiveBuffer; UINT OldCursorX = Buffer->CurrentX; UINT OldCursorY = Buffer->CurrentY; INT XY = OldCursorY * Buffer->MaxX + OldCursorX; XY += (Pos - Console->LinePos); if (XY < 0) XY = 0; else if (XY >= Buffer->MaxY * Buffer->MaxX) XY = Buffer->MaxY * Buffer->MaxX - 1; Buffer->CurrentX = XY % Buffer->MaxX; Buffer->CurrentY = XY / Buffer->MaxX; ConioSetScreenInfo(Console, Buffer, OldCursorX, OldCursorY); } Console->LinePos = Pos; }
static VOID LineInputSetPos(PCONSOLE Console, UINT Pos) { if (Pos != Console->LinePos && Console->InputBuffer.Mode & ENABLE_ECHO_INPUT) { PCONSOLE_SCREEN_BUFFER Buffer = Console->ActiveBuffer; SHORT OldCursorX = Buffer->CursorPosition.X; SHORT OldCursorY = Buffer->CursorPosition.Y; INT XY = OldCursorY * Buffer->ScreenBufferSize.X + OldCursorX; XY += (Pos - Console->LinePos); if (XY < 0) XY = 0; else if (XY >= Buffer->ScreenBufferSize.Y * Buffer->ScreenBufferSize.X) XY = Buffer->ScreenBufferSize.Y * Buffer->ScreenBufferSize.X - 1; Buffer->CursorPosition.X = XY % Buffer->ScreenBufferSize.X; Buffer->CursorPosition.Y = XY / Buffer->ScreenBufferSize.X; ConioSetScreenInfo(Console, Buffer, OldCursorX, OldCursorY); } Console->LinePos = Pos; }