0,0 → 1,372 |
;----------------------------------------------------------------------------- |
; Copyright (c) 2007, SPraid |
;----------------------------------------------------------------------------- |
format MS COFF |
|
public EXPORTS |
|
include '../proc32.inc' |
include 'proc.inc' |
|
purge section |
section '.flat' code readable align 16 |
|
mem.alloc dd ? |
mem.free dd ? |
mem.realloc dd ? |
dll.load dd ? |
|
block_count: dd 0 |
sect_num: dd 0 |
data_adr: dd 0 |
data_adr_last dd 0 |
|
filei_len EQU 0x4000 |
filei dd ?;0x4000 ; áá뫪¨ ¤ ë¥ - ⨯ â ¬ åà ¨âìáï ¡ã¤¨â... ¢ ç «¥ â ¬ - ᪮ª ¤ ¢ë¤¥«¨âì |
sec_i_len EQU 0x4000 |
sec_i dd ?;0x4000 |
dat_i_len EQU 0x4000 |
dat_i dd ?;0x4000 |
|
|
;----------------------------------------------------------------------------- |
proc lib_init ;////////// 樫¨§ æ¨ï ¡¨¡«¨®â¥ª¨ ( ¢â®¬ â¨ç¥áª¨© ¢ë§®¢)/////// |
;----------------------------------------------------------------------------- |
mov [mem.alloc],eax |
mov [mem.free],ebx |
mov [mem.realloc],ecx |
mov [dll.load],edx |
xor eax,eax |
inc eax |
ret |
endp |
|
|
; áâàãªâãà ¡«®ª |
block_adr EQU 0 |
block_name EQU block_adr + 4 |
block_i_count EQU block_name + 30 |
block_len EQU block_i_count + 4 |
; áâàãªâãà ¤ ëå |
data_name EQU 0 |
data_prev EQU data_name+200 |
data_next EQU data_prev+4 |
data_len EQU data_next+4 |
|
|
|
|
; ¢§ïâì á«¥¤ã騩 ¯ àã § ç¥¨ï ª«îç |
proc ini.get_par stdcall, sect:dword, param:dword, val:dword, num:dword |
|
pushad |
mov edx,[block_count] |
mov edi,[sect] |
mov esi,[sec_i] |
add esi,block_name |
@@: call strcmp |
cmp eax,-1 |
jne .sec_found |
dec edx |
or edx,edx |
jz .sec_not_found |
add esi,block_len |
jmp @b |
.sec_found: |
|
mov eax,esi |
sub eax,block_name |
add eax, block_i_count |
mov eax,[eax] |
; eax - count |
mov ebx,[num] ; test max count |
; ebx - num |
cmp eax,ebx |
jle .param_not_found |
|
sub esi,4 |
mov esi,[esi] |
; esi - first adr |
mov eax,ebx ; eax - num |
@@: |
or eax,eax |
je .param_found |
dec eax |
add esi,data_next |
mov esi,[esi] |
jmp @b |
|
.param_found: |
mov ebx,esi |
mov eax,[param] |
mov cl,'=' |
call copy_s |
add ebx,eax |
add ebx,1 |
mov eax,[val] |
mov cl,0 |
call copy_s |
jmp .ok |
|
.param_not_found: |
.sec_not_found: |
; set_default_.... 0 |
mov eax,[param] |
mov [eax],byte 0 |
mov eax,[val] |
mov [eax],byte 0 |
.ok: |
popad |
ret |
|
|
endp |
;------------------------------------------------------ |
proc ini.get_str stdcall, sect:dword, param:dword, buff:dword, default:dword |
; sect - ᥪæ¨ï |
; param - ¯ à ¬¥âà |
; buff - ¡ãä¥à |
; default - ¥á«¨ ®âáãâáâ¢ã¥â |
pushad |
mov edx,[block_count] |
mov edi,[sect] |
mov esi,[sec_i] |
add esi,block_name |
@@: call strcmp |
cmp eax,-1 |
jne .sec_found |
dec edx |
or edx,edx |
jz .sec_not_found |
add esi,block_len |
jmp @b |
.sec_found: |
|
mov eax,esi |
sub eax,block_name |
add eax, block_i_count |
mov eax,[eax] |
; eax - count |
sub esi,4 |
mov esi,[esi] |
; esi - first adr |
mov edi,[param] |
push eax |
|
@@: |
mov cl,'=' |
mov eax,text |
mov ebx,esi |
call copy_s |
mov edx,eax |
push esi |
mov esi,text |
call strcmp |
pop esi |
cmp eax,-1 |
jne .param_found |
pop eax |
dec eax |
or eax,eax |
jz .sec_not_found |
push eax |
add esi,data_next |
mov esi,[esi] |
jmp @b |
.param_found: |
mov ebx,esi |
add ebx,edx |
add ebx,1 |
pop eax |
mov eax,[buff] |
mov cl,0 |
call copy_s |
jmp .ok |
.param_not_found: |
.sec_not_found: |
; set_default_text |
mov eax,[buff] |
mov ebx,[default] |
mov cl,0 |
call copy_s |
.ok: |
popad |
ret |
endp |
;-------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------------- |
proc ini.load stdcall filename ;/(§ £à㧪 ¨¨ ä ©« )///////////////////////// |
locals |
reads: dd 0,0,0 |
fsize dd 0 |
addr dd filei |
nulls db 0 |
fname dd 0 |
endl |
mov [reads],dword 0 |
mov [reads+4],dword 0 |
mov [reads+8],dword 0 |
mov [nulls],byte 0 |
|
stdcall get_filesize, [filename] |
mov [fsize],eax |
|
inc eax |
|
mov ebx,eax |
|
invoke mem.alloc,eax |
mov [filei],eax |
|
mov [addr],eax |
|
add eax,ebx |
mov [eax], byte 0 ;null string |
|
invoke mem.alloc,sec_i_len |
mov [sec_i],eax |
|
invoke mem.alloc,dat_i_len |
mov [dat_i],eax |
mov [data_adr],eax |
|
mov eax,[filename] |
mov [fname],eax |
|
mov eax,70 |
mov ebx , reads-ebp |
add ebx,ebp |
int 0x40 |
|
stdcall readlnf |
|
xor eax,eax |
ret |
|
|
endp |
|
|
proc readlnf |
pushad |
mov [.pos],dword 0 |
.char: |
mov eax,[.pos] |
inc eax |
mov [.pos],eax |
|
sub eax,1 |
add eax,[filei] |
mov al,[eax] ; ᨬ¢®« ®â ¯®§¨æ¨¨ |
; ⨯ ¯® ¯¥à¢®¬ã ᨬ¢®«ã |
cmp al,' ' |
je .char |
cmp al,9 |
je .char |
cmp al,13 |
je .char |
cmp al,10 |
je .char |
cmp al,'[' |
je .sect |
cmp al,0 |
je .exit |
;------------------------------------------------------------------------------------------ |
; ç⥨¥ ¯ à ¬¥â஢ |
mov eax,[data_adr] |
mov ebx,[.pos] |
add ebx,[filei] |
dec ebx |
mov cl,0xD |
call copy_s |
xchg ebx,eax |
mov eax,[.pos] |
add eax,ebx |
mov [.pos],eax |
|
|
mov ebx,[data_adr] |
mov ecx,[data_adr_last] |
mov [ebx+data_prev],ecx |
;add ebx,data_next |
mov [ecx],ebx |
add ebx,data_next |
mov [data_adr_last],ebx |
|
add ebx,data_len-data_next |
mov [data_adr],ebx |
mov eax,[sect_num] |
imul eax,eax,block_len |
add eax,[sec_i] |
add eax, block_i_count |
mov ebx,[eax] |
inc ebx |
mov [eax],ebx |
jmp .test_next |
;----------------------------------------------------------------------------------------------------------------- |
.sect: ; ç⥨¥ ᥪ樨 |
mov eax,[block_count] |
imul eax,eax,block_len |
; ª®¯¨à㥬 ¨¬ï (¤® ]) |
add eax,[sec_i] |
add eax,block_name ; ªã¦ «®¦¨âì ¨¬ï |
mov ebx,[.pos] |
add ebx,[filei] ; ®âªã¤ |
mov cl,']' |
call copy_s ; «®¦¨¬ |
|
|
mov ebx,[.pos] |
add ebx,eax |
;sub ebx,filei |
add ebx,1 |
mov [.pos],ebx |
|
mov eax,[block_count] ; ¯à¨¡ ¢¨âì ª®«¨ç¥á⢮ ¡«®ª®¢ |
mov [sect_num],eax |
mov ebx,eax |
imul eax,eax,block_len ; íâ® ¡ã¤¨â ¤à¥á ¯¥à¤ë¤ã饣® ¤«ï ¯¥à¢®£® í«¥¬¥â |
add eax,[sec_i] |
mov [data_adr_last],eax |
inc ebx |
mov [block_count],ebx |
|
|
.test_next: |
cmp [.pos] ,dword 97 |
jb .char |
|
.exit: |
|
popad |
ret |
|
.pos dd 0 |
|
endp |
|
|
text db 255 dup(?) |
|
align 16 |
EXPORTS: |
|
export \ |
lib_init ,'lib_init',\ |
ini.load ,'ini.load',\ |
ini.get_str,'ini.get_str',\ |
ini.get_par,'ini.get_par' |