Fixed bug in lib/kernel32/misc/console.c
[reactos.git] / reactos / lib / kernel32 / misc / console.c
1 #include <windows.h>
2 #include <ddk/ntddk.h>
3
4 HANDLE StdInput = NULL;
5 HANDLE StdOutput = NULL;
6 HANDLE StdError = NULL;
7
8
9
10
11 #define FSCTL_GET_CONSOLE_SCREEN_BUFFER_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 254, DO_DIRECT_IO, FILE_READ_ACCESS|FILE_WRITE_ACCESS)
12 #define FSCTL_SET_CONSOLE_SCREEN_BUFFER_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 255, DO_DIRECT_IO, FILE_READ_ACCESS|FILE_WRITE_ACCESS)
13
14 HANDLE
15 STDCALL
16 GetStdHandle(
17 DWORD nStdHandle
18 )
19 {
20 if ( nStdHandle == STD_INPUT_HANDLE )
21 return StdInput;
22 if ( nStdHandle == STD_OUTPUT_HANDLE )
23 return StdOutput;
24 if ( nStdHandle == STD_ERROR_HANDLE )
25 return StdError;
26 /*
27 if ( nStdHandle == STD_AUX_HANDLE )
28 return StdError;
29 if ( nStdHandle == STD_PRINT_HANDLE )
30 return StdError;
31 */
32 return NULL;
33
34 }
35
36 WINBOOL
37 STDCALL
38 WriteConsoleA(
39 HANDLE hConsoleOutput,
40 CONST VOID *lpBuffer,
41 DWORD nNumberOfCharsToWrite,
42 LPDWORD lpNumberOfCharsWritten,
43 LPVOID lpReserved
44 )
45 {
46 return WriteFile(hConsoleOutput, lpBuffer, nNumberOfCharsToWrite,lpNumberOfCharsWritten, lpReserved);
47 }
48
49
50 WINBOOL
51 STDCALL
52 ReadConsoleA(
53 HANDLE hConsoleInput,
54 LPVOID lpBuffer,
55 DWORD nNumberOfCharsToRead,
56 LPDWORD lpNumberOfCharsRead,
57 LPVOID lpReserved
58 )
59 {
60 KEY_EVENT_RECORD *k;
61 OVERLAPPED Overlapped;
62 OVERLAPPED * lpOverlapped;
63 int kSize;
64 int i,j;
65
66 if ( lpReserved == NULL ) {
67 Overlapped.Internal = 0;
68 Overlapped.InternalHigh = 0;
69 Overlapped.Offset = 0;
70 Overlapped.OffsetHigh = 0;
71 // Overlapped.hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
72 lpOverlapped = &Overlapped;
73 }
74 else
75 lpOverlapped = lpReserved;
76
77
78 kSize = nNumberOfCharsToRead*sizeof(kSize);
79 k = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,kSize);
80 if ( k == NULL || kSize == 0 )
81 return FALSE;
82
83 k[0].AsciiChar = 0;
84 while(k[0].AsciiChar == 0 )
85 {
86 ReadFile(hConsoleInput,k,kSize,lpNumberOfCharsRead,lpOverlapped);
87
88 }
89 j = 0;
90 i = 0;
91 //if ( k[i].bKeyDown )
92 {
93 ((char *)lpBuffer)[j] = k[i].AsciiChar;
94 j++;
95 }
96 i++;
97 while(j < nNumberOfCharsToRead && i < *lpNumberOfCharsRead ) {
98 //if ( k[i].bKeyDown )
99 {
100 ((char *)lpBuffer)[j] = k[i].AsciiChar;
101 j++;
102 }
103 i++;
104 }
105
106 HeapFree(GetProcessHeap(),0,k);
107 //if ( lpReserved == NULL ) {
108 // CloseHandle(Overlapped.hEvent);
109 //}
110
111 }
112
113 WINBOOL
114 STDCALL
115 AllocConsole( VOID )
116 {
117 StdInput = CreateFile("\\Keyboard",
118 FILE_GENERIC_READ,
119 0,
120 NULL,
121 OPEN_EXISTING,
122 FILE_FLAG_OVERLAPPED,
123 NULL);
124
125 StdOutput = CreateFile("\\BlueScreen",
126 FILE_GENERIC_WRITE|FILE_GENERIC_READ,
127 0,
128 NULL,
129 OPEN_EXISTING,
130 0,
131 NULL);
132
133 StdError = StdOutput;
134
135 return TRUE;
136 }
137
138
139 WINBOOL
140 STDCALL
141 FreeConsole( VOID )
142 {
143 CloseHandle(StdInput);
144 CloseHandle(StdOutput);
145 return TRUE;
146 }
147
148
149 WINBOOL
150 STDCALL
151 GetConsoleScreenBufferInfo(
152 HANDLE hConsoleOutput,
153 PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
154 )
155 {
156 DWORD dwBytesReturned;
157 if( !DeviceIoControl(hConsoleOutput,
158 FSCTL_GET_CONSOLE_SCREEN_BUFFER_INFO,
159 NULL,0,
160 lpConsoleScreenBufferInfo,sizeof(CONSOLE_SCREEN_BUFFER_INFO),&dwBytesReturned,NULL ))
161 return FALSE;
162
163 return TRUE;
164 }
165
166 WINBOOL
167 STDCALL
168 SetConsoleCursorPosition(
169 HANDLE hConsoleOutput,
170 COORD dwCursorPosition
171 )
172 {
173 DWORD dwBytesReturned;
174 CONSOLE_SCREEN_BUFFER_INFO ConsoleScreenBufferInfo;
175
176 if( !GetConsoleScreenBufferInfo(hConsoleOutput,&ConsoleScreenBufferInfo) )
177 return FALSE;
178 ConsoleScreenBufferInfo.dwCursorPosition.X = dwCursorPosition.X;
179 ConsoleScreenBufferInfo.dwCursorPosition.Y = dwCursorPosition.Y;
180
181 if( !DeviceIoControl(
182 hConsoleOutput,
183 FSCTL_SET_CONSOLE_SCREEN_BUFFER_INFO,
184 &ConsoleScreenBufferInfo,
185 sizeof(CONSOLE_SCREEN_BUFFER_INFO),
186 NULL,
187 0,
188 &dwBytesReturned,
189 NULL ))
190 return FALSE;
191
192 return TRUE;
193 }
194
195 WINBOOL
196 STDCALL
197 FillConsoleOutputCharacterA(
198 HANDLE hConsoleOutput,
199 CHAR cCharacter,
200 DWORD nLength,
201 COORD dwWriteCoord,
202 LPDWORD lpNumberOfCharsWritten
203 )
204 {
205 return FillConsoleOutputCharacterW(hConsoleOutput,
206 (WCHAR) cCharacter,nLength, dwWriteCoord,lpNumberOfCharsWritten);
207 }
208
209 WINBOOL
210 STDCALL
211 FillConsoleOutputCharacterW(
212 HANDLE hConsoleOutput,
213 WCHAR cCharacter,
214 DWORD nLength,
215 COORD dwWriteCoord,
216 LPDWORD lpNumberOfCharsWritten
217 )
218 {
219
220 return FALSE;
221 }