📄 kwtools.c
字号:
}
}
if(i<ReadSize)break;
tmpPosition+=ReadSize;
if(tmpPosition>filesize-1)
{
EndPostion = tmpPosition;
nextBegin=filesize;
break;
}
Handle->SetPosition(Handle,tmpPosition);
}
Handle->SetPosition(Handle,StartPostion);
ReadSize =(UINTN)(EndPostion-StartPostion+1);
Handle->Read(Handle,&ReadSize,Buffer);//读内容出来
for(i=0;i<ReadSize;i++)
ExBuffer[i]=Buffer[i];
Handle->SetPosition(Handle,nextBegin);
FreePool(Buffer);
return ReadSize;
}
UINTN kwfwrite(VOID *Buffer,UINTN ItemSize,UINTN Length,EFI_FILE_HANDLE Handle)
{
EFI_STATUS Status;
UINTN size;
size = Length * ItemSize;
if (Handle)
Status = Handle->Write(Handle,&size,Buffer);
else
size = 0;
return size;
}
EFI_STATUS kwfclose(EFI_FILE_HANDLE Handle)
{
LIST_ENTRY *Link;
EFI_STATUS Status = EFI_NOT_FOUND;
SHELL_FILE_ARG *Arg;
for (Link=FileList.Flink; Link!=&FileList; Link=Link->Flink)
{
Arg = CR(Link, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
if (Arg->Handle == Handle)
{
KWFreeFileArg(Arg);
Status = EFI_SUCCESS;
break;
}
}
return Status;
}
UINT64 kwfsize(EFI_FILE_HANDLE Handle)
{
EFI_FILE_INFO *FileInfo;
UINTN FileInfoSize;
EFI_GUID infotype = EFI_FILE_INFO_ID;
EFI_STATUS Status;
UINT64 FileSize = 0;
FileInfoSize = sizeof(EFI_FILE_INFO) + 1024; // bug,bug
FileInfo = AllocatePool(FileInfoSize);
if (FileInfo)
{
Status = Handle->GetInfo(Handle,&infotype,&FileInfoSize,FileInfo);
if (!EFI_ERROR(Status))
{
FileSize = (INT64)FileInfo->FileSize;
FreePool(FileInfo);
}
}
return FileSize;
}
UINT64 kwftell(EFI_FILE_HANDLE Handle)
{
UINT64 Position;
if (Handle)
Handle->GetPosition(Handle,&Position);
else
Position = 0;
return Position;
}
UINT64 kwfseek(EFI_FILE_HANDLE Handle,INT64 Offset,INTN Origin)
{
UINT64 Position = 0;
UINT64 FileSize;
if (Handle)
{
if (Origin == FILESEEK_CUR)
{
Handle->GetPosition(Handle,&Position);
Position += Offset;
}
else if (Origin == FILESEEK_END)
{
FileSize = kwfsize(Handle);
Position = FileSize;
}
else if (Origin == FILESEEK_SET)
{
Position = Offset;
}
Handle->SetPosition(Handle,Position);
}
return Position;
}
BOOLEAN kwfeof(EFI_FILE_HANDLE Handle)
{
if(kwftell(Handle)>=kwfsize(Handle))
return TRUE;
return FALSE;
}
UINT64 GetFileSize(CHAR16 *filename)
{
EFI_FILE_HANDLE fp;
UINT64 filesize;
if((fp=kwfopen(filename,L"rb"))==NULL)return 0;
filesize = kwfsize(fp);
kwfclose(fp);
return filesize;
}
/*
//系统事件的数组
EFI_EVENT KW_WaitEventList[MAX_BS_WAITEVENT_NUM]; //system timer, include 3 events
INTN KW_nWaitEventCount=0; //系统事件的个数
//系统定时器
INTN KW_nTimerCount=0; //系统窗口定时器的个数
TAG_TIGERTIMER KW_Timer[MAX_BS_WAITEVENT_NUM];
//设置一个定时器
void SetTimer(UINTN TimerID, UINTN nMilSec)
{
EFI_STATUS Status;
TAG_TIGERTIMER wndtimer;
wndtimer.Period = nMilSec * 1000*10;
wndtimer.EventID = TimerID;
Status = BS->CreateEvent(EVT_TIMER, 0, NULL, NULL, &wndtimer.EventHandle);
if (EFI_ERROR(Status))
Print(L"Create Event Error:%r\n\r",Status);
Status = BS->SetTimer(wndtimer.EventHandle, TimerPeriodic, wndtimer.Period);
if (EFI_ERROR(Status))
Print(L"SetTimer Error:%r\n\r",Status);
//添加到系统的定时器列表中
KW_Timer[KW_nTimerCount].Period = wndtimer.Period;
KW_Timer[KW_nTimerCount].EventID = wndtimer.EventID;
KW_Timer[KW_nTimerCount].EventHandle = wndtimer.EventHandle;
KW_nTimerCount++;
UpdateWaitEventList();
}
void UpdateWaitEventList()
{
INTN i;
for (i=0; i<KW_nTimerCount; i++)
{
KW_WaitEventList[i] = KW_Timer[i].EventHandle;
}
KW_nWaitEventCount = KW_nTimerCount;
#ifdef WEBFTP_DEBUG_VER
KW_WaitEventList[KW_nWaitEventCount] = ST->ConIn->WaitForKey;
KW_Timer[KW_nWaitEventCount].EventID = EVENT_KEYPRESSED;
KW_nWaitEventCount++;
#endif
}
void KillTimer(UINTN TimerID)//删除一个定时器
{
INTN i,j;
for (i=0; i<KW_nTimerCount; i++)
{
if (KW_Timer[i].EventID == TimerID)
{
BS->CloseEvent(KW_Timer[i].EventHandle);
//删除一个定时器
for (j=i; j<KW_nTimerCount-1; j++)
{
KW_Timer[j].Period = KW_Timer[j+1].Period;
KW_Timer[j].EventID = KW_Timer[j+1].EventID;
KW_Timer[j].EventHandle = KW_Timer[j+1].EventHandle;
}
KW_nTimerCount--;
//rearrange the wait event list
UpdateWaitEventList();
return ;
}
}
}
void KillAllTimer()
{
INTN i;
for (i=0; i<KW_nTimerCount; i++)
{
BS->CloseEvent(KW_Timer[i].EventHandle);//删除一个定时器
}
KW_nTimerCount = 0;
KW_nWaitEventCount = 0;
}
//在这里执行定义好的Timer
void OnTimer()
{
EFI_STATUS Status;
INTN WaitIndex;
EFI_INPUT_KEY Key;
UpdateWaitEventList();
while(1)
{
Status = BS->WaitForEvent(KW_nWaitEventCount, KW_WaitEventList, &WaitIndex);
if (EFI_ERROR(Status))
{
Print(L"Wait for Event fail with error:%r\n\r",Status);
}
switch(KW_Timer[WaitIndex].EventID)
{
case EVENT_KEYPRESSED:
Status = ST->ConIn->ReadKeyStroke(ST->ConIn,&Key);
Print(L"\n%d:%c\n",Key.ScanCode,Key.UnicodeChar);
if(Key.ScanCode==23)//ESC
goto Exit;
break;
case EVENT_TEST:
Print(L".");
default:break;
}
}
Exit:
KillAllTimer();
}
*/
#define MAX_BS_WAITEVENT_NUM 32
//事件列表数组
EFI_EVENT KW_EventList[MAX_BS_WAITEVENT_NUM];
KWEvent KW_EventIDList[MAX_BS_WAITEVENT_NUM];
INTN KW_EventCount = 0;//当前事件个数
//创建事件
void CreateEvent(EFI_EVENT EventHandle,//事件句柄,为空(NULL)代表创建一个时间触发事件
UINTN EventID, //事件ID
UINTN nMilSec,//时间事件间隔,单位是微秒,只有在EventHandle==NULL时才有效
UINTN EventType)//事件的类型,分为系统和自定义
{
EFI_STATUS Status;
EFI_EVENT timerEvent;
if(EventHandle!=NULL)
{
KW_EventList[KW_EventCount] = EventHandle;
KW_EventIDList[KW_EventCount].EventID = EventID;
KW_EventIDList[KW_EventCount].EventType = EventType;
KW_EventCount++;
}
else //时间事件
{
if(nMilSec<0)return;
Status = BS->CreateEvent(EVT_TIMER, 0, NULL, NULL, &timerEvent);
if (EFI_ERROR(Status))
Print(L"Create Event %d Error:%r\n\r",EventID,Status);
Status = BS->SetTimer(timerEvent, TimerPeriodic, nMilSec* 1000*10);
if (EFI_ERROR(Status))
Print(L"SetTimer Error:%r\n\r",Status);
KW_EventList[KW_EventCount] = timerEvent;
KW_EventIDList[KW_EventCount].EventID = EventID;
KW_EventIDList[KW_EventCount].EventType = EventType;
KW_EventCount++;
}
}
void KillUserEvent(UINTN EventID)//关闭用户事件
{
INTN i;
for (i=0; i<KW_EventCount; i++)
{
if ((KW_EventIDList[i].EventID == EventID)
&&(KW_EventIDList[i].EventType==EVENTTYPE_USER))
{
BS->CloseEvent(KW_EventList[i]);
//将尾部的事件调过来
if(i!=(KW_EventCount-1))
{
KW_EventList[i] = KW_EventList[KW_EventCount-1];
KW_EventIDList[i].EventID = KW_EventIDList[KW_EventCount-1].EventID;
KW_EventIDList[i].EventType = KW_EventIDList[KW_EventCount-1].EventType;
}
KW_EventCount--;
return ;
}
}
}
void KillAllUserEvent()//关闭所有时间事件
{
INTN i;
for (i=0; i<KW_EventCount; i++)
{
if(KW_EventIDList[i].EventType==EVENTTYPE_USER)
{
BS->CloseEvent(KW_EventList[i]);
}
}
KW_EventCount=0;
}
void ProcessEvent()//处理事件,全局循环,仅供参考
{
EFI_STATUS Status;
INTN WaitIndex;
EFI_INPUT_KEY Key;
while(1)
{
Status = BS->WaitForEvent(KW_EventCount, KW_EventList, &WaitIndex);
if (EFI_ERROR(Status))
{
Print(L"Wait for Event fail with error:%r\n\r",Status);
}
switch(KW_EventIDList[WaitIndex].EventID)
{
case EVENT_KEYPRESSED:
Status = ST->ConIn->ReadKeyStroke(ST->ConIn,&Key);
Print(L"\n%d:%c\n",Key.ScanCode,Key.UnicodeChar);
if(Key.ScanCode==23)//ESC
goto Exit;
break;
case EVENT_TEST:
Print(L".");
default:break;
}
}
Exit:
KillAllUserEvent();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -