前面介绍过使用 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() 会对文件写入下一段
你可以试试