reactos作業系統實現 78

2021-08-24 19:24:48 字數 3731 閱讀 5597

arc命名是windows nt系統用來定位其引導分割槽所在的路徑,也就是利用它指明引導分割槽在哪乙個磁碟控制器,哪乙個硬碟,哪乙個分區內。arc命名可分為兩大類,以scsi為首或以multi為首,現分別說明如下:scsi(x)disk(y)rdisk(0)partition(z): 以scsi為首,表明該磁碟控制器為scsi卡,並且該卡上的bios被設定為禁用(disable)scsi(x):表示第幾個控制卡,x以0為起始數字。disk(y):表示該控制卡下的第幾塊物理磁碟,y以0為起始數字。partition(z):表示該物理磁碟上第幾個分割槽,z以1為起始數字。 注意:以scsi為首的arc命名的rdisk項總是rdisk(0)。multi(x)disk(0)rdisk(y)partition(z): 以multi為首,表明該磁碟控制器是ide,esdi,或是bios允許使用(enable)的scsi卡。multi(x):表示第幾個控制卡,x以0為起始數字。rdisk(y):表示該控制卡下的第幾塊物理磁碟,y以0為起始數字。partition(z):表示該物理磁碟上第幾個分割槽,z以1為起始數字。 注意:以multi為首的arc命名的disk項總是disk(0)。 還有一點必須注意的是,系統給nt分割槽編號時,主分割槽的編號永遠排在擴充套件分割槽前。例題windows2000安裝在d盤下,d盤為擴充套件分割槽的乙個邏輯驅動器,系統可以正常啟動。後來,又新增了乙個分割槽。重啟時發現系統無法引導了,是何原因,如何解決。 分析:乙個磁碟上最多只能有乙個擴充套件分割槽,則新新增的分割槽為主分割槽,而主分割槽的編號排在擴充套件分割槽前,所以d盤的實際arc路徑的partition值增加了1,而boot.ini檔案的內容沒變,這樣再利用原來的arc路徑就找不到d盤的系統目錄了。解決的方法就是修改boot.ini檔案。arc命名是windows nt系統用來定位其引導分割槽所在的路徑,也就是利用它指明引導分割槽在哪乙個磁碟控制器,哪乙個硬碟,哪乙個分區內。   arc命名可分為兩大類,以scsi為首或以multi為首,現分別說明如下:   scsi(x)disk(y)rdisk(0)partition(z):   以scsi為首,表明該磁碟控制器為scsi卡,並且該卡上的bios被設定為禁用(disable)   scsi(x):表示第幾個控制卡,x以0為起始數字。   disk(y):表示該控制卡下的第幾塊物理磁碟,y以0為起始數字。   partition(z):表示該物理磁碟上第幾個分割槽,z以1為起始數字。   注意:以scsi為首的arc命名的rdisk項總是rdisk(0)。   multi(x)disk(0)rdisk(y)partition(z):   以multi為首,表明該磁碟控制器是ide,esdi,或是bios允許使用(enable)的scsi卡。   multi(x):表示第幾個控制卡,x以0為起始數字。   rdisk(y):表示該控制卡下的第幾塊物理磁碟,y以0為起始數字。   partition(z):表示該物理磁碟上第幾個分割槽,z以1為起始數字。   注意:以multi為首的arc命名的disk項總是disk(0)。   還有一點必須注意的是,系統給nt分割槽編號時,主分割槽的編號永遠排在擴充套件分割槽前,故當引導分割槽處於原硬碟的剩餘磁碟空間時,必須將此磁碟空間設為主分割槽(已存在擴充套件分割槽),該分割槽雖然後編號,但其編號反而在原來擴充套件分割槽中的邏輯分割槽編號之前。

下面來分析建立引導的arc名稱,**如下:

#001 ntstatus

#002 init_function

#003 ntapi

#004 iopcreatearcnames(in ploader_parameter_block loaderblock)

#005

#047

檢查是否有乙個磁碟,但系統是從cd-rom引導的。

#048 /* check if we only found a disk, but we're booting from cd-rom */

#049 if ((singledisk) && strstr(loaderblock->arcbootdevicename, "cdrom"))

#050

#054

建立引導的字串。

#055 /* build the boot strings */

#056 rtlinitansistring(&arcbootstring, loaderblock->arcbootdevicename);

#057 rtlinitansistring(&arcsystemstring, loaderblock->archaldevicename);

#058

迴圈地建立每個磁碟的arc的名稱。

#059 /* loop every detected disk */

#060 for (i = 0; i < configinfo->diskcount; i++)

#061

#072

#073 /* loop arc disks */

#074 for (nextentry = arcdiskinfo->disksignaturelisthead.flink;

#075 nextentry != &arcdiskinfo->disksignaturelisthead;

#076 nextentry = nextentry->flink)

#077

#146

#147 /* check if it's the system boot partition */

#148 if (rtlequalstring(&arcstring, &arcsystemstring, true))

#149

#163 }

#164

#165 /* build the full arc name */

#166 sprintf(buffer,

#167 "//arcname//%spartition(%lu)",

#168 arcdiskentry->arcname,

#169 j + 1);

#170

#171 /* convert it to unicode */

#172 rtlinitansistring(&arcstring, buffer);

#173 status = rtlansistringtounicodestring(&arcname,

#174 &arcstring,

#175 true);

#176 if (!nt_success(status)) continue;

#177

#178 /* create the symbolic link and free the strings */

#179 ioassignarcname(&arcname, &devicename);

#180 rtlfreeunicodestring(&arcname);

#181 rtlfreeunicodestring(&devicename);

#182 }

#183 }

#184 }

#185 }

#186

檢查是否找到引導磁碟。

#187 /* check if we didn't find the boot disk */

#188 if (!foundboot)

#189

#200

#201 /* free the buffer */

#202 exfreepoolwithtag(partitionbuffer, tag_io);

#203 }

#204

#205 /* return success */

#206 return status_success;

#207 }

reactos作業系統實現 178

sendmessagew函式主要用來向視窗傳送訊息。下面就是它的實現 001 lresult winapi 002 sendmessagew hwnd wnd,003 uint msg,004 wparam wparam,005 lparam lparam 006 028 029 填寫訊息結構。03...

reactos作業系統實現 187

隨著全球化的發展,開發軟體都是面向多語言的環境。目前大多數程式都是採用不同字型來顯示不同語言的辦法,那麼有沒有一種更好的辦法,一種字型就可以解決全球語言的顯示呢?答案肯定的,它就是採用邏輯字型ms shell dlg和ms shell dlg2。比如開發應用程式時,就看到在資源裡可以設定ms she...

reactos作業系統實現 193

selectobject函式是將物件選定到指定的裝置場境中。具體實現 如下 001 hgdiobj 002 winapi 003 selectobject hdc hdc,004 hgdiobj hgdiobj 005 016 獲取選擇dc的物件正確的控制代碼。017 hgdiobj gdifixu...