• 当前位置:首页>>汇编语言>>汇编语言技巧教程>>仿FDISK及PQMAGIC列出分区逻辑盘符的prw.asm实现(1)
  • 仿FDISK及PQMAGIC列出分区逻辑盘符的prw.asm实现(1)
  •    FDISK,系98的FDISK.EXE(>512M模式运行)
      PQMAGIC,系POWER QUEST公司的PQMAGIC.EXE(DOS版,7)
      
      本文基于486DX2,主板,可带primary/secondary两IDE控制器,中断14/15,每个IDE,可带master,slave两通道,每个通道,可带1台硬盘驱动器,每台驱动器,可带1块NORMAL,LBA,LARGE模式的IDE硬盘.
      
      DOS,98对硬盘,先按IDE,后按master/slave,依次编号,不编闲置通道.例如,有3块盘,块1,2在primary的master/slave上,块3在secondary的slave上,此3块,编为80h~82h.
      
      开机盘的IDE及通道,由BIOS的BOOT SEQUENCE指定.
      
      (1) DOS/98的读写FAT 16/32格式的位置X的Y个连续扇区的BIOS中断13h参数:
      ah的2/3指明读/写,al的低6位指明Y,es:bx指向内存buf首,cl的低6位指明X的扇号sector,最小值1,ch的8位,左拼cl第6,7位,齐指X的柱面号cylinder,最小值0,dh指明磁头号head,最小值0,dl指明软硬盘编号.
      
      NORMAL,柱面数1024,磁头数16,扇区数63,每扇512字节,相乘=容量528MB.用作chs(cylinder,head,sector)立体寻扇及98挂大盘
      
      LBA,磁头异数到255,容量8.4GB
      
      LARGE,盘柱面数>1024,磁头数16时,控制器做柱面数/2,磁头数*2,以调13h.容量1G
      
      (2) 针对LBA的扩展13h线性64位lba寻扇:
      
      chs转成lba的公式:lba=c*sectors_per_cylinder+h*sectors_per_track+(s-1)
      其中,sectors_per_cylinder为每柱面扇数,sectors_per_track为每磁道扇数,因s从1编号,要减1.
      
      chs,lba的互转,见"(7) prw文"的chs2lba,lba2chs.
      
      利用extblk块:
      
      extblk  db  16  ;块的字节数(包括此字节)
      rsv     db  0    ;需为0
      sec_tot dw  1     ;指明Y个扇区
      buf_off dw  0   ;内存buf偏移
      buf_seg dw  0   ;内存buf段值
      lbal    dw  0   ;lba低双字低字
      lbah    dw  0   ;lba低双字高字
              dd  0   ;lba高双字
      
      读/写时,ah=42h/43h,ds:si指向extblk,dl意义不变
      
      扩展i13接口的BIOS支持及导出硬盘柱面数,磁头数,每磁道扇区数,算法见"(7) prw文"的h_geo
      
      (3) 硬盘分区:
      
      每块硬盘,最多划为DOS主分区,DOS扩展分区,非DOS分区之1的4分区,述于16字节分区表:
      
      bootON    db 0    80h/00,指明活跃/不活跃.MBR交控制给驻有OS的活跃主分区引导记录
          db ?    指明启动头号
          dw ?    低6位指明启动扇区,高字节的8位,左拼低字节第6,7位,齐指启动柱面号
      volume    db 0    分区标识值
          db ?    指明结束头号
          dw ?    低6位指明结束扇区,高字节的8位,左拼低字节第6,7位,齐指结束柱面号
      Front    dd 0    此分区之前扇区数,低/高字在前/后,如10025009H,5009在前
      In    dd 0    此分区所含扇区数,低/高字在前/后
      
      分区标识值:
      
      闲置:0
      DOS主分区:1,4,6,0bh,0ch,0eh
      DOS扩展分区:5,0fh
      非DOS分区:其它
      
      笔者用P,对硬盘划分4个DOS主分区,再用prw,读此盘chs(0:0:0)到文件0,用debug,改分区volume值为2,用prw,回写0到chs(0:0:0),P的分区info页,显出volume对应FAT类型XENIX.再得
      
      对应意义,见"(7) prw 文"的FAT
      
      若volume<20H,则高4位,1/0表示隐藏/非隐藏,后缀X,用于扩展i13接口.
      
      各硬盘,均含称为主引导记录(MBR)的1个扇,位于chs第0头第0柱面第1扇,其偏移1be字节,连续存4个分区表.
      
      各硬盘,最多1个DOS扩展分区,其内,能划分称为逻辑分区的数个DOS主分区,非DOS分区.
      
      逻辑分区串成链.例如,volume为5的扩展分区E,先含1个DOS主分区D,后含1个非DOS分区N,则E的Front域值F,是E内的各逻辑分区位置基址,F指明扇区S1,而S1的偏移1be字节,是D的分区表,偏移1ce字节,其volume为0fh,表明是DOS扩展分区,其Front域值,加上基址F,指明扇区S2,而S2的偏移1be字节,是N的分区表,偏移1ce字节,其volume为链尾0.
      
      (4) 仿F及P,列出分区逻辑盘符:
      
      盘符,从C:列向Z:.用F及P,能建数个逻辑分区
      
      分区超过Z:符时,F照列,P不赋盘符,prw赋^符
      
      活跃区数>1时,F,prw照列,P显错,boot失败
      
      F及P,依volume域,查以下3步,每步,查80h至83h:
      
      (1) 查DOS主分区
      分区若是DOS主分区,则查活跃值bootON是否80H,若是,此分区就占1个逻辑盘符,若无活跃主分区,表项在MBR首现的主分区,就占1个逻辑盘符.
      
      例如,80h~82h硬盘,80h的第1,3分区是主分区,但第3分区活跃,则第3分区占盘符C:.而81h,只含DOS扩展分区,其上,含1个DOS主分区及1个非DOS分区;82h的第2,4分区是不活跃主分区,则最先在MBR中出现的第2分区,占盘符D:
      
      (2) 查DOS扩展分区
      按逻辑分区在链上次序,查它是否DOS主分区,是就占盘符,81h的DOS扩展分区上的DOS主分区,占盘符E:
      
      (3) 查未占过盘符的DOS主分区及非DOS分区
      按MBR中,分区表项出现的先后次序,查分区是否DOS主分区,若是,且它未占过盘符,就占盘符.80h的第1分区,占盘符F:,82h的第4分区,占盘符G:
      
      F,P,prw,不给非DOS分区赋盘符,仅显出从In得的容量.
      
      (5) 例:
      
      笔者机器,在primary master上,装ST32140A驱动器(2012M),在secondary master上,装QUANTUM MAVERICK 540A驱动器(514M).
      
      (5.1) 80h上,现有volume为6的活跃主分区(FAT16B,1299M),volume为6的DOS主分区(FAT16B,39.4M),volume为17h的非DOS分区(HiddenNTFS,574.9M),volume为5的扩展分区,其上,有4个逻辑分区,按链上次序是:
      volume为0bh的DOS主分区(FAT32,35.4M,簇xk),volume为83h的非DOS分区(Linux_Ext2,19.7M),volume为1的DOS主分区(Unformatted,3.9M),volume为6的DOS主分区(FAT16B,41.3M),
      
      (5.2) 81h上,现有volume为82h的非DOS分区(Linux_Swap,3M),volume为11h的非DOS分区(Unformatted,3M),volume为6的活跃主分区(FAT16B,472.5M),volume为0fh的扩展分区,其上,有4个逻辑分区,按链上次序:
      
      volume为82h的非DOS分区(Linux_Swap,10.8M),volume为1的DOS主分区(FAT12,8.8M),volume为7的非DOS分区(NTFS,9,8M),volume为1的DOS主分区(Unformatted,7.8M).
      
      用98启动盘开机,F,P,prw,对这些分区,列出盘符及容量(MB:...是prw的16进制列出)
      
      C:1299M(MB:00000513)
      D;472.5M(MB:000001d9)
      E:35.4M(MB:00000023)
      F:3.9M(MB:00000004)
      G:41.3M(MB:00000029)
      J:39.4M(MB:00000027)
      H:8.8M(MB:00000009)
      I:7.8M(MB:00000008)
      
      (6) prw功能
      
      命令行格式为prw.exe [foo],foo为当前目录下文件名.
      
      初始界面:
      p(artition),r(ead sec to cmdline_file/stdout),w(rite file to sec),v(xd w)
      
      按p,r,w,v键,启动命令:
      
      (6.1) 命令p,显出如下值:分区硬盘编号(80),逻辑盘符(C:),BootON值(80),volume值(06),Front值(3f),In值(3ee041),从In得的容量(7dc):
      
      80,C:,Boot(80),FAT(06),Front|In:0000003f|003ee041,MB:000007dc
      
      p无限显示,则存失效F的扩展分区递归的硬盘锁.
      
      (6.2) 命令r,读软硬盘内容到新建file,或scr
      
      (6.3) 命令wv,写已存file到软硬盘,但v,依C.VxD,克服9x的DOS窗口保护硬盘,不许13h写之劣.算法见"(8) 论9x的V86下,直寻硬盘扇区,只能靠VxD"
     

  • 上一篇:用程序修改PE使其可显示一个消息框
    下一篇:仿FDISK及PQMAGIC列出分区逻辑盘符的prw.asm实现(2)