;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2000, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; K32TASK.ASM ; 32-bit kernel32.dll tasking support ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NAME k32task ;;;;;;;;; INTERNAL ProcEDURES ;;;;;;;;;;; .386p .model flat include ..\os\user.def UserGate MACRO gate_nr db 66h db 9Ah dw 0 dw 280Bh + (gate_nr SHL 4) ENDM tib_data STRUC pvFirstExcept DD ? pvStackUserTop DD ? pvStackUserBottom DD ? pvLastError DD ? pvResv1 DD ? pvArbitrary DD ? pvTEB DD ? pvProcessHandle DD ? pvThreadHandle DD ? pvModuleHandle DD ? pvTLSBitmap DD ? pvTLSArray DD ? tib_data ENDS THREAD_HANDLE EQU 7ABC0000h PROCESS_HANDLE EQU 0BCE50000h .code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: InterlockedIncrement ; ; DESCRIPTION: Increment var ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public InterlockedIncrement InterlockedIncrement Proc near mov eax,[esp + 4] inc dword ptr [eax] jz iliZero ; jns iliPos iliNeg: mov eax,-1 jmp iliDone iliPos: mov eax,1 jmp iliDone iliZero: xor eax,eax iliDone: ret 4 InterlockedIncrement ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: InterlockedDecrement ; ; DESCRIPTION: Decrement var ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public InterlockedDecrement InterlockedDecrement Proc near mov eax,[esp + 4] dec dword ptr [eax] jz ildZero ; jns ildPos ildNeg: mov eax,-1 jmp ildDone ildPos: mov eax,1 jmp ildDone ildZero: xor eax,eax ildDone: ret 4 InterlockedDecrement ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: InterlockedExchange ; ; DESCRIPTION: Exchange vars ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public InterlockedExchange InterlockedExchange Proc near mov edx,[esp + 4] mov eax,[esp + 8] xchg eax,[edx] ret 8 InterlockedExchange ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Sleep ; ; DESCRIPTION: Sleep ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public Sleep Sleep Proc near mov eax,[esp + 4] UserGate wait_milli_nr ret 4 Sleep Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: WaitForSingelObject ; ; DESCRIPTION: Wait for single object ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public WaitForSingleObject WaitForSingleObject Proc near int 3 xor eax,eax ret 8 WaitForSingleObject ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: InitializeCriticalSection ; ; DESCRIPTION: InitCritical section. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public InitializeCriticalSection icsPtr EQU 8 InitializeCriticalSection Proc near push ebp mov ebp,esp push bx ; mov edx,[ebp].icsPtr UserGate create_user_section_nr mov [edx],bx ; pop bx pop ebp ret 4 InitializeCriticalSection Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DeleteCriticalSection ; ; DESCRIPTION: DeleteCritical section. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public DeleteCriticalSection dcsPtr EQU 8 DeleteCriticalSection Proc near push ebp mov ebp,esp push ebx ; mov edx,[ebp].dcsPtr mov bx,[edx] UserGate delete_user_section_nr ; pop ebx pop ebp ret 4 DeleteCriticalSection Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: EnterCriticalSection ; ; DESCRIPTION: EnterCritical section ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public EnterCriticalSection ecsPtr EQU 8 EnterCriticalSection Proc push ebp mov ebp,esp push ebx ; mov edx,[ebp].ecsPtr mov bx,[edx] UserGate enter_user_section_nr ; pop ebx pop ebp ret 4 EnterCriticalSection Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: LeaveCriticalSection ; ; DESCRIPTION: LeaveCritical section ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public LeaveCriticalSection lcsPtr EQU 8 LeaveCriticalSection Proc push ebp mov ebp,esp push ebx ; mov edx,[ebp].lcsPtr mov bx,[edx] UserGate leave_user_section_nr ; pop ebx pop ebp ret 4 LeaveCriticalSection Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ExitThread ; ; DESCRIPTION: Exit a thread ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public ExitThread ExitThread: UserGate terminate_thread_nr ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CreateThread ; ; DESCRIPTION: Create a new thread ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public CreateThread ThreadName DB 'Win32 Thread',0 ctSec EQU 8 ctStack EQU 12 ctStart EQU 16 ctParam EQU 20 ctFlags EQU 24 ctId EQU 28 ThreadStartup Proc near mov ax,ds mov es,ax push dword ptr [edx] push OFFSET ExitThread push dword ptr [edx+4] push ebx mov [edx+16],fs ; mov ebx,[edx+8] UserGate leave_user_section_nr ; mov ebx,[edx+12] UserGate enter_user_section_nr ; mov ebx,[edx+8] UserGate delete_user_section_nr ; mov ebx,[edx+12] UserGate delete_user_section_nr ; mov eax,1000h UserGate free_app_mem_nr mov eax,ecx pop ebx ret ThreadStartup Endp CreateThread Proc near push ebp mov ebp,esp push ds push ebx push esi push edi ; mov eax,1000h UserGate allocate_app_mem_nr mov eax,[ebp].ctParam mov [edx],eax mov eax,[ebp].ctStart mov [edx+4],eax ; UserGate create_blocked_user_section_nr mov [edx+8],bx ; UserGate create_blocked_user_section_nr mov [edx+12],bx ; mov ax,cs mov ds,ax mov eax,2 mov bx,fs mov ecx,[ebp].ctStack mov esi, OFFSET ThreadStartup mov edi, OFFSET ThreadName UserGate create_thread_nr ; mov ax,es mov ds,ax mov bx,[edx+8] UserGate enter_user_section_nr ; push ds mov ds,es:[edx+16] mov ecx,[ebp].ctId or ecx,ecx jz ctIdDone ; mov eax,ds:pvTEB mov eax,es:[eax+24h] mov es:[ecx],eax ctIdDone: mov ecx,ds:pvThreadHandle pop ds ; mov bx,[edx+12] UserGate leave_user_section_nr ; pop edi pop esi pop ebx pop ds pop ebp ret 24 CreateThread Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetCurrentThreadId ; ; DESCRIPTION: Get current thread ID ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public GetCurrentThreadId GetCurrentThreadId Proc near mov eax,fs:pvThreadHandle ret GetCurrentThreadId Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetCurrentThread ; ; DESCRIPTION: Get current thread ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public GetCurrentThread GetCurrentThread Proc near mov eax,fs:pvThreadHandle ret GetCurrentThread Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetThreadPriority ; ; DESCRIPTION: Get thread priority ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public GetThreadPriority gtpHandle EQU 8 GetThreadPriority Proc near push ebp mov ebp,esp mov eax,[ebp].gtpHandle xor eax,eax pop ebp ret 4 GetThreadPriority Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ResumeThread ; ; DESCRIPTION: Resume thread ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public ResumeThread rtHandle EQU 8 ResumeThread Proc near push ebp mov ebp,esp mov eax,[ebp].rtHandle mov eax,-1 pop ebp ret 4 ResumeThread Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SuspendThread ; ; DESCRIPTION: Suspend thread ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public SuspendThread stHandle EQU 8 SuspendThread Proc near push ebp mov ebp,esp mov eax,[ebp].stHandle mov eax,-1 pop ebp ret 4 SuspendThread Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: CreateProcessA ; ; DESCRIPTION: Create a new process ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public CreateProcessA cpPath EQU 8 cpCmdLine EQU 12 cpProcAttr EQU 16 cpThreadAttr EQU 20 cpInhHandles EQU 24 cpFlags EQU 28 cpEnv EQU 32 cpCurrDir EQU 36 cpStartup EQU 40 cpInfo EQU 44 CreateProcessA Proc near push ebp mov ebp,esp push ebx push esi push edi ; mov esi,[ebp].cpPath mov edi,[ebp].cpCmdLine mov edx,[ebp].cpFlags test dl,1 jz cpNoDebug ; mov edx,fs:pvModuleHandle jmp cpCreate cpNoDebug: xor edx,edx cpCreate: UserGate spawn_exe_nr jc cpFail ; mov ecx,[ebp].cpInfo or ecx,ecx jz cpOk ; movzx eax,ax or eax,THREAD_HANDLE mov [ecx+4],eax mov [ecx+12],eax ; movzx eax,ax or eax,PROCESS_HANDLE mov [ecx],eax mov [ecx+8],eax jmp cpOk cpFail: xor eax,eax jmp cpDone cpOk: mov eax,1 cpDone: pop edi pop esi pop ebx pop ebp ret 40 CreateProcessA Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: TerminateProcess ; ; DESCRIPTION: Terminate process ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public TerminateProcess TerminateProcess Proc near int 3 pop eax pop edx push eax cmp edx,fs:pvProcessHandle jnz tpFailed ; xor eax,eax UserGate unload_exe_nr tpFailed: sub eax,eax ret 4 TerminateProcess Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetCurrentProcess ; ; DESCRIPTION: Get current process ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public GetCurrentProcess GetCurrentProcess Proc near mov eax,fs:pvProcessHandle ret GetCurrentProcess Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetCurrentProcessID ; ; DESCRIPTION: Get current process ID ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public GetCurrentProcessId GetCurrentProcessId Proc near mov eax,fs:pvModuleHandle ret GetCurrentProcessId Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: GetExitCodeProcess ; ; DESCRIPTION: Get exit code for process ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public GetExitCodeProcess GetExitCodeProcess Proc near int 3 UserGate get_exit_code_nr mov edx,[esp + 8] movzx eax,ax mov [edx],eax mov eax,1 ret 8 GetExitCodeProcess Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ExitProcess ; ; DESCRIPTION: Exit process ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public ExitProcess ExitProcess Proc near mov eax, [esp+4] UserGate unload_exe_nr ExitProcess Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: DebugActiveProcess ; ; DESCRIPTION: Debug an active process ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public DebugActiveProcess dapId EQU 8 DebugActiveProcess Proc near push ebp mov ebp,esp ; int 3 mov eax,1 ; pop ebp ret 4 DebugActiveProcess Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: TlsAlloc ; ; DESCRIPTION: Allocate TLS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public TlsAlloc TlsAlloc Proc near mov ecx,fs:pvTLSBitmap bsf eax, dword ptr [ecx] jnz short TlsAllocSuccess bsf eax, dword ptr [ecx+4] lea eax, [eax+32] jnz short TlsAllocSuccess mov eax,-1 jmp TlsAllocDone TlsAllocSuccess: btr dword ptr [ecx], eax TlsAllocDone: ret TlsAlloc Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: TlsFree ; ; DESCRIPTION: Free TLS ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public TlsFree TlsFree Proc near mov ecx, [esp + 4] cmp ecx, 64 sbb eax, eax jnc TlsFreeError mov eax,fs:pvTLSBitmap bts dword ptr [eax],ecx mov eax,1 jmp TlsFreeDone TlsFreeError: xor eax,eax TlsFreeDone: ret 4 TlsFree Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: TlsSetValue ; ; DESCRIPTION: Set TLS value ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public TlsSetValue TlsSetValue Proc near mov ecx, [esp + 4] cmp ecx, 64 jnc TlsSetError mov edx, fs:pvTlsArray mov eax, [esp + 8] mov [edx + ecx * 4], eax mov eax,1 jmp TlsSetDone TlsSetError: xor eax,eax TlsSetDone: ret 8 TlsSetValue Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: TlsGetValue ; ; DESCRIPTION: Get TLS value ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public TlsGetValue TlsGetValue Proc near mov ecx, [esp + 4] mov fs:pvLastError, -1 xor eax, eax cmp ecx, 64 jnc TlsGetError mov fs:pvLastError, eax mov edx, fs:pvTlsArray mov eax, [edx + ecx * 4] TlsGetError: ret 4 TlsGetValue Endp END