No announcement yet.

Direct Disk write

  • Filter
  • Time
  • Show
Clear All
new posts

    Direct Disk write

    Hello, I am working on a program to wipe the partition table on
    a hard disk quickly.

    I found some code that Mel wrote for Int13 read/writes (below)

    I just need a little info on how to use it. The plan is to
    overwrite sector 0 - 575 with the Null character to wipe the
    Partition table and any of these boot managers that use the
    63 sector offset method. (EzDrive, GoBack, etc.)

    What I need to know is if the following code will work in theory.
    (I will test it in reality before deployment)

    for sector%=0 to 575
      call write.hard(1,1,1,sector%,1,chr$(0))
    call write.hard(1,1,1,0,575,1,string$(chr$(0),575)) 'I think this
                                                        'syntax is wrong
    Mel's code below here.

    function read.hard$(d, t, h, s, n)     ' Read a hard drive sector
     d$ = string$(n * 512,65)               ' d = drive number (0-3)
     Reg 1, (2 * 256) + n                   ' t = track
     Reg 2, strptr(d$)                      ' h = head
     Reg 3, ((t and &hff) * 256) + s        ' s = sector
     Reg 3, Reg(3) or (t and &h300) \ &h4   ' n = number to read
     Reg 4, (h * 256) + (d or &h80)         '
     Reg 9, strseg(d$)                      '
     Call Interrupt &h13                    '
     read.hard$ = d$                        '
    end function                           '
    function write.hard(d, t, h, s, n, d$) ' Write a hard drive sector
     Reg 1, (3 * 256) + n                   ' d = drive (0-3)
     Reg 2, strptr(d$)                      ' t = track number
     Reg 3, ((t and &hff) * 256) + s        ' h = head number
     Reg 3, Reg(3) or (t and &h300) \ &h4   ' s = sector number
     Reg 4, (h * 256) + (d or &h80)         ' n = nbr sects to write
     Reg 9, strseg(d$)                      ' d$ = data to write
     Call Interrupt &h13                    ' Call the interrupt (13h)
    end function                           '
    mailto:[email protected][email protected]</A>

    Originally posted by Amos Vryhof:
    for sector%=0 to 575
      call write.hard(1,1,1,sector%,1,chr$(0))
    I sure hope the hell you know what you are doing. Assuming you
    are, there are a couple of things you need to know.

    * * * * BACK UP YOUR HARD DRIVE * * * *

    The number of heads are referenced to 0. If you have 63 heads on
    the drive, they are numbered 0 to 62. Ditto on the number of
    tracks on the drive.

    Sectors per track, on the other hand, are numbered referenced to
    1. If you have 63 sectors per track, they are numbered 1 to 63.

    The code will work as advertised. However, you are apparently
    misunderstanding something:

    * * * * BACK UP YOUR HARD DRIVE * * * *

    function write.hard(d, t, h, s, n, d$)

    d = the drive number (0 thru 3). Your main boot drive is usually
    the "C" (drive 0). Partition(s) structure(s) on the drive are
    irrevellant. If your drive 0 has "C:\" & "D:\", it's all the same
    to this function. Both are treated as Drive=0.

    T, H, & S is the Track (Ref 0), Head (Ref 0) and Sector (Ref 1)

    N is the number of sectors to write to (1 to 63)

    D$ is the data you want to write. The size of the data buffer
    must be exactly 512 * N(umberOfSectors).

    and it's all over but the shouting.

    So to modify your code, I would suggest:

    * * * * BACK UP YOUR HARD DRIVE * * * *
    d = 0                         ' Define the drive (0 to 3)
    n = 1                         ' Number of sectors to write
    d$ = string$(512 * n,chr$(0)) ' Data to write
    for t = 0 to  1               ' First track only (Track 0)
      for h = 0 to 62             ' Assuming 63 heads on the drive
        for s = 1 to 63           ' Assuming 63 sectors per track
      call write.hard(d, t, h, s, n, d$)
        next s
      next h
    next t
    * * * * BACK UP YOUR HARD DRIVE * * * *


    [This message has been edited by Mel Bishop (edited September 03, 2002).]
    There are no atheists in a fox hole or the morning of a math test.
    If my flag offends you, I'll help you pack.


      As an added thought: If you are going to wipe the partition
      table, you might just as well go ahead and wipe the entire
      drive. Wiping the partition table means you will have to
      re-fdisk, re-format and re-install your operating system(s).
      Just as well to go with a "clean" drive right off the git-go.

      It's just a thought.

      There are no atheists in a fox hole or the morning of a math test.
      If my flag offends you, I'll help you pack.


        The whole point of this utility is simply to make the drive
        appear unpartitioned so I can put it in a batch file to FDISK
        and format a hard drive unattended.

        FDISK will take a response file, but there is no real way to
        determine if all partitions are gone. Zeroing the first 575
        will do the trick and remove boot managers and such. Then I can
        do a simple response file for FDISK to create a single fresh
        partition, reboot the system, then run Format c: /autotest (for
        unattended format)

        Backing up the hard drive for this operation is pointless, as the
        goal is to simply wipe the MBR/Partiti8on table.

        Thanks for the help Mel, I will be beta testing in no time!

        mailto:[email protected][email protected]</A>


          I'd just like to mention this unit I wrote once for direct disk access under DOS (and Win9x for read-only). It's called DIRDISK, it's free to use (w/o source) and you can find it at:

          There's also a PBH help file with all the info on how to use the various routines. In my opinion they're very easy to use, but that's probably because I wrote them In case of problems or desperate need of source code, please contact me

          [edit]Hmm, since you're already in beta-testing phase, this might no longer apply to you Amos, but I leave this post because it fits well in this topic when people use the 'search forum' option[/edit]

          Sebastian Groeneveld
          mailto:[email protected][email protected]</A>

          [This message has been edited by Sebastian Groeneveld (edited September 04, 2002).]
          Sebastian Groeneveld
          mailto:[email protected][email protected]</A>


            I may use your unit in the future. I noticed it while doing my
            initial search. A friend and myself might be doing some drive
            imaging software, and it seems your unit would be more useful
            for this type of thing.

            Just out of curriosity, does your unit work on large hard drives
            (8Gb and larger)?

            I recall seeing that Int13 reads/writes won't work past 8Gb.

            mailto:[email protected][email protected]</A>


              Originally posted by Amos Vryhof:
              I recall seeing that Int13 reads/writes won't work past 8Gb.
              You are partly right on this Amos. The routine in your original
              post will work up to 8gb. If you have a drive larger than 8gb,
              you will have to go the LBA route. LBA still uses int13 but in
              a different way. Sorry, I don't have code for this (yet).

              There are no atheists in a fox hole or the morning of a math test.
              If my flag offends you, I'll help you pack.



                I can undertand the joy of writing this tool yourself
                However you may want to have a look at MBRtool that will do what you want as well.
                It is a command line tool that therefore can be 'batched'.

                Command line would look like: MBRtool /x /d:0 - will wipe track 0 on disk 0

                Note, MBRtool wipes the first track (normally 63 sectors) which is enough to get rid of all boot managers, hard disk overlays as EZ drive and Ontrack DDO etc ...
                Homepage for MBRtool:

                Best regards,


                [This message has been edited by Joep van Steen (edited September 05, 2002).]



                  Thanks Joep,

                  I do have a copy of that handy as a matter of fact!

                  I still prefer to write my own code, mostly for the educational
                  experience. It's easy to take someone else's software and use
                  it, but still never really know how it works.

                  At least starting with Mel's functions, I can see what is going
                  on and get a hang of it for possible other uses. Most people
                  ask, "Why reinvent the wheel?" I say "Why use your neighbor's
                  wheel when you can have your own?"

                  Finally, thank you to all who responded. It's great to see a
                  friendly DOS community still exists.

                  mailto:[email protected][email protected]</A>



                    >At least starting with Mel's functions, I can see what is going
                    >on and get a hang of it for possible other uses.

                    Yes, as long as you intend to only read/write up to the first 1024 cylinders of a disk you're fine with Mel's routines. There used for MBRtool as well as it only reads/writes to the first track anyway.

                    Something that may come in handy: The geometry of a disk depends up on how the BIOS translates it or if it is translated at all. Fro example, you may see your disk in the BIOS as:

                    1024 cyl 255 heads 63 sector/track, or,
                    1024 cyl 240 heads 63 sector/track, or untranslated,
                    16000 cyl 15 heads 63 sector/track, or sometimes with SCSI,
                    1024 cyl 240 heads, 32 sector/track

                    If you want to read/write you have to be able to tell when to wrap to the next head or cylinder. The following function will return the drive geometry as it was detected by the BIOS:

                    sub readgeo (disk as byte,gcyl as integer,ghead as integer,gsect as integer)

                    dim regc as local string
                    dim regd as local string
                    dim c as local string
                    dim h as local string
                    dim s as local string

                    reg 1,2048
                    reg 4,disk
                    call interrupt &h13



                    if gcyl=1023 then gcyl=1024 'some BIOSes translate non standard, make up for that
                    if ghead=254 then ghead=255 'some BIOSes translate non standard, make up for that

                    end sub


                    Also handy, CHS to LBA conversion:

                    function calclba (cyl as dword,head as dword,sector as dword) as dword
                    dim tmp as local dword
                    if cyl=0 and head=0 and sector=0 then
                    tmp=(((cyl * ghead) + head) * gsect) + sector - 1
                    end if
                    end function

                    Good luck!





                      Hi Amos,
                      To zap the partition table you need only to access Track 0, Head 0, Sector 1.
                      This MBR sector contain the partition table, 64 bytes (16 * 4) at offset &H1BF.

                      If you use FDisk to recreate partition then zapping those 64 bytes should
                      be enough, if you want to recreate the partition programmatically then
                      it is often necessary to zap the first sector of each partition
                      depending of the DOS/FDisk-Format version you use.

                      Since you are aware of the /autotest swicth, I'm sure you know
                      the /MBR one to restore a fresh MBR.

                      I did wrote a FDisk program, unfortunately, it is written in PDS/PDQ,
                      it's not quite finished yet, but all the needed functions are in it...

                      BootRecordInfo, ChsToLB, LbToChs,CsToInt, IntToChs, DrvParam
                      PartTableRead, PartTableWrite, SectRead, SectWrite
                      LockDrive (For acces under Win 9x), BootStar compatable.
                      No problem with disk bigger than 8.4 gig.

                      Just send me a mail if you are interested.

                      Also, some usefull links...

                      Pierre Bellisle
                      eMail removed

                      [This message has been edited by Pierre Bellisle (edited December 21, 2006).]


                        Hi Amos,
                        I have some source code that I can send you if you are still in need of these routines.
                        BTW: My Company Omnitron, has a Disk and File Editor for FAT32 and NTFS file systems (xray1.2). Download demo here NOTE: The demo only reads to disk and is limited to 35000 sectors. While I would like to pitch my product, I also would like to help with your request and like I said, send you some routines, and provide you with resources to accomplish such task's.

                        keep in mind that the routines I will send are proven to work, afterall, We use em!