windows-nt/Source/XPSP1/NT/base/ntos/ke/i386/threadbg.asm
2020-09-26 16:20:57 +08:00

100 lines
2.4 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 APC_LEVEL.
;
; Revision History:
;
;--
.386p
.xlist
include ks386.inc
include i386\kimacro.inc
include callconv.inc
.list
EXTRNP KfLowerIrql,1,IMPORT, FASTCALL
EXTRNP _KeBugCheck,1
extrn _KiServiceExit2:PROC
page ,132
subttl "Thread Startup"
_TEXT$00 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. If control returns from the initial thread
; procedure and a user mode context was established when the thread
; was initialized, then the user mode context is restored and control
; is transfered to user mode. Otherwise a bug check will occur.
;
;
; Arguments:
;
; (TOS) = SystemRoutine - address of initial system routine.
; (TOS+4) = StartRoutine - Initial thread routine.
; (TOS+8) = StartContext - Context parm for initial thread routine.
; (TOS+12) = UserContextFlag - 0 if no user context, !0 if there is one
; (TOS+16) = Base of KTrapFrame if and only if there's a user context.
;
; Return Value:
;
; None.
;
;--
cPublicProc _KiThreadStartup ,1
xor ebx,ebx ; clear registers
xor esi,esi ;
xor edi,edi ;
xor ebp,ebp ;
mov ecx, APC_LEVEL
fstCall KfLowerIrql ; KeLowerIrql(APC_LEVEL)
pop eax ; (eax)->SystemRoutine
call eax ; SystemRoutine(StartRoutine, StartContext)
IFNDEF STD_CALL
add esp,8 ; Clear off args
ENDIF
pop ecx ; (ecx) = UserContextFlag
or ecx, ecx
jz short kits10 ; No user context, go bugcheck
mov ebp,esp ; (bp) -> TrapFrame holding UserContext
jmp _KiServiceExit2
kits10: stdCall _KeBugCheck, <NO_USER_MODE_CONTEXT>
stdENDP _KiThreadStartup
_TEXT$00 ends
end