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