随便说几个点吧。
分区相关的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直接创建/删除分区,不需要裸写分区表。