磁碟在聯機後要初始化,同樣也有兩種方法,一種是呼叫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...