ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

console.c
Go to the documentation of this file.
00001 /*
00002  *  ReactOS kernel
00003  *  Copyright (C) 2002 ReactOS Team
00004  *
00005  *  This program is free software; you can redistribute it and/or modify
00006  *  it under the terms of the GNU General Public License as published by
00007  *  the Free Software Foundation; either version 2 of the License, or
00008  *  (at your option) any later version.
00009  *
00010  *  This program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  *  GNU General Public License for more details.
00014  *
00015  *  You should have received a copy of the GNU General Public License along
00016  *  with this program; if not, write to the Free Software Foundation, Inc.,
00017  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
00018  */
00019 /*
00020  * COPYRIGHT:       See COPYING in the top level directory
00021  * PROJECT:         ReactOS text-mode setup
00022  * FILE:            subsys/system/usetup/console.c
00023  * PURPOSE:         Console support functions
00024  * PROGRAMMER:      Eric Kohl
00025  */
00026 
00027 /* INCLUDES ******************************************************************/
00028 
00029 #include "usetup.h"
00030 /* Blue Driver Header */
00031 #include <blue/ntddblue.h>
00032 #include "keytrans.h"
00033 
00034 #define NDEBUG
00035 #include <debug.h>
00036 
00037 /* FUNCTIONS *****************************************************************/
00038 
00039 BOOL WINAPI
00040 AllocConsole(VOID)
00041 {
00042     UNICODE_STRING ScreenName = RTL_CONSTANT_STRING(L"\\??\\BlueScreen");
00043     UNICODE_STRING KeyboardName = RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
00044     OBJECT_ATTRIBUTES ObjectAttributes;
00045     IO_STATUS_BLOCK IoStatusBlock;
00046     NTSTATUS Status;
00047 
00048     /* Open the screen */
00049     InitializeObjectAttributes(
00050         &ObjectAttributes,
00051         &ScreenName,
00052         0,
00053         NULL,
00054         NULL);
00055     Status = NtOpenFile(
00056         &StdOutput,
00057         FILE_ALL_ACCESS,
00058         &ObjectAttributes,
00059         &IoStatusBlock,
00060         FILE_OPEN,
00061         FILE_SYNCHRONOUS_IO_ALERT);
00062     if (!NT_SUCCESS(Status))
00063         return FALSE;
00064 
00065     /* Open the keyboard */
00066     InitializeObjectAttributes(
00067         &ObjectAttributes,
00068         &KeyboardName,
00069         0,
00070         NULL,
00071         NULL);
00072     Status = NtOpenFile(
00073         &StdInput,
00074         FILE_ALL_ACCESS,
00075         &ObjectAttributes,
00076         &IoStatusBlock,
00077         FILE_OPEN,
00078         0);
00079     if (!NT_SUCCESS(Status))
00080         return FALSE;
00081 
00082     return TRUE;
00083 }
00084 
00085 BOOL WINAPI
00086 AttachConsole(
00087     IN DWORD dwProcessId)
00088 {
00089     return FALSE;
00090 }
00091 
00092 BOOL WINAPI
00093 FreeConsole(VOID)
00094 {
00095     if (StdInput != INVALID_HANDLE_VALUE)
00096         NtClose(StdInput);
00097 
00098     if (StdOutput != INVALID_HANDLE_VALUE)
00099         NtClose(StdOutput);
00100 
00101     return TRUE;
00102 }
00103 
00104 BOOL WINAPI
00105 WriteConsole(
00106     IN HANDLE hConsoleOutput,
00107     IN const VOID* lpBuffer,
00108     IN DWORD nNumberOfCharsToWrite,
00109     OUT LPDWORD lpNumberOfCharsWritten,
00110     IN LPVOID lpReserved)
00111 {
00112     IO_STATUS_BLOCK IoStatusBlock;
00113     NTSTATUS Status;
00114 
00115     Status = NtWriteFile(
00116         hConsoleOutput,
00117         NULL,
00118         NULL,
00119         NULL,
00120         &IoStatusBlock,
00121         (PVOID)lpBuffer,
00122         nNumberOfCharsToWrite,
00123         NULL,
00124         NULL);
00125     if (!NT_SUCCESS(Status))
00126         return FALSE;
00127 
00128     *lpNumberOfCharsWritten = IoStatusBlock.Information;
00129     return TRUE;
00130 }
00131 
00132 HANDLE WINAPI
00133 GetStdHandle(
00134     IN DWORD nStdHandle)
00135 {
00136     switch (nStdHandle)
00137     {
00138         case STD_INPUT_HANDLE:
00139             return StdInput;
00140         case STD_OUTPUT_HANDLE:
00141             return StdOutput;
00142         default:
00143             return INVALID_HANDLE_VALUE;
00144     }
00145 }
00146 
00147 BOOL WINAPI
00148 FlushConsoleInputBuffer(
00149     IN HANDLE hConsoleInput)
00150 {
00151     LARGE_INTEGER Offset, Timeout;
00152     IO_STATUS_BLOCK IoStatusBlock;
00153     KEYBOARD_INPUT_DATA InputData;
00154     NTSTATUS Status;
00155 
00156     do
00157     {
00158         Offset.QuadPart = 0;
00159         Status = NtReadFile(
00160             hConsoleInput,
00161             NULL,
00162             NULL,
00163             NULL,
00164             &IoStatusBlock,
00165             &InputData,
00166             sizeof(KEYBOARD_INPUT_DATA),
00167             &Offset,
00168             0);
00169         if (Status == STATUS_PENDING)
00170         {
00171             Timeout.QuadPart = -100;
00172             Status = NtWaitForSingleObject(hConsoleInput, FALSE, &Timeout);
00173             if (Status == STATUS_TIMEOUT)
00174             {
00175                 NtCancelIoFile(hConsoleInput, &IoStatusBlock);
00176                 return TRUE;
00177             }
00178         }
00179     } while (NT_SUCCESS(Status));
00180     return FALSE;
00181 }
00182 
00183 BOOL WINAPI
00184 ReadConsoleInput(
00185     IN HANDLE hConsoleInput,
00186     OUT PINPUT_RECORD lpBuffer,
00187     IN DWORD nLength,
00188     OUT LPDWORD lpNumberOfEventsRead)
00189 {
00190     LARGE_INTEGER Offset;
00191     IO_STATUS_BLOCK IoStatusBlock;
00192     KEYBOARD_INPUT_DATA InputData;
00193     NTSTATUS Status;
00194 
00195     Offset.QuadPart = 0;
00196     Status = NtReadFile(
00197         hConsoleInput,
00198         NULL,
00199         NULL,
00200         NULL,
00201         &IoStatusBlock,
00202         &InputData,
00203         sizeof(KEYBOARD_INPUT_DATA),
00204         &Offset,
00205         0);
00206     if (Status == STATUS_PENDING)
00207     {
00208         Status = NtWaitForSingleObject(hConsoleInput, FALSE, NULL);
00209         Status = IoStatusBlock.Status;
00210     }
00211     if (!NT_SUCCESS(Status))
00212         return FALSE;
00213 
00214     lpBuffer->EventType = KEY_EVENT;
00215     Status = IntTranslateKey(&InputData, &lpBuffer->Event.KeyEvent);
00216     if (!NT_SUCCESS(Status))
00217         return FALSE;
00218 
00219     *lpNumberOfEventsRead = 1;
00220     return TRUE;
00221 }
00222 
00223 BOOL WINAPI
00224 WriteConsoleOutputCharacterA(
00225     HANDLE hConsoleOutput,
00226     IN LPCSTR lpCharacter,
00227     IN DWORD nLength,
00228     IN COORD dwWriteCoord,
00229     OUT LPDWORD lpNumberOfCharsWritten)
00230 {
00231     IO_STATUS_BLOCK IoStatusBlock;
00232     PCHAR Buffer;
00233     COORD *pCoord;
00234     PCHAR pText;
00235     NTSTATUS Status;
00236 
00237     Buffer = (CHAR*) RtlAllocateHeap(
00238         ProcessHeap,
00239         0,
00240         nLength + sizeof(COORD));
00241     pCoord = (COORD *)Buffer;
00242     pText = (PCHAR)(pCoord + 1);
00243 
00244     *pCoord = dwWriteCoord;
00245     memcpy(pText, lpCharacter, nLength);
00246 
00247     Status = NtDeviceIoControlFile(
00248         hConsoleOutput,
00249         NULL,
00250         NULL,
00251         NULL,
00252         &IoStatusBlock,
00253         IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
00254         NULL,
00255         0,
00256         Buffer,
00257         nLength + sizeof(COORD));
00258 
00259     RtlFreeHeap(
00260         ProcessHeap,
00261         0,
00262         Buffer);
00263     if (!NT_SUCCESS(Status))
00264         return FALSE;
00265 
00266     *lpNumberOfCharsWritten = IoStatusBlock.Information;
00267     return TRUE;
00268 }
00269 
00270 BOOL WINAPI
00271 WriteConsoleOutputCharacterW(
00272     HANDLE hConsoleOutput,
00273     IN LPCWSTR lpCharacter,
00274     IN DWORD nLength,
00275     IN COORD dwWriteCoord,
00276     OUT LPDWORD lpNumberOfCharsWritten)
00277 {
00278     IO_STATUS_BLOCK IoStatusBlock;
00279     PCHAR Buffer;
00280     COORD *pCoord;
00281     PCHAR pText;
00282     NTSTATUS Status;
00283     ULONG i;
00284 
00285     Buffer = (CHAR*) RtlAllocateHeap(
00286         ProcessHeap,
00287         0,
00288         nLength + sizeof(COORD));
00289     pCoord = (COORD *)Buffer;
00290     pText = (PCHAR)(pCoord + 1);
00291 
00292     *pCoord = dwWriteCoord;
00293 
00294     /* FIXME: use real unicode->oem conversion */
00295     for (i = 0; i < nLength; i++)
00296         pText[i] = (CHAR)lpCharacter[i];
00297 
00298     Status = NtDeviceIoControlFile(
00299         hConsoleOutput,
00300         NULL,
00301         NULL,
00302         NULL,
00303         &IoStatusBlock,
00304         IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
00305         NULL,
00306         0,
00307         Buffer,
00308         nLength + sizeof(COORD));
00309 
00310     RtlFreeHeap(
00311         ProcessHeap,
00312         0,
00313         Buffer);
00314     if (!NT_SUCCESS(Status))
00315         return FALSE;
00316 
00317     *lpNumberOfCharsWritten = IoStatusBlock.Information;
00318     return TRUE;
00319 }
00320 
00321 BOOL WINAPI
00322 FillConsoleOutputAttribute(
00323     IN HANDLE hConsoleOutput,
00324     IN WORD wAttribute,
00325     IN DWORD nLength,
00326     IN COORD dwWriteCoord,
00327     OUT LPDWORD lpNumberOfAttrsWritten)
00328 {
00329     IO_STATUS_BLOCK IoStatusBlock;
00330     OUTPUT_ATTRIBUTE Buffer;
00331     NTSTATUS Status;
00332 
00333     Buffer.wAttribute = wAttribute;
00334     Buffer.nLength    = nLength;
00335     Buffer.dwCoord    = dwWriteCoord;
00336 
00337     Status = NtDeviceIoControlFile(
00338         hConsoleOutput,
00339         NULL,
00340         NULL,
00341         NULL,
00342         &IoStatusBlock,
00343         IOCTL_CONSOLE_FILL_OUTPUT_ATTRIBUTE,
00344         &Buffer,
00345         sizeof(OUTPUT_ATTRIBUTE),
00346         &Buffer,
00347         sizeof(OUTPUT_ATTRIBUTE));
00348 
00349     if (!NT_SUCCESS(Status))
00350         return FALSE;
00351 
00352     *lpNumberOfAttrsWritten = Buffer.dwTransfered;
00353     return TRUE;
00354 }
00355 
00356 BOOL WINAPI
00357 FillConsoleOutputCharacterA(
00358     IN HANDLE hConsoleOutput,
00359     IN CHAR cCharacter,
00360     IN DWORD nLength,
00361     IN COORD dwWriteCoord,
00362     OUT LPDWORD lpNumberOfCharsWritten)
00363 {
00364     IO_STATUS_BLOCK IoStatusBlock;
00365     OUTPUT_CHARACTER Buffer;
00366     NTSTATUS Status;
00367 
00368     Buffer.cCharacter = cCharacter;
00369     Buffer.nLength = nLength;
00370     Buffer.dwCoord = dwWriteCoord;
00371 
00372     Status = NtDeviceIoControlFile(
00373         hConsoleOutput,
00374         NULL,
00375         NULL,
00376         NULL,
00377         &IoStatusBlock,
00378         IOCTL_CONSOLE_FILL_OUTPUT_CHARACTER,
00379         &Buffer,
00380         sizeof(OUTPUT_CHARACTER),
00381         &Buffer,
00382         sizeof(OUTPUT_CHARACTER));
00383     if (!NT_SUCCESS(Status))
00384         return FALSE;
00385 
00386     *lpNumberOfCharsWritten = Buffer.dwTransfered;
00387     return TRUE;
00388 }
00389 
00390 BOOL WINAPI
00391 GetConsoleScreenBufferInfo(
00392     IN HANDLE hConsoleOutput,
00393     OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
00394 {
00395     IO_STATUS_BLOCK IoStatusBlock;
00396     NTSTATUS Status;
00397 
00398     Status = NtDeviceIoControlFile(
00399         hConsoleOutput,
00400         NULL,
00401         NULL,
00402         NULL,
00403         &IoStatusBlock,
00404         IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO,
00405         NULL,
00406         0,
00407         lpConsoleScreenBufferInfo,
00408         sizeof(CONSOLE_SCREEN_BUFFER_INFO));
00409     return NT_SUCCESS(Status);
00410 }
00411 
00412 BOOL WINAPI
00413 SetConsoleCursorInfo(
00414     IN HANDLE hConsoleOutput,
00415     IN const CONSOLE_CURSOR_INFO* lpConsoleCursorInfo)
00416 {
00417     IO_STATUS_BLOCK IoStatusBlock;
00418     NTSTATUS Status;
00419 
00420     Status = NtDeviceIoControlFile(
00421         hConsoleOutput,
00422         NULL,
00423         NULL,
00424         NULL,
00425         &IoStatusBlock,
00426         IOCTL_CONSOLE_SET_CURSOR_INFO,
00427         (PCONSOLE_CURSOR_INFO)lpConsoleCursorInfo,
00428         sizeof(CONSOLE_CURSOR_INFO),
00429         NULL,
00430         0);
00431     return NT_SUCCESS(Status);
00432 }
00433 
00434 BOOL WINAPI
00435 SetConsoleCursorPosition(
00436     IN HANDLE hConsoleOutput,
00437     IN COORD dwCursorPosition)
00438 {
00439     CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
00440     IO_STATUS_BLOCK IoStatusBlock;
00441     NTSTATUS Status;
00442 
00443     Status = GetConsoleScreenBufferInfo(hConsoleOutput, &ConsoleScreenBufferInfo);
00444     if (!NT_SUCCESS(Status))
00445         return FALSE;
00446 
00447     ConsoleScreenBufferInfo.dwCursorPosition.X = dwCursorPosition.X;
00448     ConsoleScreenBufferInfo.dwCursorPosition.Y = dwCursorPosition.Y;
00449 
00450     Status = NtDeviceIoControlFile(
00451         hConsoleOutput,
00452         NULL,
00453         NULL,
00454         NULL,
00455         &IoStatusBlock,
00456         IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO,
00457         &ConsoleScreenBufferInfo,
00458         sizeof(CONSOLE_SCREEN_BUFFER_INFO),
00459         NULL,
00460         0);
00461 
00462     return NT_SUCCESS(Status);
00463 }
00464 
00465 BOOL WINAPI
00466 SetConsoleTextAttribute(
00467     IN HANDLE hConsoleOutput,
00468     IN WORD wAttributes)
00469 {
00470     IO_STATUS_BLOCK IoStatusBlock;
00471     NTSTATUS Status;
00472 
00473     Status = NtDeviceIoControlFile(
00474         hConsoleOutput,
00475         NULL,
00476         NULL,
00477         NULL,
00478         &IoStatusBlock,
00479         IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE,
00480         &wAttributes,
00481         sizeof(USHORT),
00482         NULL,
00483         0);
00484     return NT_SUCCESS(Status);
00485 }
00486 
00487 BOOL WINAPI
00488 SetConsoleOutputCP(
00489     IN UINT wCodepage)
00490 {
00491     HANDLE hConsoleOutput;
00492     IO_STATUS_BLOCK IoStatusBlock;
00493     NTSTATUS Status;
00494 
00495     hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
00496 
00497     Status = NtDeviceIoControlFile(
00498         hConsoleOutput,
00499         NULL,
00500         NULL,
00501         NULL,
00502         &IoStatusBlock,
00503         IOCTL_CONSOLE_LOADFONT,
00504         &wCodepage,
00505         sizeof(ULONG),
00506         NULL,
00507         0);
00508     return NT_SUCCESS(Status);
00509 }
00510 
00511 
00512 /* EOF */

Generated on Sun May 27 2012 04:16:55 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.