首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

用 C 語言建立多個 Primary DOS 分區:分區表結構、隱藏切換與完整源碼實現

     編輯:C 語言基礎

動機

培訓環境中防止學員誤刪數據,利用硬盤支持 4 個主分區表項,建立多個 Primary DOS 分區,使用時僅激活一個,其餘隱藏,實現數據隔離保護。

分區表結構解析

  • 主引導扇區(0柱面0頭1扇區)含 446 字節引導代碼 + 64 字節分區表(4 項 × 16 字節) + 2 字節 55AA。
  • 表項結構:激活標志(1) | 起始CHS(3) | 類型(1) | 結束CHS(3) | 起始LBA(4) | 扇區數(4)。
  • 類型值:01=12bit FAT, 04=16bit FAT, 06=大分區, 05=擴展分區。
  • 擴展分區鏈:每個邏輯分區前有擴展分區表項,形成鏈表。

建立多主分區核心技巧

  1. 用 FDISK 建立 1 主分區 + 1 擴展分區(含 1 邏輯分區)。
  2. 將擴展分區表項類型 05→06,激活標志 00→80,同時將原主分區激活標志 80→00。
  3. 重啟格式化,新主分區成為 C:,原主分區變 D:。
  4. 重複上述步驟可建立第 3、4 個主分區。

隱藏/恢復分區程序邏輯

  • 利用主引導扇區保留區(0DBH-1BDH 228 字節)備份 4 個表項。
  • 切換時:將 4 項中非擴展類型項清零,僅保留目標項並置激活標志 80。
  • 恢復時:從備份區寫回表項。

完整源碼(PDOS.CPP,Turbo C++ 3.0)

#include <dos.h> #include <bios.h> #include <stdio.h> ...
struct PartitionTable { char Flag; struct HSC begin; char Type; struct HSC end; long id, size; };
struct note { char boot1[366]; PartitionTable PT[1], PT1[4], PT2[4]; char f[2]; } dosboot;

void create_pri_dos() {  // 擴展→主分區
    biosdisk(2,0x80,0,0,1,1,&dosboot);  // 讀主引導扇區
    for(i=0;i<4;i++) {
        if (dosboot.PT2[i].Type && dosboot.PT2[i].Type!=5) dosboot.PT2[i].Flag=0;
        if (dosboot.PT2[i].Type==5) { dosboot.PT2[i].Type=6; dosboot.PT2[i].Flag=0x80; }
    }
    biosdisk(3,0x80,0,0,1,1,&dosboot);  // 寫回
}
// set_hidde_dos() 備份、recall_dos() 恢復、change_dos(n) 切換保留第 n 項
main(int argc,char *argv[]) { ... switch(argv[1][0]) { case 'c':... case '1'..'4': change_dos(n); } }

實戰案例:1.2G 硬盤建 3 主分區

  1. FDISK 建 300M 主分區 + 400M 擴展分區 → 激活主分區 → 格式化 C: → PDOS S 備份 → PDOS C 轉換擴展為主分區 → 重啟格式化(原 C→D)。
  2. FDISK 再建 500M 擴展分區 → PDOS S → PDOS C → 重啟格式化。
  3. 最終盤符:C:500M, D:300M, E:400M。

關鍵:PDOS.EXE 必須拷貝到每個主分區,操作需極謹慎防數據損壞。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved