百科问答小站 logo
百科问答小站 font logo



Windows C++如何直接写分区表? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

随便说几个点吧。

分区相关的API在此。

几个点要注意一下:

1. 权限的问题,要搞定。

2. 直接写盘的话,正常是写不到分区之外的,要用内核里的符号链接去写,就是\.PhsicalDrive0类似的名字。你可以使用WinObj查看内核对象的名字,WinOBJ可以从微软官网下载:

打开以后,global??的名字都是可以在用户态访问到的。

下面的一段代码就是读MBR的代码,写操作也是类似的:

       #include <windows.h> #include <stdlib.h> #include <string.h> #include <stdio.h>  int main()     {     HANDLE hFile;     char b[512];     DWORD nr;      hFile = CreateFile("\\?\PhysicalDrive2", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);          if (hFile == INVALID_HANDLE_VALUE)         {         printf("%d
", GetLastError());         return -1;         }      if (ReadFile(hFile, b, sizeof(b), &nr, NULL) == TRUE)         {         int i;         for (i = 0; i < 512; i++)             {             if (i % 16 == 0)                 {                 printf("
");                 }              printf("%02X ", (unsigned char)b[i]);             }         }      CloseHandle(hFile);      return 0;     }     

3. GPT分区问题

这个问题比较复杂,微软没有官方的文档放出来,我自己遇到过一次,就是在WIN10上,当一个盘有一个合法的MBR+PMBR+GPT的时候,在Linux或者其他OS上把MBR里的PMBR删掉,重新做MBR分区,此时GPT数据还在,这个时候把盘接到Windows上,Windows仍然会继续识别GPT分区,哪怕PMBR已经没有了。

解决的思路就是每次要把MBR后面的很大一片数据(直到第一个分区起点)都清零。通过注册表观察发现,Windows会缓存一部分GPT分区,但具体的检测机制并不清楚,这方面微软没有公开的文档。

如果题主只是想在用户态分区,那么研究一下DISKPART.EXE是怎么实现的更好,理论上说Windows提供了用户态的API直接创建/删除分区,不需要裸写分区表。




  

相关话题

  想做 C++ 方面开发,是基于 Linux 还是基于 Windows 平台? 
  同一段代码,为什么有的编译器能编译通过,有的不能? 
  关于阿里巴巴2011年一道C++笔试题(struct和class)的疑问? 
  如何让停留在语法层面的 C++,变成实际工程中的 C++? 
  开发桌面软件时,如何使用 Mac 上那种扁平化极简风格的 UI? 
  在C++中,为什么部分程序员喜欢在循环中写‘++i’而不是‘i++’? 
  为什么 Unix 一切皆文件的设计这么成功,而 C++ 统一的流式 IO 则不甚成功? 
  Linux 和 Windows 的内存申请机制有何不同? 
  在C语言中,math.h中定义的各种数学函数在电脑上具体是怎么实现的? 
  如何从零写一个正则表达式引擎? 

前一个讨论
为什么一个36字节的文本文档占用空间0字节?
下一个讨论
当两个CPU核心要求读写同一内存地址时,其后果是未定义行为吗?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利