⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lock2.asm

📁 锁住/解锁硬盘
💻 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 + -