UINTN NewSize;\r
EFI_STATUS Status;\r
BOOLEAN Volatile;\r
+ UINTN TotalSize;\r
\r
//\r
// Most if not all UEFI commands will have an '\r\n' at the end of any output. \r
//\r
NewBuffer = NULL;\r
NewSize = 0;\r
+ TotalSize = 0;\r
\r
Status = IsVolatileEnv (((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &Volatile);\r
if (EFI_ERROR (Status)) {\r
\r
Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
- NewBuffer = AllocateZeroPool(NewSize + sizeof(CHAR16));\r
+ TotalSize = NewSize + sizeof (CHAR16);\r
+ NewBuffer = AllocateZeroPool (TotalSize);\r
if (NewBuffer == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
} \r
\r
if (!EFI_ERROR(Status) && NewBuffer != NULL) {\r
\r
- if (StrSize(NewBuffer) > 6)\r
- {\r
- if ((((CHAR16*)NewBuffer)[(StrSize(NewBuffer)/2) - 2] == CHAR_LINEFEED) \r
- && (((CHAR16*)NewBuffer)[(StrSize(NewBuffer)/2) - 3] == CHAR_CARRIAGE_RETURN)) {\r
- ((CHAR16*)NewBuffer)[(StrSize(NewBuffer)/2) - 3] = CHAR_NULL; \r
+ if (TotalSize / sizeof (CHAR16) >= 3) {\r
+ if ( (((CHAR16*)NewBuffer)[TotalSize / sizeof (CHAR16) - 2] == CHAR_LINEFEED) &&\r
+ (((CHAR16*)NewBuffer)[TotalSize / sizeof (CHAR16) - 3] == CHAR_CARRIAGE_RETURN)\r
+ ) {\r
+ ((CHAR16*)NewBuffer)[TotalSize / sizeof (CHAR16) - 3] = CHAR_NULL;\r
}\r
\r
if (Volatile) {\r
- Status = SHELL_SET_ENVIRONMENT_VARIABLE_V(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, StrSize(NewBuffer), NewBuffer);\r
+ Status = SHELL_SET_ENVIRONMENT_VARIABLE_V (\r
+ ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
+ TotalSize - sizeof (CHAR16),\r
+ NewBuffer\r
+ );\r
+\r
+ if (!EFI_ERROR(Status)) {\r
+ Status = ShellAddEnvVarToList (\r
+ ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
+ NewBuffer,\r
+ TotalSize,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS\r
+ );\r
+ }\r
} else {\r
- Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, StrSize(NewBuffer), NewBuffer);\r
+ Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV (\r
+ ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
+ TotalSize - sizeof (CHAR16),\r
+ NewBuffer\r
+ );\r
+\r
+ if (!EFI_ERROR(Status)) {\r
+ Status = ShellAddEnvVarToList (\r
+ ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
+ NewBuffer,\r
+ TotalSize,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS\r
+ );\r
+ }\r
}\r
}\r
} \r
\r
/**\r
File style interface for Volatile Environment Variable (Write).\r
+ This function also caches the environment variable into gShellEnvVarList.\r
\r
@param[in] This The pointer to the EFI_FILE_PROTOCOL object.\r
@param[in, out] BufferSize Size in bytes of Buffer.\r
@param[in] Buffer The pointer to the buffer to write.\r
\r
- @retval EFI_SUCCESS The data was read.\r
+ @retval EFI_SUCCESS The data was successfully write to variable.\r
+ @retval SHELL_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
EFIAPI\r
VOID* NewBuffer;\r
UINTN NewSize;\r
EFI_STATUS Status;\r
+ UINTN TotalSize;\r
\r
NewBuffer = NULL;\r
NewSize = 0;\r
+ TotalSize = 0;\r
\r
Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);\r
- if (Status == EFI_BUFFER_TOO_SMALL){\r
- NewBuffer = AllocateZeroPool(NewSize + *BufferSize + sizeof(CHAR16));\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ TotalSize = NewSize + *BufferSize + sizeof (CHAR16);\r
+ } else if (Status == EFI_NOT_FOUND) {\r
+ TotalSize = *BufferSize + sizeof(CHAR16);\r
+ } else {\r
+ return Status;\r
+ }\r
+\r
+ NewBuffer = AllocateZeroPool (TotalSize);\r
+ if (NewBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);\r
}\r
- if (!EFI_ERROR(Status) && NewBuffer != NULL) {\r
- while (((CHAR16*)NewBuffer)[NewSize/2] == CHAR_NULL) {\r
- //\r
- // We want to overwrite the CHAR_NULL\r
- //\r
- NewSize -= 2;\r
- }\r
- CopyMem((UINT8*)NewBuffer + NewSize + 2, Buffer, *BufferSize);\r
- Status = SHELL_SET_ENVIRONMENT_VARIABLE_V(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, StrSize(NewBuffer), NewBuffer);\r
- FreePool(NewBuffer);\r
- return (Status);\r
- } else {\r
- SHELL_FREE_NON_NULL(NewBuffer);\r
- return (SHELL_SET_ENVIRONMENT_VARIABLE_V(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, *BufferSize, Buffer));\r
+\r
+ if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) {\r
+ FreePool (NewBuffer);\r
+ return Status;\r
+ }\r
+\r
+ CopyMem ((UINT8*)NewBuffer + NewSize, Buffer, *BufferSize);\r
+ Status = ShellAddEnvVarToList (\r
+ ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
+ NewBuffer,\r
+ TotalSize,\r
+ EFI_VARIABLE_BOOTSERVICE_ACCESS\r
+ );\r
+ if (EFI_ERROR(Status)) {\r
+ FreePool (NewBuffer);\r
+ return Status;\r
+ }\r
+\r
+ Status = SHELL_SET_ENVIRONMENT_VARIABLE_V (\r
+ ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
+ TotalSize - sizeof (CHAR16),\r
+ NewBuffer\r
+ );\r
+ if (EFI_ERROR(Status)) {\r
+ ShellRemvoeEnvVarFromList (((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name);\r
}\r
+\r
+ FreePool (NewBuffer);\r
+ return Status;\r
}\r
\r
\r
/**\r
File style interface for Non Volatile Environment Variable (Write).\r
+ This function also caches the environment variable into gShellEnvVarList.\r
\r
@param[in] This The pointer to the EFI_FILE_PROTOCOL object.\r
@param[in, out] BufferSize Size in bytes of Buffer.\r
@param[in] Buffer The pointer to the buffer to write.\r
\r
- @retval EFI_SUCCESS The data was read.\r
+ @retval EFI_SUCCESS The data was successfully write to variable.\r
+ @retval SHELL_OUT_OF_RESOURCES A memory allocation failed.\r
**/\r
EFI_STATUS\r
EFIAPI\r
VOID* NewBuffer;\r
UINTN NewSize;\r
EFI_STATUS Status;\r
+ UINTN TotalSize;\r
\r
NewBuffer = NULL;\r
NewSize = 0;\r
+ TotalSize = 0;\r
\r
Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);\r
- if (Status == EFI_BUFFER_TOO_SMALL){\r
- NewBuffer = AllocateZeroPool(NewSize + *BufferSize);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ TotalSize = NewSize + *BufferSize + sizeof (CHAR16);\r
+ } else if (Status == EFI_NOT_FOUND) {\r
+ TotalSize = *BufferSize + sizeof (CHAR16);\r
+ } else {\r
+ return Status;\r
+ }\r
+\r
+ NewBuffer = AllocateZeroPool (TotalSize);\r
+ if (NewBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);\r
}\r
- if (!EFI_ERROR(Status)) {\r
- CopyMem((UINT8*)NewBuffer + NewSize, Buffer, *BufferSize);\r
- return (SHELL_SET_ENVIRONMENT_VARIABLE_NV(\r
- ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
- NewSize + *BufferSize,\r
- NewBuffer));\r
- } else {\r
- return (SHELL_SET_ENVIRONMENT_VARIABLE_NV(\r
- ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
- *BufferSize,\r
- Buffer));\r
+\r
+ if (EFI_ERROR(Status) && Status != EFI_NOT_FOUND) {\r
+ FreePool (NewBuffer);\r
+ return Status;\r
+ }\r
+\r
+ CopyMem ((UINT8*) NewBuffer + NewSize, Buffer, *BufferSize);\r
+ Status = ShellAddEnvVarToList (\r
+ ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
+ NewBuffer,\r
+ TotalSize,\r
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (NewBuffer);\r
+ return Status;\r
}\r
+\r
+ Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV (\r
+ ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,\r
+ TotalSize - sizeof (CHAR16),\r
+ NewBuffer\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ ShellRemvoeEnvVarFromList (((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name);\r
+ }\r
+\r
+ FreePool (NewBuffer);\r
+ return Status;\r
}\r
\r
/**\r