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

📄 filesystem.c

📁 EFI(Extensible Firmware Interface)是下一代BIOS
💻 C
📖 第 1 页 / 共 2 页
字号:
	     //no more entries
	     if (BufSize == 0) 
	     {
	        break;
	     }


		//隐藏文件不显示
		if ( (Info->Attribute & EFI_FILE_HIDDEN)
			|| ( StrCmp(Info->FileName,L".") == 0)
			|| ( StrCmp(Info->FileName,L"..") == 0))
			continue;
	
	    //添加一个文件节点
		fileitem = (FILEITEM*)MEM_ALLOC(sizeof(FILEITEM));
	    if(!fileitem)
	    {
	    	Print(L"alloc memory error!\r\n");
		    DirHandle->Close(DirHandle);
	    	return;
	    };
		fileitem->Signature = EFI_FILEITEM_SIGNATURE;
		StrCpy(fileitem->FileName , Info->FileName);

	    if (Info->Attribute & EFI_FILE_DIRECTORY)
	    {
		    fileitem->bDirectory = TRUE;
	    }
	    else
	    {
		    fileitem->bDirectory = FALSE;
	    }
		
		InsertTailList(&this->DirFileList,&fileitem->LinkFile);

    }

	if (Info) 
	{
	  FreePool(Info);
	}

	DirHandle->Close(DirHandle);
	
	//只有当根目录以下的目录开始时,才需要体添加路径
	if ( (StrCmp(DirName, L"..") != 0) && (StrLen(DirName) >0))
	{
		//添加一个当前当前目录
		fileitem = (FILEITEM*)MEM_ALLOC(sizeof(FILEITEM));
		fileitem->Signature = EFI_FILEITEM_SIGNATURE;
		StrCpy(fileitem->FileName , DirName);

	    fileitem->bDirectory = TRUE;
		InsertTailList(&this->DirFilePathList,&fileitem->LinkFile);
	}
}

void ComposeCurDir(struct _FileMgrControl *this,OUT CHAR16 *CurDir, IN INTN CurDirLen)
{
    LIST_ENTRY      *Link;
	FILEITEM *Prot;

	ZeroMem(CurDir, CurDirLen);
	StrCpy(CurDir,L"\\");
	
    for (Link = this->DirFilePathList.Flink; Link != &this->DirFilePathList; Link = Link->Flink)
    {
	    Prot = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
	    StrCat(CurDir, Prot->FileName);
	    StrCat(CurDir, L"\\");
    }
}
void GoParentDir(struct _FileMgrControl *this)
{
    LIST_ENTRY      *Link;
	FILEITEM *Prot;

    Link = this->DirFilePathList.Blink; 
    if (Link != &this->DirFilePathList)
    {
	    Prot = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
        RemoveEntryList (&Prot->LinkFile);

        FreePool(Prot);
    }
}


//刷新文件管理器,重新映射
void FileMGR_ReMap(struct _FileMgrControl *this)
{
	ClearFSList(this);
//	Print(L"ClearFSList\n");
	ClearFileList(this);
//	Print(L"ClearFileList\n");
	ClearFilePathList(this);
//	Print(L"ClearFilePathList\n");

	this->CurRootFs = NULL;

	ListFileSystem(this);
//	Print(L"ListFileSystem\n");
	DisplayFileSystem(this);
//	Print(L"DisplayFileSystem\n");
}

//刷新当前目录的内容
void FileMGR_Refresh(struct _FileMgrControl *this)
{
    LIST_ENTRY      *Link;
	CHAR16 buf[MAX_FILEPATH_LENGTH];
	FILEITEM *FileProt;

	//如果root fs为空,说明当前在分区列表,不进行目录刷新
	if (!this->CurRootFs)
		return;
	
	if (IsListEmpty(&this->DirFilePathList))
	{
		//说明此时正在根目录下面
		ListDirFile(this, this->CurRootFs, L"");	
	}
	else
	{
		//最后一个节点
	    Link = this->DirFilePathList.Blink; 
	    if (Link != &this->DirFilePathList)
	    {
		    FileProt = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
			StrCpy(buf, FileProt->FileName);
			
			//先回到上级目录
			GoParentDir(this);
			//再把当前目录重新打开
			ListDirFile(this, this->CurRootFs, buf);			    
	    }	
	}
	/*
	//往LISTBOX中填写数据
	this->ListBox.Clear(&this->ListBox);

//	this->ListBox.AddItem(&this->ListBox, L"[..]", 0,PARENT_DIRECTORY);
	this->ListBox.AddItem(&this->ListBox, L"..", 0,PARENT_DIRECTORY);
    for (Link = this->DirFileList.Flink; Link != &this->DirFileList; Link = Link->Flink)
    {
	    FileProt = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
		ZeroMem(buf, MAX_FILEPATH_LENGTH);
		if (FileProt->bDirectory)
		{
			//SPrint(buf, MAX_FILEPATH_LENGTH, L"[%s]", FileProt->FileName);
			SPrint(buf, MAX_FILEPATH_LENGTH, L"%s", FileProt->FileName);
		}
		else
		{
			SPrint(buf, MAX_FILEPATH_LENGTH, L"%s", FileProt->FileName);
		}
		this->ListBox.AddItem(&this->ListBox, buf, (UINT32)FileProt,kind);
    }
    
    this->ListBox.control.Draw((WndControl*)this);
    */
}

/*
//获取当前的文件路径
EFI_STATUS FileMGR_GetFullPath(struct _FileMgrControl *this,
	OUT CHAR16 *FileVolumnName,
	OUT CHAR16 *FullPathName,
	OUT CHAR16 *FileName,   //返回文件名
	BOOLEAN *bDirectory,      //是否是目录
	IN INT32 Length)
{
    CHAR16 dirBuf[MAX_FILEPATH_LENGTH];
    LIST_ENTRY      *Link;
	FSITEM *Prot;
	FILEITEM *FileProt;

	//如果root fs为空,说明当前在分区列表,不进行目录刷新
	if (!this->CurRootFs)
		return EFI_NOT_FOUND;

	//得到当前的文件卷
    for (Link = this->FileSystemList.Flink; Link != &this->FileSystemList; Link = Link->Flink)
    {
	    Prot = CR (Link, FSITEM, LinkFS, EFI_FSITEM_SIGNATURE);
        if (Prot->RootFs == this->CurRootFs)
        	StrCpy(FileVolumnName, Prot->FSName);
    }


	//得到当前目录
	ComposeCurDir(this, dirBuf, MAX_FILEPATH_LENGTH);
	StrCpy(FullPathName, dirBuf);	

	//得到当前的文件名
	FileProt = (FILEITEM *)this->ListBox.GetItemParam(&this->ListBox, this->ListBox.GetCurSel(&this->ListBox));
	if (FileProt)
	{
		//!!这里必须使用buf作为中间转接,因为在ListDirFile里面,
		//将会把所有的FileProt全部释放内存,故参数会变得无效.澹
		StrCpy(FileName, FileProt->FileName);
		*bDirectory = FileProt->bDirectory;
		
		return EFI_SUCCESS;
	}
	else
		StrCpy(FileName, L"");	//可能是..

	return EFI_SUCCESS; 
}
*/
//根据所给路径,直接打开文件夹并显示
//前提给出的文件名是包含驱动器的完整路径名
//格式如下:
//    .\netcfg\yuhu.efi		//当前驱动器下的路径
// fs2:\music\lmouse.mp3	//绝对路径
void FileMGR_DisplayDir(struct _FileMgrControl *this, CHAR16 *FullRootFath)
{
	//!!这里必须使用buf作为中间转接,因为在ListDirFile里面,
	//将会把所有的FileProt全部释放内存,故参数会变得无效.澹

	LIST_ENTRY  *Link;
	//FILEITEM 	*FileProt;
	CHAR16 		buf[MAX_FILEPATH_LENGTH];
	CHAR16 		DriverLabel[20];//驱动器名称,如fs1: ,  fs3:
	INT32 		i;
	FSITEM 		*Prot;
	EFI_FILE_HANDLE  open_RootFs;


	if(FullRootFath==NULL)return;//错误的路径名
	if(FullRootFath[0]=='.')//打开当前驱动下的目录
	{
		open_RootFs=this->CurRootFs;
	}
	else//打开绝对路径
	{	
		//首先获取驱动器名称
		for(i=0;(FullRootFath[i]!='\\')&&(FullRootFath[i]!='\0');i++)
			DriverLabel[i]=FullRootFath[i];
		if(FullRootFath[i]=='\0')return;//错误的路径名
		DriverLabel[i]='\0';

	    for (Link = this->FileSystemList.Flink; Link != &this->FileSystemList; Link = Link->Flink)
	    {
		    Prot = CR (Link, FSITEM, LinkFS, EFI_FSITEM_SIGNATURE);
			if(StrCmp(Prot->FSLabel,DriverLabel)==0)//找到了对应的驱动器
				{
					this->CurRootFs = Prot->RootFs;
					open_RootFs = Prot->RootFs;
					break;
				}
	    }
	}
		
	//!!这里必须使用buf作为中间转接,因为在ListDirFile里面,
	//将会把所有的FileProt全部释放内存,故参数会变得无效.
	//去掉开头的'\\'
	while((*FullRootFath!='\\')&&(*FullRootFath!='\0'))FullRootFath++;
		if(*FullRootFath=='\0')return;
		FullRootFath++;
	StrCpy(buf,FullRootFath);
	ListDirFile(this,open_RootFs,buf);
	this->CurRootFs=open_RootFs;
	/*
	//往LISTBOX中填写数据
	this->ListBox.Clear(&this->ListBox);
	//this->ListBox.AddItem(&this->ListBox, L"[..]", 0,PARENT_DIRECTORY);
	this->ListBox.AddItem(&this->ListBox, L"..", 0,PARENT_DIRECTORY);
	for (Link = this->DirFileList.Flink; Link != &this->DirFileList; Link = Link->Flink)
	{
		    FileProt = CR (Link, FILEITEM, LinkFile, EFI_FILEITEM_SIGNATURE);
			ZeroMem(buf, MAX_FILEPATH_LENGTH);
			if (FileProt->bDirectory)
			{
				//SPrint(buf, MAX_FILEPATH_LENGTH, L"[%s]", FileProt->FileName);
				SPrint(buf, MAX_FILEPATH_LENGTH, L"%s", FileProt->FileName);
			}
			else
			{
				SPrint(buf, MAX_FILEPATH_LENGTH, L"%s", FileProt->FileName);
			}
			this->ListBox.AddItem(&this->ListBox, buf, (UINT32)FileProt,kind);
	}
	this->ListBox.control.Draw((WndControl*)this);
	*/
}


//创建FileMgr
EFI_STATUS CreateFileMgr(FileMgrControl *this)
{

	this->ReMap = FileMGR_ReMap;
	this->Refresh = FileMGR_Refresh;
	this->DisplayDir = FileMGR_DisplayDir;
		
    InitializeListHead (&this->FileSystemList);
    InitializeListHead (&this->DirFileList);
    InitializeListHead (&this->DirFilePathList);
    this->CurRootFs = NULL;
	this->FilePathLevel = 0;
	CreateContentList(&this->m_ContentList);

	return EFI_SUCCESS;
}
//========================================


void ContentList_AddItem(
struct _ContentList *this, 
CHAR16 *itemcaption,
UINT32 param,
INT32 data)
{
	ContentListITEM *item;
	item = (ContentListITEM*)MEM_ALLOC(sizeof( ContentListITEM)) ;
	item->Signature = EFI_CONTENTLISTITEM_SIGNATURE;
	StrCpy(item->ItemText ,itemcaption);
	item->ItemParam = param;
	item->ItemData = data;
	this->ItemCount ++;
	InsertTailList(&this->LinkItems, &item->Link); 
}

INTN ContentList_GetCount(struct _ContentList *this)
{
	return this->ItemCount;
}

UINT32 ContentList_GetItemParam(struct _ContentList *this, INTN index)
{
    LIST_ENTRY         *ItemLink;
    ContentListITEM    	   *ProtItem;
    INTN num=0;

	if ( (this->ItemCount>0) && (index>=0) && (index <this->ItemCount))
	{
		num = 0;
	    for (ItemLink =  this->LinkItems.Flink; 
	         ItemLink != &this->LinkItems; 
	         ItemLink =  ItemLink->Flink) 
	    {
	    	//找到该Link节点
	    	if (num == index) 
	    	{
	    		break;
	    	}
	    	num++;
	    }         
    	ProtItem = CR(ItemLink, ContentListITEM, Link, EFI_CONTENTLISTITEM_SIGNATURE);
    	return ProtItem->ItemParam;
	}
	return 0;
};

void ContentList_Clear(struct _ContentList *this)
{
    LIST_ENTRY         *ItemLink,*ItemNextLink;
    ContentListITEM    	   *ProtItem;

	if (this->ItemCount>0)
	{
		this->ItemCount = 0;	    //当前滚动的行数
		
	    for (ItemLink =  this->LinkItems.Flink; 
	         ItemLink != &this->LinkItems; 
	         ItemLink =  ItemNextLink) 
	    {
	    	ItemNextLink = ItemLink->Flink;    	
	    	ProtItem = CR(ItemLink, ContentListITEM, Link, EFI_CONTENTLISTITEM_SIGNATURE);
	        RemoveEntryList(&ProtItem->Link);
	        MEM_FREE(ProtItem);
	    }         
	}
}

//查找条款,返回位置
INT32 ContentList_Find(struct _ContentList *this,CHAR16 *pattern,INTN DATA)
{
    LIST_ENTRY         *ItemLink;
    ContentListITEM    	   *ProtItem;
	INT32 i;
    for (i=0,ItemLink =  this->LinkItems.Flink; 
	         ItemLink != &this->LinkItems; 
	         ItemLink =  ItemLink->Flink,i++) 
	    {
	    	ProtItem = CR(ItemLink, ContentListITEM, Link, EFI_CONTENTLISTITEM_SIGNATURE);
			if((ProtItem->ItemData==DATA)&&(StrCmp(ProtItem->ItemText,pattern)==0))
				return i;
	    }         
	return -1;
}

//查找目录,返回位置
INT32 FindDirectory(struct _ContentList *this,CHAR16 *DirectoryName)
{
    LIST_ENTRY         *ItemLink;
    ContentListITEM    	   *ProtItem;
	INT32 i;
    for (i=0,ItemLink =  this->LinkItems.Flink; 
	         ItemLink != &this->LinkItems; 
	         ItemLink =  ItemLink->Flink,i++) 
	    {
	    	ProtItem = CR(ItemLink, ContentListITEM, Link, EFI_CONTENTLISTITEM_SIGNATURE);
			if(	(
					(ProtItem->ItemData==FILE_DIRECTORY)
					||(ProtItem->ItemData==DISKDRIVER)
					||(ProtItem->ItemData==PARENT_DIRECTORY)
				)
				&&(StrCmp(ProtItem->ItemText,DirectoryName)==0))
				return i;
	    }         
	return -1;
}

//查找条款,返回签名
UINT32 *ContentList_GetItemSignature(struct _ContentList *this,INT32 nIndex)
{
	return (UINT32 *)this->GetItemParam(this,nIndex);
}
void CreateContentList(ContentList *this)
{
	//ListBox独有的数据
	this->ItemCount = 0;

	this->AddItem = ContentList_AddItem;
	this->GetCount = ContentList_GetCount;
	this->GetItemParam = ContentList_GetItemParam;
	this->Clear = ContentList_Clear;
	this->Find = ContentList_Find;
	this->GetItemSignature = ContentList_GetItemSignature;
	
	InitializeListHead(&this->LinkItems);

}

void GoComputerRoot(struct _FileMgrControl *this)//到达最外层,看到驱动器
{
	Print(L"Go to computer root\n");
	FileMGR_ReMap(this);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -