ReactOS  0.4.15-dev-1397-g19779b3
tui.c
Go to the documentation of this file.
1 /*
2  * FreeLoader
3  * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  */
19 #ifndef _M_ARM
20 #include <freeldr.h>
21 
22 #define TAG_TUI_SCREENBUFFER 'SiuT'
23 #define TAG_TAG_TUI_PALETTE 'PiuT'
24 
27 
28 /*
29  * TuiPrintf()
30  * Prints formatted text to the screen
31  */
32 int TuiPrintf(const char *Format, ...)
33 {
34  int i;
35  int Length;
36  va_list ap;
37  CHAR Buffer[512];
38 
39  va_start(ap, Format);
40  Length = _vsnprintf(Buffer, sizeof(Buffer), Format, ap);
41  va_end(ap);
42 
43  if (Length == -1) Length = sizeof(Buffer);
44 
45  for (i = 0; i < Length; i++)
46  {
48  }
49 
50  return Length;
51 }
52 
54 {
58 
60  if (TextVideoBuffer == NULL)
61  {
62  return FALSE;
63  }
64 
65  return TRUE;
66 }
67 
69 {
71  {
72  TuiFadeOut();
73  }
74  else
75  {
77  }
78 
82 }
83 
85 {
86  //
87  // Fill in the background (excluding title box & status bar)
88  //
89  TuiFillArea(0,
91  UiScreenWidth - 1,
92  UiScreenHeight - 2,
95 
96  //
97  // Draw the title box
98  //
99  TuiDrawBox(0,
100  0,
101  UiScreenWidth - 1,
103  D_VERT,
104  D_HORZ,
105  TRUE,
106  FALSE,
108 
109  //
110  // Draw version text
111  //
112  TuiDrawText(2,
113  1,
116 
117  //
118  // Draw copyright
119  //
120  TuiDrawText(2,
121  2,
122  BY_AUTHOR,
124  TuiDrawText(2,
125  3,
126  AUTHOR_EMAIL,
128 
129  //
130  // Draw help text
131  //
132  TuiDrawText(UiScreenWidth - 16, 3, /*"F1 for Help"*/"F8 for Options", ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor));
133 
134  //
135  // Draw title text
136  //
138  2,
141 
142  //
143  // Update the date & time
144  //
146 
148 }
149 
150 /*
151  * FillArea()
152  * This function assumes coordinates are zero-based
153  */
154 VOID TuiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, CHAR FillChar, UCHAR Attr /* Color Attributes */)
155 {
156  PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer;
157  ULONG i, j;
158 
159  // Clip the area to the screen
160  if ((Left >= UiScreenWidth) || (Top >= UiScreenHeight))
161  {
162  return;
163  }
164  if (Right >= UiScreenWidth)
165  {
166  Right = UiScreenWidth - 1;
167  }
168  if (Bottom >= UiScreenHeight)
169  {
170  Bottom = UiScreenHeight - 1;
171  }
172 
173  // Loop through each line and fill it in
174  for (i=Top; i<=Bottom; i++)
175  {
176  // Loop through each character (column) in the line and fill it in
177  for (j=Left; j<=Right; j++)
178  {
179  ScreenMemory[((i*2)*UiScreenWidth)+(j*2)] = (UCHAR)FillChar;
180  ScreenMemory[((i*2)*UiScreenWidth)+(j*2)+1] = Attr;
181  }
182  }
183 }
184 
185 /*
186  * DrawShadow()
187  * This function assumes coordinates are zero-based
188  */
190 {
191  PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer;
192  ULONG Idx;
193 
194  // Shade the bottom of the area
195  if (Bottom < (UiScreenHeight - 1))
196  {
197  if (UiScreenHeight < 34)
198  {
199  Idx=Left + 2;
200  }
201  else
202  {
203  Idx=Left + 1;
204  }
205 
206  for (; Idx<=Right; Idx++)
207  {
208  ScreenMemory[(((Bottom+1)*2)*UiScreenWidth)+(Idx*2)+1] = ATTR(COLOR_GRAY, COLOR_BLACK);
209  }
210  }
211 
212  // Shade the right of the area
213  if (Right < (UiScreenWidth - 1))
214  {
215  for (Idx=Top+1; Idx<=Bottom; Idx++)
216  {
217  ScreenMemory[((Idx*2)*UiScreenWidth)+((Right+1)*2)+1] = ATTR(COLOR_GRAY, COLOR_BLACK);
218  }
219  }
220  if (UiScreenHeight < 34)
221  {
222  if ((Right + 1) < (UiScreenWidth - 1))
223  {
224  for (Idx=Top+1; Idx<=Bottom; Idx++)
225  {
226  ScreenMemory[((Idx*2)*UiScreenWidth)+((Right+2)*2)+1] = ATTR(COLOR_GRAY, COLOR_BLACK);
227  }
228  }
229  }
230 
231  // Shade the bottom right corner
232  if ((Right < (UiScreenWidth - 1)) && (Bottom < (UiScreenHeight - 1)))
233  {
234  ScreenMemory[(((Bottom+1)*2)*UiScreenWidth)+((Right+1)*2)+1] = ATTR(COLOR_GRAY, COLOR_BLACK);
235  }
236  if (UiScreenHeight < 34)
237  {
238  if (((Right + 1) < (UiScreenWidth - 1)) && (Bottom < (UiScreenHeight - 1)))
239  {
240  ScreenMemory[(((Bottom+1)*2)*UiScreenWidth)+((Right+2)*2)+1] = ATTR(COLOR_GRAY, COLOR_BLACK);
241  }
242  }
243 }
244 
245 /*
246  * DrawBox()
247  * This function assumes coordinates are zero-based
248  */
249 VOID TuiDrawBox(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr)
250 {
251  UCHAR ULCorner, URCorner, LLCorner, LRCorner;
252 
253  // Calculate the corner values
254  if (HorzStyle == HORZ)
255  {
256  if (VertStyle == VERT)
257  {
258  ULCorner = UL;
259  URCorner = UR;
260  LLCorner = LL;
261  LRCorner = LR;
262  }
263  else // VertStyle == D_VERT
264  {
265  ULCorner = VD_UL;
266  URCorner = VD_UR;
267  LLCorner = VD_LL;
268  LRCorner = VD_LR;
269  }
270  }
271  else // HorzStyle == D_HORZ
272  {
273  if (VertStyle == VERT)
274  {
275  ULCorner = HD_UL;
276  URCorner = HD_UR;
277  LLCorner = HD_LL;
278  LRCorner = HD_LR;
279  }
280  else // VertStyle == D_VERT
281  {
282  ULCorner = D_UL;
283  URCorner = D_UR;
284  LLCorner = D_LL;
285  LRCorner = D_LR;
286  }
287  }
288 
289  // Fill in box background
290  if (Fill)
291  {
292  TuiFillArea(Left, Top, Right, Bottom, ' ', Attr);
293  }
294 
295  // Fill in corners
296  TuiFillArea(Left, Top, Left, Top, ULCorner, Attr);
297  TuiFillArea(Right, Top, Right, Top, URCorner, Attr);
298  TuiFillArea(Left, Bottom, Left, Bottom, LLCorner, Attr);
299  TuiFillArea(Right, Bottom, Right, Bottom, LRCorner, Attr);
300 
301  // Fill in left line
302  TuiFillArea(Left, Top+1, Left, Bottom-1, VertStyle, Attr);
303  // Fill in top line
304  TuiFillArea(Left+1, Top, Right-1, Top, HorzStyle, Attr);
305  // Fill in right line
306  TuiFillArea(Right, Top+1, Right, Bottom-1, VertStyle, Attr);
307  // Fill in bottom line
308  TuiFillArea(Left+1, Bottom, Right-1, Bottom, HorzStyle, Attr);
309 
310  // Draw the shadow
311  if (Shadow)
312  {
313  TuiDrawShadow(Left, Top, Right, Bottom);
314  }
315 }
316 
317 /*
318  * DrawText()
319  * This function assumes coordinates are zero-based
320  */
322 {
323  PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer;
324  ULONG i, j;
325 
326  // Draw the text
327  for (i = X, j = 0; Text[j] && i < UiScreenWidth; i++, j++)
328  {
329  ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)] = (UCHAR)Text[j];
330  ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)+1] = Attr;
331  }
332 }
333 
334 /*
335  * DrawText2()
336  * This function assumes coordinates are zero-based.
337  * MaxNumChars is the maximum number of characters to display.
338  * If MaxNumChars == 0, then display the whole string.
339  */
341 {
342  PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer;
343  ULONG i, j;
344 
345  // Draw the text
346  for (i = X, j = 0; Text[j] && i < UiScreenWidth && (MaxNumChars > 0 ? j < MaxNumChars : TRUE); i++, j++)
347  {
348  ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)] = (UCHAR)Text[j];
349  ScreenMemory[((Y*2)*UiScreenWidth)+(i*2)+1] = Attr;
350  }
351 }
352 
353 VOID TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr)
354 {
355  SIZE_T TextLength;
356  ULONG BoxWidth;
357  ULONG BoxHeight;
358  ULONG LineBreakCount;
359  SIZE_T Index;
360  SIZE_T LastIndex;
361  ULONG RealLeft;
362  ULONG RealTop;
363  ULONG X;
364  ULONG Y;
365  CHAR Temp[2];
366 
367  TextLength = strlen(TextString);
368 
369  // Count the new lines and the box width
370  LineBreakCount = 0;
371  BoxWidth = 0;
372  LastIndex = 0;
373  for (Index=0; Index<TextLength; Index++)
374  {
375  if (TextString[Index] == '\n')
376  {
377  LastIndex = Index;
378  LineBreakCount++;
379  }
380  else
381  {
382  if ((Index - LastIndex) > BoxWidth)
383  {
384  BoxWidth = (ULONG)(Index - LastIndex);
385  }
386  }
387  }
388 
389  BoxHeight = LineBreakCount + 1;
390 
391  RealLeft = (((Right - Left) - BoxWidth) / 2) + Left;
392  RealTop = (((Bottom - Top) - BoxHeight) / 2) + Top;
393 
394  LastIndex = 0;
395  for (Index=0; Index<TextLength; Index++)
396  {
397  if (TextString[Index] == '\n')
398  {
399  RealTop++;
400  LastIndex = 0;
401  }
402  else
403  {
404  X = (ULONG)(RealLeft + LastIndex);
405  Y = RealTop;
406  LastIndex++;
407  Temp[0] = TextString[Index];
408  Temp[1] = 0;
409  TuiDrawText(X, Y, Temp, Attr);
410  }
411  }
412 }
413 
415 {
416  SIZE_T i;
417 
420 
421  for (i=strlen(StatusText)+1; i<UiScreenWidth; i++)
422  {
424  }
425 
427 }
428 
430 {
431  TIMEINFO* TimeInfo;
432  char DateString[40];
433  CHAR TimeString[40];
434  CHAR TempString[20];
435  BOOLEAN PMHour = FALSE;
436 
437  /* Don't draw the time if this has been disabled */
438  if (!UiDrawTime) return;
439 
440  TimeInfo = ArcGetTime();
441  if (TimeInfo->Year < 1 || 9999 < TimeInfo->Year ||
442  TimeInfo->Month < 1 || 12 < TimeInfo->Month ||
443  TimeInfo->Day < 1 || 31 < TimeInfo->Day ||
444  23 < TimeInfo->Hour ||
445  59 < TimeInfo->Minute ||
446  59 < TimeInfo->Second)
447  {
448  /* This happens on QEmu sometimes. We just skip updating */
449  return;
450  }
451  // Get the month name
452  strcpy(DateString, UiMonthNames[TimeInfo->Month - 1]);
453  // Get the day
454  _itoa(TimeInfo->Day, TempString, 10);
455  // Get the day postfix
456  if (1 == TimeInfo->Day || 21 == TimeInfo->Day || 31 == TimeInfo->Day)
457  {
458  strcat(TempString, "st");
459  }
460  else if (2 == TimeInfo->Day || 22 == TimeInfo->Day)
461  {
462  strcat(TempString, "nd");
463  }
464  else if (3 == TimeInfo->Day || 23 == TimeInfo->Day)
465  {
466  strcat(TempString, "rd");
467  }
468  else
469  {
470  strcat(TempString, "th");
471  }
472 
473  // Add the day to the date
474  strcat(DateString, TempString);
475  strcat(DateString, " ");
476 
477  // Get the year and add it to the date
478  _itoa(TimeInfo->Year, TempString, 10);
479  strcat(DateString, TempString);
480 
481  // Draw the date
483 
484  // Get the hour and change from 24-hour mode to 12-hour
485  if (TimeInfo->Hour > 12)
486  {
487  TimeInfo->Hour -= 12;
488  PMHour = TRUE;
489  }
490  if (TimeInfo->Hour == 0)
491  {
492  TimeInfo->Hour = 12;
493  }
494  _itoa(TimeInfo->Hour, TempString, 10);
495  strcpy(TimeString, " ");
496  strcat(TimeString, TempString);
497  strcat(TimeString, ":");
498  _itoa(TimeInfo->Minute, TempString, 10);
499  if (TimeInfo->Minute < 10)
500  {
501  strcat(TimeString, "0");
502  }
503  strcat(TimeString, TempString);
504  strcat(TimeString, ":");
505  _itoa(TimeInfo->Second, TempString, 10);
506  if (TimeInfo->Second < 10)
507  {
508  strcat(TimeString, "0");
509  }
510  strcat(TimeString, TempString);
511  if (PMHour)
512  {
513  strcat(TimeString, " PM");
514  }
515  else
516  {
517  strcat(TimeString, " AM");
518  }
519 
520  // Draw the time
522 }
523 
525 {
526  PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer;
527  ULONG i;
528 
529  for (i=0; i < (UiScreenWidth * UiScreenHeight * 2); i++)
530  {
531  Buffer[i] = ScreenMemory[i];
532  }
533 }
534 
536 {
537  PUCHAR ScreenMemory = (PUCHAR)TextVideoBuffer;
538  ULONG i;
539 
540  for (i=0; i < (UiScreenWidth * UiScreenHeight * 2); i++)
541  {
542  ScreenMemory[i] = Buffer[i];
543  }
544 }
545 
547 {
549 
550  // Save the screen contents
554 
555  // Display the message box
556  TuiMessageBoxCritical(MessageText);
557 
558  // Restore the screen contents
561 }
562 
564 {
565  int width = 8;
566  unsigned int height = 1;
567  int curline = 0;
568  int k;
569  size_t i , j;
570  int x1, x2, y1, y2;
571  char temp[260];
572  char key;
573 
574  // Find the height
575  for (i=0; i<strlen(MessageText); i++)
576  {
577  if (MessageText[i] == '\n')
578  height++;
579  }
580 
581  // Find the width
582  for (i=0,j=0,k=0; i<height; i++)
583  {
584  while ((MessageText[j] != '\n') && (MessageText[j] != 0))
585  {
586  j++;
587  k++;
588  }
589 
590  if (k > width)
591  width = k;
592 
593  k = 0;
594  j++;
595  }
596 
597  // Calculate box area
598  x1 = (UiScreenWidth - (width+2))/2;
599  x2 = x1 + width + 3;
600  y1 = ((UiScreenHeight - height - 2)/2) + 1;
601  y2 = y1 + height + 4;
602 
603  // Draw the box
605 
606  // Draw the text
607  for (i=0,j=0; i<strlen(MessageText)+1; i++)
608  {
609  if ((MessageText[i] == '\n') || (MessageText[i] == 0))
610  {
611  temp[j] = 0;
612  j = 0;
614  curline++;
615  }
616  else
617  temp[j++] = MessageText[i];
618  }
619 
620  // Draw OK button
621  strcpy(temp, " OK ");
622  UiDrawText(x1+((x2-x1)/2)-3, y2-2, temp, ATTR(COLOR_BLACK, COLOR_GRAY));
623 
624  // Draw status text
625  UiDrawStatusText("Press ENTER to continue");
626 
628 
629  for (;;)
630  {
631  if (MachConsKbHit())
632  {
633  key = MachConsGetCh();
634  if (key == KEY_EXTENDED)
635  key = MachConsGetCh();
636 
637  if ((key == KEY_ENTER) || (key == KEY_SPACE) || (key == KEY_ESC))
638  break;
639  }
640 
642 
644 
645  MachHwIdle();
646  }
647 }
648 
650 {
651  ULONG Left, Top, Right, Bottom;
652  ULONG Width = 50; // Allow for 50 "bars"
653  ULONG Height = 2;
654 
655  Left = (UiScreenWidth - Width - 4) / 2;
656  Right = Left + Width + 3;
657  Top = (UiScreenHeight - Height - 2) / 2;
658  Top += 2;
659  Bottom = Top + Height + 1;
660 
661  TuiDrawProgressBar(Left, Top, Right, Bottom, Position, Range, ProgressText);
662 }
663 
665 {
666  ULONG i;
667  ULONG ProgressBarWidth = (Right - Left) - 3;
668 
669  // First make sure the progress bar text fits
670  UiTruncateStringEllipsis(ProgressText, ProgressBarWidth - 4);
671 
672  if (Position > Range)
673  {
674  Position = Range;
675  }
676 
677  // Draw the box
679 
680  //
681  // Draw the "Loading..." text
682  //
683  TuiDrawCenteredText(Left + 2, Top + 2, Right - 2, Top + 2, ProgressText, ATTR(UiTextColor, UiMenuBgColor));
684 
685  // Draw the percent complete
686  for (i=0; i<(Position*ProgressBarWidth)/Range; i++)
687  {
688  TuiDrawText(Left+2+i, Top+2, "\xDB", ATTR(UiTextColor, UiMenuBgColor));
689  }
690 
691  // Draw the shadow
692  for (; i<ProgressBarWidth; i++)
693  {
694  TuiDrawText(Left+2+i, Top+2, "\xB2", ATTR(UiTextColor, UiMenuBgColor));
695  }
696 
699 }
700 
702 {
703  static const struct
704  {
705  PCSTR ColorName;
706  UCHAR ColorValue;
707  } Colors[] =
708  {
709  {"Black" , COLOR_BLACK },
710  {"Blue" , COLOR_BLUE },
711  {"Green" , COLOR_GREEN },
712  {"Cyan" , COLOR_CYAN },
713  {"Red" , COLOR_RED },
714  {"Magenta", COLOR_MAGENTA},
715  {"Brown" , COLOR_BROWN },
716  {"Gray" , COLOR_GRAY },
717  {"DarkGray" , COLOR_DARKGRAY },
718  {"LightBlue" , COLOR_LIGHTBLUE },
719  {"LightGreen" , COLOR_LIGHTGREEN },
720  {"LightCyan" , COLOR_LIGHTCYAN },
721  {"LightRed" , COLOR_LIGHTRED },
722  {"LightMagenta", COLOR_LIGHTMAGENTA},
723  {"Yellow" , COLOR_YELLOW },
724  {"White" , COLOR_WHITE },
725  };
726  ULONG i;
727 
728  if (_stricmp(ColorText, "Default") == 0)
729  return MachDefaultTextColor;
730 
731  for (i = 0; i < sizeof(Colors)/sizeof(Colors[0]); ++i)
732  {
733  if (_stricmp(ColorText, Colors[i].ColorName) == 0)
734  return Colors[i].ColorValue;
735  }
736 
737  return COLOR_BLACK;
738 }
739 
741 {
742  static const struct
743  {
744  PCSTR FillStyleName;
745  UCHAR FillStyleValue;
746  } FillStyles[] =
747  {
748  {"Light" , LIGHT_FILL },
749  {"Medium", MEDIUM_FILL},
750  {"Dark" , DARK_FILL },
751  };
752  ULONG i;
753 
754  for (i = 0; i < sizeof(FillStyles)/sizeof(FillStyles[0]); ++i)
755  {
756  if (_stricmp(FillStyleText, FillStyles[i].FillStyleName) == 0)
757  return FillStyles[i].FillStyleValue;
758  }
759 
760  return LIGHT_FILL;
761 }
762 
764 {
765  PPALETTE_ENTRY TuiFadePalette = NULL;
766 
768  {
769  TuiFadePalette = (PPALETTE_ENTRY)FrLdrTempAlloc(sizeof(PALETTE_ENTRY) * 64,
771 
772  if (TuiFadePalette != NULL)
773  {
774  VideoSavePaletteState(TuiFadePalette, 64);
776  }
777  }
778 
779  // Draw the backdrop and title box
780  TuiDrawBackdrop();
781 
782  if (UiUseSpecialEffects && ! MachVideoIsPaletteFixed() && TuiFadePalette != NULL)
783  {
784  VideoFadeIn(TuiFadePalette, 64);
785  FrLdrTempFree(TuiFadePalette, TAG_TAG_TUI_PALETTE);
786  }
787 }
788 
790 {
791  PPALETTE_ENTRY TuiFadePalette = NULL;
792 
794  {
795  TuiFadePalette = (PPALETTE_ENTRY)FrLdrTempAlloc(sizeof(PALETTE_ENTRY) * 64,
797 
798  if (TuiFadePalette != NULL)
799  {
800  VideoSavePaletteState(TuiFadePalette, 64);
801  }
802  }
803 
804  if (UiUseSpecialEffects && ! MachVideoIsPaletteFixed() && TuiFadePalette != NULL)
805  {
806  VideoFadeOut(64);
807  }
808 
810 
811  if (UiUseSpecialEffects && ! MachVideoIsPaletteFixed() && TuiFadePalette != NULL)
812  {
813  VideoRestorePaletteState(TuiFadePalette, 64);
814  FrLdrTempFree(TuiFadePalette, TAG_TAG_TUI_PALETTE);
815  }
816 
817 }
818 
819 BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
820 {
821  INT width = 8;
822  ULONG height = 1;
823  INT curline = 0;
824  INT k;
825  size_t i , j;
826  INT x1, x2, y1, y2;
827  CHAR temp[260];
828  CHAR key;
829  BOOLEAN Extended;
830  INT EditBoxLine;
831  ULONG EditBoxStartX, EditBoxEndX;
832  INT EditBoxCursorX;
833  ULONG EditBoxTextLength, EditBoxTextPosition;
834  INT EditBoxTextDisplayIndex;
835  BOOLEAN ReturnCode;
837 
838  // Save the screen contents
842 
843  // Find the height
844  for (i=0; i<strlen(MessageText); i++)
845  {
846  if (MessageText[i] == '\n')
847  height++;
848  }
849 
850  // Find the width
851  for (i=0,j=0,k=0; i<height; i++)
852  {
853  while ((MessageText[j] != '\n') && (MessageText[j] != 0))
854  {
855  j++;
856  k++;
857  }
858 
859  if (k > width)
860  width = k;
861 
862  k = 0;
863  j++;
864  }
865 
866  // Calculate box area
867  x1 = (UiScreenWidth - (width+2))/2;
868  x2 = x1 + width + 3;
869  y1 = ((UiScreenHeight - height - 2)/2) + 1;
870  y2 = y1 + height + 4;
871 
872  // Draw the box
874 
875  // Draw the text
876  for (i=0,j=0; i<strlen(MessageText)+1; i++)
877  {
878  if ((MessageText[i] == '\n') || (MessageText[i] == 0))
879  {
880  temp[j] = 0;
881  j = 0;
883  curline++;
884  }
885  else
886  temp[j++] = MessageText[i];
887  }
888 
889  EditBoxTextLength = (ULONG)strlen(EditTextBuffer);
890  EditBoxTextLength = min(EditBoxTextLength, Length - 1);
891  EditBoxTextPosition = 0;
892  EditBoxLine = y2 - 2;
893  EditBoxStartX = x1 + 3;
894  EditBoxEndX = x2 - 3;
895 
896  // Draw the edit box background and the text
897  UiFillArea(EditBoxStartX, EditBoxLine, EditBoxEndX, EditBoxLine, ' ', ATTR(UiEditBoxTextColor, UiEditBoxBgColor));
898  UiDrawText2(EditBoxStartX, EditBoxLine, EditBoxEndX - EditBoxStartX + 1, EditTextBuffer, ATTR(UiEditBoxTextColor, UiEditBoxBgColor));
899 
900  // Show the cursor
901  EditBoxCursorX = EditBoxStartX;
902  MachVideoSetTextCursorPosition(EditBoxCursorX, EditBoxLine);
904 
905  // Draw status text
906  UiDrawStatusText("Press ENTER to continue, or ESC to cancel");
907 
909 
910  //
911  // Enter the text. Please keep in mind that the default input mode
912  // of the edit boxes is in insertion mode, that is, you can insert
913  // text without erasing the existing one.
914  //
915  for (;;)
916  {
917  if (MachConsKbHit())
918  {
919  Extended = FALSE;
920  key = MachConsGetCh();
921  if (key == KEY_EXTENDED)
922  {
923  Extended = TRUE;
924  key = MachConsGetCh();
925  }
926 
927  if (key == KEY_ENTER)
928  {
929  ReturnCode = TRUE;
930  break;
931  }
932  else if (key == KEY_ESC)
933  {
934  ReturnCode = FALSE;
935  break;
936  }
937  else if (key == KEY_BACKSPACE) // Remove a character
938  {
939  if ( (EditBoxTextLength > 0) && (EditBoxTextPosition > 0) &&
940  (EditBoxTextPosition <= EditBoxTextLength) )
941  {
942  EditBoxTextPosition--;
943  memmove(EditTextBuffer + EditBoxTextPosition,
944  EditTextBuffer + EditBoxTextPosition + 1,
945  EditBoxTextLength - EditBoxTextPosition);
946  EditBoxTextLength--;
947  EditTextBuffer[EditBoxTextLength] = 0;
948  }
949  else
950  {
951  MachBeep();
952  }
953  }
954  else if (Extended && key == KEY_DELETE) // Remove a character
955  {
956  if ( (EditBoxTextLength > 0) &&
957  (EditBoxTextPosition < EditBoxTextLength) )
958  {
959  memmove(EditTextBuffer + EditBoxTextPosition,
960  EditTextBuffer + EditBoxTextPosition + 1,
961  EditBoxTextLength - EditBoxTextPosition);
962  EditBoxTextLength--;
963  EditTextBuffer[EditBoxTextLength] = 0;
964  }
965  else
966  {
967  MachBeep();
968  }
969  }
970  else if (Extended && key == KEY_HOME) // Go to the start of the buffer
971  {
972  EditBoxTextPosition = 0;
973  }
974  else if (Extended && key == KEY_END) // Go to the end of the buffer
975  {
976  EditBoxTextPosition = EditBoxTextLength;
977  }
978  else if (Extended && key == KEY_RIGHT) // Go right
979  {
980  if (EditBoxTextPosition < EditBoxTextLength)
981  EditBoxTextPosition++;
982  else
983  MachBeep();
984  }
985  else if (Extended && key == KEY_LEFT) // Go left
986  {
987  if (EditBoxTextPosition > 0)
988  EditBoxTextPosition--;
989  else
990  MachBeep();
991  }
992  else if (!Extended) // Add this key to the buffer
993  {
994  if ( (EditBoxTextLength < Length - 1) &&
995  (EditBoxTextPosition < Length - 1) )
996  {
997  memmove(EditTextBuffer + EditBoxTextPosition + 1,
998  EditTextBuffer + EditBoxTextPosition,
999  EditBoxTextLength - EditBoxTextPosition);
1000  EditTextBuffer[EditBoxTextPosition] = key;
1001  EditBoxTextPosition++;
1002  EditBoxTextLength++;
1003  EditTextBuffer[EditBoxTextLength] = 0;
1004  }
1005  else
1006  {
1007  MachBeep();
1008  }
1009  }
1010  else
1011  {
1012  MachBeep();
1013  }
1014  }
1015 
1016  // Draw the edit box background
1017  UiFillArea(EditBoxStartX, EditBoxLine, EditBoxEndX, EditBoxLine, ' ', ATTR(UiEditBoxTextColor, UiEditBoxBgColor));
1018 
1019  // Fill the text in
1020  if (EditBoxTextPosition > (EditBoxEndX - EditBoxStartX))
1021  {
1022  EditBoxTextDisplayIndex = EditBoxTextPosition - (EditBoxEndX - EditBoxStartX);
1023  EditBoxCursorX = EditBoxEndX;
1024  }
1025  else
1026  {
1027  EditBoxTextDisplayIndex = 0;
1028  EditBoxCursorX = EditBoxStartX + EditBoxTextPosition;
1029  }
1030  UiDrawText2(EditBoxStartX, EditBoxLine, EditBoxEndX - EditBoxStartX + 1, &EditTextBuffer[EditBoxTextDisplayIndex], ATTR(UiEditBoxTextColor, UiEditBoxBgColor));
1031 
1032  // Move the cursor
1033  MachVideoSetTextCursorPosition(EditBoxCursorX, EditBoxLine);
1034 
1036 
1038 
1039  MachHwIdle();
1040  }
1041 
1042  // Hide the cursor again
1044 
1045  // Restore the screen contents
1048 
1049  return ReturnCode;
1050 }
1051 
1053 {
1054  TuiInitialize,
1057  TuiFillArea,
1058  TuiDrawShadow,
1059  TuiDrawBox,
1060  TuiDrawText,
1061  TuiDrawText2,
1065  TuiMessageBox,
1069  TuiEditBox,
1073  TuiFadeOut,
1075  TuiDrawMenu,
1076 };
1077 #endif
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG y1
Definition: winddi.h:3706
#define HD_UL
Definition: tui.h:92
signed char * PCHAR
Definition: retypes.h:7
#define VD_UL
Definition: tui.h:97
#define LR
Definition: tui.h:85
VOID TuiMessageBox(PCSTR MessageText)
Definition: tui.c:546
GLint GLint GLsizei width
Definition: gl.h:1546
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
VOID TuiDrawStatusText(PCSTR StatusText)
Definition: tui.c:414
UCHAR UiTextColor
Definition: ui.c:42
#define D_UR
Definition: tui.h:88
#define LL
Definition: tui.h:84
#define DARK_FILL
Definition: ui.h:199
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define MachConsGetCh()
Definition: machine.h:90
#define COLOR_YELLOW
Definition: ui.h:219
void Fill(HDC hdc, LONG x, LONG y, COLORREF color)
Definition: drawing.cpp:109
#define COLOR_BLACK
Definition: ui.h:204
BOOLEAN TuiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length)
Definition: tui.c:819
#define D_UL
Definition: tui.h:87
#define Y(I)
char * strcat(char *DstString, const char *SrcString)
Definition: utclib.c:568
#define MachHwIdle()
Definition: machine.h:137
CHAR UiTitleBoxTitleText[260]
Definition: ui.c:48
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
#define TRUE
Definition: types.h:120
#define COLOR_LIGHTBLUE
Definition: ui.h:214
UCHAR UiMessageBoxFgColor
Definition: ui.c:38
VOID TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr)
Definition: tui.c:353
VOID TuiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr)
Definition: tui.c:321
static COORD Position
Definition: mouse.c:34
unsigned char * PUCHAR
Definition: retypes.h:3
char CHAR
Definition: xmlstorage.h:175
VOID VideoFadeIn(PPALETTE_ENTRY Palette, ULONG ColorCount)
Definition: video.c:75
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG x1
Definition: winddi.h:3706
VOID VideoSavePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount)
Definition: video.c:40
#define HORZ
Definition: ui.h:228
#define COLOR_LIGHTMAGENTA
Definition: ui.h:218
USHORT Second
Definition: fw.h:16
ULONG UiScreenHeight
Definition: ui.c:29
#define TUI_TITLE_BOX_CHAR_HEIGHT
Definition: tui.h:22
#define KEY_EXTENDED
Definition: keycodes.h:38
UCHAR UiTitleBoxBgColor
Definition: ui.c:37
#define UR
Definition: tui.h:83
#define _stricmp
Definition: cat.c:22
int32_t INT
Definition: typedefs.h:58
VOID VideoCopyOffScreenBufferToVRAM(VOID)
Definition: video.c:34
USHORT Month
Definition: fw.h:12
static ULONG ProgressBarWidth
Definition: inbv.c:87
#define HD_LL
Definition: tui.h:94
#define LIGHT_FILL
Definition: ui.h:197
VOID TuiDrawProgressBar(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, ULONG Position, ULONG Range, PCHAR ProgressText)
Definition: tui.c:664
#define KEY_LEFT
Definition: keycodes.h:47
struct tagRange Range
USHORT Minute
Definition: fw.h:15
#define va_end(ap)
Definition: acmsvcex.h:90
VOID TuiFadeOut(VOID)
Definition: tui.c:789
#define FALSE
Definition: types.h:117
UCHAR UiEditBoxTextColor
Definition: ui.c:45
Definition: fw.h:9
BOOLEAN UiDrawTime
Definition: ui.c:51
VOID TuiSaveScreen(PUCHAR Buffer)
Definition: tui.c:524
#define COLOR_DARKGRAY
Definition: ui.h:213
VOID TuiDrawBox(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UCHAR VertStyle, UCHAR HorzStyle, BOOLEAN Fill, BOOLEAN Shadow, UCHAR Attr)
Definition: tui.c:249
#define KEY_RIGHT
Definition: keycodes.h:48
FORCEINLINE PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
Definition: mm.h:177
UCHAR TuiTextToColor(PCSTR ColorText)
Definition: tui.c:701
#define VD_UR
Definition: tui.h:98
#define ATTR(cFore, cBack)
Definition: ui.h:192
unsigned char BOOLEAN
Definition: video.h:11
const PCSTR FrLdrVersionString
Definition: freeldr.c:32
UCHAR TuiTextToFillStyle(PCSTR FillStyleText)
Definition: tui.c:740
struct _PALETTE_ENTRY * PPALETTE_ENTRY
char * va_list
Definition: acmsvcex.h:78
VOID TuiDrawBackdrop(VOID)
Definition: tui.c:84
Definition: bufpool.h:45
#define COLOR_RED
Definition: ui.h:208
TIMEINFO * ArcGetTime(VOID)
Definition: arcemul.c:27
#define D_LL
Definition: tui.h:89
VOID UiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr)
Definition: ui.c:234
#define MachConsKbHit()
Definition: machine.h:88
VOID TuiFadeInBackdrop(VOID)
Definition: tui.c:763
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 GLint GLint j
Definition: glfuncs.h:250
_CRTIMP char *__cdecl _itoa(_In_ int _Value, _Pre_notnull_ _Post_z_ char *_Dest, _In_ int _Radix)
#define D_HORZ
Definition: ui.h:229
#define VD_LL
Definition: tui.h:99
VOID UiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr)
Definition: ui.c:239
const UIVTBL TuiVtbl
Definition: tui.c:1052
VOID VideoFadeOut(ULONG ColorCount)
Definition: video.c:134
#define KEY_DELETE
Definition: keycodes.h:41
#define KEY_ESC
Definition: keycodes.h:49
USHORT Year
Definition: fw.h:11
_In_ WDFCOLLECTION _In_ ULONG Index
PVOID TextVideoBuffer
Definition: tui.c:25
#define MachBeep()
Definition: machine.h:118
#define KEY_BACKSPACE
Definition: keycodes.h:40
#define COLOR_BROWN
Definition: ui.h:210
Colors
Definition: ansiprsr.h:4
#define MachConsPutChar(Ch)
Definition: machine.h:86
#define COLOR_CYAN
Definition: ui.h:207
UCHAR UiBackdropFillStyle
Definition: ui.c:35
va_start(ap, x)
UCHAR UiEditBoxBgColor
Definition: ui.c:46
BOOLEAN TuiInitialize(VOID)
Definition: tui.c:53
#define COLOR_BLUE
Definition: ui.h:205
#define COLOR_LIGHTCYAN
Definition: ui.h:216
#define VD_LR
Definition: tui.h:100
#define KEY_HOME
Definition: keycodes.h:44
UCHAR UiStatusBarBgColor
Definition: ui.c:32
#define MachVideoClearScreen(Attr)
Definition: machine.h:92
unsigned char UCHAR
Definition: xmlstorage.h:181
VOID UiDrawStatusText(PCSTR StatusText)
Definition: ui.c:249
#define AUTHOR_EMAIL
Definition: ver.h:25
UCHAR UiMenuBgColor
Definition: ui.c:41
#define COLOR_GREEN
Definition: ui.h:206
UCHAR UiTitleBoxFgColor
Definition: ui.c:36
#define COLOR_LIGHTRED
Definition: ui.h:217
HKEY key
Definition: reg.c:42
#define MachVideoHideShowTextCursor(Show)
Definition: machine.h:104
BOOLEAN UiUseSpecialEffects
Definition: ui.c:50
#define COLOR_WHITE
Definition: ui.h:220
Definition: ui.h:145
Definition: range.c:39
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG _In_ LONG y2
Definition: winddi.h:3706
VOID TuiDrawShadow(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom)
Definition: tui.c:189
UCHAR UiBackdropBgColor
Definition: ui.c:34
USHORT Hour
Definition: fw.h:14
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
VOID TuiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, CHAR FillChar, UCHAR Attr)
Definition: tui.c:154
BOOLEAN TuiDisplayMenu(IN PCSTR MenuHeader, IN PCSTR MenuFooter OPTIONAL, IN BOOLEAN ShowBootOptions, IN PCSTR MenuItemList[], IN ULONG MenuItemCount, IN ULONG DefaultMenuItem, IN LONG MenuTimeOut, OUT PULONG SelectedMenuItem, IN BOOLEAN CanEscape, IN UiMenuKeyPressFilterCallback KeyPressFilter OPTIONAL, IN PVOID Context OPTIONAL)
Definition: tuimenu.c:17
#define HD_LR
Definition: tui.h:95
ULONG_PTR SIZE_T
Definition: typedefs.h:80
VOID TuiUnInitialize(VOID)
Definition: tui.c:68
#define TAG_TAG_TUI_PALETTE
Definition: tui.c:23
VOID TuiMessageBoxCritical(PCSTR MessageText)
Definition: tui.c:563
VOID UiTruncateStringEllipsis(PCHAR StringText, ULONG MaxChars)
Definition: ui.c:455
static LPHIST_ENTRY Bottom
Definition: history.c:54
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
VOID TuiRestoreScreen(PUCHAR Buffer)
Definition: tui.c:535
static calc_node_t temp
Definition: rpn_ieee.c:38
#define COLOR_MAGENTA
Definition: ui.h:209
#define KEY_SPACE
Definition: keycodes.h:42
UCHAR MachDefaultTextColor
Definition: pcvideo.c:111
#define MachVideoSetTextCursorPosition(X, Y)
Definition: machine.h:102
UCHAR UiMessageBoxBgColor
Definition: ui.c:39
VOID TuiDrawText2(ULONG X, ULONG Y, ULONG MaxNumChars, PCSTR Text, UCHAR Attr)
Definition: tui.c:340
#define min(a, b)
Definition: monoChain.cc:55
#define NULL
Definition: types.h:112
PVOID VideoAllocateOffScreenBuffer(VOID)
Definition: video.c:17
#define BY_AUTHOR
Definition: ver.h:26
#define _vsnprintf
Definition: xmlstorage.h:202
VOID TuiDrawProgressBarCenter(ULONG Position, ULONG Range, PCHAR ProgressText)
Definition: tui.c:649
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG x2
Definition: winddi.h:3706
#define MachVideoSetDisplayMode(Mode, Init)
Definition: machine.h:94
void int int ULONGLONG int va_list * ap
Definition: winesup.h:32
HANDLE ScreenBuffer
Definition: notevil.c:37
#define D_LR
Definition: tui.h:90
int TuiPrintf(const char *Format,...)
Definition: tui.c:32
#define MachVideoIsPaletteFixed()
Definition: machine.h:110
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
VOID TuiDrawMenu(PUI_MENU_INFO MenuInfo)
Definition: tuimenu.c:233
VOID UiFillArea(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, CHAR FillChar, UCHAR Attr)
Definition: ui.c:219
unsigned int ULONG
Definition: retypes.h:1
const CHAR UiMonthNames[12][15]
Definition: ui.c:56
UCHAR UiBackdropFgColor
Definition: ui.c:33
UCHAR UiMenuFgColor
Definition: ui.c:40
USHORT Day
Definition: fw.h:13
const char * PCSTR
Definition: typedefs.h:52
ULONG UiScreenWidth
Definition: ui.c:28
VOID TuiUpdateDateTime(VOID)
Definition: tui.c:429
#define KEY_END
Definition: keycodes.h:64
VOID VideoSetAllColorsToBlack(ULONG ColorCount)
Definition: video.c:63
#define UL
Definition: tui.h:82
static LPHIST_ENTRY Top
Definition: history.c:53
#define VERT
Definition: ui.h:230
int k
Definition: mpi.c:3369
#define MEDIUM_FILL
Definition: ui.h:198
#define D_VERT
Definition: ui.h:231
VOID VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount)
Definition: video.c:50
UCHAR UiStatusBarFgColor
Definition: ui.c:31
#define COLOR_LIGHTGREEN
Definition: ui.h:215
#define X(b, s)
char * Text
Definition: combotst.c:136
#define KEY_ENTER
Definition: keycodes.h:39
#define HD_UR
Definition: tui.h:93
Definition: path.c:41
#define TAG_TUI_SCREENBUFFER
Definition: tui.c:22
FORCEINLINE VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)
Definition: mm.h:186