Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenconsole.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
1.7.6.1
|