;
; âàãªâãà ¤«ï äãªæ¨¨ 70
;
struc sinfo
{
.subfnc_name dd 0
.pos_in_file dd 0
.reserved dd 0
.bytes_to_read dd 0
.pbuffer dd 0
.null db 0
.pname dd 0
}
;
; â ¡«¨æë § 票©
;
; +----+-------------+-----------------+
; | in | Variable | Variable |
; | de | name | string |
; | x | | |
; | | | |
; +----+-------------+-----------------+
; | | | |
; | | | |
; | 1 | UIN | 'XXXXX..XX',0 |
; | | | |
; +----+-------------+-----------------+
; | | |
;
; § £à㧪 int ¯®ª ¥ ॠ«¨§®¢
;
; +----+-------------+-----------------+
; | in | Variable | Variable |
; | de | name | int |
; | x | | |
; | | | |
; +----+-------------+-----------------+
; | | | |
; | | | |
; | 1 | BUFFSIZE | XXXXXXXX |
; | | | |
; +----+-------------+-----------------+
; | | |
;
;
TABLE_SIZE equ 16
VNAME_LEN equ 8
VAR_LEN equ 16
;
; ¯¨á ¨¥ â ¡«¨æë § 票©
virtual at 0
vartable:
.uin db VAR_LEN dup ?
.pass db VAR_LEN dup ?
.icqip db VAR_LEN dup ?
end virtual
;
; ®¤ë ®è¨¡®ª ä ©«®¢®© á¨á⥬ë
;
FIO_SUCCESS equ 0
FIO_UNSUPPORTED equ 2
FIO_UNKNOWNFS equ 3
FIO_FILENOTFOUND equ 5
FIO_EOF equ 6
FIO_BADPOINTER equ 7
FIO_DISKFULL equ 8
FIO_FATDAMAGED equ 9
FIO_DENIED equ 10
FIO_ERRORDEVICE equ 11
IOBUFF_SIZE equ 128
;
; ¬ ªà®á ¤«ï ¯®¨áª í«¥¬¥â ¢ áâப¥
; ¢®§¢à é ¥â ¢ eax ®¬¥à í«¥¬¥â ¨«¨ -1 ¥á«¨ ¥ ©¤¥
macro findchar string, len, char
{
local ..fc_endstr, ..fc_end
push ebx
push ecx
push edi
mov edi, string
mov ecx, len
mov ebx, ecx
cld
mov al, char
repne scasb
jcxz ..fc_endstr
sub ebx, ecx ; ®¬¥à =
mov eax, ebx
jmp ..fc_end
..fc_endstr:
mov eax, -1
..fc_end:
pop edi
pop ecx
pop ebx
}
;
; ªà®á ¤«ï ¯®¨áª í«¥¬¥â áâப¨, ®â«¨ç î饣®áï ®â
; § ¤ ®£®
macro findother string, len, char
{
local ..fc_endstr, ..fc_end
push ebx
push ecx
push edi
mov edi, string
mov ecx, len
mov ebx, ecx
cld
mov al, char
repe scasb ;
᫨ ᨬ¢®« ¥ char - ¢ë室¨¬
jcxz ..fc_endstr ; áâப ¨§ char
sub ebx, ecx ; ¢ ebx - ®¬¥à í«¥¬¥â ®â«¨ç®£® ®â char
mov eax, ebx
jmp ..fc_end
..fc_endstr:
mov eax, -1
..fc_end:
pop edi
pop ecx
pop ebx
}
;
; ªà®á ¤«ï ª®¯¨à®¢ ¨ï áâப
;
macro mstrcpy from, to, leng
{
push ecx
push esi
push edi
mov ecx, leng
mov esi, from
mov edi, to
cld
rep movsb
pop edi
pop esi
pop ecx
}
;
; ¨æ¨ «¨§¨àã¥â â ¡«¨æë
;
; inittables:
;
;
; mstrcpy name1, nvtable, VNAME_LEN
; mstrcpy name2, (nvtable + NAME_LEN), VNAME_LEN
; mstrcpy name3, (nvtable + NAME_LEN * 2), VNAME_LEN
;
;
;
; ret
;
; § ¯®«ï¥â â ¡«¨æë § 票ﬨ
; IN eax - ASCIIZ ¨¬ï ä ©«
; OUT eax - १ã«ìâ â ç⥨ï
; ¥á«¨ १ã«ìâ â -1, ä®à¬ â ä ©« ¥¯à ¢¨«ìë©
;
parseconf:
push edi
push esi
;push eax
push ebx
push ecx
push edx
mov [strnum], dword 0
;
; à®ç¨â âì ¯®áâà®ç® ª®ä¨£
; ¥á«¨ áâப ç¨ ¥âáï á ;, # - ª®¬¬¥â ਩
; ®à¬ â UIN="1234567890"
; PASS="******" ¨ â.¤.
;
; ¡à®á ᬥ饨ï
mov [shift], dword 0
mov esi, eax
pc_still:
mov edx, esi
mov ecx, IOBUFF_SIZE
mov ebx, iobuff
call getstr
inc [strnum]
push eax
;
;஢¥àª ¯®«ã祮© áâப¨
;
movzx eax, byte [iobuff]
test eax, eax
jz pc_next
cmp al, '#'
jz pc_next
cmp al, ';'
jz pc_next
;
; ©â¨ ¨¬ï ¯¥à¥¬¥®©
;
findother iobuff, ebx, ' '
cmp eax, -1
jz pc_next
mov [stnpos], eax ; ç «® ¨¬¥¨
;
; ©â¨ =
;
mov ecx, ebx ; ᪠âì ®â ©¤¥®£® ᨬ¢®«
sub ecx, eax ;
mov edi, iobuff
add edi, eax
findchar edi, ecx, '='
cmp eax, -1
jz pc_badformat
mov edi, [stnpos]
add eax, edi ; ¢ eax - ᬥ饨¥ ®â ç « áâப¨
mov [eqpos], eax
mov ecx, ebx
sub ecx, eax
;
; ¯à®¢¥à¨âì "
;
mov dl, [iobuff + eax]
cmp dl, '"'
jnz pc_badformat
;
; ©â¨ § ªàë¢ îéãî "
;
mov edi, iobuff
add edi, eax
inc edi
findchar edi, ecx, '"'
cmp eax, -1
jz pc_badformat
inc eax
mov edx, [eqpos]
add eax, edx
mov [edvpos], eax
;
; áâ ®¢¨âì § 票¥
;
; ®¡ ¢¨âì § ¢¥àè î騥 0
mov eax, [stnpos]
dec eax
mov ebx, [eqpos]
mov ecx, ebx
dec ecx ; ª®«¨ç¥á⢮ ᨬ¢®«®¢ ¤® =
inc ebx ; யãáâ¨âì "
mov [iobuff + ecx], byte 0
mov edx, [edvpos]
dec edx
mov [iobuff + edx], byte 0
lea eax, [iobuff + eax]
lea ebx, [iobuff + ebx]
call setavar
jmp pc_next
pc_badformat:
pop eax
mov ebx, [strnum]
jmp pc_err
pc_next:
pop eax
cmp eax, FIO_EOF
jz pc_eof
cmp eax, FIO_SUCCESS
jnz pc_err
jmp pc_still
pc_eof:
pc_err:
pop edx
pop ecx
pop ebx
;pop eax
pop esi
pop edi
ret
; ®¨áª ¢ â ¡«¨æ¥ ¯¥à¥¬¥®© ¨ ãáâ ®¢ª ¥ñ § 票ï
; IN eax - §¢ ¨¥ ¯¥à¥¬¥®© 㪠§ ⥫ì ASCIIZ
; IN ebx - § 票¥ ¯¥à¥¬¥®© 㪠§ ⥫ì ASCIIZ
; OUT eax -१ã«ìâ â 0 = OK, -1 = ¥â ¢ â ¡«¨æ¥ ¯¥à¥¬¥ëå
; OUT § ¯®«ï¥â £«®¡ «ìãî â ¡«¨æã
setavar:
;push ebx
push ecx
push edx
push esi
push edi
push ebx
;
; ¯à¥¤¥«¨âì ¤«¨ã áâப¨ - §¢ ¨¥ ¯¥à¥¬¥®©
;
mov edi, eax
push eax
mov ecx, VNAME_LEN
xor eax, eax ;饬 \0
cld
repne scasb
mov eax, VNAME_LEN
sub eax, ecx ; ecx - ®áâ ⮪ ¤® ¬ ªá¨¬ «ì®£® à §¬¥à áâப¨
mov ebx, eax
pop eax
;
; ᪠âì ¢ â ¡«¨æ¥ ¯®¤å®¤ï饥 ¨¬ï
;
xor edx, edx ;index
sv_next:
mov ecx, ebx
push eax
mov esi, eax
mov edi, nvtable
mov eax, edx
imul eax, VNAME_LEN ;offset
add edi, eax
pop eax
cld
repe cmpsb
jz sv_match
sv_inc:
inc edx
cmp edx, TABLE_SIZE
jae sv_fail
jmp sv_next
sv_match:
cmp ebx, VNAME_LEN ; ebx - ¤«¨ ¨á室®© áâà®çª¨
jz sv_match2
push eax
mov edi, nvtable
mov eax, edx
imul eax, VNAME_LEN ;offset
add edi, eax
pop eax
cmp [edi + ebx], byte 0 ;
᫨ ¨¬ï ¢ â ¡«¨æ¥ ª®à®ç¥ ¬ ªá¨¬ «ì®£®,
jnz sv_inc ; § ª 稢 ¥âáï 0
sv_match2:
pop edi ;
push edi
;
; ¯à¥¤¥«ïâì ¤«¨ã áâப¨ - ¯¥à¥¬¥ ï
;
xor eax, eax
mov ecx, VAR_LEN
cld
repne scasb
mov eax, VAR_LEN
sub eax, ecx
mov ecx, eax
mov ebx, eax
;
; ®¯¨à®¢ âì ¯¥à¥¬¥ãî ¢ â ¡«¨æã
;
pop esi
push esi
mov eax, VAR_LEN
imul eax, edx
mov edi, vtable
add edi, eax
cld
rep movsb
;
;
᫨ áâப ª®à®ç¥ ¯®«ï ¢ â ¡«¨æ¥, § ¯¨á âì ¢ ª®¥æ 0
;
cmp ebx, VAR_LEN
jz sv_end
mov [edi + ebx], byte 0
sv_end:
xor eax, eax
jmp sv_fin
sv_fail:
mov eax, -1
sv_fin:
pop ebx
pop edi
pop esi
pop edx
pop ecx
;pop ebx
ret
;
; ⥨¥ ASCIIZ áâப¨ ¨§ ä ©«
; IN ebx - 㪠§ â¥«ì ¡ãä¥à
; ecx - à §¬¥à ¡ãä¥à
; edx - 㪠§ ⥫ì áâப㠨¬ï ä ©«
; OUT ebx - ¤«¨ áâப¨
; eax - १ã«ìâ â ç⥨ï
getstr:
;push eax
;push ebx
push ecx
push edx
push esi
;xor edx, edx
xor esi, esi
gs_read:
;
; ¯®«ï¥¬ áâàãªâãàã
;
mov [finfo.subfnc_name], 0
mov eax, [shift]
mov [finfo.pos_in_file], eax
mov [finfo.bytes_to_read], ecx
mov [finfo.pbuffer], ebx
mov [finfo.pname], edx
push ebx
;
; ¨â¥¬
;
;mov eax, 70
;mov ebx, finfo
;int 40h
mcall 70, finfo
mov ecx, ebx ; ebx ª®«¨ç¥á⢮ ¯à®çâ¥ëå ¡ ©â
pop ebx
;
; ஢¥à¨âì १ã«ìâ â ç⥨ï - ¥á«¨ ¥ EOF ¨ 0,
; ¢ë室¨¬
cmp eax, FIO_EOF
jz gs_loop
cmp eax, 0
jz gs_loop
jmp gs_ok
;
; ¡à ¡®âª ¯®«ã祮£® ¡«®ª
;
gs_loop:
mov dl, [ebx + esi]
cmp dl, 0Ah ;cr
jz gs_cr
inc esi
cmp esi, ecx
jnb gs_err
jmp gs_loop
gs_err:
;
; ¡ãä¥à¥ ¥â ᨬ¢®« ¯¥à¥®á áâப¨, â.¥. áâப ᫨誮¬ ¤«¨ ï
; â¡à áë¢ ¥¬ ¢á¥ ¤® ¡«¨¦ ©è¥£® ᨬ¢®« ¯¥à¥®á áâப¨
; ¥á«¨ ª®¥æ ä ©« - ¢ë室¨¬
cmp eax, FIO_EOF
jz gs_endf
add [shift], ecx
jmp gs_read
gs_endf:
xor ebx, ebx
jmp gs_ok
gs_cr:
;
; ¡à®á¨âì १ã«ìâ â ç⥨ï
;
xor eax, eax
mov dl, [ebx + esi - 1]
cmp dl, 0Dh ;le
jz gs_le
mov [ebx + esi], byte 0
mov ebx, esi
inc esi
add [shift], esi
jmp gs_ok
gs_le:
mov [ebx + esi - 1], byte 0
mov [ebx + esi], byte 0
lea ebx, [esi - 1]
inc esi
add [shift], esi
gs_ok:
pop esi
pop edx
pop ecx
;pop ebx
;pop eax
ret
;
; ãªæ¨ï ¤«ï ¢ë¢®¤ § £à㦥®© ¨äë
;
showcfg:
push eax
push ebx
push ecx
push edx
push edi
xor edx, edx ; áç¥â稪
sc_loop:
cmp edx, TABLE_SIZE
jnb sc_end
;
; ª®¯¨à®¢ âì ¢ ¡ãä¥à ¨¬ï ¨ § 票¥ ¯¥à¥¬¥®©
;
mov eax, VNAME_LEN
imul eax, edx
lea eax, [nvtable + eax]
mov cl, [eax]
cmp cl, byte 0
jz sc_next
push eax
call strlen
mov ecx, eax
pop eax
mov ebx, cfgbuff
call strcpy
mov [cfgbuff + ecx], ':'
lea ebx, [cfgbuff + ecx + 1]
mov eax, VAR_LEN
imul eax, edx
lea eax, [vtable + eax]
push eax
call strlen
mov ecx, eax
pop eax
call strcpy
mov [ebx + ecx], byte 0
mov eax, cfgbuff
xor ebx, ebx
call writemsg
sc_next:
inc edx
jmp sc_loop
sc_end:
pop edi
pop edx
pop ecx
pop ebx
pop eax
ret