2020-09-30 17:17:25 +02:00

102 lines
2.3 KiB
NASM

title "Thread Startup"
;++
;
; Copyright (c) 1989 Microsoft Corporation
;
; Module Name:
;
; threadbg.asm
;
; Abstract:
;
; This module implements the code necessary to startup a thread in kernel
; mode.
;
; Author:
;
; Bryan Willman (bryanwi) 22-Feb-1990, derived from DaveC's code.
;
; Environment:
;
; Kernel mode only, IRQL PASSIVE_LEVEL.
;
; Revision History:
;
;--
.386p
.xlist
include ks386.inc
include i386\kimacro.inc
include callconv.inc
.list
EXTRNP KfLowerIrql,1,,FASTCALL
EXTRNP _KeBugCheck,1
EXTRNP _PsTerminateSystemThread,1
extrn _KiPCR:DWORD
page ,132
subttl "Thread Startup"
_TEXT SEGMENT DWORD PUBLIC 'CODE'
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
;++
;
; Routine Description:
;
; This routine is called at thread startup. Its function is to call the
; initial thread procedure.
;
; Arguments:
;
; (TOS) = SystemRoutine - address of initial system routine.
; (TOS+4) = StartRoutine - Initial thread routine.
; (TOS+8) = StartContext - Context parm for initial thread routine.
;
; Return Value:
;
; None.
;
;--
cPublicProc _KiThreadStartup ,1
xor ebx,ebx ; clear registers
xor esi,esi ;
xor edi,edi ;
xor ebp,ebp ;
mov ecx, PASSIVE_LEVEL
fstCall KfLowerIrql ; KeLowerIrql(PASSIVE_LEVEL)
;
; Check if PsCreateSystemThreadEx failed to fully initialize the thread. If so,
; it will mark the thread as already terminated and use PsTerminateSystemThread
; to cleanup the thread.
;
mov eax, PCR[PcPrcbData+PbCurrentThread]
cmp BYTE PTR [eax].ThHasTerminated, 0
jne kits20
;
; Invoke the system routine.
;
pop eax ; (eax)->SystemRoutine
call eax ; SystemRoutine(StartRoutine, StartContext)
IFNDEF STD_CALL
add esp,8 ; Clear off args
ENDIF
kits10: stdCall _KeBugCheck, <NO_USER_MODE_CONTEXT>
kits20: stdCall _PsTerminateSystemThread, <STATUS_NO_MEMORY>
stdENDP _KiThreadStartup
_TEXT ends
end