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

📄 fsdmgr.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/

/*****************************************************
文件说明:文件系统管理器
版本号:1.0.0
开发时期:2000
作者:李林
修改记录:
	2005-02-24, FileMgr_RegisterVolume 加入 设备文件夹的隐含标志
******************************************************/

#include <eframe.h>
#include <efile.h>
#include <edevice.h>
#include <eapisrv.h>
#include <eobjlist.h>
#include <efsdmgr.h>
#include <epdev.h>
#include <epfs.h>
#include <eshell.h>
#include <filesrv.h>
#include <estring.h> 
#include <eassert.h>

#define MAX_VOL_NUM 16
#define FSDMGR_ZONE 0

typedef struct _FSDMGR
{
    struct _FSDMGR * lpNext;
    LPFSDDRV lpfsd;
    LPTSTR lpszFSDName;
}FSDMGR, * PFSDMGR;

//static PFSDMGR pSysfsd = NULL;
// 查找文件对象链表
static _LPFINDDATA lpFindObjList = NULL;
// 卷对象链表
static _LPVOLUME lpVolLink=NULL;

/*
// **************************************************
// 声明:
// 参数:
//		
// 返回值:
//		
// 功能描述:
//		
// 引用: 
// **************************************************

static LPFSDDRV GetFSD( LPCTSTR lpcszFSDName )
{
    PFSDMGR pfsd = pSysfsd;
    while( pfsd )
    {
        if( stricmp( pfsd->lpszFSDName, lpcszFSDName ) == 0 )
            return pfsd->lpfsd; //found
        pfsd = pfsd->lpNext;
    }
    return NULL;
}
*/


// **************************************************
// 声明:HANDLE WINAPI FileMgr_AttachDevice( HANDLE hFSD, LPCTSTR lpszDeviceName )
// 参数:
//		IN hFSD - 文件系统驱动程序对象句柄(由文件系统驱动程序 调用FileMgr_RegisterFSD/Dev_RegisterFSD所传递的参数)
//		IN lpszDeviceName - 需要与文件系统关联的设备名(如:DSK2,RAM1)
// 返回值:
//		假如成功,返回非NULL的句柄;否则,返回NULL
// 功能描述:
//		将一个设备与已经注册的文件系统关联
// 引用: 
//		系统API
// **************************************************
HANDLE WINAPI FileMgr_AttachDevice( HANDLE hFSD, LPCTSTR lpszDeviceName )
{
    LPFSDDRV lpfsd = (LPFSDDRV)hFSD;
    TCHAR buf[6];
	
    if( lpfsd )
    {   // 分配_FSDDSK结构对象     
        _LPFSDDSK lpdsk = (_LPFSDDSK)malloc( sizeof( _FSDDSK ) );
        if( lpdsk )
        {   // 将设备名组合成 "XXX1:" 的形式
			strncpy( buf, lpszDeviceName, 4 );
			buf[4] = ':';
			buf[5] = 0;	  
			// 打开该设备文件
			lpdsk->hFile = CreateFile(
				buf, 
				GENERIC_WRITE|GENERIC_READ, 
				0,
				NULL, 
				OPEN_EXISTING,
				0, 
				NULL );
			DEBUGMSG(FSDMGR_ZONE, (TEXT("FileMgr_AttachDevice: CreateFile-%s, handle=%x\r\n"), buf, lpdsk->hFile));
			
			if( lpdsk->hFile != INVALID_HANDLE_VALUE )
			{	// 打开文件成功
				lpdsk->lpfsd = lpfsd;
				// 得到磁盘信息
				FileMgr_GetDiskInfo( (HDSK)lpdsk, &lpdsk->fdi );
				// 安装磁盘卷
				if( lpfsd->lpMountDisk( (HDSK)lpdsk ) )   //-> regist volume
				{
					return (HANDLE)lpdsk;
				}
				else
				{
					WARNMSG( FSDMGR_ZONE, (TEXT("error in FileMgr_AttachDevice(%s): MountDisk(0x%x) failure.\r\n"), buf, lpdsk ));
				}
			}
			else
			{
				WARNMSG( FSDMGR_ZONE, (TEXT("error in FileMgr_AttachDevice: CreateFile(%s) failure.\r\n"), buf ) );
			}
			// 打开文件不成功
			free( lpdsk );
        }
    }
	WARNMSG(1, (TEXT("error in FileMgr_AttachDevice: Attach device failure.\r\n") ));
    return NULL;
}

// **************************************************
// 声明:BOOL WINAPI FileMgr_DetachDevice( HANDLE hDsk )
// 参数:
//		IN hDsk - 磁盘对象句柄	
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		将一个设备与已经注册的文件系统断开联结
// 引用: 
//		系统API
// **************************************************
BOOL WINAPI FileMgr_DetachDevice( HANDLE hDsk )
{
    _LPFSDDSK lpdsk = (_LPFSDDSK)hDsk;

	DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_DetachDevice:hDsk=%x.\r\n", hDsk ) );
	if( lpdsk )
	{
		_LPFINDDATA lpFindData;

		DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_DetachDevice:Call UnmountDisk.\r\n" ) );
		// 卸下磁盘卷
		lpdsk->lpfsd->lpUnmountDisk( (DWORD)hDsk );
		// 将系统的与该磁盘关联的搜索句柄释放掉
		// 
		// EnterCS ???
		lpFindData = lpFindObjList;
		// 
		while( lpFindData )
		{
			_LPFINDDATA lpNext;
			_LPVOLUME lpVol = (_LPVOLUME)lpFindData->hVol;

			if( lpVol->lpdsk == hDsk )
			{
				lpNext = (_LPFINDDATA)lpFindData->obj.lpNext;
				// 关闭搜索句柄
				FileMgr_CloseSearchHandle( lpFindData );
				lpFindData = lpNext;
			}
			else
			    lpFindData = (_LPFINDDATA)lpFindData->obj.lpNext;
		}
		// LeaveCS ???		
		CloseHandle( lpdsk->hFile );

		free( lpdsk );
		return TRUE;
	}
	return FALSE;
}
 
// **************************************************
// 声明:BOOL WINAPI FileMgr_RegisterFSD ( LPCTSTR lpcszFSDName, 
//                                         const FSDDRV * lpfsd )
// 参数:
//		IN lpcszFSDName - 文件系统名
//		IN lpfsd - 文件系统接口
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		注册文件系统驱动程序
// 引用: 
//		系统API
// **************************************************
BOOL WINAPI FileMgr_RegisterFSD ( LPCTSTR lpcszFSDName, const FSDDRV * lpfsd )
{
    FSDINITDRV fsdInit = { FileMgr_AttachDevice,    
		                   FileMgr_DetachDevice };
	DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterFSD:lpcszFSDName=%s,lpfsd=%x.\r\n", lpcszFSDName, lpfsd ) );
    return Dev_RegisterFSD( lpcszFSDName, (HANDLE)lpfsd, &fsdInit );
}

// **************************************************
// 声明:BOOL WINAPI FileMgr_UnregisterFSD ( LPCTSTR lpcszFSDName )
// 参数:
//		IN lpcszFSDName - 文件系统名
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		与FileMgr_RegisterFSD相反,注销文件系统驱动程序
// 引用: 
//		系统API
// **************************************************
BOOL WINAPI FileMgr_UnregisterFSD ( LPCTSTR lpcszFSDName )
{
    return Dev_UnregisterFSD( lpcszFSDName );
}

// **************************************************
// 声明:HANDLE WINAPI FileMgr_CreateFileHandle( 
//                               HVOL hVol, 
//                               HANDLE hProc,
//                               PFILE pFile )
// 参数:
//		IN hVol - 卷对象
//		IN hProc - 拥有者进程对象
//		IN pFile - 由文件系统驱动程序产生的私有对象
// 返回值:
//		假如成功,返回非 INVALID_HANDLE_VALUE ; 否则,返回 INVALID_HANDLE_VALUE
// 功能描述:
//		创建与文件对象关联的文件句柄
// 引用: 
//		系统API
// **************************************************
HANDLE WINAPI FileMgr_CreateFileHandle( 
                               HVOL hVol, 
                               HANDLE hProc,
                               PFILE pFile )
{
	// 该功能具体实现已没有,已被移入 fsmain.c 's FileSys_CreateFile
	return (HANDLE)pFile;
}

// **************************************************
// 声明:BOOL WINAPI FileMgr_CloseFileHandle( HANDLE hFile )
// 参数:
//		IN hFile - 文件句柄
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		关闭文件句柄
// 引用: 
// **************************************************
BOOL WINAPI FileMgr_CloseFileHandle( HANDLE hFile )
{
	// 该功能具体实现已没有
	return TRUE;
}

// **************************************************
// 声明:HANDLE WINAPI  FileMgr_CreateSearchHandle(
//                                  HVOL hVol, 
//                                  HANDLE hProc,
//                                  PFIND pfd )
// 参数:
//		IN hVol - 卷对象
//		IN hProc - 拥有者进程句柄
//		IN pfd - 由文件系统驱动程序创建的私有对象
// 返回值:
//		假如成功,返回非NULL句柄;否则,返回NULL
// 功能描述:
//		创建一个能被本管理器管理的搜索对象
// 引用: 
//		系统API
// **************************************************
HANDLE WINAPI  FileMgr_CreateSearchHandle(
                                  HVOL hVol, 
                                  HANDLE hProc,
                                  PFIND pfd )
{	// 分配 _FINDDATA 结构对象
    _LPFINDDATA lpfd =(_LPFINDDATA) malloc( sizeof( _FINDDATA ) );
    
    if( lpfd )
    {
        lpfd->hVol = hVol;
        lpfd->pFind = pfd; 
        // 加入搜索对象链表
		ObjList_Init( (LPOBJLIST*)&lpFindObjList, &lpfd->obj, OBJ_FINDFILE, (ULONG)hProc );
    }
    return (HANDLE)lpfd;
}

// **************************************************
// 声明:BOOL WINAPI FileMgr_CloseSearchHandle( HANDLE hFind )
// 参数:
//		IN hFind - 搜索句柄对象(由 FileMgr_CreateSearchHandle 创建)
// 返回值:
//		假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
//		关闭搜索句柄
// 引用: 
//		系统API
// **************************************************
BOOL WINAPI FileMgr_CloseSearchHandle( HANDLE hFind )
{
	_LPFINDDATA lpfd = _GetHFINDPtr( hFind );

	if( lpfd )
	{   // 从搜索对象链表中移出搜索句柄对象
		ObjList_Remove( (LPOBJLIST*)&lpFindObjList, &lpfd->obj );
		// 释放
		free( lpfd );
		return TRUE;
	}
	return FALSE;
}

// **************************************************
// 声明:int WINAPI FileMgr_GetVolumeName( 
//							HVOL hVol, 
//							LPTSTR lpszName,
//							int cMax )
// 参数:
//		IN hVol - 卷对象
//		IN lpszName - 用于接受卷文件名的缓存
//		IN cMax - 用于接受卷文件名的缓存大小
// 返回值:
//		实际拷贝到 lpszName 的文件名字符串数
// 功能描述:
//		得到卷文件名
// 引用: 
//		系统API
// **************************************************
int WINAPI FileMgr_GetVolumeName( 
    HVOL hVol, 
    LPTSTR lpszName,
    int cMax )
{
    _LPVOLUME lpVol = (_LPVOLUME)hVol;

    DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_GetVolumeName: lpVol->lpszVolName(%s).lpszName=(0x%x).\r\n", lpVol->lpszVolName, lpszName ) );
	strncpy( lpszName, lpVol->lpszVolName, cMax );
    return strlen( lpszName );
}

#define TOUPPER( c ) ( ( (c) >= 'a' && (c) <= 'z' ) ? ((c) - 'a' + 'A') : (c) )
#define TOLOWER( c ) ( ( (c) >= 'A' && (c) <= 'Z' ) ? ((c) - 'A' + 'a') : (c) )

// **************************************************
// 声明:int vol_nicmp( const char *szCmpVol, int szCmpVolLen, const char *szSysVol  )
// 参数:
//		IN szCmpVol - 卷名1
//		IN szCmpVolLen - 卷名1的长度
//		IN szSysVol - 卷名2
// 返回值:
//		假如 szCmpVol > szSysVol, 返回 1;
//		假如 szCmpVol < szSysVol, 返回 -1;
//		假如 szCmpVol == szSysVol,返回 0;
// 功能描述:
//		比较字符串的的大小
// 引用: 
// **************************************************
static int vol_nicmp( const char *szCmpVol, int szCmpVolLen, const char *szSysVol  )
{
	register const unsigned char * p1 = (const unsigned char *)szCmpVol;
	register const unsigned char * p2 = (const unsigned char *)szSysVol;
    register int count = szCmpVolLen;
	register unsigned char s1;
	register unsigned char s2;


	while( count )
	{
		s1 = *p1++;
		s2 = *p2++;

		count--;
		s1 = TOUPPER(s1);
		s2 = TOUPPER(s2);
		if(  s1 > s2 )
			return 1;
		else if( s1 < s2 )
			return -1;
		else if( s1 == 0 && s2 == 0 )
			return 0;
	}
	if( *p2 )
		return -1;

	return 0;
}

// **************************************************
// 声明:_LPVOLUME _FileMgr_FindVolume( 
//						LPCTSTR lpcszVolName, 
//						UINT uNameLen )
// 参数:
//		IN lpcszVolName - 卷名
//		IN uNameLen - 卷名的长度
// 返回值:
//		假如找到,返回卷结构指针;否则,返回 NULL
// 功能描述:
//		通过卷名发现卷对象
// 引用: 
//	该模块和fsmain.c
// **************************************************
_LPVOLUME _FileMgr_FindVolume( 
                      LPCTSTR lpcszVolName, UINT uNameLen )
{
    _LPVOLUME lpVol;

    //RETAILMSG( 1, ( "_FileMgr_FindVolume:%s,len=%d.\r\n", lpcszVolName, uNameLen ) );
    if( *lpcszVolName == '\\' )
    {
        lpcszVolName++;
        uNameLen--;

⌨️ 快捷键说明

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