[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]

    {
    RN > Howdy All!

    RN > I "had" a small external program, that ran as a module for
    RN > one of my larger products.  This module allowed formatting
    RN > of floppy disks.

    RN > Since WIN95 this program no longer works, returns errors.

    RN > From my reading, is seems that DOS programs using IRQ ummmm,
    RN > 25 and ?? conflict with WIN95 system, unless they LOCK the
    RN > volume.

    and Interrupt 13h, interrupt 26h and IOCTL functions

    RN > Can anybody tell me how, in a DOS program, to LOCK the
    RN > volume ID so that the floppy in that drive might be
    RN > formatted, under WIN95 OS?

    I use:

    ------------------------- Cut begin (TEMP.TMP) ---------------------------
    }
    Function Lock(DNum:Byte):Boolean;
    Var
      fejl : Byte;
    Begin
      {$ifdef Windows}
      Lock:=True;
      If ((GetWinFlags and $4000)>0) or (Hi(LoWord(GetVersion))<20) Then Exit;
      {$Endif}
      Asm
        Mov fejl,1      {Nothing is OK yet}
        Mov ax,440dh    {generic IOCTL}
        Mov bh,0        {Lock level, first lock on drive}
        Mov bl,DNum     {Number of drive}
        Mov ch,08h      {device catagory (Must be 08h)}
        Mov cl,4bh      {Lock physical volume}
        Mov dx,0b       {Permisions (First lock=0)}
        {$ifdef Windows}
        Call Dos3Call   {Do it}
        {$Else}
        Int 21h
        {$Endif}
        jc @@Error      {Error?}
        Mov ax,440dh    {generic IOCTL}
        Mov bh,0        {Lock level, second lock on drive}
        Mov bl,DNum     {Number of drive}
        Mov ch,08h      {Device catagory (Must be 08h)}
        Mov cl,4bh      {Lock physical volume}
        Mov dx,100b     {Lock for format}
        {$ifdef Windows}
        Call Dos3Call   {Do it}
        {$Else}
        Int 21h
        {$Endif}
        jc @@Error2     {Error?}
        Mov Fejl,0      {No, no error here}
        Jmp @@Error     {End this function}
        @@Error2:
        Mov ax,440dh    {Unlock first lock, if second failed}
        Mov bl,DNum     {Number of drive}
        Mov ch,08h      {Device catagory (Must be 08h)}
        Mov cl,6bh      {Unlock physical volume}
        {$ifdef Windows}
        Call Dos3Call   {Do it}
        {$Else}
        Int 21h
        {$Endif}
        @@Error:
      End;
      Lock:=(Fejl=0);
    End;

    Procedure UnLock(DNum:Byte);
    Begin
      {$ifdef Windows}
      If ((GetWinFlags and $4000)>0) or (Hi(LoWord(GetVersion))<20) Then Exit;
      {$Endif}
      Asm
        Mov ax,440dh    {Generic IOCTL}
        Mov bl,DNum     {Drive number}
        Mov ch,08h      {Device catagory (Must be 08h)}
        Mov cl,6bh      {Unlock physical volume}
        {$ifdef Windows}
        Call Dos3Call   {Do it}
        {$Else}
        Int 21h
        {$Endif}
        Mov ax,440dh    {Generic IOCTL}
        Mov bl,DNum     {Drive number}
        Mov ch,08h      {Device catagory (Must be 08h)}
        Mov cl,6bh      {Unlock physical volume}
        {$ifdef Windows}
        Call Dos3Call   {Do it}
        {$Else}
        Int 21h
        {$Endif}
      End;
    End;

    -------------------------- Cut end (TEMP.TMP)-----------------------------

    It is used in this way:

    If Lock(Drive) then begin
      Format(Drive) {or whatever}
      UnLock(Drive);
    End;

    The drives are numbered: A=0 B=1

[Back to DRIVES SWAG index] [Back to Main SWAG index] [Original]