根据驱动器盘符获得分区号.doc_第1页
根据驱动器盘符获得分区号.doc_第2页
根据驱动器盘符获得分区号.doc_第3页
根据驱动器盘符获得分区号.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

白水绕东城Zhongs Blog 条新通知 登录 注册 欢迎 退出 我的博客 配置 写文章 文章管理 博客首页 空间 博客 好友 相册 留言 用户操作 留言 发消息 加为好友 订阅我的博客 编辑felixz的公告 用 Gtalk 和我交谈 _uacct = UA-292248-3; urchinTracker(); 编辑文章分类 .net code C+ Builder etc Linux Philosophic Symbian win32 code win32 driver编辑My Pages Google Analytics hotmail mobile my flickr ReactOS 存档 2008年04月(1) 2008年03月(1) 2007年09月(1) 2007年06月(6) 2007年05月(5) 2007年03月(3) 2006年10月(3) 2006年08月(2) 2006年07月(3) 2006年06月(4) 2006年05月(10)公告: 意见反馈官方博客 根据驱动器盘符获得分区号 (Convert Driver Name to Partition Number) 收藏 程序里有自动重启 Windows 系统的功能,当有多个 Windows 共存的时候 C: 根目录下的 boot.ini 文件包含类似下面的内容:boot loader timeout=30 default=multi(0)disk(0)rdisk(0)partition(1)WINNToperating systems multi(0)disk(0)rdisk(0)partition(1)WINNT=Windows 2000 Professionalmulti(0)disk(0)rdisk(0)partition(2)WINDOWS=WindowsXP 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 #include #include #include #include / 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;发表于 2006年05月17日16:36:00| 评论( loading. ) | 编辑| 举报| 收藏 新一篇

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论