根据驱动器盘符获得分区号 (Convert Driver Name to Partition Number)

原创 2006年05月17日 16:36:00

  程序里有自动重启 Windows 系统的功能,当有多个 Windows 共存的时候 C: 根目录下的 boot.ini 文件包含类似下面的内容:

[boot loader]
  timeout=30
  default=multi(0)disk(0)rdisk(0)partition(1)/WINNT
[operating systems]
  multi(0)disk(0)rdisk(0)partition(1)/WINNT="Windows 2000 Professional"
  multi(0)disk(0)rdisk(0)partition(2)/WINDOWS="Windows XP Professional" /fastdetect

  我们会判断当前系统所在的驱动器,然后改写 boot.ini 中的 default 值,以使得程序重启系统后进入当前启动的操作系统。例如在拥有以上 boot.ini 的系统上,用户手工从操作系统列表选择了启动处于 partition(2) 上的 Windows XP ,如果我们不作任何修改的重启系统,那么重启以后将进入当前的缺省操作系统 Windows 2000 而不是先前启动的 Windows XP。 GetSystemDirectory() 可以获得当前操作系统所在目录。

  开始我们想当然的将盘符和分区作了以下映射

            C: -> partition(1)

            D: -> partition(2)

            E: -> partition(3)

                .......

  后来这里被 Report 了一个 Bug, 在 Dell 600m 笔记本电脑上, 单一操作系统, 我们的程序无法正常重启系统。检查后发现这个型号的笔记本电脑有一个隐藏分区,而 C: 则是 partition(2)。我们必须寻找一个途径将驱动器号转换成分区号。

  查阅 MSDN 后得知标准 Win32 API 的解决方法, 简单范例:

 

#include <stdlib.h>

#include <stdio.h>

#include <windows.h>

#include <Winioctl.h>

#include <iostream.h>

 

//  Required to ensure correct PhysicalDrive IOCTL structure setup

#pragma pack(1)

 

int main(int argc, char** argv)

{

 HANDLE hDrv = CreateFile("////.//C:",

     GENERIC_READ,                // Read only to the drive

                    FILE_SHARE_READ | // share mode

                    FILE_SHARE_WRITE,

                    NULL,             // default security attributes

                    OPEN_EXISTING,    // disposition

                    0,                // file attributes

                    NULL);

 

 if(!hDrv)

 {

  cout << "Error Can not open the Driver " << GetLastError();

  return 0;

 }

 

 PARTITION_INFORMATION pinfo;

 DWORD lpBytesReturned;

 

 

 BOOL bSuccess = DeviceIoControl(

     (HANDLE) hDrv,                // handle to a partition

     IOCTL_DISK_GET_PARTITION_INFO,   // dwIoControlCode

     NULL,                            // lpInBuffer

     0,                               // nInBufferSize

     (LPVOID) &pinfo,            // output buffer

     (DWORD) sizeof(pinfo),          // size of output buffer

     (LPDWORD) &lpBytesReturned,       // number of bytes returned

     (LPOVERLAPPED) NULL      // OVERLAPPED structure

     );

 

 CloseHandle(hDrv);

 

 if(!bSuccess)

 {

  cout << "ERROR " << GetLastError();

  return 0;

 }

 cout << pinfo.PartitionNumber;

 

 

 return 1;

}

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HN2IP host name convert to IP

  • 2009-08-01 14:57
  • 1.13MB
  • 下载

XP系统中,如何将驱动器盘符或某个文件夹显示为蓝色或绿色的字体颜色恢复成黑色

问题描述XP系统中,用户来电表示驱动器盘符或者某个文件夹显示字体为蓝色或绿色,具体现象如下图所示,咨询其原因?蓝色字体:绿色字体:问题分析微软有三种文件系统:FAT,FAT32,NTFS。FAT主要用...

ProgressBar控件的应用;文件的读出和写入;目录和文件管理;检索计算机上逻辑驱动器盘符;XML文件的增加、修改、读节点内容

今天学的知识整理: 1、ProgressBar控件的应用 Maximum最大值,Minimum最小值,Value当前的进度值 //调用PerformStep方法,设置step步长规定每次增加进...

C#获取驱动器盘符

一、使用ManagementObjectSearcher类 static void Main(string[] args) { SelectQ...

Windows 7怎样更改DVD驱动器盘符?

Windows 7怎样更改DVD驱动器盘符? 简介 安装Windows 7时不小心将DVD驱动器盘符改成F,看起来怪怪的,有没有方法能改回来。 ...

逻辑驱动器个数和盘符获取GetLogicalDrives和GetLogicalDriverStrings

获取逻辑驱动器有两个函数GetLogicalDrives和GetLogicalDriverStrings MSDN:GetLogicalDrives函数介绍 MSDN :GetLogicalDrive...

在Win 2000/XP下调整硬盘分区与盘符 转

在Win 2000/XP下调整硬盘分区与盘符 中国电脑教育报 飞鱼 很多用户都知道,使用Windows XP的安装盘,可以直接在没有进行分区和格式化的硬盘上安装Windows XP。其实,W...

[leetcode: Python]405. Convert a Number to Hexadecimal

Title: Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two...
  • NXHYD
  • NXHYD
  • 2017-05-16 17:18
  • 136
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)