📄 fsmain.c
字号:
// 参数:
// IN lpcszFileName-文件名
// IN dwAccess-存取控制,由以下值的位组合:
// GENERIC_WRITE-读操作
// GENERIC_READ-写操作
// IN dwShareMode-共享模式,由以下值的位组合:
// FILE_SHARE_READ-共享读
// FILE_SHARE_WRITE-共享写
// IN pSecurityAttributes-安全设置(不支持,为NULL)
// IN dwCreate-创建方式,包含:
// CREATE_NEW-创建新文件;假如文件存在,则失败
// CREATE_ALWAYS-创建文件;假如文件存在,则覆盖它
// OPEN_EXISTING-打开文件;假如文件不存在,则失败
// OPEN_ALWAYS-打开文件;假如文件不存在,则创建
// IN dwFlagsAndAttributes-文件属性
// IN hTemplateFile-临时文件句柄(不支持,为NULL)
// 返回值:
// 成功:返回句柄
// 失败:返回 INVALID_HANDLE_VALUE
// 功能描述:
// 创建文件
// 引用:
//
// **************************************************
#define DEBUG_FileSys_CreateFile 0
HANDLE WINAPI FileSys_CreateFile( LPCTSTR lpcszFileName,
DWORD dwAccess,
DWORD dwShareMode,
PSECURITY_ATTRIBUTES pSecurityAttributes,
DWORD dwCreate,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile )
{
_LPFILEDATA lpFile;
// 检查参数 check param
if( dwShareMode & ( ~( FILE_SHARE_READ | FILE_SHARE_WRITE ) ) )
goto RET_INVALIDPARAM;
if( dwAccess & ( ~( GENERIC_READ | GENERIC_WRITE | GENERIC_DATA ) ) )
goto RET_INVALIDPARAM;
if( !( dwCreate == CREATE_NEW ||
dwCreate == CREATE_ALWAYS ||
dwCreate == OPEN_ALWAYS ||
dwCreate == OPEN_EXISTING ||
dwCreate == TRUNCATE_EXISTING ) )
goto RET_INVALIDPARAM;
if( dwCreate == TRUNCATE_EXISTING &&
!( dwAccess & GENERIC_WRITE ) )
{
SetLastError( ERROR_ACCESS_DENIED );
return INVALID_HANDLE_VALUE;
}
if( dwFlagsAndAttributes & FILE_ATTRIBUTE_DIRECTORY )
goto RET_INVALIDPARAM;
if( (BYTE)dwFlagsAndAttributes == FILE_ATTRIBUTE_NORMAL )
dwFlagsAndAttributes &= ~0xFFFF;
else
dwFlagsAndAttributes &= ~FILE_ATTRIBUTE_NORMAL;
dwFlagsAndAttributes |= FILE_ATTRIBUTE_ARCHIVE;
// 检查文件名
if( CheckFilePathName( lpcszFileName ) )// LN 2003-05-23, ADD
{ // 有效
lpFile = _CreateFile( lpcszFileName, dwAccess, dwShareMode, pSecurityAttributes, dwCreate, dwFlagsAndAttributes, hTemplateFile );
if( lpFile != INVALID_HANDLE_VALUE )
{ // 创建文件成功,分配一个句柄
return Sys_AllocAPIHandle( API_FILESYS, lpFile, OBJ_FILE );
}
}
DEBUGMSG( FSMAIN_ZONE | DEBUG_FileSys_CreateFile, ( "CreateFile0(=%s) failure.\r\n" , lpcszFileName ) );
return INVALID_HANDLE_VALUE;
RET_INVALIDPARAM:
DEBUGMSG( FSMAIN_ZONE, ( "CreateFile1(=%s) failure.\r\n" , lpcszFileName ) );
SetLastError( ERROR_INVALID_PARAMETER );
return INVALID_HANDLE_VALUE;
}
// **************************************************
// 声明:static BOOL _CloseFile( _LPFILEDATA lpFile )
// 参数:
// IN lpFile - 文件对象指针
// 返回值:
// 成功:返回TRUE
// 失败:返回FALSE
// 功能描述:
// 关闭文件
// 引用:
//
// **************************************************
static BOOL _CloseFile( _LPFILEDATA lpFile )
{
BOOL bRetv = FALSE;
if( lpFile->hVol )
{ // 文件对象 file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpCloseFile )
bRetv = lpVol->lpdsk->lpfsd->lpCloseFile( lpFile->pFile );
Sys_ReleaseException();
}
}
else
{ // 设备对象 device
bRetv = Dev_CloseFile( (HANDLE)lpFile->pFile );
}
free( lpFile );
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_CloseFile( HANDLE hFile )
// 参数:
// IN hFile - 文件对象
// 返回值:
// 假如成功,返回TRUE; 失败,返回FALSE
// 功能描述:
// 关闭文件对象
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_CloseFile( HANDLE hFile )
{
_LPFILEDATA lpFile;
lpFile = _GetHFILEPtr( hFile );
if( lpFile )
{
return _CloseFile( lpFile );
}
return FALSE;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_DeleteAndRename(
// LPCTSTR lpszNewFileName,
// LPCTSTR lpszOldFileName )
// 参数:
// IN lpcszNewFileName – 目标文件
// IN lpcszOldFileName – 源文件
// 返回值:
// 假如成功,返回TRUE;否则,返回FALSE
// 功能描述:
// 将源文件内容拷贝到目标文件后再删除源文件
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_DeleteAndRename( LPCTSTR lpcszNewFileName, LPCTSTR lpcszOldFileName )
{
int type;
UINT uLen;
// 检查名字是否有效
if( CheckFilePathName( lpcszNewFileName ) && CheckFilePathName( lpcszOldFileName ) )
{
type = _GetObjName( lpcszOldFileName, &uLen ); // 得到对象类型
if( type == 2 )
{ // 文件对象 file
UINT ul = uLen;
// 得到卷对象
_LPVOLUME lpVol = _GetVolumePtr( lpcszOldFileName, &uLen );
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
BOOL bRetv = FALSE;
if( lpVol &&
lpVol == _GetVolumePtr( lpcszNewFileName, &ul ) &&
lpVol->lpdsk->lpfsd->lpDeleteAndRenameFile )
bRetv = lpVol->lpdsk->lpfsd->lpDeleteAndRenameFile( lpVol->pVol, lpcszNewFileName + uLen, lpcszOldFileName + uLen );
Sys_ReleaseException();
return bRetv;
}
}
}
return FALSE;
}
// **************************************************
// 声明:BOOL FileSys_Delete(
// LPCTSTR lpszFileName )
// 参数:
// IN lpszFileName - 文件名
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 删除文件
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_Delete( LPCTSTR lpcszFileName )
{
int type;
UINT uLen;
BOOL bRetv = FALSE;
if( CheckFilePathName( lpcszFileName ) ) // 检查文件名
{
type = _GetObjName( lpcszFileName, &uLen ); // 得到文件类型
if( type == 2 )
{ // 文件类型 file
_LPVOLUME lpVol = _GetVolumePtr( lpcszFileName, &uLen ); // 得到卷对象
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol && lpVol->lpdsk->lpfsd->lpDeleteFile )
{
bRetv = lpVol->lpdsk->lpfsd->lpDeleteFile( lpVol->pVol, lpcszFileName + uLen );
}
Sys_ReleaseException();
}
}
}
return bRetv;
}
//typedef BOOL (*SHELLFILECHANGEFUNC)( LPFILECHANGEINFO );
//static BOOL ShellFileNotify( LPFILECHANGEINFO lpfci )
//{
// FILECHANGEINFO fci = *lpfci;
//}
// **************************************************
// 声明:BOOL WINAPI FileSys_DeviceIoControl(
// HANDLE hFile,
// DWORD dwIoControlCode,
// LPVOID lpInBuf,
// DWORD nInBufSize,
// LPVOID lpOutBuf,
// DWORD nOutBufSize,
// LPDWORD lpBytesReturned
// )
// 参数:
// IN hFile-文件对象
// IN dwIoControlCode-I/O控制命令,文件系统包含:
// IOCTL_DISK_SCAN_VOLUME-通知文件系统去扫描卷的错误
// IOCTL_DISK_FORMAT_VOLUME-通知文件系统去格式化卷
// IN lpInBuf-输入缓存
// IN nInBufSize-输入缓存的尺寸
// OUT lpOutBuf-输出缓存
// IN nOutBufSize-输出缓存的尺寸
// OUT lpBytesReturned-返回的数据的尺寸,该数据在返回时已存入lpOutBuf
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 文件系统控制管理
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_DeviceIoControl( HANDLE hFile, DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpdwBytesReturned, LPOVERLAPPED lpOverlapped )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
if( lpFile )
{
if( lpFile->hVol )
{ // 文件对象 file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
BOOL bRetv = FALSE;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpDeviceIoControl )
bRetv = lpVol->lpdsk->lpfsd->lpDeviceIoControl( lpFile->pFile, dwIoControlCode, lpInBuf, nInBufSize, lpOutBuf, nOutBufSize, lpdwBytesReturned );
Sys_ReleaseException();
return bRetv;
}
}
else
{ // 设备对象 device
return Dev_IoControl( (HANDLE)lpFile->pFile, dwIoControlCode, lpInBuf, nInBufSize, lpOutBuf, nOutBufSize, lpdwBytesReturned, lpOverlapped );
}
}
return FALSE;
}
// **************************************************
// 声明:BOOL FileSys_FindClose( HANDLE hFind )
// 参数:
// IN hFind - 查找对象
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 关闭查找对象
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_FindClose( HANDLE hFind )
{
_LPFINDDATA lpFind = _GetHFINDPtr( hFind );
if( lpFind )
{
if( lpFind->hVol )
{
_LPVOLUME lpVol = (_LPVOLUME)lpFind->hVol;
BOOL bRetv = FALSE;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpFindClose )
{
if( lpVol->lpdsk->lpfsd->lpFindClose( lpFind->pFind ) )
{
bRetv = TRUE;
}
}
FileMgr_CloseSearchHandle( hFind );
Sys_ReleaseException();
return bRetv;
}
}
FileMgr_CloseSearchHandle( hFind );
}
return FALSE;
}
// **************************************************
// 声明:HANDLE WINAPI FileSys_FindFirst(
// LPCTSTR lpszFileSpec,
// FILE_FIND_DATA * pfd )
// 参数:
// IN lpszFileSpec - 文件名(可以含通配字符)
// OUT pfd - FILE_FIND_DATA数据结构指针,用于接收找到的数据
// 返回值:
// 成功:返回有效的句柄
// 否则:返回INVALID_HANDLE_VALUE
// 功能描述:
// 查找匹配的文件
// 引用:
// 系统API
// **************************************************
HANDLE WINAPI FileSys_FindFirst( LPCTSTR lpcszFileSpec, FILE_FIND_DATA * pfd )
{
int type;
UINT uLen;
HANDLE hCallerProcess = GetCallerProcess(); // 得到呼叫进程
HANDLE hRetv = INVALID_HANDLE_VALUE;
if( CheckFilePathName( lpcszFileSpec ) ) // 检查文件名的有效性
{
type = _GetObjName( lpcszFileSpec, &uLen ); // 得到对象类型
if( type == 2 )
{ // 文件类型 file
_LPVOLUME lpVol = _GetVolumePtr( lpcszFileSpec, &uLen );
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol && lpVol->lpdsk->lpfsd->lpFindFirstFile )
{
HANDLE hFind = (HANDLE)lpVol->lpdsk->lpfsd->lpFindFirstFile( lpVol->pVol, hCallerProcess, lpcszFileSpec + uLen, pfd );
if( hFind != INVALID_HANDLE_VALUE )
{ // 成功,为文件系统驱动程序的对象分配一个句柄
hRetv = FileMgr_CreateSearchHandle( (HVOL)lpVol, hCallerProcess, (DWORD)hFind );
if( hRetv == NULL )
{
//return hRetv; // 成功
if( lpVol->lpdsk->lpfsd->lpFindClose )
lpVol->lpdsk->lpfsd->lpFindClose( (DWORD)hFind );
hRetv = INVALID_HANDLE_VALUE;
}
}
}
Sys_ReleaseException();
}
}
}
return hRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_FindNext(
// HANDLE hFind,
// FILE_FIND_DATA * pffd )
// 参数:
// IN hFind - 查找对象
// OUT pffd - FILE_FIND_DATA数据结构指针,用于接收找到的数据
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 查找下一个匹配的文件
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_FindNext( HANDLE hFind, FILE_FIND_DATA * pfd )
{
_LPFINDDATA lpFind = _GetHFINDPtr( hFind );
BOOL bRetv = FALSE;
if( lpFind && pfd )
{
if( lpFind->hVol )
{
_LPVOLUME lpVol = (_LPVOLUME)lpFind->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
{
if( lpVol->lpdsk->lpfsd->lpFindNextFile )
bRetv = lpVol->lpdsk->lpfsd->lpFindNextFile( lpFind->pFind, pfd );
Sys_ReleaseException();
}
}
}
return bRetv;
}
// **************************************************
// 声明:BOOL WINAPI FileSys_FlushBuffers( HANDLE hFile )
// 参数:
// IN hFile - 文件对象指针
// 返回值:
// 成功:返回TRUE
// 否则:返回FALSE
// 功能描述:
// 刷新文件缓存(假如有的话)
// 引用:
// 系统API
// **************************************************
BOOL WINAPI FileSys_FlushBuffers( HANDLE hFile )
{
_LPFILEDATA lpFile = _GetHFILEPtr( hFile );
BOOL bRetv = FALSE;
if( lpFile )
{
if( lpFile->hVol )
{ // file
_LPVOLUME lpVol = (_LPVOLUME)lpFile->hVol;
if( Sys_CaptureException() == EXCEPTION_NO_ERROR )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -