Disallow more than one BOARD instance - new instances will be closed if one instance already exists

git-svn-id: svn://kolibrios.org@4672 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
izikiel 2014-03-21 15:11:12 +00:00
parent f7a74bc85b
commit 1bb0d90607

View File

@ -5,8 +5,8 @@
; ;
; Compile with FASM for Menuet ; Compile with FASM for Menuet
; ;
WRITE_LOG equ 1 WRITE_LOG equ 1
P_LEN equ 11
include 'lang.inc' include 'lang.inc'
use32 use32
@ -25,6 +25,9 @@ MAXSTRINGS = 16
TMP = 80*(MAXSTRINGS+1) TMP = 80*(MAXSTRINGS+1)
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
START: ; start of execution START: ; start of execution
call CheckUnique
mov edi,filename mov edi,filename
cmp [edi],byte 0 cmp [edi],byte 0
jnz param jnz param
@ -311,6 +314,106 @@ WriteToFile:
.out: .out:
pop ebx pop ebx
ret ret
;-------------------------------------------------
;********************************************
;* input: esi = pointer to string *
;* edi = pointer to string *
;* ecx = data length *
;********************************************
StrCmp:
repe cmpsb
ja .a_greater_b
jb .a_less_b
.equal:
mov eax, 0
jmp .end
.a_less_b:
mov eax, 1
jmp .end
.a_greater_b:
mov eax, -1
.end:
ret
;-------------------------------------------------
;********************************************
;* input: edi = pointer to string *
;* ecx = data length *
;********************************************
; 'a' - 'A' = 32 -> 'A'|32 = 'a'
ToLower:
xor eax, eax
.cycle:
or byte[edi+eax], 32
inc eax
loop .cycle
.end:
ret
;-------------------------------------------------
CheckUnique:
;get info on current thread, save pid/tid
;look for another process with same name and different pid/tid
;if found, close self
;else continue normally
.get_thread_info:
mov ebx, procinfo
mov ecx, -1
mcall 9
.get_pid:
; check_buffer
mov [process_count], eax
mov eax, [ebx+process_information.PID]
mov [pid_tid], eax
mov ecx, 2
.check_threads:
cmp ecx, [process_count]
ja .leave_check
mov eax, 9
mcall
.check_slot_free:
cmp dword [ebx+process_information.slot_state], 9
je .next_thread
.check_pid:
mov eax, [pid_tid]
cmp [ebx+process_information.PID], eax
je .next_thread
.get_proc_name:
lea edi, [ebx+process_information.process_name]
push ecx
mov ecx, my_name_size-1
.lower_case:
call ToLower
lea esi, [my_name]
mov ecx, my_name_size
call StrCmp
pop ecx
cmp eax, 0
je .close_program
.next_thread:
inc ecx
jmp .check_threads
.close_program:
mov eax, -1
mcall
.leave_check:
ret
;-------------------------------------------------- ;--------------------------------------------------
InfoStructure: InfoStructure:
dd 0x0 ; subfunction number dd 0x0 ; subfunction number
@ -343,6 +446,11 @@ end if
krnl_cnt dd 0 krnl_cnt dd 0
vmode dd 1 vmode dd 1
targ dd text2 targ dd text2
my_name db 'board',0
my_name_size = $-my_name
process_count dd 0x0
pid_tid dd 0x0
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
I_END: I_END:
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------