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

第三部分、TrueCrypt Mount卸载虚拟磁盘

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

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

 

[cpp:nogutter]  view plain copy
  1. BOOL UnmountVolume (HWND hwndDlg,     
  2.                     int nDosDriveNo,     
  3.                     BOOL forceUnmount )    
 

 

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

 参数  类型  含义  示例
 hwndDlg  HWND  传入的窗口句柄  NULL
 driveNo  int  加载的磁盘分区序号  8
 forceUnmount  BOOL  是否强制卸载  FALSE

      下面我们来看具体的实例

 

[cpp:nogutter]  view plain copy
  1. int Unmount(int nDriveNo, HWND hwndDlg)    
  2. {    
  3.     int nDosDriveNo;    
  4.     int unmounted = 0;    
  5.     BOOL bForceUnmount = FALSE;         /* Unmount volume even if it cannot be locked */    
  6.     //nDosDriveNo = 8;    
  7.     nDosDriveNo = nDriveNo;    
  8.     bForceUnmount = FALSE;    
  9.     unmounted = UnmountVolume (hwndDlg, nDosDriveNo, bForceUnmount);    
  10.     if(unmounted == 1)    
  11.         return 1;    
  12.     else    
  13.         return 0;    
  14. }    
 

 

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

      1、UNMOUNT_FAILED 卸载出错

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

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

 

[cpp:nogutter]  view plain copy
  1. BOOL UnmountVolume (HWND hwndDlg, int nDosDriveNo, BOOL forceUnmount)    
  2. {    
  3.     int result;    
  4.     BOOL forced = forceUnmount;    
  5.     int dismountMaxRetries = UNMOUNT_MAX_AUTO_RETRIES;    
  6. retry:    
  7.     BroadcastDeviceChange (DBT_DEVICEREMOVEPENDING, nDosDriveNo, 0);    
  8.     do    
  9.     {    
  10.         result = DriverUnmountVolume (hwndDlg, nDosDriveNo, forced);    
  11.         if (result == ERR_FILES_OPEN)    
  12.             Sleep (UNMOUNT_AUTO_RETRY_DELAY);    
  13.         else    
  14.             break;    
  15.     } while (--dismountMaxRetries > 0);    
  16.     if (result != 0)    
  17.     {    
  18.         if (result == ERR_FILES_OPEN && !Silent)    
  19.         {    
  20.             if (IDYES == AskWarnNoYes ("UNMOUNT_LOCK_FAILED"))    
  21.             {    
  22.                 forced = TRUE;    
  23.                 goto retry;    
  24.             }    
  25.             return FALSE;    
  26.         }    
  27.         Error ("UNMOUNT_FAILED");    
  28.         return FALSE;    
  29.     }     
  30.         
  31.     BroadcastDeviceChange (DBT_DEVICEREMOVECOMPLETE, nDosDriveNo, 0);    
  32.     return TRUE;    
  33. }    
 

 

      但是,有些应用场景不希望用户执行强制卸载的情况,因为那样的话,用户操作的文档则不会保存,因此需要继续友好的提示用户虚拟磁盘还继续打开着,因此我们可以当判断result == ERR_FILES_OPEN && !Silent的时候直接return FALSE,或者注释forced = TRUE,一直提示用户,可以根据具体的应用场景加以修改。

你可能感兴趣的:(TrueCrypt原理与系统开发(3):TrueCrypt Mount卸载虚拟磁盘)