the_king
مدیرکل انجمن
برنامه زیر با فشار دادن کلید D در صفحه کلید یک درایو همانند :C یا :F و غیره را دریافت می کند.
سپس با فشار دادن کلید S، شماره سریال آن درایو را در یک فایل ASMLOCK.DAT ذخیره می کند.
در انتها با فشار دادن کلید C، شماره سریال موجود در فایل را با شماره سریال درایو مقایسه کرده
و پس از اعلام آن دو سریال، مطابقت و یا عدم مطابقت شماره ها را اعلام می کند.
این برنامه می تواند زیربنای یک قفل نرم افزاری باشد.
کد کامل برنامه به همراه فایل اجرایی com ضمیمه این پست می باشد.
سپس با فشار دادن کلید S، شماره سریال آن درایو را در یک فایل ASMLOCK.DAT ذخیره می کند.
در انتها با فشار دادن کلید C، شماره سریال موجود در فایل را با شماره سریال درایو مقایسه کرده
و پس از اعلام آن دو سریال، مطابقت و یا عدم مطابقت شماره ها را اعلام می کند.
این برنامه می تواند زیربنای یک قفل نرم افزاری باشد.
کد:
CommandLineLength EQU 80h
CommandLine EQU 81h
Key_ESC EQU 27
Key_C EQU 'C'
Key_D EQU 'D'
Key_S EQU 'S'
Key_A EQU 'A'
Key_Z EQU 'Z'
.MODEL TINY
.386
.CODE
.STARTUP
mov ah,19h
int 21h
add al,'A'
mov Drive,al
mov cl,byte ptr cs:[CommandLineLength]
xor ch,ch
cmp cx,3
jb NoCommand
mov dx,cx
mov di,CommandLine
mov al,":"
cld
repne scasb
jne NoDrive
mov al,[di-2]
Call ToUpcase
cmp al,'A'
jb Err5
cmp al,'Z'
ja Err5
mov Drive,al
mov TargetDrive,al
mov ah,9
mov dx,offset DriveMsg
int 21h
NoDrive:
mov di,81h
mov al,"/"
mov cx,dx
repne scasb
jne NoSwitch
mov al,[di]
call ToUpcase
cmp al,'C'
je AutoCheck
cmp al,'S'
je AutoSave
cmp al,'?'
je Err5
NoSwitch:
jmp Start
AutoSave:
mov ax,6900h
mov bl,Drive
sub bl,'A'
inc bl
mov dx,offset Buffer
int 21h
jc Err1
mov ax,3D01h
mov dx,offset Filename
int 21h
jnc FileOpened2
mov ah,3Ch
xor cx,cx
mov dx,offset Filename
int 21h
jc Err2
FileOpened2:
mov bx,ax
mov ah,40h
mov cx,4
mov dx,offset SerialNumber
int 21h
jc Err3
mov ah,3Eh
int 21h
mov ah,9
mov dx,offset SaveMsg
int 21h
.EXIT 0
AutoCheck:
mov ax,6900h
mov bl,Drive
sub bl,'A'
inc bl
mov dx,offset Buffer
int 21h
jc Err1
mov ax,3D00h
mov dx,offset Filename
int 21h
jc Err2
mov bx,ax
mov ah,3Fh
mov cx,4
mov dx,offset SavedSerialNumber
int 21h
jc Err4
mov ah,3Eh
int 21h
mov eax,SerialNumber
cmp eax,SavedSerialNumber
jne StateBad2
mov ah,9
mov dx,offset OKMsg
int 21h
.EXIT 0
StateBad2:
mov ah,9
mov dx,offset BadMsg
int 21h
.EXIT 1
Err5:
mov ah,9
mov dx,offset ErrMsg4
int 21h
.EXIT 1
NoCommand:
jmp Start
DriveMsg db "Target Drive : "
TargetDrive db 0
db 13,10,"$"
ErrMsg4 db "AsmLock Syntax :",13,10
db "Asmlock [disk:] [/C|/S]",13,10
db "disk Select target Disk (C:,D: .etc)",13,10
db "/C Check Disk Serial Number",13,10
db "/S Save Disk Serial Number",13,10,"$"
Start:
call CLS
NoCLS:
mov ah,9
mov dx,offset MainMsg
int 21h
ReadKey:
mov ah,8
int 21h
call ToUpCase
cmp al,Key_ESC
je Press_ESC
cmp al,Key_D
je Press_D
cmp al,Key_C
je Press_C
cmp al,Key_S
je Press_S
jmp ReadKey
Press_ESC:
.EXIT 0
lnext:
Press_D:
call CLS
mov ah,9
mov dx,offset SelectMsg
int 21h
ReadLetter:
mov ah,8
int 21h
call ToUpCase
cmp al,Key_ESC
je Start
cmp al,Key_A
jb ReadLetter
cmp al,Key_Z
ja ReadLetter
mov Drive,al
jmp Start
Press_S:
mov ax,6900h
mov bl,Drive
sub bl,'A'
inc bl
mov dx,offset Buffer
int 21h
jc Err1
mov ax,3D01h
mov dx,offset Filename
int 21h
jnc FileOpened
mov ah,3Ch
xor cx,cx
mov dx,offset Filename
int 21h
jc Err2
FileOpened:
mov bx,ax
mov ah,40h
mov cx,4
mov dx,offset SerialNumber
int 21h
jc Err3
mov ah,3Eh
int 21h
call CLS
mov ah,9
mov dx,offset SaveMsg
int 21h
jmp NoCls
Press_C:
call CLS
mov ax,6900h
mov bl,Drive
sub bl,'A'
inc bl
mov dx,offset Buffer
int 21h
jc Err1
mov ax,3D00h
mov dx,offset Filename
int 21h
jc Err2
mov bx,ax
mov ah,3Fh
mov cx,4
mov dx,offset SavedSerialNumber
int 21h
jc Err4
mov ah,3Eh
int 21h
mov ah,9
mov dx,offset CheckMsg1
int 21h
mov esi,offset SerialNumber
call ShowSerialNumber
mov ah,9
mov dx,offset CheckMsg2
int 21h
mov si,offset SavedSerialNumber
call ShowSerialNumber
mov eax,SerialNumber
cmp eax,SavedSerialNumber
jne StateBad
mov ah,9
mov dx,offset OKMsg
int 21h
jmp NoCLS
StateBad:
mov ah,9
mov dx,offset BadMsg
int 21h
jmp NoCLS
Err1:
mov ah,9
mov dx,offset ErrMsg1
int 21h
.EXIT 1
Err2:
mov ah,9
mov dx,offset ErrMsg2
int 21h
.EXIT 1
Err3:
mov ah,3Eh
int 21h
mov ah,9
mov dx,offset ErrMsg3
int 21h
.EXIT 1
Err4:
mov ah,3Eh
int 21h
mov ah,9
mov dx,offset ErrMsg2
int 21h
.EXIT 1
CLS:
mov ah,8
int 10h
mov bh,ah
xor cx,cx
mov dx,324Fh
mov ax,0600h
int 10h
xor bh,bh
xor dx,dx
mov ah,2
int 10h
ret
ToUpCase:
cmp al,'a'
jb UpCase
cmp al,'z'
ja UpCase
sub al,32
UpCase:
ret
ShowSerialNumber:
cld
mov cx,4
ReadByte:
lodsb
mov dl,al
shr dl,4
call Check4Bit
mov dl,al
and dl,0Fh
call Check4Bit
loop ReadByte
mov ah,9
mov dx,offset NewLine
int 21h
ret
Check4Bit:
add dl,'0'
cmp dl,'9'
jna ShowChar
add dl,7
ShowChar:
push ax
mov ah,2
int 21h
pop ax
ret
SelectMsg db "Press Disk letter [ESC = Abort] : $"
CheckMsg1 db "Current Disk Serial Number : $"
CheckMsg2 db "Saved Disk Serial Number : $"
OKMsg db "Lock State : OK",13,10,"$"
BadMsg db "Lock State : Bad",13,10,"$"
SaveMsg db "Disk Serial Number saved.",13,10,"$"
NewLine db 13,10,"$"
MainMsg db "Press one of this keys :",13,10,10
db " [D] Select Disk ("
Drive db 0
db ":)",13,10
db " [S] Save Disk Serial Number",13,10
db " [C] Check Disk Serial Number",13,10,10
db " [ESC] Exit",13,10,"$"
Filename db "asmlock.dat",0
ErrMsg1 db "ERROR : Getting Disk Serial Number failed.",13,10,"$"
ErrMsg2 db "ERROR : File access denied.",13,10,"$"
ErrMsg3 db "ERROR : ReadOnly File.",13,10,"$"
SavedSerialNumber dd 0
Buffer:
InfoLevel dw 0
SerialNumber dd 0
Volume db 11 dup(0)
FATMode db 8 dup(0)
END
کد کامل برنامه به همراه فایل اجرایی com ضمیمه این پست می باشد.