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...