console.c
来自「一个类似windows」· C语言 代码 · 共 1,044 行 · 第 1/2 页
C
1,044 行
/*
* ReactOS kernel
* Copyright (C) 2002 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS text-mode setup
* FILE: subsys/system/usetup/console.c
* PURPOSE: Console support functions
* PROGRAMMER: Eric Kohl
*/
/* INCLUDES ******************************************************************/
#include <usetup.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS ******************************************************************/
static HANDLE StdInput = INVALID_HANDLE_VALUE;
static HANDLE StdOutput = INVALID_HANDLE_VALUE;
static SHORT xScreen = 0;
static SHORT yScreen = 0;
NTSTATUS
ConGetConsoleScreenBufferInfo(PCONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo);
/* FUNCTIONS *****************************************************************/
NTSTATUS
ConAllocConsole(VOID)
{
UNICODE_STRING ScreenName = RTL_CONSTANT_STRING(L"\\??\\BlueScreen");
UNICODE_STRING KeyboardName = RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status;
CONSOLE_SCREEN_BUFFER_INFO csbi;
/* Open the screen */
InitializeObjectAttributes(&ObjectAttributes,
&ScreenName,
0,
NULL,
NULL);
Status = NtOpenFile (&StdOutput,
FILE_ALL_ACCESS,
&ObjectAttributes,
&IoStatusBlock,
0,
FILE_SYNCHRONOUS_IO_ALERT);
if (!NT_SUCCESS(Status))
return(Status);
/* Open the keyboard */
InitializeObjectAttributes(&ObjectAttributes,
&KeyboardName,
0,
NULL,
NULL);
Status = NtOpenFile (&StdInput,
FILE_ALL_ACCESS,
&ObjectAttributes,
&IoStatusBlock,
0,
FILE_SYNCHRONOUS_IO_ALERT);
if (!NT_SUCCESS(Status))
return(Status);
ConGetConsoleScreenBufferInfo(&csbi);
xScreen = csbi.dwSize.X;
yScreen = csbi.dwSize.Y;
return(Status);
}
VOID
ConFreeConsole(VOID)
{
DPRINT("FreeConsole() called\n");
if (StdInput != INVALID_HANDLE_VALUE)
NtClose(StdInput);
if (StdOutput != INVALID_HANDLE_VALUE)
NtClose(StdOutput);
DPRINT("FreeConsole() done\n");
}
NTSTATUS
ConWriteConsole(PCHAR Buffer,
ULONG NumberOfCharsToWrite,
PULONG NumberOfCharsWritten)
{
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS Status = STATUS_SUCCESS;
Status = NtWriteFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
Buffer,
NumberOfCharsToWrite,
NULL,
NULL);
if (NT_SUCCESS(Status) && NumberOfCharsWritten != NULL)
{
*NumberOfCharsWritten = IoStatusBlock.Information;
}
return(Status);
}
#if 0
/*--------------------------------------------------------------
* ReadConsoleA
*/
BOOL
STDCALL
ReadConsoleA(HANDLE hConsoleInput,
LPVOID lpBuffer,
DWORD nNumberOfCharsToRead,
LPDWORD lpNumberOfCharsRead,
LPVOID lpReserved)
{
KEY_EVENT_RECORD KeyEventRecord;
BOOL stat = TRUE;
PCHAR Buffer = (PCHAR)lpBuffer;
DWORD Result;
int i;
for (i=0; (stat && i<nNumberOfCharsToRead);)
{
stat = ReadFile(hConsoleInput,
&KeyEventRecord,
sizeof(KEY_EVENT_RECORD),
&Result,
NULL);
if (stat && KeyEventRecord.bKeyDown && KeyEventRecord.uChar.AsciiChar != 0)
{
Buffer[i] = KeyEventRecord.uChar.AsciiChar;
i++;
}
}
if (lpNumberOfCharsRead != NULL)
{
*lpNumberOfCharsRead = i;
}
return(stat);
}
#endif
NTSTATUS
ConReadConsoleInput(PINPUT_RECORD Buffer)
{
IO_STATUS_BLOCK Iosb;
NTSTATUS Status;
KEYBOARD_INPUT_DATA InputData;
Buffer->EventType = KEY_EVENT;
Status = NtReadFile(StdInput,
NULL,
NULL,
NULL,
&Iosb,
&InputData,
sizeof(KEYBOARD_INPUT_DATA),
NULL,
0);
if (NT_SUCCESS(Status))
{
Status = IntTranslateKey(&InputData, &Buffer->Event.KeyEvent);
}
return(Status);
}
NTSTATUS
ConReadConsoleOutputCharacters(LPSTR lpCharacter,
ULONG nLength,
COORD dwReadCoord,
PULONG lpNumberOfCharsRead)
{
IO_STATUS_BLOCK IoStatusBlock;
OUTPUT_CHARACTER Buffer;
NTSTATUS Status;
Buffer.dwCoord = dwReadCoord;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_READ_OUTPUT_CHARACTER,
&Buffer,
sizeof(OUTPUT_CHARACTER),
(PVOID)lpCharacter,
nLength);
if (NT_SUCCESS(Status) && lpNumberOfCharsRead != NULL)
{
*lpNumberOfCharsRead = Buffer.dwTransfered;
}
return(Status);
}
NTSTATUS
ConReadConsoleOutputAttributes(PUSHORT lpAttribute,
ULONG nLength,
COORD dwReadCoord,
PULONG lpNumberOfAttrsRead)
{
IO_STATUS_BLOCK IoStatusBlock;
OUTPUT_ATTRIBUTE Buffer;
NTSTATUS Status;
Buffer.dwCoord = dwReadCoord;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_READ_OUTPUT_ATTRIBUTE,
&Buffer,
sizeof(OUTPUT_ATTRIBUTE),
(PVOID)lpAttribute,
nLength);
if (NT_SUCCESS(Status) && lpNumberOfAttrsRead != NULL)
{
*lpNumberOfAttrsRead = Buffer.dwTransfered;
}
return(Status);
}
NTSTATUS
ConWriteConsoleOutputCharacters(LPCSTR lpCharacter,
ULONG nLength,
COORD dwWriteCoord)
{
IO_STATUS_BLOCK IoStatusBlock;
PCHAR Buffer;
COORD *pCoord;
PCHAR pText;
NTSTATUS Status;
Buffer = RtlAllocateHeap(ProcessHeap,
0,
nLength + sizeof(COORD));
pCoord = (COORD *)Buffer;
pText = (PCHAR)(pCoord + 1);
*pCoord = dwWriteCoord;
memcpy(pText, lpCharacter, nLength);
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
NULL,
0,
Buffer,
nLength + sizeof(COORD));
RtlFreeHeap(ProcessHeap,
0,
Buffer);
return(Status);
}
NTSTATUS
ConWriteConsoleOutputCharactersW(LPCWSTR lpCharacter,
ULONG nLength,
COORD dwWriteCoord)
{
IO_STATUS_BLOCK IoStatusBlock;
PCHAR Buffer;
COORD *pCoord;
PCHAR pText;
NTSTATUS Status;
ULONG i;
Buffer = RtlAllocateHeap(ProcessHeap,
0,
nLength + sizeof(COORD));
pCoord = (COORD *)Buffer;
pText = (PCHAR)(pCoord + 1);
*pCoord = dwWriteCoord;
/* FIXME: use real unicode->oem conversion */
for (i = 0; i < nLength; i++)
pText[i] = (CHAR)lpCharacter[i];
pText[i] = 0;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
NULL,
0,
Buffer,
nLength + sizeof(COORD));
RtlFreeHeap(ProcessHeap,
0,
Buffer);
return(Status);
}
NTSTATUS
ConWriteConsoleOutputAttributes(CONST USHORT *lpAttribute,
ULONG nLength,
COORD dwWriteCoord,
PULONG lpNumberOfAttrsWritten)
{
IO_STATUS_BLOCK IoStatusBlock;
PUSHORT Buffer;
COORD *pCoord;
PUSHORT pAttrib;
NTSTATUS Status;
Buffer = RtlAllocateHeap(ProcessHeap,
0,
nLength * sizeof(USHORT) + sizeof(COORD));
pCoord = (COORD *)Buffer;
pAttrib = (PUSHORT)(pCoord + 1);
*pCoord = dwWriteCoord;
memcpy(pAttrib, lpAttribute, nLength * sizeof(USHORT));
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_WRITE_OUTPUT_ATTRIBUTE,
NULL,
0,
Buffer,
nLength * sizeof(USHORT) + sizeof(COORD));
RtlFreeHeap(ProcessHeap,
0,
Buffer);
return(Status);
}
NTSTATUS
ConFillConsoleOutputAttribute(USHORT wAttribute,
ULONG nLength,
COORD dwWriteCoord,
PULONG lpNumberOfAttrsWritten)
{
IO_STATUS_BLOCK IoStatusBlock;
OUTPUT_ATTRIBUTE Buffer;
NTSTATUS Status;
Buffer.wAttribute = wAttribute;
Buffer.nLength = nLength;
Buffer.dwCoord = dwWriteCoord;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE,
&Buffer,
sizeof(OUTPUT_ATTRIBUTE),
&Buffer,
sizeof(OUTPUT_ATTRIBUTE));
if (NT_SUCCESS(Status))
{
*lpNumberOfAttrsWritten = Buffer.dwTransfered;
}
return(Status);
}
NTSTATUS
ConFillConsoleOutputCharacter(CHAR Character,
ULONG Length,
COORD WriteCoord,
PULONG NumberOfCharsWritten)
{
IO_STATUS_BLOCK IoStatusBlock;
OUTPUT_CHARACTER Buffer;
NTSTATUS Status;
Buffer.cCharacter = Character;
Buffer.nLength = Length;
Buffer.dwCoord = WriteCoord;
Status = NtDeviceIoControlFile(StdOutput,
NULL,
NULL,
NULL,
&IoStatusBlock,
IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER,
&Buffer,
sizeof(OUTPUT_CHARACTER),
&Buffer,
sizeof(OUTPUT_CHARACTER));
if (NT_SUCCESS(Status))
{
*NumberOfCharsWritten = Buffer.dwTransfered;
}
return(Status);
}
#if 0
/*--------------------------------------------------------------
* GetConsoleMode
*/
WINBASEAPI
BOOL
WINAPI
GetConsoleMode(
HANDLE hConsoleHandle,
LPDWORD lpMode
)
{
CONSOLE_MODE Buffer;
DWORD dwBytesReturned;
if (DeviceIoControl (hConsoleHandle,
IOCTL_CONSOLE_GET_MODE,
NULL,
0,
&Buffer,
sizeof(CONSOLE_MODE),
&dwBytesReturned,
NULL))
{
*lpMode = Buffer.dwMode;
SetLastError (ERROR_SUCCESS);
return TRUE;
}
SetLastError(0); /* FIXME: What error code? */
return FALSE;
}
/*--------------------------------------------------------------
* GetConsoleCursorInfo
*/
WINBASEAPI
BOOL
WINAPI
GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
)
{
DWORD dwBytesReturned;
if (DeviceIoControl (hConsoleOutput,
IOCTL_CONSOLE_GET_CURSOR_INFO,
NULL,
0,
lpConsoleCursorInfo,
sizeof(CONSOLE_CURSOR_INFO),
&dwBytesReturned,
NULL))
return TRUE;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?