⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kwtools.c

📁 EFI(Extensible Firmware Interface)是下一代BIOS
💻 C
📖 第 1 页 / 共 2 页
字号:
					}
				}
		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 + -