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

📄 kwtools.c

📁 EFI(Extensible Firmware Interface)是下一代BIOS
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************
Copyright (c) 2005  Lenovo Corporation
All rights reserved.

Module Name:
    kwTools.c    

Abstract:
	提供常用好使的工具函数

Author: WangZhe
Revision History

********************************************************/

#include "kwTools.h"

extern const UINTN  UNICODE_GB_COUNT;
extern const CHAR8  UNICODE_GB_TABLE[];

#define WEBFTP_DEBUG_VER	//调试版

void *MEM_ALLOC( UINTN n )//开辟内存
{
	void *p = NULL;
	p = AllocateZeroPool (n);
	
	return p;
}

void MEM_FREE( void *pBase )//释放内存
{
	FreePool(pBase);
}

//返回最终8为字符串的长度
INTN 	String16To8(CHAR16* SrcStr, CHAR8* DestStr)
{
	INTN counter = 0;
	CHAR16 * pchar16;

  	if (SrcStr == NULL) 
 		return -1;

  	pchar16 = SrcStr;
 		
   while ( (*pchar16 != 0) && (*pchar16 != EOF))
  	{
		if (*pchar16 & 0xff00)  //chinese word, dissolve into 2 char
		{  
			//DestStr[counter++] = (*pchar16 >> 8) & 0xff; 
			//DestStr[counter++] = *pchar16  & 0xff; 
			DestStr[counter++] = UNICODE_GB_TABLE[(*pchar16) * 2]; 
			DestStr[counter++] = UNICODE_GB_TABLE[(*pchar16) * 2+1]; 
		}
		else				//english word
			DestStr[counter++] = *pchar16  & 0xff; 		
		pchar16++;
  	}

	DestStr[counter] = 0;
	return counter;
}


//返回最终16为字符串的长度
INTN 	String8To16(CHAR8* SrcStr, CHAR16* DestStr)
{
	INTN len=0,counter = 0;
	CHAR8 * pchar;
	CHAR16 unicodechar;

 	pchar = SrcStr;
 	if (pchar == NULL) 
 		return -1;
 		
   while ( (*pchar != 0) && (*pchar != EOF))
  	{
  		unicodechar = 0;
  		if (*pchar < 0x80)	//english word
  		{
			unicodechar = *pchar;
  			pchar = pchar + 1;
  			len++;
  		}
  		else	//chinese world
  		{
  			unicodechar = *(pchar);
  			unicodechar = unicodechar << 8;
  			unicodechar += *(pchar+1);

  			pchar = pchar + 2;
  			len++;
  			len++;
  		}
		DestStr[counter++] = unicodechar;
  	}

	DestStr[counter] = 0;
	return counter;

}

//返回最终16为字符串的长度
//将接收的宽8位字符串(其实已经是Unicode编码形式了),变成Unicode
//只有连续2个SrcStr为0,才是结尾
INTN 	StringWide8To16(CHAR8* SrcStr, CHAR16* DestStr)
{
	INTN counter = 0;
	CHAR8 * pchar;
	CHAR16 unicodechar;

 	pchar = SrcStr;
 	if (pchar == NULL) 
 		return -1;
 		
   while (!((*pchar == 0) && (*(pchar+1)== 0)))
  	{
  		unicodechar = 0;
		unicodechar = *(pchar);
  		unicodechar = unicodechar << 8;
  		unicodechar += *(pchar+1);
  		pchar += 2;
		DestStr[counter++] = unicodechar;
  	}

	DestStr[counter] = 0;
	return counter;
}


//-----------------------------------------------------------------------------
// Copy from SEnv
//-----------------------------------------------------------------------------
VOID
KWFreeFileArg (
    IN SHELL_FILE_ARG   *Arg
)
{
    //
    // Free memory for all elements belonging to Arg
    //
    if (Arg->Parent)
        Arg->Parent->Close (Arg->Parent);

    if (Arg->ParentName)
        FreePool (Arg->ParentName);

    if (Arg->ParentDevicePath)
        FreePool (Arg->ParentDevicePath);

    if (Arg->FullName)
        FreePool (Arg->FullName);

    if (Arg->FileName)
        FreePool (Arg->FileName);

    if (Arg->Handle)
        Arg->Handle->Close (Arg->Handle);

    if (Arg->Info)
        FreePool (Arg->Info);

    if (Arg->Link.Flink)
        RemoveEntryList (&Arg->Link);

    //
    // Free memory for Arg
    //
    FreePool (Arg);
}



//-----------------------------------------------------------------------------
// File System
//-----------------------------------------------------------------------------
LIST_ENTRY FileList;
UINTN InitFileListFlag = 0;
EFI_FILE_HANDLE kwfopen(CHAR16 *filename,CHAR16 *AccessMode)
{
    EFI_STATUS Status;
    SHELL_FILE_ARG          *FileArg;
    EFI_FILE_HANDLE			File = 0;
	UINT64 					OpenMode = 0;
	CHAR16 					ch;
	BOOLEAN 				CreateNewFile=FALSE;
	EFI_FILE_INFO        *FileInfo;
	INTN				FileInfoSize=SIZE_OF_EFI_FILE_INFO + 1024;
	LIST_ENTRY			*Link;
	
    if (InitFileListFlag == 0)
    {
        InitializeListHead (&FileList);
        InitFileListFlag |= 1;
    }

    OpenMode = 0;
    do {
        if (AccessMode)
            ch = *AccessMode++;
        else
            ch = 0;
 
        if (ch == 'r')
        {
            OpenMode |= EFI_FILE_MODE_READ;
        }
        else if (ch == '+')
        {
            OpenMode |= EFI_FILE_MODE_READ;
            OpenMode |= EFI_FILE_MODE_WRITE;
        }
        else if (ch == 'w')
        {
            OpenMode |= EFI_FILE_MODE_CREATE;
            OpenMode |= EFI_FILE_MODE_WRITE;
            CreateNewFile=TRUE;
        }
        else
            ch = 0;
    } while (ch);
    
    Status = ShellFileMetaArg(filename, &FileList);
    if (EFI_ERROR(Status))
    {
            Status = EFI_NOT_FOUND;
            Print(L"open file error!\n");
    }
    if (IsListEmpty(&FileList))
    {
            Status = EFI_NOT_FOUND;
            Print(L"open file error!\n");
    }
    //FileArg = CR(FileList.Flink, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);

    for (Link=FileList.Flink; Link!=&FileList; Link=Link->Flink)
    {
        FileArg = CR(Link, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
        if (StrCmp(FileArg->FileName,filename)==0)
        {
           break;
        }
    }

    if (OpenMode & EFI_FILE_MODE_CREATE)
    {
         	Status = FileArg->Parent->Open(FileArg->Parent,
                                   &FileArg->Handle,
                                   FileArg->FileName,
                                   FILE_CREATE,
                                   0
                                  );
        	if (EFI_ERROR(Status))
        		//return EFI_NOT_FOUND;
        		return NULL;
      	
     }                    
    
    File = FileArg->Handle;
    
    if(CreateNewFile)//如果是新创建文件,将它清空
    {
		//创建文件属性INFO,开辟空间
	    FileInfo = (EFI_FILE_INFO*)AllocatePool(FileInfoSize);
		//获取文件属性
	    File->GetInfo (File, &GenericFileInfo,&FileInfoSize, FileInfo );
		//设置文件属性
		FileInfo->FileSize = 0;
		File->SetInfo( File,&GenericFileInfo,(UINTN) FileInfo->Size,FileInfo);
	    if (FileInfo != NULL){
	           BS->FreePool (FileInfo);
		}

    }
    return File;
}

UINTN kwfread(VOID *Buffer,UINTN ItemSize,UINTN Length,EFI_FILE_HANDLE Handle)
{
    EFI_STATUS Status;
    UINTN size;

    size = Length * ItemSize;
    if (Handle)
        Status = Handle->Read(Handle,&size,Buffer);
    else
        size = 0;

    return size;
}

//读出Handle此时所处位置的一行出来行的结束标记是\n\r就是 0D 0A
//返回这一行的长度,读取完毕后Handle处于\r后的那个位置
UINTN kwfreadLine(UINT8 *ExBuffer,EFI_FILE_HANDLE Handle)
{
	UINT8	*Buffer = NULL;
	UINT64	StartPostion;//行的开始位置
	UINT64	EndPostion;//行的结束位置
	UINT64	CurPosition,tmpPosition;
	UINTN	ReadSize;
	UINT64	i,filesize;
	UINT64	nextBegin;//读取完毕后位置
	filesize = kwfsize(Handle);
	BS->AllocatePool(EfiLoaderData,1024, &Buffer);//开辟缓冲区
	if (Buffer == NULL) {
			Print(L"Can not allocate a buffer\n");
			return 0;
	}
	Handle->GetPosition(Handle,&CurPosition);
	tmpPosition = CurPosition;
	//从文件指针现在的位置,向前读取1024个字节
	//寻找此行开始位置
	while(1)
	{
		if(tmpPosition<=0)
			{
				StartPostion=0;break;
			}
		else
			{

				if(tmpPosition<1024)//前面的数据不足1024个
				{
					Handle->SetPosition(Handle,0);//指针到文件头
					ReadSize = (UINTN)tmpPosition+1;
				}
				else //可以读取1024个字节出来
				{
					Handle->SetPosition(Handle,tmpPosition-1023);//指针到文件头
					ReadSize = 1024;
				}
				Handle->Read(Handle,&ReadSize,Buffer);//读内容出来
				for(i=ReadSize-1;i>=1;i--)//寻找分割符\n\r
				{
					if((Buffer[i-1]==0x0d)&&(Buffer[i]==0x0a))
					{
						StartPostion = CurPosition-ReadSize+2+i;//找到开始位置
						break;
					}
				}
				if(i>=1)break;
				Handle->GetPosition(Handle,&tmpPosition);
			}
	}
	//向后找,找到此行结束位置
	tmpPosition = CurPosition;
	Handle->SetPosition(Handle,tmpPosition);
	while(1)
	{
		if((filesize-tmpPosition+1)<1024)//到结尾不足1024个
			ReadSize = (UINTN)(filesize-tmpPosition);
		else ReadSize = 1024;
		Handle->Read(Handle,&ReadSize,Buffer);//读内容出来
		for(i=0;i<ReadSize;i++)//寻找分割符\n\r
				{
					if((Buffer[i]==0x0d)&&(Buffer[i+1]==0x0a))
					{
						EndPostion =CurPosition+i-1;//找到结束位置
						nextBegin =CurPosition+i+2;
						if(nextBegin>filesize)nextBegin=filesize;
						break;

⌨️ 快捷键说明

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