前面介绍过使用 ShellReadFile 读取文件的内容,这里介绍一下 ShellWriteFile 的使用。
例子是使用 ShellOpenFileByName 打开当前的 EFI Application,把内容读取到内存之后,创建一个名为 Test.efi 的文件,使用 ShellWriteFile 函数把内容写进去。
代码如下:
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <Library/ShellLib.h>
#include <Library/MemoryAllocationLib.h>
extern EFI_BOOT_SERVICES *gBS;
extern EFI_SYSTEM_TABLE *gST;
extern EFI_RUNTIME_SERVICES *gRT;
int
EFIAPI
main (
IN int Argc,
IN CHAR16 **Argv
)
{
EFI_FILE_HANDLE FileHandle;
RETURN_STATUS Status;
EFI_FILE_INFO *FileInfo = NULL;
EFI_HANDLE *HandleBuffer=NULL;
UINTN ReadSize;
//Open the file given by the parameter
Status = ShellOpenFileByName(Argv[0],
(SHELL_FILE_HANDLE *)&
FileHandle,
EFI_FILE_MODE_READ , 0);
if(Status != RETURN_SUCCESS) {
Print(L"OpenFile failed!\n");
return EFI_SUCCESS;
}
//Get file size
FileInfo = ShellGetFileInfo( (SHELL_FILE_HANDLE)FileHandle);
//Allocate a memory buffer
HandleBuffer = AllocateZeroPool((UINTN) FileInfo-> FileSize);
if (HandleBuffer == NULL) {
return (SHELL_OUT_OF_RESOURCES); }
ReadSize=(UINTN) FileInfo-> FileSize;
//Load the whole file to the buffer
Status = ShellReadFile(FileHandle,&ReadSize,HandleBuffer);
//Close the source file
ShellCloseFile(&FileHandle);
//Create a new file
Status = ShellOpenFileByName(L"Test.efi",
(SHELL_FILE_HANDLE *)&FileHandle,
EFI_FILE_MODE_READ |
EFI_FILE_MODE_WRITE|
EFI_FILE_MODE_CREATE,
0);
if(Status != RETURN_SUCCESS) {
Print(L"CreatFile failed [%r]!\n",Status);
return EFI_SUCCESS;
}
Status = ShellWriteFile(FileHandle,
&ReadSize,
HandleBuffer
);
//Close the source file
ShellCloseFile(&FileHandle);
return EFI_SUCCESS;
}
运行结果(运行结束之后我比较了一下生成文件和源文件是相同的):
特别注意:使用 ShellOpenFuleByName 创建一个文件时,要同时使用 EFI_FILE_MODE_READ ,EFI_FILE_MODE_WRITE 和 EFI_FILE_MODE_CREATE ,否则可能出现“Invalid Parameter”的错误【参考1】
完整代码下载
CreateFile
1.http://feishare.com/efimail/messages/20120331-0611-Re__edk2__Problems_creating_file_using_ShellOpenFileByName-_Bekefi__Stephen_C_.html

你好,我想請教一個問題,我調用了一個建立了一個Buffer[0x100000],然後調用ShellWriteFile(Handle,0x100000,Buffer),結果在編譯EDK2會發生編譯錯誤,主要是 __chkstk 問題。
查詢網路後好像是說因為我Buffer溢出,請問要如何解決?因為我需要將Buffer大小為1M資料寫入檔案
是不是创建 Buffer 的时候溢出了?你可以先试试分段写入,不要一次性写入。
請問我要怎麼分段寫入同一個檔案?能提點下嗎?
我看了一下 ,应该是这样的例如:
1.第一次调用 ShellWriteFile() 会对文件写入一段
2.再次调用ShellWriteFile() 会对文件写入下一段
你可以试试