4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Main file for cp shell level 2 function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to take a list of files to copy and a destination location and do
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the verification and copying of those files to that location. This function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will report any errors to the user and halt.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileList A LIST_ENTRY* based list of files to move.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestDir The destination location.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SilentMode TRUE to eliminate screen output.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RecursiveMode TRUE to copy directories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Resp The response to the overwrite query (if always).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS the files were all moved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_INVALID_PARAMETER a parameter was invalid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SECURITY_VIOLATION a security violation ocurred
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_WRITE_PROTECTED the destination was write protected
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_OUT_OF_RESOURCES a memory allocation failed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to Copy one file to another location
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the destination exists the user will be prompted and the result put into *resp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Source pointer to source file name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Dest pointer to destination file name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Resp pointer to response from question. Pass back on looped calling
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SilentMode whether to run in quiet mode or not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS The source file was copied to the destination
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Why bother copying a file to itself
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Open destination file without create
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(Dest, &DestHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // close file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if the destination file existed check response and possibly prompt user
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellPromptForResponseHii(ShellPromptResponseTypeYesNoAllCancel, STRING_TOKEN (STR_GEN_DEST_EXIST_OVR), gShellLevel2HiiHandle, &Response);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // possibly return based on response
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // return success here so we dont stop the process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // indicate to stop everything
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Now copy all the files under the directory...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellOpenFileMetaArg((CHAR16*)TempName, EFI_FILE_MODE_READ, &List);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = ValidateAndCopyFiles(List, TempName, SilentMode, TRUE, Resp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // open file with create enabled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(Dest, &DestHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // open source file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(Source, &SourceHandle, EFI_FILE_MODE_READ, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // copy data between files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (ReadSize == PcdGet16(PcdShellFileOperationSize) && !EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellReadFile(SourceHandle, &ReadSize, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellWriteFile(DestHandle, &ReadSize, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // close files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function to take a list of files to copy and a destination location and do
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the verification and copying of those files to that location. This function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will report any errors to the user and halt.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The key is to have this function called ONLY once. this allows for the parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync verification to happen correctly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileList A LIST_ENTRY* based list of files to move.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestDir The destination location.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SilentMode TRUE to eliminate screen output.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RecursiveMode TRUE to copy directories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Resp The response to the overwrite query (if always).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS the files were all moved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_INVALID_PARAMETER a parameter was invalid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SECURITY_VIOLATION a security violation ocurred
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_WRITE_PROTECTED the destination was write protected
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_OUT_OF_RESOURCES a memory allocation failed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We already verified that this was present.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are trying to copy multiple files... make sure we got a directory for the target...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(ShellIsDirectory(DestDir)) && FileList->Link.ForwardLink != FileList->Link.BackLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Error for destination not a directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, DestDir);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&FileList->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&FileList->Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // skip the directory traversing stuff...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrCmp(Node->FileName, L".") == 0 || StrCmp(Node->FileName, L"..") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure got -r if required
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!RecursiveMode && !EFI_ERROR(ShellIsDirectory(Node->FullName))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CP_DIR_REQ), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make sure got dest as dir if needed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(ShellIsDirectory(Node->FullName)) && EFI_ERROR(ShellIsDirectory(DestDir))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Error for destination not a directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NOT_DIR), gShellLevel2HiiHandle, DestDir);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiOutput = HiiGetString (gShellLevel2HiiHandle, STRING_TOKEN (STR_CP_OUTPUT), NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiResultOk = HiiGetString (gShellLevel2HiiHandle, STRING_TOKEN (STR_GEN_RES_OK), NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestPath == NULL || HiiOutput == NULL || HiiResultOk == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go through the list of files to copy...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&FileList->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&FileList->Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // skip the directory traversing stuff...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrCmp(Node->FileName, L".") == 0 || StrCmp(Node->FileName, L"..") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileList->Link.ForwardLink == FileList->Link.BackLink // 1 item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && EFI_ERROR(ShellIsDirectory(DestDir)) // not an existing directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // simple copy of a single file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestPath[StrLen(DestPath)-1] != L'\\' && DestDir[0] != L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (DestPath[StrLen(DestPath)-1] == L'\\' && DestDir[0] == L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((CHAR16*)DestPath)[StrLen(DestPath)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we have multiple files or a directory in the DestDir
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for leading slash
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy to the root of CWD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestPath[StrLen(DestPath)-1] != L'\\' && DestDir[0] != L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (DestPath[StrLen(DestPath)-1] == L'\\' && DestDir[0] == L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((CHAR16*)DestPath)[StrLen(DestPath)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestDir[StrLen(DestDir)-1] != L'\\' && Node->FileName[0] != L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (DestDir[StrLen(DestDir)-1] == L'\\' && Node->FileName[0] == L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((CHAR16*)DestPath)[StrLen(DestPath)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DestDir[StrLen(DestDir)-1] != L'\\' && Node->FileName[0] != L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (DestDir[StrLen(DestDir)-1] == L'\\' && Node->FileName[0] == L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure the path exists
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(VerifyIntermediateDirectories(DestPath))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CP_DIR_WNF), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && StrniCmp(Node->FullName, DestPath, StrLen(DestPath)) == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CP_SD_PARENT), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringNoCaseCompare(&Node->FullName, &DestPath) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CP_SD_SAME), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((TempLocation = StrniCmp(Node->FullName, DestPath, StrLen(Node->FullName))) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && (DestPath[StrLen(Node->FullName)] == CHAR_NULL || DestPath[StrLen(Node->FullName)] == L'\\')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CP_SD_SAME), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, HiiOutput, Node->FullName, DestPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // copy single file...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = CopySingleFile(Node->FullName, DestPath, &Response, SilentMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS && Resp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Validate and if successful copy all the files from the list into
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destination directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileList The list of files to copy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DestDir The directory to copy files to.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SilentMode TRUE to eliminate screen output.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RecursiveMode TRUE to copy directories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileMetaArg((CHAR16*)DestDir, EFI_FILE_MODE_READ, &List);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (List != NULL && List->Link.ForwardLink != List->Link.BackLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_MARG_ERROR), gShellLevel2HiiHandle, DestDir);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(((EFI_SHELL_FILE_INFO *)List->Link.ForwardLink) != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(((EFI_SHELL_FILE_INFO *)List->Link.ForwardLink)->FullName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInfo = gEfiShellProtocol->GetFileInfo(((EFI_SHELL_FILE_INFO *)List->Link.ForwardLink)->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((FileInfo->Attribute & EFI_FILE_READ_ONLY) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = ValidateAndCopyFiles(FileList, ((EFI_SHELL_FILE_INFO *)List->Link.ForwardLink)->FullName, SilentMode, RecursiveMode, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CP_DEST_ERROR), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = ValidateAndCopyFiles(FileList, DestDir, SilentMode, RecursiveMode, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'cp' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // initialize the shell lib (we must be in non-auto-init...)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // parse the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for "-?"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize SilentMode and RecursiveMode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SilentMode = ShellCommandLineGetFlag(Package, L"-q");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecursiveMode = ShellCommandLineGetFlag(Package, L"-r");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (ParamCount = ShellCommandLineGetCount(Package)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we have insufficient parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // must have valid CWD for single parameter...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileList == NULL || IsListEmpty(&FileList->Link) || EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = ProcessValidateAndCopyFiles(FileList, Cwd, SilentMode, RecursiveMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make a big list of all the files...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (ParamCount--, LoopCounter = 1 ; LoopCounter < ParamCount && ShellStatus == SHELL_SUCCESS ; LoopCounter++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status) || FileList == NULL || IsListEmpty(&FileList->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, LoopCounter));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // now copy them all...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileList != NULL && !IsListEmpty(&FileList->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = ProcessValidateAndCopyFiles(FileList, PathCleanUpDirectories((CHAR16*)ShellCommandLineGetRawValue(Package, ParamCount)), SilentMode, RecursiveMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, ParamCount), ShellStatus|MAX_BIT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } // switch on parameter count
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // free the command line package