Uefi hexedit 源码分析

来源:互联网 发布:中软国际java培训骗局 编辑:程序博客网 时间:2024/06/04 19:56

我们最熟悉的软件应该就是记事本了,UEFI SHELL 下面也提供了一个类似的,叫edit  和 hexedit

用于对文件,磁盘,或者内存 里面的内容进行编辑。


接下来,我们就对它一些关键的函数和数据结构进行分析。


/**   Dispatch input to different handler    @param[in] Key                The input key.  One of:                                    ASCII KEY                                    Backspace/Delete                                    Return                                    Direction key: up/down/left/right/pgup/pgdn                                    Home/End                                    INS  @retval EFI_SUCCESS           The dispatch was done successfully.  @retval EFI_LOAD_ERROR        The dispatch was not successful.  @retval EFI_OUT_OF_RESOURCES  A memory allocation failed.**//** * 将不同的输入分发给相应的处理单元,比如你按下的上下左右键,或者翻页,相应的处理函数当然不同。 * @param[in]   key                       输入键,只可能是其中之一 *                                             ASCII  *                                             删除键 *                                             回车键 *                                             返回键 *                                             方向键:   上/下/左/右/向上翻页/向下翻页/ **/EFI_STATUSEFIAPIFileBufferHandleInput (  IN CONST EFI_INPUT_KEY *Key  ){  EFI_STATUS  Status;                       Status = EFI_SUCCESS;                  // local 变量初始化  switch (Key->ScanCode) {                // 对输入的键进行分发  //  // ordinary key input  //  //  //  第一种怀况就是常规输入,然后分两种CASE, 如是打开的文件是只读的,直接告诉用户“只读文件不能被修改”  //   case SCAN_NULL:    if (!FileBuffer.ReadOnly) {      Status = FileBufferDoCharInput (Key->UnicodeChar);    } else {      Status = StatusBarSetStatusString (L"Read Only File Can Not Be Modified");    }    break;  //  // up arrow  //  case SCAN_UP:    Status = FileBufferScrollUp ();    break;  //  // down arrow  //  case SCAN_DOWN:    Status = FileBufferScrollDown ();    break;  //  // right arrow  //  case SCAN_RIGHT:    Status = FileBufferScrollRight ();    break;  //  // left arrow  //  case SCAN_LEFT:    Status = FileBufferScrollLeft ();    break;  //  // page up  //  case SCAN_PAGE_UP:    Status = FileBufferPageUp ();    break;  //  // page down  //  case SCAN_PAGE_DOWN:    Status = FileBufferPageDown ();    break;  //  // delete  //  case SCAN_DELETE:    if (!FileBuffer.ReadOnly) {      Status = FileBufferDoDelete ();    } else {      Status = StatusBarSetStatusString (L"Read Only File Can Not Be Modified");    }    break;  //  // home  //  case SCAN_HOME:    FileBufferMovePosition (FileBuffer.FilePosition.Row, 1);    Status = EFI_SUCCESS;    break;  //  // end  //  case SCAN_END:    Status = FileBufferEnd ();    break;  //  // insert  //  case SCAN_INSERT:    FileBuffer.ModeInsert = (BOOLEAN)!FileBuffer.ModeInsert;    Status = EFI_SUCCESS;    break;  default:    Status = StatusBarSetStatusString (L"Unknown Command");    break;  }  return Status;}


编辑器一个重要的功能,就是光标随着键盘的输入,不断的响应。

那其实,EDK II 里面已经提供了现成的函数,拿过来调用就是了。


/**  Set the cursor position according to FileBuffer.DisplayPosition.  @retval EFI_SUCCESS           The operation was successful.**//** *  根据 FileBuffer.DisplayPosition 来调整光标的位置 *  @ retval EFI_SUCCESS        操作成功。 * */EFI_STATUSEFIAPIFileBufferRestorePosition (  VOID  ){  //  // set cursor position  //  // 现成的函数去设置光标的位置  return (gST->ConOut->SetCursorPosition (        gST->ConOut,        FileBuffer.DisplayPosition.Column - 1,        FileBuffer.DisplayPosition.Row - 1        ));}



原创粉丝点击