1. 程式人生 > >獲取硬碟分割槽表的格式--是gpt還是mbr

獲取硬碟分割槽表的格式--是gpt還是mbr

MSDN:DeviceIoControl

與硬體驅動互動時,DeviceIoControl 是常用的windows API。 它把控制碼發給制定的硬體驅動,然後獲取裝置資訊或者對裝置進行其他操作。 下面是一個小demo

#include<iostream>
#include<windows.h>
using namespace std;


int main()
{
	TCHAR szDiskPos[128] = L"\\\\.\\PhysicalDrive0"; //ff
	HANDLE hDevice = INVALID_HANDLE_VALUE;
	int
nDiskBufferSize = sizeof(PARTITION_INFORMATION_EX); PARTITION_INFORMATION_EX * lpDiskPartinfo_ex = (PARTITION_INFORMATION_EX *)malloc(nDiskBufferSize); DWORD nDiskBytesRead = 0; memset(lpDiskPartinfo_ex, 0, sizeof(lpDiskPartinfo_ex)); hDevice = CreateFile(szDiskPos, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL
, OPEN_EXISTING, 0, NULL); BOOL Ret = FALSE; Ret = DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO_EX, NULL, 0, lpDiskPartinfo_ex, nDiskBufferSize, &nDiskBytesRead, NULL); if(!Ret) { int e = GetLastError(); cout<<strerror(e)<<endl; } if(lpDiskPartinfo_ex->PartitionStyle == PARTITION_STYLE_MBR ) { cout
<<"MBR"<<endl; }else if(lpDiskPartinfo_ex->PartitionStyle == PARTITION_STYLE_GPT ) { cout<<"GPT"<<endl; }else if(lpDiskPartinfo_ex->PartitionStyle == PARTITION_STYLE_RAW ) { cout<<"RAW"<<endl; } free(lpDiskPartinfo_ex); lpDiskPartinfo_ex = NULL; CloseHandle(hDevice); cin.get(); return 0; }

這寫這個小demo的時候,犯了一個錯誤,使用了一個不再支援的控制碼IOCTL_DISK_GET_DRIVE_LAYOUT
而在MSDN上也已經警告過了

Note  IOCTL_DISK_GET_DRIVE_LAYOUT has been superseded by IOCTL_DISK_GET_DRIVE_LAYOUT_EX, which retrieves layout information for AT and EFI (Extensible Firmware Interface) partitions.

而我卻把這句話理解反了,使用IOCTL_DISK_GET_DRIVE_LAYOUT得不到想要的資料,雖然編譯是成功的,執行也沒有報錯,這導致後面浪費了好多時間。