Contributor: CLAUS ZIEGLER
{
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


AltStyle によって変換されたページ (->オリジナル) /