上一篇给出了GetCurDir的方法,不过这样玩多多少少看起来让人觉得不够简洁。于是又在EDK2 ShellPkg中翻了一下,在\ShellPkg\Include\Library\ShellLib.h 中有定义 ShellGetCurrentDir 函数
/** Retreives the current directory path. If the DeviceName is NULL, it returns the current device's current directory name. If the DeviceName is not NULL, it returns the current directory name on specified drive. @param[in] DeviceName The name of the file system to get directory on. @retval NULL The directory does not exist. @retval != NULL The directory. **/ CONST CHAR16* EFIAPI ShellGetCurrentDir ( IN CHAR16 * CONST DeviceName OPTIONAL );
看一下具体实现在 \ShellPkg\Library\UefiShellLib\UefiShellLib.c
/** Retreives the current directory path If the DeviceName is NULL, it returns the current device's current directory name. If the DeviceName is not NULL, it returns the current directory name on specified drive. @param DeviceName the name of the drive to get directory on @retval NULL the directory does not exist @return != NULL the directory **/ CONST CHAR16* EFIAPI ShellGetCurrentDir ( IN CHAR16 * CONST DeviceName OPTIONAL ) { // // Check for UEFI Shell 2.0 protocols // if (gEfiShellProtocol != NULL) { return (gEfiShellProtocol->GetCurDir(DeviceName)); } // // Check for EFI shell // if (mEfiShellEnvironment2 != NULL) { return (mEfiShellEnvironment2->CurDir(DeviceName)); } return (NULL); }
就是说它内部实际上是直接判断了当前哪个Protocol能用,就用对应的来实现取得当前目录的功能。于是,直接使用它就能避免我们需要特别选择 Protocol 的烦恼。尝试编写程序如下
#include <Uefi.h> #include <Library/UefiLib.h> #include <Library/ShellCEntryLib.h> #include <stdio.h> #include <stdlib.h> #include <wchar.h> #include <Protocol/EfiShell.h> #include <Library/ShellLib.h> extern EFI_BOOT_SERVICES *gBS; extern EFI_SYSTEM_TABLE *gST; extern EFI_RUNTIME_SERVICES *gRT; extern EFI_SHELL_PROTOCOL *gEfiShellProtocol; int EFIAPI main ( IN int Argc, IN char **Argv ) { CHAR16 *R=0; R=(CHAR16 *)ShellGetCurrentDir(NULL); Print(L"%s",ShellGetCurrentDir(0)); return EFI_SUCCESS; }
同时给出对应的 INF,如果你再编译时出现Link之类的错误,最大的可能就是头文件和INF中没有引用对应的库支持。
## @file # A simple, basic, application showing how the Hello application could be # built using the "Standard C Libraries" from StdLib. # # Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR> # This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license. # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. ## [Defines] INF_VERSION = 0x00010006 BASE_NAME = getcurdir2 FILE_GUID = 4ea97c46-7491-4dfd-0028-747010f3ce5f MODULE_TYPE = UEFI_APPLICATION VERSION_STRING = 0.1 ENTRY_POINT = ShellCEntryLib # # VALID_ARCHITECTURES = IA32 X64 IPF # [Sources] GetCurDir2.c [Packages] StdLib/StdLib.dec MdePkg/MdePkg.dec ShellPkg/ShellPkg.dec [LibraryClasses] LibC LibStdio ShellCEntryLib ShellLib [Protocols] [BuildOptions]
从功能上来说,和之前的完全一样