C 實現磁碟初始化

2021-08-20 08:34:00 字數 1458 閱讀 4811

磁碟在聯機後要初始化,同樣也有兩種方法,一種是呼叫ioctl_disk_create_disk,還有一種是呼叫wmi的initialize方法。

1.首先說說簡單的wmi的方法:

大致思路同部落格:c++ 實現磁碟聯機

先獲取磁碟的id, 然後執行無引數方法initialize 

核心模組**如下:

wchar_t msftdiskobjectid[256];

getwmimsftdiskobjectid(msftdiskobjectid, index);

bstr methodname = sysallocstring(l"initialize");

ccomptr< iwbemclassobject > poutparams = null;

hr = service->execmethod(msftdiskobjectid, methodname, 0, null, null, &poutparams, null);

if (failed(hr))

sysfreestring(methodname);

2. 使用ioctl_disk_create_disk方法的話,需要分成mbr和gpt兩種情況處理,因為mbr使用的是磁碟signature,而gpt磁碟使用的是磁碟guid.

mbr**如下:

int initalizediskmbr(int index, unsigned int signature)

//判斷是否可寫

for (int i = 0; i < 10; ++i)

create_disk disk;

disk.partitionstyle=partition_style_mbr;

disk.mbr.signature=signature;

dword returnedlength;

bool ret=deviceiocontrol(hfile, ioctl_disk_create_disk, &disk, sizeof(create_disk), null, 0, &returnedlength, null);

if (!ret)

closehandle(hfile);

return retcode;

}

gpt磁碟類似,不同的地方在於傳入的引數變成了guid

核心**在於create_disk結構的初始化發生了變化:

create_disk disk;

disk.partitionstyle = partition_style_gpt;

memcpy(&(disk.gpt.diskid),guid,sizeof(guid));

disk.gpt.maxpartitioncount = 128;

guidtostring(diskguid,*guid);

C 直接初始化和複製初始化

在c 裡,物件初始化是乙個非常重要但又容易令人混淆的問題。這裡是自己的一些總結。一。初始化與賦值的含義 初始化 包括建立 或說定義 物件並且賦給初值。如果乙個物件只被建立而沒有被初始化,則該變數只能用於被賦值 賦值 擦除物件的當前值並用新值代替。二。內建型別 一 直接初始化 1.空初始化 即無引數無...

c 直接初始化與拷貝初始化

我們常見的幾種初始化的形式 string str1 first 拷貝初始化,編譯器允許把這句話改寫為string str first 但是string類必須有public的拷貝 移動 建構函式 string str2 10,a 直接初始化 string str3 str2 直接初始化 string ...

初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...