您的位置:首页 > 产品设计 > UI/UE

TrueCrypt原理与系统开发(3):TrueCrypt Mount卸载虚拟磁盘

2011-02-14 15:03 260 查看
第三部分、TrueCrypt Mount卸载虚拟磁盘

加载虚拟磁盘之后,可以创建受虚拟磁盘加密保护的文档,之后卸载虚拟磁盘,创建的文档则加密保存在加密卷中,这步操作起来比较简单,那么,在TrueCrypt实际是如何实现的呢?

TrueCrypt另一个核心函数卸载虚拟磁盘函数UnmountVolume,接受三个函数,分别是传入的窗口句柄、磁盘分区的序号和是否强制卸载的标识,其在TrueCrypt中的原型是

BOOL UnmountVolume (HWND hwndDlg,
int nDosDriveNo,
BOOL forceUnmount )


下面我们来看下每个参数具体的含义

参数类型含义示例
hwndDlgHWND传入的窗口句柄NULL
driveNoint加载的磁盘分区序号8
forceUnmountBOOL是否强制卸载FALSE
下面我们来看具体的实例

int Unmount(int nDriveNo, HWND hwndDlg)
{
int nDosDriveNo;
int unmounted = 0;
BOOL bForceUnmount = FALSE;         /* Unmount volume even if it cannot be locked */
//nDosDriveNo = 8;
nDosDriveNo = nDriveNo;
bForceUnmount = FALSE;
unmounted = UnmountVolume (hwndDlg, nDosDriveNo, bForceUnmount);
if(unmounted == 1)
return 1;
else
return 0;
}


当unmounted为1的时候卸载虚拟磁盘成功,为0的时候卸载失败,那么失败的原因有哪些呢?

1、UNMOUNT_FAILED 卸载出错

2、UNMOUNT_LOCK_FAILED 加载的虚拟磁盘打开或者虚拟磁盘内的文件还在打开等

当为第二种情况时,TrueCrypt的处理情形是提出提示,虚拟磁盘还打开着,提示用户是否强制卸载,如果强制卸载的话,创建的文件将不会保存,虚拟磁盘强制退出,如果不强制卸载的话,重复执行卸载虚拟磁盘的操作。

BOOL UnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forceUnmount)
{
int result;
BOOL forced = forceUnmount;
int dismountMaxRetries = UNMOUNT_MAX_AUTO_RETRIES;
retry:
BroadcastDeviceChange (DBT_DEVICEREMOVEPENDING, nDosDriveNo, 0);
do
{
result = DriverUnmountVolume (hwndDlg, nDosDriveNo, forced);
if (result == ERR_FILES_OPEN)
Sleep (UNMOUNT_AUTO_RETRY_DELAY);
else
break;
} while (--dismountMaxRetries > 0);
if (result != 0)
{
if (result == ERR_FILES_OPEN && !Silent)
{
if (IDYES == AskWarnNoYes ("UNMOUNT_LOCK_FAILED"))
{
forced = TRUE;
goto retry;
}
return FALSE;
}
Error ("UNMOUNT_FAILED");
return FALSE;
}

BroadcastDeviceChange (DBT_DEVICEREMOVECOMPLETE, nDosDriveNo, 0);
return TRUE;
}


但是,有些应用场景不希望用户执行强制卸载的情况,因为那样的话,用户操作的文档则不会保存,因此需要继续友好的提示用户虚拟磁盘还继续打开着,因此我们可以当判断result == ERR_FILES_OPEN && !Silent的时候直接return FALSE,或者注释forced = TRUE,一直提示用户,可以根据具体的应用场景加以修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: