]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/Mode.c
pointer verification (not NULL) and buffer overrun fixes.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / Mode.c
1 /** @file
2 Main file for Mode shell Debug1 function.
3
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the acModeanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which acModeanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "UefiShellDebug1CommandsLib.h"
16
17 /**
18 Function for 'mode' command.
19
20 @param[in] ImageHandle Handle to the Image (NULL if Internal).
21 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
22 **/
23 SHELL_STATUS
24 EFIAPI
25 ShellCommandRunMode (
26 IN EFI_HANDLE ImageHandle,
27 IN EFI_SYSTEM_TABLE *SystemTable
28 )
29 {
30 EFI_STATUS Status;
31 LIST_ENTRY *Package;
32 CHAR16 *ProblemParam;
33 SHELL_STATUS ShellStatus;
34 UINTN NewCol;
35 UINTN NewRow;
36 UINTN Col;
37 UINTN Row;
38 CONST CHAR16 *Temp;
39 BOOLEAN Done;
40 INT32 LoopVar;
41
42 ShellStatus = SHELL_SUCCESS;
43 Status = EFI_SUCCESS;
44
45 //
46 // initialize the shell lib (we must be in non-auto-init...)
47 //
48 Status = ShellInitialize();
49 ASSERT_EFI_ERROR(Status);
50
51 Status = CommandInit();
52 ASSERT_EFI_ERROR(Status);
53
54 //
55 // parse the command line
56 //
57 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);
58 if (EFI_ERROR(Status)) {
59 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
60 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
61 FreePool(ProblemParam);
62 ShellStatus = SHELL_INVALID_PARAMETER;
63 } else {
64 ASSERT(FALSE);
65 }
66 } else {
67 if (ShellCommandLineGetCount(Package) > 3) {
68 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
69 ShellStatus = SHELL_INVALID_PARAMETER;
70 } else if (ShellCommandLineGetCount(Package) == 2) {
71 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
72 ShellStatus = SHELL_INVALID_PARAMETER;
73 } else if (ShellCommandLineGetCount(Package) == 3) {
74 Temp = ShellCommandLineGetRawValue(Package, 1);
75 if (!ShellIsHexOrDecimalNumber(Temp, FALSE, FALSE)) {
76 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);
77 ShellStatus = SHELL_INVALID_PARAMETER;
78 }
79 NewCol = ShellStrToUintn(Temp);
80 Temp = ShellCommandLineGetRawValue(Package, 2);
81 if (!ShellIsHexOrDecimalNumber(Temp, FALSE, FALSE)) {
82 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Temp);
83 ShellStatus = SHELL_INVALID_PARAMETER;
84 }
85 NewRow = ShellStrToUintn(Temp);
86
87 for (LoopVar = 0, Done = FALSE; LoopVar < gST->ConOut->Mode->MaxMode && ShellStatus == SHELL_SUCCESS ; LoopVar++) {
88 Status = gST->ConOut->QueryMode(gST->ConOut, LoopVar, &Col, &Row);
89 if (EFI_ERROR(Status)) {
90 continue;
91 }
92 if (Col == NewCol && Row == NewRow) {
93 Status = gST->ConOut->SetMode(gST->ConOut, LoopVar);
94 if (EFI_ERROR(Status)) {
95 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MODE_SET_FAIL), gShellDebug1HiiHandle, Status);
96 ShellStatus = SHELL_DEVICE_ERROR;
97 } else {
98 // worked fine...
99 Done = TRUE;
100 }
101 break;
102 }
103 }
104
105 if (!Done) {
106 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MODE_NO_MATCH), gShellDebug1HiiHandle);
107 ShellStatus = SHELL_INVALID_PARAMETER;
108 }
109
110 } else if (ShellCommandLineGetCount(Package) == 1) {
111 //
112 // print out valid
113 //
114 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MODE_LIST_HEAD), gShellDebug1HiiHandle);
115 for (LoopVar = 0, Done = FALSE; LoopVar < gST->ConOut->Mode->MaxMode && ShellStatus == SHELL_SUCCESS ; LoopVar++) {
116 Status = gST->ConOut->QueryMode(gST->ConOut, LoopVar, &Col, &Row);
117 if (EFI_ERROR(Status)) {
118 continue;
119 }
120 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MODE_LIST_ITEM), gShellDebug1HiiHandle, Col, Row, LoopVar == gST->ConOut->Mode->Mode?L'*':L' ');
121 }
122 }
123 ShellCommandLineFreeVarList (Package);
124 }
125
126 return (ShellStatus);
127 }