ReactOS  0.4.14-dev-98-gb0d4763
history.c
Go to the documentation of this file.
1 /*
2  * LICENSE: GPL - See COPYING in the top level directory
3  * PROJECT: ReactOS Console Server DLL
4  * FILE: win32ss/user/winsrv/consrv/history.c
5  * PURPOSE: Console line input functions
6  * PROGRAMMERS: Jeffrey Morlan
7  */
8 
9 /* INCLUDES *******************************************************************/
10 
11 #include "consrv.h"
12 #include "popup.h"
13 
14 #define NDEBUG
15 #include <debug.h>
16 
17 typedef struct _HISTORY_BUFFER
18 {
26 
27 
28 BOOLEAN
30  PVOID Source,
31  USHORT SourceLength,
32  // BOOLEAN IsUnicode,
33  PWCHAR* Target,
34  PUSHORT TargetLength);
35 BOOLEAN
37  PVOID Source,
38  USHORT SourceLength,
39  // BOOLEAN IsAnsi,
40  PCHAR/* * */ Target,
41  /*P*/USHORT TargetLength);
42 
43 
44 /* PRIVATE FUNCTIONS **********************************************************/
45 
46 static PHISTORY_BUFFER
48  PUNICODE_STRING ExeName)
49 {
50  PLIST_ENTRY Entry = Console->HistoryBuffers.Flink;
51  PHISTORY_BUFFER Hist;
52 
53  for (; Entry != &Console->HistoryBuffers; Entry = Entry->Flink)
54  {
55  Hist = CONTAINING_RECORD(Entry, HISTORY_BUFFER, ListEntry);
56  if (RtlEqualUnicodeString(ExeName, &Hist->ExeName, FALSE))
57  return Hist;
58  }
59 
60  /* Couldn't find the buffer, create a new one */
61  Hist = ConsoleAllocHeap(0, sizeof(HISTORY_BUFFER) + ExeName->Length);
62  if (!Hist) return NULL;
63  Hist->MaxEntries = Console->HistoryBufferSize;
64  Hist->NumEntries = 0;
65  Hist->Entries = ConsoleAllocHeap(0, Hist->MaxEntries * sizeof(UNICODE_STRING));
66  if (!Hist->Entries)
67  {
68  ConsoleFreeHeap(Hist);
69  return NULL;
70  }
71  Hist->ExeName.Length = Hist->ExeName.MaximumLength = ExeName->Length;
72  Hist->ExeName.Buffer = (PWCHAR)(Hist + 1);
73  memcpy(Hist->ExeName.Buffer, ExeName->Buffer, ExeName->Length);
74  InsertHeadList(&Console->HistoryBuffers, &Hist->ListEntry);
75  return Hist;
76 }
77 
78 static PHISTORY_BUFFER
80  PVOID ExeName,
81  USHORT ExeLength,
82  BOOLEAN UnicodeExe)
83 {
84  UNICODE_STRING ExeNameU;
85 
87  PHISTORY_BUFFER Hist = NULL;
88 
89  if (ExeName == NULL) return NULL;
90 
91  if (UnicodeExe)
92  {
93  ExeNameU.Buffer = ExeName;
94  /* Length is in bytes */
95  ExeNameU.MaximumLength = ExeLength;
96  }
97  else
98  {
100  ExeName, ExeLength,
101  &ExeNameU.Buffer, &ExeNameU.MaximumLength))
102  {
103  return NULL;
104  }
105  }
106  ExeNameU.Length = ExeNameU.MaximumLength;
107 
108  Entry = Console->HistoryBuffers.Flink;
109  while (Entry != &Console->HistoryBuffers)
110  {
111  Hist = CONTAINING_RECORD(Entry, HISTORY_BUFFER, ListEntry);
112 
113  /* For the history APIs, the caller is allowed to give only part of the name */
114  if (RtlPrefixUnicodeString(&ExeNameU, &Hist->ExeName, TRUE))
115  {
116  if (!UnicodeExe) ConsoleFreeHeap(ExeNameU.Buffer);
117  return Hist;
118  }
119 
120  Entry = Entry->Flink;
121  }
122 
123  if (!UnicodeExe) ConsoleFreeHeap(ExeNameU.Buffer);
124  return NULL;
125 }
126 
127 static VOID
129 {
130  if (!Hist) return;
131 
132  while (Hist->NumEntries != 0)
133  RtlFreeUnicodeString(&Hist->Entries[--Hist->NumEntries]);
134 
135  ConsoleFreeHeap(Hist->Entries);
136  RemoveEntryList(&Hist->ListEntry);
137  ConsoleFreeHeap(Hist);
138 }
139 
140 VOID
142  PUNICODE_STRING ExeName,
144 {
145  // UNICODE_STRING NewEntry;
147 
148  if (!Hist) return;
149 
150  // NewEntry.Length = NewEntry.MaximumLength = Console->LineSize * sizeof(WCHAR);
151  // NewEntry.Buffer = Console->LineBuffer;
152 
153  /* Don't add blank or duplicate entries */
154  if (Entry->Length == 0 || Hist->MaxEntries == 0 ||
155  (Hist->NumEntries > 0 &&
156  RtlEqualUnicodeString(&Hist->Entries[Hist->NumEntries - 1], Entry, FALSE)))
157  {
158  return;
159  }
160 
161  if (Console->HistoryNoDup)
162  {
163  INT i;
164 
165  /* Check if this line has been entered before */
166  for (i = Hist->NumEntries - 1; i >= 0; i--)
167  {
168  if (RtlEqualUnicodeString(&Hist->Entries[i], Entry, FALSE))
169  {
170  UNICODE_STRING NewEntry;
171 
172  /* Just rotate the list to bring this entry to the end */
173  NewEntry = Hist->Entries[i];
174  memmove(&Hist->Entries[i], &Hist->Entries[i + 1],
175  (Hist->NumEntries - (i + 1)) * sizeof(UNICODE_STRING));
176  Hist->Entries[Hist->NumEntries - 1] = NewEntry;
177  Hist->Position = Hist->NumEntries - 1;
178  return;
179  }
180  }
181  }
182 
183  if (Hist->NumEntries == Hist->MaxEntries)
184  {
185  /* List is full, remove oldest entry */
186  RtlFreeUnicodeString(&Hist->Entries[0]);
187  memmove(&Hist->Entries[0], &Hist->Entries[1],
188  --Hist->NumEntries * sizeof(UNICODE_STRING));
189  }
190 
192  Hist->NumEntries++;
193  Hist->Position = Hist->NumEntries - 1;
194 }
195 
196 VOID
198  PUNICODE_STRING ExeName,
200 {
202 
203  if (!Hist || Hist->NumEntries == 0)
204  Entry->Length = 0;
205  else
206  *Entry = Hist->Entries[Hist->Position];
207 }
208 
209 BOOL
211  PUNICODE_STRING ExeName,
212  INT Offset,
214 {
216  ULONG Position = 0;
217 
218  if (!Hist || Hist->NumEntries == 0) return FALSE;
219 
220  Position = Hist->Position + Offset;
221  Position = min(max(Position, 0), Hist->NumEntries - 1);
222  Hist->Position = Position;
223 
224  *Entry = Hist->Entries[Hist->Position];
225  return TRUE;
226 }
227 
228 BOOL
230  PUNICODE_STRING ExeName,
233 {
234  INT HistPos;
235 
236  /* Search for history entries starting with input. */
238  if (!Hist || Hist->NumEntries == 0) return FALSE;
239 
240  /*
241  * Like Up/F5, on first time start from current (usually last) entry,
242  * but on subsequent times start at previous entry.
243  */
244  if (Console->LineUpPressed)
245  Hist->Position = (Hist->Position ? Hist->Position : Hist->NumEntries) - 1;
246  Console->LineUpPressed = TRUE;
247 
248  // Entry.Length = Console->LinePos * sizeof(WCHAR); // == Pos * sizeof(WCHAR)
249  // Entry.Buffer = Console->LineBuffer;
250 
251  /*
252  * Keep going backwards, even wrapping around to the end,
253  * until we get back to starting point.
254  */
255  HistPos = Hist->Position;
256  do
257  {
258  if (RtlPrefixUnicodeString(Prefix, &Hist->Entries[HistPos], FALSE))
259  {
260  Hist->Position = HistPos;
261  *Entry = Hist->Entries[HistPos];
262  return TRUE;
263  }
264  if (--HistPos < 0) HistPos += Hist->NumEntries;
265  } while (HistPos != Hist->Position);
266 
267  return FALSE;
268 }
269 
272  PUNICODE_STRING ExeName)
273 {
274  PCONSOLE_SCREEN_BUFFER ActiveBuffer;
276 
277  SHORT xLeft, yTop;
278  SHORT Width, Height;
279 
281 
282  if (!Hist) return NULL;
283  if (Hist->NumEntries == 0) return NULL;
284 
285  if (GetType(Console->ActiveBuffer) != TEXTMODE_BUFFER) return NULL;
286  ActiveBuffer = Console->ActiveBuffer;
287 
288  Width = 40;
289  Height = 10;
290 
291  /* Center the popup window on the screen */
292  xLeft = ActiveBuffer->ViewOrigin.X + (ActiveBuffer->ViewSize.X - Width ) / 2;
293  yTop = ActiveBuffer->ViewOrigin.Y + (ActiveBuffer->ViewSize.Y - Height) / 2;
294 
295  /* Create the popup */
296  Popup = CreatePopupWindow(Console, ActiveBuffer,
297  xLeft, yTop, Width, Height);
298  if (Popup == NULL) return NULL;
299 
300  Popup->PopupInputRoutine = NULL;
301 
302  return Popup;
303 }
304 
305 VOID
307  PUNICODE_STRING ExeName)
308 {
310 }
311 
312 VOID
314 {
315  PLIST_ENTRY CurrentEntry;
316  PHISTORY_BUFFER HistoryBuffer;
317 
318  while (!IsListEmpty(&Console->HistoryBuffers))
319  {
320  CurrentEntry = RemoveHeadList(&Console->HistoryBuffers);
321  HistoryBuffer = CONTAINING_RECORD(CurrentEntry, HISTORY_BUFFER, ListEntry);
322  HistoryDeleteBuffer(HistoryBuffer);
323  }
324 }
325 
326 
327 /* PUBLIC SERVER APIS *********************************************************/
328 
329 CSR_API(SrvGetConsoleCommandHistory)
330 {
332  PCONSOLE_GETCOMMANDHISTORY GetCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryRequest;
334  ULONG BytesWritten = 0;
335  PHISTORY_BUFFER Hist;
336 
337  DPRINT1("SrvGetConsoleCommandHistory entered\n");
338 
339  if ( !CsrValidateMessageBuffer(ApiMessage,
340  (PVOID*)&GetCommandHistoryRequest->History,
341  GetCommandHistoryRequest->HistoryLength,
342  sizeof(BYTE)) ||
343  !CsrValidateMessageBuffer(ApiMessage,
344  (PVOID*)&GetCommandHistoryRequest->ExeName,
345  GetCommandHistoryRequest->ExeLength,
346  sizeof(BYTE)) )
347  {
349  }
350 
352  &Console, TRUE);
353  if (!NT_SUCCESS(Status)) return Status;
354 
355  Hist = HistoryFindBuffer(Console,
356  GetCommandHistoryRequest->ExeName,
357  GetCommandHistoryRequest->ExeLength,
358  GetCommandHistoryRequest->Unicode2);
359  if (Hist)
360  {
361  ULONG i;
362 
363  LPSTR TargetBufferA;
364  LPWSTR TargetBufferW;
365  ULONG BufferSize = GetCommandHistoryRequest->HistoryLength;
366 
367  ULONG Offset = 0;
368  ULONG SourceLength;
369 
370  if (GetCommandHistoryRequest->Unicode)
371  {
372  TargetBufferW = GetCommandHistoryRequest->History;
373  BufferSize /= sizeof(WCHAR);
374  }
375  else
376  {
377  TargetBufferA = GetCommandHistoryRequest->History;
378  }
379 
380  for (i = 0; i < Hist->NumEntries; i++)
381  {
382  SourceLength = Hist->Entries[i].Length / sizeof(WCHAR);
383  if (Offset + SourceLength + 1 > BufferSize)
384  {
386  break;
387  }
388 
389  if (GetCommandHistoryRequest->Unicode)
390  {
391  RtlCopyMemory(&TargetBufferW[Offset], Hist->Entries[i].Buffer, SourceLength * sizeof(WCHAR));
392  Offset += SourceLength;
393  TargetBufferW[Offset++] = L'\0';
394  }
395  else
396  {
398  Hist->Entries[i].Buffer, SourceLength * sizeof(WCHAR),
399  &TargetBufferA[Offset], SourceLength);
400  Offset += SourceLength;
401  TargetBufferA[Offset++] = '\0';
402  }
403  }
404 
405  if (GetCommandHistoryRequest->Unicode)
406  BytesWritten = Offset * sizeof(WCHAR);
407  else
409  }
410 
411  // GetCommandHistoryRequest->HistoryLength = TargetBuffer - (PBYTE)GetCommandHistoryRequest->History;
412  GetCommandHistoryRequest->HistoryLength = BytesWritten;
413 
415  return Status;
416 }
417 
418 CSR_API(SrvGetConsoleCommandHistoryLength)
419 {
421  PCONSOLE_GETCOMMANDHISTORYLENGTH GetCommandHistoryLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryLengthRequest;
423  PHISTORY_BUFFER Hist;
424  ULONG Length = 0;
425 
426  if (!CsrValidateMessageBuffer(ApiMessage,
427  (PVOID*)&GetCommandHistoryLengthRequest->ExeName,
428  GetCommandHistoryLengthRequest->ExeLength,
429  sizeof(BYTE)))
430  {
432  }
433 
435  &Console, TRUE);
436  if (!NT_SUCCESS(Status)) return Status;
437 
438  Hist = HistoryFindBuffer(Console,
439  GetCommandHistoryLengthRequest->ExeName,
440  GetCommandHistoryLengthRequest->ExeLength,
441  GetCommandHistoryLengthRequest->Unicode2);
442  if (Hist)
443  {
444  ULONG i;
445  for (i = 0; i < Hist->NumEntries; i++)
446  Length += Hist->Entries[i].Length + sizeof(WCHAR); // Each entry is returned NULL-terminated
447  }
448  /*
449  * Quick and dirty way of getting the number of bytes of the
450  * corresponding ANSI string from the one in UNICODE.
451  */
452  if (!GetCommandHistoryLengthRequest->Unicode)
453  Length /= sizeof(WCHAR);
454 
455  GetCommandHistoryLengthRequest->HistoryLength = Length;
456 
458  return Status;
459 }
460 
461 CSR_API(SrvExpungeConsoleCommandHistory)
462 {
464  PCONSOLE_EXPUNGECOMMANDHISTORY ExpungeCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ExpungeCommandHistoryRequest;
466  PHISTORY_BUFFER Hist;
467 
468  if (!CsrValidateMessageBuffer(ApiMessage,
469  (PVOID*)&ExpungeCommandHistoryRequest->ExeName,
470  ExpungeCommandHistoryRequest->ExeLength,
471  sizeof(BYTE)))
472  {
474  }
475 
477  &Console, TRUE);
478  if (!NT_SUCCESS(Status)) return Status;
479 
480  Hist = HistoryFindBuffer(Console,
481  ExpungeCommandHistoryRequest->ExeName,
482  ExpungeCommandHistoryRequest->ExeLength,
483  ExpungeCommandHistoryRequest->Unicode2);
484  HistoryDeleteBuffer(Hist);
485 
487  return Status;
488 }
489 
490 CSR_API(SrvSetConsoleNumberOfCommands)
491 {
493  PCONSOLE_SETHISTORYNUMBERCOMMANDS SetHistoryNumberCommandsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryNumberCommandsRequest;
495  PHISTORY_BUFFER Hist;
496 
497  if (!CsrValidateMessageBuffer(ApiMessage,
498  (PVOID*)&SetHistoryNumberCommandsRequest->ExeName,
499  SetHistoryNumberCommandsRequest->ExeLength,
500  sizeof(BYTE)))
501  {
503  }
504 
506  &Console, TRUE);
507  if (!NT_SUCCESS(Status)) return Status;
508 
509  Hist = HistoryFindBuffer(Console,
510  SetHistoryNumberCommandsRequest->ExeName,
511  SetHistoryNumberCommandsRequest->ExeLength,
512  SetHistoryNumberCommandsRequest->Unicode2);
513  if (Hist)
514  {
515  ULONG MaxEntries = SetHistoryNumberCommandsRequest->NumCommands;
516  PUNICODE_STRING OldEntryList = Hist->Entries;
517  PUNICODE_STRING NewEntryList = ConsoleAllocHeap(0, MaxEntries * sizeof(UNICODE_STRING));
518  if (!NewEntryList)
519  {
521  }
522  else
523  {
524  /* If necessary, shrink by removing oldest entries */
525  for (; Hist->NumEntries > MaxEntries; Hist->NumEntries--)
526  {
527  RtlFreeUnicodeString(Hist->Entries++);
528  Hist->Position += (Hist->Position == 0);
529  }
530 
531  Hist->MaxEntries = MaxEntries;
532  Hist->Entries = memcpy(NewEntryList, Hist->Entries,
533  Hist->NumEntries * sizeof(UNICODE_STRING));
534  ConsoleFreeHeap(OldEntryList);
535  }
536  }
537 
539  return Status;
540 }
541 
542 CSR_API(SrvGetConsoleHistory)
543 {
544 #if 0 // Vista+
545  PCONSOLE_GETSETHISTORYINFO HistoryInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HistoryInfoRequest;
548  &Console, TRUE);
549  if (NT_SUCCESS(Status))
550  {
551  HistoryInfoRequest->HistoryBufferSize = Console->HistoryBufferSize;
552  HistoryInfoRequest->NumberOfHistoryBuffers = Console->NumberOfHistoryBuffers;
553  HistoryInfoRequest->dwFlags = (Console->HistoryNoDup ? HISTORY_NO_DUP_FLAG : 0);
555  }
556  return Status;
557 #else
558  DPRINT1("%s not yet implemented\n", __FUNCTION__);
559  return STATUS_NOT_IMPLEMENTED;
560 #endif
561 }
562 
563 CSR_API(SrvSetConsoleHistory)
564 {
565 #if 0 // Vista+
566  PCONSOLE_GETSETHISTORYINFO HistoryInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HistoryInfoRequest;
569  &Console, TRUE);
570  if (NT_SUCCESS(Status))
571  {
572  Console->HistoryBufferSize = HistoryInfoRequest->HistoryBufferSize;
573  Console->NumberOfHistoryBuffers = HistoryInfoRequest->NumberOfHistoryBuffers;
574  Console->HistoryNoDup = !!(HistoryInfoRequest->dwFlags & HISTORY_NO_DUP_FLAG);
576  }
577  return Status;
578 #else
579  DPRINT1("%s not yet implemented\n", __FUNCTION__);
580  return STATUS_NOT_IMPLEMENTED;
581 #endif
582 }
583 
584 CSR_API(SrvSetConsoleCommandHistoryMode)
585 {
587  PCONSOLE_SETHISTORYMODE SetHistoryModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryModeRequest;
589 
590  DPRINT("SrvSetConsoleCommandHistoryMode(Mode = %d) is not yet implemented\n",
591  SetHistoryModeRequest->Mode);
592 
594  &Console, TRUE);
595  if (!NT_SUCCESS(Status)) return Status;
596 
597  Console->InsertMode = !!(SetHistoryModeRequest->Mode & CONSOLE_OVERSTRIKE);
598 
600  return STATUS_SUCCESS;
601 }
602 
603 /* EOF */
signed char * PCHAR
Definition: retypes.h:7
PPOPUP_WINDOW HistoryDisplayCurrentHistory(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName)
Definition: history.c:271
NTSTATUS ConSrvGetConsole(IN PCONSOLE_PROCESS_DATA ProcessData, OUT PCONSRV_CONSOLE *Console, IN BOOLEAN LockConsole)
Definition: console.c:271
#define CsrGetClientThread()
Definition: csrsrv.h:77
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define max(a, b)
Definition: svc.c:63
_Must_inspect_result_ _In_ PFILE_OBJECT _In_opt_ PLARGE_INTEGER _In_ ULONG _In_ FLT_IO_OPERATION_FLAGS _Out_opt_ PULONG BytesWritten
Definition: fltkernel.h:1293
#define TRUE
Definition: types.h:120
_In_ __drv_aliasesMem PSTRING Prefix
Definition: rtlfuncs.h:1631
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
UNICODE_STRING ExeName
Definition: history.c:23
BOOL HistoryRecallHistory(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName, INT Offset, PUNICODE_STRING Entry)
Definition: history.c:210
CSR_API(SrvGetConsoleCommandHistory)
Definition: history.c:329
struct _Entry Entry
Definition: kefuncs.h:640
VOID HistoryDeleteBuffers(PCONSRV_CONSOLE Console)
Definition: history.c:313
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
USHORT MaximumLength
Definition: env_spec_w32.h:370
static PHISTORY_BUFFER HistoryFindBuffer(PCONSRV_CONSOLE Console, PVOID ExeName, USHORT ExeLength, BOOLEAN UnicodeExe)
Definition: history.c:79
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
Definition: rtlfuncs.h:201
struct _HISTORY_BUFFER HISTORY_BUFFER
ULONG NumEntries
Definition: history.c:22
static COORD Position
Definition: mouse.c:34
struct _CONSOLE_API_MESSAGE * PCONSOLE_API_MESSAGE
LONG NTSTATUS
Definition: precomp.h:26
BOOLEAN NTAPI CsrValidateMessageBuffer(IN PCSR_API_MESSAGE ApiMessage, IN PVOID *Buffer, IN ULONG ElementCount, IN ULONG ElementSize)
Definition: api.c:1315
#define ConsoleAllocHeap(Flags, Size)
Definition: heap.h:14
VOID HistoryGetCurrentEntry(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName, PUNICODE_STRING Entry)
Definition: history.c:197
uint16_t * PWCHAR
Definition: typedefs.h:54
#define TEXTMODE_BUFFER
Definition: pccons.c:21
#define PCONSRV_CONSOLE
Definition: conio.h:27
char * LPSTR
Definition: xmlstorage.h:182
VOID ConSrvReleaseConsole(IN PCONSRV_CONSOLE Console, IN BOOLEAN IsConsoleLocked)
Definition: console.c:296
int32_t INT
Definition: typedefs.h:56
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
ULONG MaxEntries
Definition: history.c:21
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
unsigned int BOOL
Definition: ntddk_ex.h:94
short SHORT
Definition: pedump.c:59
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
Definition: rtlfuncs.h:128
void DPRINT(...)
Definition: polytest.cpp:61
LIST_ENTRY ListEntry
Definition: history.c:19
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
ULONG X
Definition: bl.h:1340
PUNICODE_STRING Entries
Definition: history.c:24
static VOID HistoryDeleteBuffer(PHISTORY_BUFFER Hist)
Definition: history.c:128
BOOLEAN ConvertInputAnsiToUnicode(PCONSRV_CONSOLE Console, PVOID Source, USHORT SourceLength, PWCHAR *Target, PUSHORT TargetLength)
Definition: alias.c:37
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define ConsoleGetPerProcessData(Process)
Definition: consrv.h:37
#define BufferSize
Definition: classpnp.h:419
ULONG Position
Definition: history.c:20
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
BOOL HistoryFindEntryByPrefix(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName, PUNICODE_STRING Prefix, PUNICODE_STRING Entry)
Definition: history.c:229
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
_Must_inspect_result_ typedef _In_ ULONG _In_ BOOLEAN Target
Definition: iotypes.h:1068
struct _HISTORY_BUFFER * PHISTORY_BUFFER
INT GetType(BOOL bLocal, LPOSVERSIONINFOEX osvi, LPSERVER_INFO_102 pBuf102)
Definition: gettype.c:129
NTSYSAPI NTSTATUS WINAPI RtlDuplicateUnicodeString(int, const UNICODE_STRING *, UNICODE_STRING *)
static const WCHAR L[]
Definition: oid.c:1250
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char BYTE
Definition: mem.h:68
Definition: typedefs.h:117
BOOLEAN ConvertInputUnicodeToAnsi(PCONSRV_CONSOLE Console, PVOID Source, USHORT SourceLength, PCHAR Target, USHORT TargetLength)
Definition: alias.c:64
VOID HistoryDeleteCurrentBuffer(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName)
Definition: history.c:306
Definition: console.h:35
Status
Definition: gdiplustypes.h:24
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:61
unsigned short USHORT
Definition: pedump.c:61
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
#define min(a, b)
Definition: monoChain.cc:55
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
CConsole Console
#define DPRINT1
Definition: precomp.h:8
#define ConsoleFreeHeap(HeapBase)
Definition: heap.h:15
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
unsigned int ULONG
Definition: retypes.h:1
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167
VOID HistoryAddEntry(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName, PUNICODE_STRING Entry)
Definition: history.c:141
WCHAR * LPWSTR
Definition: xmlstorage.h:184
return STATUS_SUCCESS
Definition: btrfs.c:2966
#define __FUNCTION__
Definition: types.h:112
ULONG Y
Definition: bl.h:1341
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
static PHISTORY_BUFFER HistoryCurrentBuffer(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName)
Definition: history.c:47
unsigned short * PUSHORT
Definition: retypes.h:2
base of all file and directory entries
Definition: entries.h:82