在2K以上系统中挂载盘符(设置盘符)

      昨天,在CSDN中看见 帖子寻求解决挂载盘符的问题,今天把它搞定了。
      改变盘符主要是用 SetVolumeMountPoint DeleteVolumeMountPoint 两个函数。DeleteVolumeMountPoint 很简单就不多说了。SetVolumeMountPoint 的使用主要是要找到被挂载设备的VolumeName。但是设备被卸载以后用GetVolumeNameForVolumeMountPoint根本取不到VolumeName,怎么办呢?
      微软XP的系统文件夹里面有一个叫diskpart.exe的命令行工具,用它可以改变盘符。那么它是怎么做到的呢?
简单的分析(用VC6自带的工具DEPENDS.EXE)就可以看见这个程序使用了很多Setup API函数,我判断使用SetupDiEnumDeviceInfo来取得VolumeName的ClassGUID,但是结果发现取到的ClassGUID和用GetVolumeNameForVolumeMountPoint获取的没有卸载前的VolumeName中的ClassGUID不一样。怎么办呢?
      没关系,让我们祭出屠龙刀:IDA Pro。如何反汇编分析不在本文的介绍了(挺麻烦,而我这人又比较懒嘿嘿)。我一阵海扁它,发现关键是要通过DefineDosDevice 函数将设备Attach到盘符上,然后用GetVolumeNameForVolumeMountPoint取到VolumeName,之后就可以用SetVolumeMountPoint将设备挂载到盘符上了。我把它写成了函数如果要加载盘符就可以使用(前提是盘符未被占用):
ChangeMountPoint( _T( " H:// " ), _T( " ///Device//HarddiskVolume2 " ), true );
卸载的话用:
ChangeMountPoint( _T( " H:// " ),NULL,  false );
下面是ChangeMountPoint函数的实现:

bool ChangeMountPoint(LPCTSTR lpDriveLetter,LPCTSTR lpDevice,bool bAddMountPoint)
{
    bool bRet 
=   false ;
    TCHAR szDriveLetterAndSlash[
4 =  { 0 };
    TCHAR szDriveLetter[
3 =  { 0 };
    TCHAR szUniqueVolumeName[MAX_PATH] 
=  { 0 };
    
if (lpDriveLetter  &&  lpDevice)
    {
        szDriveLetter[
0 =  lpDriveLetter[ 0 ];
        szDriveLetter[
1 =  TEXT(':');
        szDriveLetter[
2 =  TEXT('/ 0 ');
        
        szDriveLetterAndSlash[
0 =  lpDriveLetter[ 0 ];
        szDriveLetterAndSlash[
1 =  TEXT(':');
        szDriveLetterAndSlash[
2 =  TEXT('//');
        szDriveLetterAndSlash[
3 =  TEXT('/ 0 ');
        
if  ( bAddMountPoint )
        {
            
// Try to Attach lpDevice to lpDriveLetter
            bRet  =  DefineDosDevice (DDD_RAW_TARGET_PATH, szDriveLetter,
                lpDevice);
            
            
if  (bRet)
            {
                
if  ( ! GetVolumeNameForVolumeMountPoint (szDriveLetterAndSlash,
                    szUniqueVolumeName,
                    MAX_PATH))
                {
                    
// Can't Find Attached lpDevice 's VolumeName
                    szUniqueVolumeName[ 0 =  '/ 0 ';
                }
                
                bRet 
=  DefineDosDevice ( 
                    DDD_RAW_TARGET_PATH
| DDD_REMOVE_DEFINITION |
                    DDD_EXACT_MATCH_ON_REMOVE, szDriveLetter,
                    lpDevice);
                
                
if  ( ! bRet)
                    
return  bRet;
                
                bRet 
=  SetVolumeMountPoint(szDriveLetterAndSlash, 
                    szUniqueVolumeName);
            }
        }
        
else
        {
            bRet 
=  DeleteVolumeMountPoint (szDriveLetterAndSlash);
        }
    }
    
    
return  bRet;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值