100 lines
2.4 KiB
NASM
100 lines
2.4 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 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
|
||
|