[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]