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

📄 fsmain.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 4 页
字号:
// 参数:
//		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 + -