328 lines
7.4 KiB
NASM
328 lines
7.4 KiB
NASM
|
title "Thunks"
|
||
|
;++
|
||
|
;
|
||
|
; Copyright (c) 1989 Microsoft Corporation
|
||
|
;
|
||
|
; Module Name:
|
||
|
;
|
||
|
; thunk.asm
|
||
|
;
|
||
|
; Abstract:
|
||
|
;
|
||
|
; This module implements all Win32 thunks. This includes the
|
||
|
; first level thread starter...
|
||
|
;
|
||
|
; Author:
|
||
|
;
|
||
|
; Mark Lucovsky (markl) 28-Sep-1990
|
||
|
;
|
||
|
; Revision History:
|
||
|
;
|
||
|
;--
|
||
|
.386p
|
||
|
.xlist
|
||
|
include ks386.inc
|
||
|
include callconv.inc
|
||
|
.list
|
||
|
_DATA SEGMENT DWORD PUBLIC 'DATA'
|
||
|
|
||
|
_BasepTickCountMultiplier dd 0d1b71759H
|
||
|
|
||
|
_DATA ENDS
|
||
|
|
||
|
|
||
|
_TEXT SEGMENT DWORD PUBLIC 'CODE'
|
||
|
ASSUME DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING
|
||
|
|
||
|
;; align 512
|
||
|
|
||
|
page ,132
|
||
|
subttl "BaseThreadStartThunk"
|
||
|
;++
|
||
|
;
|
||
|
; VOID
|
||
|
; BaseThreadStartThunk(
|
||
|
; IN PTHREAD_START_ROUTINE StartRoutine,
|
||
|
; IN PVOID ThreadParameter
|
||
|
; )
|
||
|
;
|
||
|
; Routine Description:
|
||
|
;
|
||
|
; This function calls to the portable thread starter after moving
|
||
|
; its arguments from registers to the stack.
|
||
|
;
|
||
|
; Arguments:
|
||
|
;
|
||
|
; EAX - StartRoutine
|
||
|
; EBX - ThreadParameter
|
||
|
;
|
||
|
; Return Value:
|
||
|
;
|
||
|
; Never Returns
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
EXTRNP _BaseThreadStart,2
|
||
|
cPublicProc _BaseThreadStartThunk,2
|
||
|
|
||
|
xor ebp,ebp
|
||
|
push ebx
|
||
|
push eax
|
||
|
push 0
|
||
|
jmp _BaseThreadStart@8
|
||
|
|
||
|
stdENDP _BaseThreadStartThunk
|
||
|
|
||
|
;++
|
||
|
;
|
||
|
; VOID
|
||
|
; BaseProcessStartThunk(
|
||
|
; IN LPVOID lpProcessStartAddress,
|
||
|
; IN LPVOID lpParameter
|
||
|
; );
|
||
|
;
|
||
|
; Routine Description:
|
||
|
;
|
||
|
; This function calls the process starter after moving
|
||
|
; its arguments from registers to the stack.
|
||
|
;
|
||
|
; Arguments:
|
||
|
;
|
||
|
; EAX - StartRoutine
|
||
|
; EBX - ProcessParameter
|
||
|
;
|
||
|
; Return Value:
|
||
|
;
|
||
|
; Never Returns
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
EXTRNP _BaseProcessStart,1
|
||
|
cPublicProc _BaseProcessStartThunk,2
|
||
|
|
||
|
xor ebp,ebp
|
||
|
push eax
|
||
|
push 0
|
||
|
jmp _BaseProcessStart@4
|
||
|
|
||
|
stdENDP _BaseProcessStartThunk
|
||
|
|
||
|
|
||
|
;++
|
||
|
;
|
||
|
; VOID
|
||
|
; SwitchToFiber(
|
||
|
; PFIBER NewFiber
|
||
|
; )
|
||
|
;
|
||
|
; Routine Description:
|
||
|
;
|
||
|
; This function saves the state of the current fiber and switches
|
||
|
; to the new fiber.
|
||
|
;
|
||
|
; Arguments:
|
||
|
;
|
||
|
; NewFiber (TOS+4) - Supplies the address of the new fiber.
|
||
|
;
|
||
|
; Return Value:
|
||
|
;
|
||
|
; None
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
cPublicProc _SwitchToFiber,1
|
||
|
|
||
|
mov edx,fs:[PcTeb] ; edx is flat TEB
|
||
|
mov eax,[edx]+TbFiberData ; eax points to current fiber
|
||
|
|
||
|
|
||
|
;
|
||
|
; Setup and save nonvolitile state
|
||
|
;
|
||
|
|
||
|
|
||
|
mov ecx,esp
|
||
|
|
||
|
mov [eax]+FbFiberContext+CsEbx,ebx
|
||
|
mov [eax]+FbFiberContext+CsEdi,edi
|
||
|
mov [eax]+FbFiberContext+CsEsi,esi
|
||
|
mov [eax]+FbFiberContext+CsEbp,ebp
|
||
|
|
||
|
mov ebx,[esp] ; get return address
|
||
|
|
||
|
add ecx,8 ; adjust esp to account for args + ra
|
||
|
mov [eax]+FbFiberContext+CsEsp,ecx
|
||
|
|
||
|
mov [eax]+FbFiberContext+CsEip,ebx
|
||
|
|
||
|
;
|
||
|
; Save exception list, stack base, stack limit
|
||
|
;
|
||
|
|
||
|
mov ecx,[edx]+PcExceptionList
|
||
|
mov ebx,[edx]+PcStackLimit
|
||
|
|
||
|
mov [eax]+FbExceptionList,ecx
|
||
|
mov [eax]+FbStackLimit,ebx
|
||
|
|
||
|
|
||
|
;
|
||
|
; Now restore the new fiber
|
||
|
;
|
||
|
|
||
|
mov eax,[esp]+4 ; eax is new fiber
|
||
|
|
||
|
|
||
|
;
|
||
|
; now restore new fiber TEB state
|
||
|
;
|
||
|
|
||
|
mov ecx,[eax]+FbExceptionList
|
||
|
mov ebx,[eax]+FbStackBase
|
||
|
mov esi,[eax]+FbStackLimit
|
||
|
mov edi,[eax]+FbDeallocationStack
|
||
|
|
||
|
mov [edx]+PcExceptionList,ecx
|
||
|
mov [edx]+PcInitialStack,ebx
|
||
|
mov [edx]+PcStackLimit,esi
|
||
|
mov [edx]+TbDeallocationStack,edi
|
||
|
|
||
|
;
|
||
|
; Restore FiberData
|
||
|
;
|
||
|
|
||
|
mov [edx]+TbFiberData,eax
|
||
|
|
||
|
;
|
||
|
; Restore new fiber nonvolitile state
|
||
|
;
|
||
|
|
||
|
mov edi,[eax]+FbFiberContext+CsEdi
|
||
|
mov esi,[eax]+FbFiberContext+CsEsi
|
||
|
mov ebp,[eax]+FbFiberContext+CsEbp
|
||
|
mov ebx,[eax]+FbFiberContext+CsEbx
|
||
|
mov ecx,[eax]+FbFiberContext+CsEip
|
||
|
mov esp,[eax]+FbFiberContext+CsEsp
|
||
|
|
||
|
jmp ecx
|
||
|
|
||
|
stdENDP _SwitchToFiber
|
||
|
|
||
|
;++
|
||
|
;
|
||
|
; VOID
|
||
|
; LdrpCallInitRoutine(
|
||
|
; IN PDLL_INIT_ROUTINE InitRoutine,
|
||
|
; IN PVOID DllHandle,
|
||
|
; IN ULONG Reason,
|
||
|
; IN PCONTEXT Context OPTIONAL
|
||
|
; )
|
||
|
;
|
||
|
; Routine Description:
|
||
|
;
|
||
|
; This function calls an x86 DLL init routine. It is robust
|
||
|
; against DLLs that don't preserve EBX or fail to clean up
|
||
|
; enough stack.
|
||
|
;
|
||
|
; The only register that the DLL init routine cannot trash is ESI.
|
||
|
;
|
||
|
; Arguments:
|
||
|
;
|
||
|
; InitRoutine - Address of init routine to call
|
||
|
;
|
||
|
; DllHandle - Handle of DLL to call
|
||
|
;
|
||
|
; Reason - one of the DLL_PROCESS_... or DLL_THREAD... values
|
||
|
;
|
||
|
; Context - context pointer or NULL
|
||
|
;
|
||
|
; Return Value:
|
||
|
;
|
||
|
; FALSE if the init routine fails, TRUE for success.
|
||
|
;
|
||
|
;--
|
||
|
|
||
|
cPublicProc __ResourceCallEnumLangRoutine , 6
|
||
|
|
||
|
EnumRoutine equ [ebp + 8]
|
||
|
ModuleHandle equ [ebp + 12]
|
||
|
LpType equ [ebp + 16]
|
||
|
LpName equ [ebp + 20]
|
||
|
WLanguage equ [ebp + 24]
|
||
|
LParam equ [ebp + 28]
|
||
|
|
||
|
stdENDP __ResourceCallEnumLangRoutine
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push esi ; save esi across the call
|
||
|
push edi ; save edi across the call
|
||
|
push ebx ; save ebx on the stack across the call
|
||
|
mov esi,esp ; save the stack pointer in esi across the call
|
||
|
push LParam
|
||
|
push WLanguage
|
||
|
push LpName
|
||
|
push LpType
|
||
|
push ModuleHandle
|
||
|
call EnumRoutine
|
||
|
mov esp,esi ; restore the stack pointer in case callee forgot to clean up
|
||
|
pop ebx ; restore ebx
|
||
|
pop edi ; restore edi
|
||
|
pop esi ; restore esi
|
||
|
pop ebp
|
||
|
stdRET __ResourceCallEnumLangRoutine
|
||
|
|
||
|
cPublicProc __ResourceCallEnumNameRoutine , 5
|
||
|
|
||
|
EnumRoutine equ [ebp + 8]
|
||
|
ModuleHandle equ [ebp + 12]
|
||
|
LpType equ [ebp + 16]
|
||
|
LpName equ [ebp + 20]
|
||
|
LParam equ [ebp + 24]
|
||
|
|
||
|
stdENDP __ResourceCallEnumNameRoutine
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push esi ; save esi across the call
|
||
|
push edi ; save edi across the call
|
||
|
push ebx ; save ebx on the stack across the call
|
||
|
mov esi,esp ; save the stack pointer in esi across the call
|
||
|
push LParam
|
||
|
push LpName
|
||
|
push LpType
|
||
|
push ModuleHandle
|
||
|
call EnumRoutine
|
||
|
mov esp,esi ; restore the stack pointer in case callee forgot to clean up
|
||
|
pop ebx ; restore ebx
|
||
|
pop edi ; restore edi
|
||
|
pop esi ; restore esi
|
||
|
pop ebp
|
||
|
stdRET __ResourceCallEnumNameRoutine
|
||
|
|
||
|
cPublicProc __ResourceCallEnumTypeRoutine , 4
|
||
|
|
||
|
EnumRoutine equ [ebp + 8]
|
||
|
ModuleHandle equ [ebp + 12]
|
||
|
LpType equ [ebp + 16]
|
||
|
LParam equ [ebp + 20]
|
||
|
|
||
|
stdENDP __ResourceCallEnumTypeRoutine
|
||
|
push ebp
|
||
|
mov ebp, esp
|
||
|
push esi ; save esi across the call
|
||
|
push edi ; save edi across the call
|
||
|
push ebx ; save ebx on the stack across the call
|
||
|
mov esi,esp ; save the stack pointer in esi across the call
|
||
|
push LParam
|
||
|
push LpType
|
||
|
push ModuleHandle
|
||
|
call EnumRoutine
|
||
|
mov esp,esi ; restore the stack pointer in case callee forgot to clean up
|
||
|
pop ebx ; restore ebx
|
||
|
pop edi ; restore edi
|
||
|
pop esi ; restore esi
|
||
|
pop ebp
|
||
|
stdRET __ResourceCallEnumTypeRoutine
|
||
|
|
||
|
_TEXT ends
|
||
|
end
|