/kernel/trunk/core/dll.inc |
---|
511,7 → 511,7 |
jnz .err_1 |
mov eax, [file_size] |
cmp eax, 1024*1024*16 ;to be enough for anybody (c) |
cmp eax, 1024*1024*1024 ;to be enough for anybody 1Gbt(c) |
ja .err_1 |
;it is very likely that the file is packed |
stdcall kernel_alloc, [file_size] ;with kpack, so allocate memory from kernel heap |
/kernel/trunk/core/sys32.inc |
---|
201,11 → 201,59 |
iretd |
IRetToUserHook: |
cmp ebx, 12 |
je .ex_stack |
cmp ebx, 14 |
jne .nostack |
mov ecx, cr2 |
sub ecx, [reg_esp3] |
jg .nostack |
add ecx, 1000h |
jl .nostack |
.ex_stack: |
xor ecx, ecx |
mov ecx, [ecx+APP_HEADER_01_.except_stack_top] |
test ecx, ecx |
jle .nostack |
xchg edi, eax |
sub ecx, sizeof.EXCEPT_STACK |
push ebx |
push 1 |
pop ebx |
.lock: |
lock bts [ecx+EXCEPT_STACK.LockAccess], 0 |
jnc .lock1 |
call delay_hs_unprotected |
jmp .lock |
.lock1: |
pop ebx |
cmp ebx, 14 |
jne .ex12 |
btr [esi+APPDATA.except_mask], 12 |
jc .ex_stack1 |
xchg eax, edi |
jmp .nostack |
.ex_stack1: |
bts [esi+APPDATA.except_mask], ebx |
dec ebx |
dec ebx |
.ex12: |
mov [ecx+EXCEPT_STACK.ExcCode], ebx |
mov eax, ecx |
xchg [reg_esp3], eax |
mov [ecx+EXCEPT_STACK.OldESP], eax |
mov eax, cr2 |
mov [ecx+EXCEPT_STACK.RegCR2], eax |
xchg edi, [reg_eip] |
mov [ecx+EXCEPT_STACK.RegEIP], edi |
jmp .end |
.nostack: |
xchg eax, [reg_eip] |
sub dword[reg_esp3], 8 |
mov edi, [reg_esp3] |
stosd |
mov [edi], ebx |
.end: |
restore_ring3_context |
; simply return control to interrupted process |
unknown_interrupt: |
/kernel/trunk/docs/sysfuncr.txt |
---|
3608,9 → 3608,14 |
приостановка с уведомлением отлаживающего приложения иначе. |
* После завершения критических действий в обработчике пользователя |
восстановление бита маски данного исключения можно сделать |
подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также |
возлагается на обработчик пользователя. |
подфункцией 25. Сброс флагов исключений в модулях FPU и XMM также возлагается на обработчик пользователя. |
Внимание: |
Если пользовательский обработчик обрабатывает исключение переполнения стека (#SS), то должен быть установлен адрес резервного стека в заголовке программы (см. структуру APP_HEADER_01_ taskman.inc). |
В этот резервный стек будут записаны дополнительные данные (см. структуру EXCEPT_STACK sys32.inc). |
Пользовательский бработчик,при завершении обработки этого исключения, должен дополнительно обнулить бит занятости (бит номер 0) резервного стека в поле LockAccess структуры EXCEPT_STACK. |
---------------------- Константы для регистров: ---------------------- |
eax - SF_SYS_MISC (68) |
ebx - SSF_SET_EXCEPTION_HANDLER (24) |
/kernel/trunk/network/socket.inc |
---|
757,22 → 757,17 |
jne .free |
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP |
je .tcp |
.free: |
call socket_free |
ret |
.tcp: |
jne .free |
test [eax + SOCKET.state], SS_ISCONNECTED |
jz @f |
jz .free |
test [eax + SOCKET.state], SS_ISDISCONNECTING |
jnz @f |
jnz .free |
call tcp_disconnect |
@@: |
; TODO: |
; ... |
; call socket_free |
test eax, eax |
jz .end |
.free: |
call socket_free |
.end: |
ret |