现在的位置: 首页 > 综合 > 正文

如何用自己的方法实现修改盘符

2013年09月02日 ⁄ 综合 ⁄ 共 4766字 ⁄ 字号 评论关闭

有朋友问我怎么用软件实现修改分区盘符,让我找了老半天 。终于找到了

官方:

[http://support.microsoft.com/default.aspx/kb/280297]
如何在群集服务器上配置卷装入点

文章编号 : 280297
最后修改 : 2004年3月11日
修订 : 1.0


概要

使用 NTFS 卷装入点功能,可以突破 26 个驱动器号的限制。通过使用卷装入点,可以将目标分区移植或装入 到其他物理磁盘上的文件夹中。卷装入点对于程序而言是透明的。本文讨论如何在服务器群集上创建卷装入点,并讨论与其相关的注意事项。

将装入点添加到共享磁盘上与将装入点添加到非共享磁盘上相同。装入点由 Win32 API SetVolumeMountPoint 添加,由 DeleteVolumeMountPoint 删除。这与磁盘资源动态链接库 (DLL) 无关。资源 DLL 仅关心卷全局通用标识 (GUID),而不是实际的装入点。

有三种向系统添加装入点的方法(对于群集系统和非群集系统相同):

逻辑磁盘管理器 (Diskmgmt.msc)
从命令提示符处运行 Mountvol.exe
使用 Win32 API SetVolumeMountPoint 和 DeleteVolumeMountPoint 编写您自己的 .exe 文件

回到顶端

更多信息

在服务器群集上创建卷装入点时,需要考虑以下与卷装入点相关的主要事项:

不能在群集和非群集磁盘之间创建装入点。
不能创建“仲裁”磁盘的装入点。
如果您具有从一个共享磁盘到另一个共享磁盘的装入点,必须确保它们位于同一组内,并且装入的磁盘依赖于根磁盘。

回到顶端

在群集服务器上安装卷装入点


1. 在本地使用管理权限登录到拥有根磁盘(您要将目录移植到该磁盘中)的节点。该磁盘就是将包含装入点的磁盘。
2. 打开群集管理器 (CluAdmin.exe),并暂停群集中的其它节点。
3. 将磁盘分区,然后创建装入点。为此,请执行以下步骤:

a. 要打开磁盘管理,请单击开始,再单击运行,键入 diskmgmt.msc,然后单击确定
b. 选择要移植到目录中的磁盘。
c. 用鼠标右键单击磁盘上的可用空间,然后单击新建磁盘分区
d. 创建主磁盘分区,然后单击下一步
e. 设置分区的大小。
f. 选择“装入以下空白 NTFS 文件夹中”,单击浏览以找到要在其中创建装入点的目录,然后单击新建文件夹(这将是卷装入到的根目录)。单击新创建的文件夹,再单击确定,然后单击下一步
g. 使用 NTFS 文件系统格式化分区。

这既是 Microsoft Cluster Server (MSCS) 的要求,也是“卷装入点”功能的要求。

4. 新建磁盘资源,然后设置依赖项。为此,请执行以下步骤:

a. 打开群集管理器。
b. 对于刚在其中创建卷装入点的磁盘,用鼠标右键单击拥有该磁盘的“共享磁盘”资源的组。单击新建,然后单击资源
c. 对于资源类型,请单击物理磁盘。验证它与根磁盘位于同一组中。单击下一步
d. 确保所有节点都是可能的所有者,然后单击下一步
e. 双击根磁盘,使该卷装入点磁盘依赖于根磁盘。单击下一步
f. 在“磁盘参数”窗口中,应该看到磁盘被列出。磁盘将按磁盘编号和分区编号列出,这不同于标准 MSCS 磁盘(标准 MSCS 磁盘按驱动器号列出)。单击完成
g. 用鼠标右键单击新磁盘资源,然后单击联机
5. 中止暂停所有其他节点,并测试您是否可以将组故障转移到每个节点并访问新创建的装入点。

有关如何从命令提示符处创建卷装入点的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

205524 (http://support.microsoft.com/kb/205524/EN-US/) How to Create and Manipulate NTFS Junction Points

有关操作系统如何处理驱动器的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

234048 (http://support.microsoft.com/kb/234048/EN-US/) How Windows 2000 Assigns, Reserves, and Stores Drive Letters

回到顶端


这篇文章中的信息适用于:
Microsoft Windows Server 2003 Enterprise Edition
Microsoft Windows Server 2003 Datacenter Edition

回到顶端


转自:[http://www.cnblogs.com/henryzc/articles/316806.html]

      昨天,在CSDN中看见帖子寻求解决挂载盘符的问题,今天把它搞定了。
      改变盘符主要是用SetVolumeMountPointDeleteVolumeMountPoint 两个函数。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;
}

抱歉!评论已关闭.