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

📄 fsdmgr.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
    }
	if( uNameLen )  
	{
		// EnterCS ???
		lpVol = (_LPVOLUME)lpVolLink;
		while( lpVol )
		{
			if( vol_nicmp( lpcszVolName, uNameLen, lpVol->lpszVolName ) == 0 )
				return lpVol;
			lpVol = lpVol->lpNext;
		}
		// LeaveCS ???
	}
    return NULL;
}

// **************************************************
// 声明:DWORD WINAPI FileMgr_GetDiskInfo ( 
//								HDSK hDsk,
//								PFDD pfdd )
// 参数:
//		IN hDsk - 磁盘对象句柄
//		IN pfdd - 用于保存磁盘信息的 pfdd 结构指针
// 返回值:
//	    假如成功,返回ERROR_SUCCESS	
// 功能描述:
//		得到磁盘信息
// 引用: 
//		系统API
// **************************************************

DWORD WINAPI FileMgr_GetDiskInfo ( 
					HDSK hDsk,
					PFDD pfdd )
{
    _LPFSDDSK lpfsd = (_LPFSDDSK)hDsk;
    DWORD dwRet;

	DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_GetDiskInfo: handle=%x.\r\n", lpfsd->hFile ) );
	// 给设备发控制信息
    if( DeviceIoControl( lpfsd->hFile, IOCTL_DISK_GETINFO, pfdd, sizeof( FSD_DISK_DATA ), NULL, 0, &dwRet, NULL ) )
        return ERROR_SUCCESS;  // 成功
    return !ERROR_SUCCESS;	// 失败
}

extern BOOL WINAPI KL_SetFileAttributes( LPCTSTR lpcszFileName, DWORD dwFileAttributes );
extern BOOL WINAPI KL_CreateDirectory( LPCTSTR lpcszPathName, PSECURITY_ATTRIBUTES pSecurityAttributes );
extern BOOL WINAPI KL_RemoveDirectory( LPCTSTR lpcszPathName );

// **************************************************
// 声明:HVOL WINAPI FileMgr_RegisterVolume( 
//									HDSK hDsk,
//									LPCTSTR lpcszName,
//									PVOL pVol )
// 参数:
//		IN hDsk - 磁盘对象名
//		IN lpcszName - 卷名(可以为NULL,则调用DeviceIoCOntrol(...,IOCTL_DISK_GETNAME,...)得到名)
//		IN pVol - 文件系统驱动程序私有卷对象
// 返回值:
//		假如成功,返回非NULL卷句柄;否则,返回NULL
// 功能描述:
//		注册卷
// 引用: 
//		系统API
// **************************************************
HVOL WINAPI FileMgr_RegisterVolume( 
									HDSK hDsk,
									LPCTSTR lpcszName,
									PVOL pVol )
{    
    TCHAR tcVol[MAX_PATH+1];
	TCHAR * lpVolName = tcVol+1;// 将用 tcVol 创建一个文件夹 "\\valname"
								// 因此 tcVol[0] = '\\';
	int len = 0;
	_LPVOLUME lpVol;
	int index;
	BOOL bCreateFolder = FALSE;
	_LPFSDDSK lpfsd = (_LPFSDDSK)hDsk;

    DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume(lpcszName(0x%x)=&s).\r\n", lpcszName, lpcszName ? lpcszName : "" ) );
	
	*lpVolName = 0;
	if( lpcszName == NULL || *lpcszName == 0 )  
	{	//  没有给出有效的卷名
		
		DWORD dwRet = 0;		

		DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume:Call DeviceIoControl(IOCTL_DISK_GETNAME).\r\n" ) );
		// 从设备驱动程序得到卷名
		DeviceIoControl( 
						lpfsd->hFile, 
						IOCTL_DISK_GETNAME, 
						NULL, 
						0, 
						lpVolName, 
						MAX_PATH, 
						&dwRet, 
						NULL );

		if( dwRet == 0  ) 
		{   // 设备驱动程序没有返回有效的卷名,用默认的
			strcpy( tcVol, "\\disk0" );
		}
		else
		{	// 
			// strncpy( lpVolName, (TCHAR*)dwRet, MAX_PATH ); // 2004-02-11			
		    lpVolName[MAX_PATH]=0; // 安全起见
		}
	}
	else
	{
		DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume(%s).\r\n", lpcszName ) );
		strncpy( lpVolName, lpcszName, MAX_PATH );
		lpVolName[MAX_PATH]=0;// 安全起见
	}
    len = strlen( lpVolName );
	index = 0;
	DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume: get volume name=%s.\r\n", lpVolName ) );
	if( len < MAX_PATH - 2 )
	{   // 检查该名字是否合法/是否已经存在,get a default name
	    BOOL bFindOldFolder;
		DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume: search existed volume.\r\n" ) );
		tcVol[0] = '\\';
		bFindOldFolder = FALSE;
		while( 1 )
		{	
			if( bFindOldFolder || _FileMgr_FindVolume( lpVolName, len ) )
			{  // 系统已经存在该卷名。在卷名后添加 '0' ~ '9'序号看行不行 add index and to find
				for( ; index < 10; index++ )
				{
					lpVolName[len] = '0' + index;
					lpVolName[len+1] = 0;
					if( _FileMgr_FindVolume( lpVolName, len+1 ) == FALSE )
						break; // 没有该名
				}
				if( index == 10 )
					return NULL; // 所有的卷名+序号都以检查完,失败
			}
			// 该卷名不存在,新增一个 get a volname
			if( lpVolLink )
			{   // 创建一个根文件夹,extend disk, to create a disk folder at the root
				DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume: CreateDirectory=%s.\r\n", tcVol ) );
				if( ( bCreateFolder = KL_CreateDirectory( tcVol, NULL ) ) )
				{
					break; // 创建成功
				}
				bFindOldFolder = TRUE;
			}
			else
				break;
		}
		DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume: can't create a valid folder.\r\n" ) );
	}
	else
	{
		return NULL;
	}

	DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume: Create folder(%s) success.\r\n", tcVol ) );
	
	// 分配新卷对象
	len = strlen( lpVolName );
	lpVol = malloc( sizeof( _VOLUME ) + len + 1 );

	if( lpVol )
	{
		lpVol->lpszVolName = (LPTSTR)(lpVol + 1);
		//2005-02-24
		if( lpVolLink )
		{   // 设置卷文件夹为设备属性 extend disk, set the folder with device attrib
			DWORD attr = FILE_ATTRIBUTE_DEVICE | FILE_ATTRIBUTE_DIRECTORY;
			//2005-02-24, add code by lilin
			if( lpfsd->fdi.dwFlags & DISK_INFO_FLAG_HIDDEN )
			{
				attr |= FILE_ATTRIBUTE_HIDDEN;
			}
			KL_SetFileAttributes( tcVol, attr );
		}		
		strcpy( lpVol->lpszVolName, lpVolName );
		lpVol->lpdsk = (_LPFSDDSK)hDsk;
		lpVol->pVol = pVol;
		lpVol->lpNext = lpVolLink;
		lpVolLink = lpVol;
		// 想系统通知改变信息
		DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume ShellNotify.\r\n" ) );
		SHChangeNotify( SHCNE_DRIVEADD, 0, NULL, NULL );		
		return (HVOL)lpVol;
	}
	else
	{	// 初始化卷对象失败,删除之前创建的文件夹
		if( lpVolLink && bCreateFolder )
		{   // remove the folder
			KL_RemoveDirectory( tcVol );
		}
	}
	WARNMSG( FSDMGR_ZONE, ( "FileMgr_RegisterVolume: RegisterValume(%s.) failure.\r\n", tcVol ) );
    return NULL;
}

// **************************************************
// 声明:void WINAPI FileMgr_DeregisterVolume( HVOL hVol )
// 参数:
//		IN hVol - 卷对象句柄
// 返回值:
//		无
// 功能描述:
//		与FileMgr_RegisterVolume相反,注销一个卷
// 引用: 
//		系统API
// **************************************************

void WINAPI FileMgr_DeregisterVolume( HVOL hVol )
{
    _LPVOLUME lpVol = (_LPVOLUME)hVol;

	DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_DeregisterVolume:hVol=%x.\r\n", hVol ) );

    if( lpVol )
    {
        TCHAR buf[MAX_PATH];
		
		buf[0] = '\\';
		strcpy( buf+1, lpVol->lpszVolName );

		// EnterCS ????
		// 偏历卷链表
        if( lpVol == lpVolLink )
        {
            lpVolLink = lpVol->lpNext;
            free( lpVol );
        }
        else
        {
            _LPVOLUME lp = lpVolLink;
            while( lp )
            {
                if( lp->lpNext == lpVol )
                {   // 发现
                    lp->lpNext = lpVol->lpNext;
                    free( lpVol );
                    break;
                }
                lp = lp->lpNext;
            }
        }
        DEBUGMSG( FSDMGR_ZONE, ( "FileMgr_DeregisterVolume:Call KL_RemoveDirectory=%s.\r\n", buf ) );
		// 移出在根目录的文件夹名
		KL_RemoveDirectory( buf );
		// 想系统发送通知消息
		SHChangeNotify( SHCNE_DRIVEREMOVED, 0, NULL, NULL );
    }
}

// **************************************************
// 声明:DWORD WINAPI FileMgr_ReadDisk ( 
//                       HDSK hDsk,
//                       DWORD dwStartSector,
//                       DWORD nSectorNum,
//                       LPVOID lpBuffer,
//                       DWORD nSizeOfBuffer )
// 参数:
//		IN hDsk - 磁盘对象句柄
//      IN dwStartSector - 开始扇区
//      IN nSectorNum - 扇区数
//      OUT lpBuffer - 用于接受数据的缓存
//      IN nSizeOfBuffer - 用于接受数据的缓存大小
// 返回值:
//		假如成功,返回 ERROR_SUCCESS; 否则,返回错误代码
// 功能描述:
//		从磁盘的扇区读取数据
// 引用: 
//		系统API
// **************************************************
DWORD WINAPI FileMgr_ReadDisk ( 
                       HDSK hDsk,
                       DWORD dwStartSector,
                       DWORD nSectorNum,
                       LPVOID lpBuffer,
                       DWORD nSizeOfBuffer )
{
    _LPFSDDSK lpfsd = (_LPFSDDSK)hDsk;
    DISK_RW drw;
    DWORD dwRet;
	DWORD dwReadSize = nSectorNum * lpfsd->fdi.nBytesPerSector;

	if( dwReadSize <= nSizeOfBuffer )
	{
		// 准备块读结构
		drw.dwSectorNumber = nSectorNum;
		drw.dwStartSector = dwStartSector;
		drw.dwStatus = 0;
		drw.nrwNum = 1;
		drw.rwBufs[0].dwSize = dwReadSize;
		drw.rwBufs[0].lpBuf = lpBuffer;
		//ASSERT( ( (DWORD)drw.rwBufs[0].lpBuf & 0x3) == 0 );

		
		if( DeviceIoControl( lpfsd->hFile, IOCTL_DISK_READ, &drw, sizeof( drw ), NULL, 0, &dwRet, NULL ) )
			return ERROR_SUCCESS;  // 成功
		return GetLastError();
	}
	else
	{
		ERRORMSG(FSDMGR_ZONE, (TEXT("error in FileMgr_ReadDisk: dwReadSize(%d) > nSizeOfBuffer(%d).\r\n"), dwReadSize, nSizeOfBuffer ));
		return ERROR_INVALID_PARAMETER;
	}
}

// **************************************************
// 声明:DWORD WINAPI FileMgr_WriteDisk ( 
//                       HDSK hDsk,
//                       DWORD dwStartSector,
//                       DWORD nSectorNum,
//                       LPVOID lpBuffer,
//                       DWORD nSizeOfBuffer )
// 参数:
//		IN hDsk - 磁盘对象句柄
//      IN dwStartSector - 开始扇区
//      IN nSectorNum - 扇区数
//      IN lpBuffer - 用于接受数据的缓存
//      IN nSizeOfBuffer - 用于接受数据的缓存大小
// 返回值:
//		假如成功,返回 ERROR_SUCCESS; 否则,返回错误代码
// 功能描述:
//		向磁盘的扇区写入数据
// 引用: 
//		系统API
// **************************************************
DWORD WINAPI FileMgr_WriteDisk ( 
                        HDSK hDsk,
                        DWORD dwStartSector,
                        DWORD nSectorNum,
                        LPCVOID lpBuffer,
                        DWORD nSizeOfBuffer )
{
    _LPFSDDSK lpfsd = (_LPFSDDSK)hDsk;
    DISK_RW drw;
    DWORD dwRet;
	DWORD dwWriteSize = nSectorNum * lpfsd->fdi.nBytesPerSector;

	DEBUGMSG(FSDMGR_ZONE, (TEXT("FileMgr_WriteDisk: hDsk=%x, dwStartSector=%d, nSectorNum=%d, lpBuffer=%x, nSizeOfBuffer=%d\r\n"), hDsk, dwStartSector, nSectorNum, lpBuffer, nSizeOfBuffer));
	if( dwWriteSize <= nSizeOfBuffer )
	{		
		// 准备块写结构
		drw.dwSectorNumber = nSectorNum;
		drw.dwStartSector = dwStartSector;
		drw.dwStatus = 0;
		drw.nrwNum = 1;
		drw.rwBufs[0].dwSize = dwWriteSize;
		drw.rwBufs[0].lpBuf = (LPBYTE)lpBuffer;
		//ASSERT( ( (DWORD)drw.rwBufs[0].lpBuf & 0x3) == 0 );
		
		if( DeviceIoControl( lpfsd->hFile, IOCTL_DISK_WRITE, &drw, sizeof( drw ), NULL, 0, &dwRet, NULL ) )
			return ERROR_SUCCESS;  // 成功
		return GetLastError();
	}
	else
	{
		ERRORMSG(FSDMGR_ZONE, (TEXT("error in FileMgr_WriteDisk: dwWriteSize(%d) > nSizeOfBuffer(%d).\r\n"), dwWriteSize, nSizeOfBuffer ));
		return ERROR_INVALID_PARAMETER;
	}
    
}

// **************************************************
// 声明:BOOL WINAPI FileMgr_DeviceIoControl ( 
//                           HDSK hDsk,
//                           DWORD dwIoControlCode,
//                           LPVOID lpInBuf,
//                           DWORD nInBufSize,
//                           LPVOID lpOutBuf,
//                           DWORD nOutBufSize,
//                           LPDWORD lpdwBytesReturned,
//                           LPOVERLAPPED lpOverlapped )
// 参数:
//		IN hDsk-磁盘文件对象句柄
//		IN dwIoControlCode-I/O控制命令,文件系统包含:
//			IOCTL_DISK_SCAN_VOLUME-通知文件系统去扫描卷的错误
//			IOCTL_DISK_FORMAT_VOLUME-通知文件系统去格式化卷
//	    IN lpInBuf-输入缓存
//	    IN nInBufSize-输入缓存的尺寸
//	    OUT lpOutBuf-输出缓存
//	    IN nOutBufSize-输出缓存的尺寸
//	    IN lpBytesReturned-返回的数据的尺寸,该数据在返回时已存入lpOutBuf
//	    IN lpOverlapped-支持覆盖(不支持,为NULL)
		
// 返回值:
//		成功:返回TRUE
//		否则:返回FALSE
// 功能描述:
//		对设备进行控制
// 引用: 
//		系统API
// **************************************************
BOOL WINAPI FileMgr_DeviceIoControl ( 
                          HDSK hDsk,
                          DWORD dwIoControlCode,
                          LPVOID lpInBuf,
                          DWORD nInBufSize,
                          LPVOID lpOutBuf,
                          DWORD nOutBufSize,
                          LPDWORD lpdwBytesReturned,
                          LPOVERLAPPED lpOverlapped )
{
	 _LPFSDDSK lpfsd = (_LPFSDDSK)hDsk;
     return DeviceIoControl( lpfsd->hFile, 
		                     dwIoControlCode,
							 lpInBuf,
							 nInBufSize,
							 lpOutBuf,
							 nOutBufSize,
							 lpdwBytesReturned, 
							 lpOverlapped );
}


⌨️ 快捷键说明

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