📄 fsdmgr.c
字号:
/******************************************************
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 + -