📄 lock2.asm
字号:
;LOCK&UNLOCK.ASM
CODE SEGMENT
ASSUME CS:CODE,DS:CODE
ORG 100H
START:
JMP BEGIN
TS1 DB "No Drive !",7,13,10,'$'
TS2 DB 'Usage: ',13,10
DB ' LOCK /L C: .or. LOCK /U C:',13,10,7,'$'
TS3 DB 'Read Drive failure ! ',7,13,10,'$'
TS4 DB 'Not DOS .or. EXTEND Partition ! ',7,13,10,'$'
TS5 DB 'This drive had already locked !',7,13,10,'$'
TS51 DB 'This drive had already UNlocked !',7,13,10,'$'
TS6 DB 13,10,7,'This drive A: will been Locked! Continue(Y/N)? $'
TS7 DB 13,10,'LOCK OK !',13,10
flag db 0
Begin:
mov dx,offset TS2
call parascan ;参数处理
jnc $+5
jmp err_exit
mov dx,offset ts1
mov si,82h
cmp byte ptr ds:[si-2],0
ja $+5
jmp err_exit
mov dx,offset ts2
loc_1:
lodsb
cmp al,20h
jz loc_1
cmp al,'A'
jae $+5
jmp err_exit
and al,5fh
cmp al,'A'
jae $+5
jmp err_exit
xor ah,ah
sub al,'A'
mov si,ax
cmp al,2
jae loc_2
jmp lock_begin
loc_2:
mov cx,1
loc_21:
push ax
mov ax,201h
mov bx,offset buff
mov dx,80h
int 13h ;读入指定扇区
pop ax
mov dx,offset ts3
jnc $+5
jmp err_exit
add bx,1c2h
cmp ax,2
je loc_3
dec ax
mov cx,4
loc_22:
cmp byte ptr [bx],05h ;是EXT_DOS分区吗?
jz loc_2? ;是,转
add bx,10h
loop loc_22 ;找下一分区表项
mov dx,offset ts4 ;4项找完
jmp err_exit
loc_2?:
mov cx,word ptr [bx-2]
jmp loc_21
loc_3:
cmp byte ptr cs:flag,0 ;是加锁吗?
jnz $+5 ;不是
jmp disklock
mov dx,offset ts51
cmp byte ptr [bx-10h],0
jnz $+5
jmp err_exit
mov al,byte ptr [bx-10h]
mov byte ptr [bx-10h],0
mov di,cx
mov cx,4
unlock_0:
cmp word ptr [bx-2],di
je unlock_1
add bx,10h
loop unlock_0
jmp err_exit
unlock_1:
mov cx,di
mov byte ptr [bx],al
mov bx,offset buff
mov dx,80h
mov ax,301h
int 13h ;写入指定磁盘扇区
jmp mem_lock
disklock:
mov dx,offset ts5
cmp byte ptr [bx-10h],0 ;没有加锁吗
jz $+5 ;是,转
jmp err_exit
push cx
mov cx,4
loc_31:
cmp byte ptr [bx],01h ;12位FAT
je loc_4
cmp byte ptr [bx],04h ;16位FAT
je loc_4
cmp byte ptr [bx],06h ;保留FAT
je loc_4
add bx,10h
loop loc_31
pop cx
mov dx,offset ts4
jmp err_exit
loc_4:
mov al,byte ptr [bx]
mov byte ptr [bx],0
pop cx
mov bx,offset buff
mov byte ptr [bx+1b2h],al
Lock_begin:
mov dx,offset ts6
mov di,dx
mov ax,si
ADD AL,'A'
MOV byte ptr DS:[di+14],AL ;驱动器号
mov ah,9
int 21h
MOV AH,1
INT 21H ;等待敲键
AND AL,5FH ;转换成大写
CMP AL,59H ;是'Y'吗
Je $+5
jmp exit
mov ax,si
cmp al,2
jb mem_lock
mov dx,80h
mov ax,0301h
int 13h ;写入指定磁盘扇区
mem_lock:
mov ah,52h
int 21h ;获取目录结构表
mov ax,si
mov dl,58h
mul dl
mov si,word ptr es:[bx+16h]
mov ds,word ptr es:[bx+18h]
add si,ax
mov word ptr ds:[si+43h],0 ;置磁盘无效标志
cmp byte ptr cs:flag,0 ;是加锁磁盘吗?
jz exit ;是,转
cmp word ptr ds:[si+45h],0 ;该驱动器的DPB指针有效否?
jnz mem_lock1 ;有效,转
cmp word ptr ds:[si+47h],0
jz exit
mem_lock1:
mov word ptr ds:[si+43h],4000h;置磁盘有效标志
jmp exit
err_exit:
mov ah,9
int 21h
exit:
mov ax,4c00h
int 21h
parascan proc near
mov si,81h
ploc_1:
lodsb
cmp al,20h
jz ploc_1 ;空格忽略
cmp al,0dh
jz p_exit ;回车结束
cmp al,'/'
jnz ploc_1
lodsb
and al,5fh ;转换成大写
cmp al,'L'
jz ploc_2
cmp al,'U'
jnz ploc_1
mov byte ptr ds:flag,1
ploc_2:
mov word ptr [si-2],2020h
clc
ret
p_exit:
stc
ret
parascan endp
buff label byte
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -