mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
460 lines
12 KiB
460 lines
12 KiB
TITLE KTHUNKS.ASM
|
|
PAGE ,132
|
|
;
|
|
; WOW v1.0
|
|
;
|
|
; Copyright (c) 1991, Microsoft Corporation
|
|
;
|
|
; KTHUNKS.ASM
|
|
; Thunks in 16-bit space to route Windows API calls to WOW32
|
|
;
|
|
; History:
|
|
; 02-Apr-1991 Matt Felton (mattfe)
|
|
; Created.
|
|
;
|
|
|
|
ifndef WINDEBUG
|
|
KDEBUG = 0
|
|
WDEBUG = 0
|
|
else
|
|
KDEBUG = 1
|
|
WDEBUG = 1
|
|
endif
|
|
|
|
|
|
.286p
|
|
|
|
.xlist
|
|
include cmacros.inc
|
|
include wow.inc
|
|
include wowkrn.inc
|
|
.list
|
|
|
|
externNP WowFixWin32CurDir
|
|
|
|
sBegin CODE
|
|
assumes CS,CODE
|
|
assumes DS,NOTHING
|
|
assumes ES,NOTHING
|
|
|
|
|
|
; Kernel API thunks
|
|
|
|
DKernelThunk Yield,0
|
|
KernelThunk GetProfileString
|
|
KernelThunk GetProfileInt
|
|
KernelThunk GetPrivateProfileString
|
|
KernelThunk GetPrivateProfileInt
|
|
KernelThunk RegEnumKey32
|
|
KernelThunk RegOpenKey32
|
|
KernelThunk RegCloseKey32
|
|
KernelThunk RegEnumValue32
|
|
KernelThunk WriteProfileString
|
|
KernelThunk WritePrivateProfileString
|
|
DKernelThunk GetVersionEx
|
|
|
|
|
|
|
|
; Internal WOW Thunks
|
|
|
|
DKernelThunk WowInitTask ; Task Creation
|
|
DKernelThunk WowKillTask,0 ; Task Destruction
|
|
DKernelThunk WOWFreeResource, %(size FREERESOURCE16)
|
|
DKernelThunk WowFileRead,%(size FILEIOREAD16)
|
|
DKernelThunk WowFileWrite,%(size FILEIOWRITE16)
|
|
DKernelThunk WowFileLSeek,%(size FILEIOLSEEK16)
|
|
DKernelThunk WowKernelTrace,%(size KERNELTRACE16)
|
|
DKernelThunk WOWOutputDebugString, %(size OUTPUTDEBUGSTRING16)
|
|
DKernelThunk WowCursorIconOp
|
|
DKernelThunk WowFailedExec,0
|
|
DKernelThunk WowCloseComPort
|
|
DKernelThunk WowFileOpen,%(size FILEIOOPEN16)
|
|
DKernelThunk WowFileClose,%(size FILEIOCLOSE16)
|
|
DKernelThunk WowIsKnownDLL, %(size WOWISKNOWNDLL16)
|
|
DKernelThunk WowDdeFreeHandle
|
|
DKernelThunk WowFileGetAttributes,%(size FILEIOGETATTRIBUTES16)
|
|
DKernelThunk WowFileGetDateTime,%(size FILEIOGETDATETIME16)
|
|
DKernelThunk WowFileLock,%(size FILEIOLOCK16)
|
|
DKernelThunk WowFindFirst,%(size WOWFINDFIRST16)
|
|
DKernelThunk WowFindNext,%(size WOWFINDNEXT16)
|
|
DKernelThunk WowSetDefaultDrive
|
|
DKernelThunk WowGetCurrentDirectory
|
|
DKernelThunk WowSetCurrentDirectory
|
|
DKernelThunk WowWaitForMsgAndEvent
|
|
DKernelThunk WowMsgBox
|
|
DKernelThunk WowGetCurrentDate,0
|
|
DKernelThunk WowDeviceIOCTL
|
|
DKernelThunk WowFileSetAttributes
|
|
DKernelThunk WowFileSetDateTime
|
|
DKernelThunk WowFileCreate
|
|
DKernelThunk WowDosWowInit
|
|
DKernelThunk WowCheckUserGdi
|
|
DKernelThunk WowPartyByNumber
|
|
DKernelThunk WowShouldWeSayWin95
|
|
DKernelThunk GetShortPathName
|
|
DKernelThunk FindAndReleaseDib
|
|
DKernelThunk WowReserveHtask
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; WOWGetNexVdmCommand
|
|
;
|
|
; Returns the Next App Name for the Requested 32 Bit Exec
|
|
;
|
|
; Arguments:
|
|
; FARP lpReturnedString = LPSTR points to the buffer that receives the character strin
|
|
; int nSize = Size of the lpReturnedString buffer
|
|
;
|
|
; Returns:
|
|
; DX:AX = TRUE Success, sting is present
|
|
; DX:AX = NULL, buffer size was not large enough
|
|
;
|
|
; Error Returns:
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; Calls:
|
|
;
|
|
; History:
|
|
; Sun Jan 19, 1992 11:00:06a -by- Matthew Felton [MattFe]
|
|
; New API for Multi Tasking Exec by 32 bit app of 16 bit app
|
|
;-----------------------------------------------------------------------;
|
|
|
|
DKernelThunk WowGetNextVdmCommand
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; WowRegisterShellWindowHandle
|
|
;
|
|
; Tells WOW the Windows Handle To Post Messages to For Execing 16 bit
|
|
; apps. (see WOWEXEC and WK32NotifyThread)
|
|
;
|
|
; Arguments:
|
|
; hwndShell = Shell Window Handle
|
|
;
|
|
; Returns:
|
|
; nothing
|
|
;
|
|
; Error Returns:
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; Calls:
|
|
;
|
|
; History:
|
|
; thu mar 19, 1992 11:11:06a -by- Matthew Felton [MattFe]
|
|
; New API for Multi Tasking Exec by 32 bit app of 16 bit app
|
|
;-----------------------------------------------------------------------;
|
|
|
|
DKernelThunk WowRegisterShellWindowHandle
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; WOWLoadModule32
|
|
;
|
|
; Loads a module or creates a new instance of an existing module.
|
|
;
|
|
; Arguments:
|
|
; FARP p = name of module or handle of existing module
|
|
; FARP lpPBlock = Parameter Block to pass to CreateTask
|
|
; HWND hwndWinOldAp = hwnd to send WM_USER to when app exits.
|
|
;
|
|
; Returns:
|
|
; AX = 32 if Successful
|
|
;
|
|
; Error Returns:
|
|
; AX = Error from Win32 LoadModule
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; Calls:
|
|
;
|
|
; History:
|
|
; Mon 16-Mar-1991 14:19:04 -by- Matthew Felton [mattfe}
|
|
;-----------------------------------------------------------------------;
|
|
|
|
DKernelThunk WOWLoadModule
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; WOWSetIdleHook
|
|
;
|
|
; Calls WK32SetIdleHook For 16 Bit App
|
|
;
|
|
; Arguments:
|
|
; none
|
|
;
|
|
; Returns:
|
|
; AX = 32 if Successful
|
|
;
|
|
; Error Returns:
|
|
; AX = Error from Win32 LoadModule
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; Calls:
|
|
;
|
|
; History:
|
|
; Mon 01-Dec-1992 16:30:00 -by- Russ Blake [russbl}
|
|
;-----------------------------------------------------------------------;
|
|
|
|
DKernelThunk WOWSetIdleHook,0
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; WOWQueryPerformanceCounter
|
|
;
|
|
; Calls NTQueryPerformanceCounter For 16 Bit App
|
|
;
|
|
; Arguments:
|
|
; FARP p = name of module or handle of existing module
|
|
; FARP lpPBlock = Parameter Block to pass to CreateTask
|
|
;
|
|
; Returns:
|
|
; AX = 32 if Successful
|
|
;
|
|
; Error Returns:
|
|
; AX = Error from Win32 LoadModule
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; Calls:
|
|
;
|
|
; History:
|
|
; Mon 16-Mar-1991 14:19:04 -by- Matthew Felton [mattfe}
|
|
;-----------------------------------------------------------------------;
|
|
|
|
DKernelThunk WOWQueryPerformanceCounter
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; WOWGetFastAddress
|
|
;
|
|
; Calls into WOW32 to determine the address of WOWBopEntry on the 32-bit side.
|
|
;
|
|
; Arguments:
|
|
; none
|
|
;
|
|
; Returns:
|
|
; AX = LOWORD of address
|
|
; DX = HIWORD of address
|
|
;
|
|
; Error Returns:
|
|
; AX = 0
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; Calls:
|
|
;
|
|
; History:
|
|
; Mon 16-Mar-1991 14:19:04 -by- Matthew Felton [mattfe}
|
|
;-----------------------------------------------------------------------;
|
|
|
|
DKernelThunk WOWGetFastAddress, 0
|
|
|
|
DKernelThunk WOWGetFastCbRetAddress, 0
|
|
DKernelThunk WOWGetTableOffsets
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; WOWKillRemoteTask
|
|
;
|
|
; Tells the 32-bit thread to die and save its context so that later remote
|
|
; threads can be created to use this context.
|
|
;
|
|
; Arguments:
|
|
; none
|
|
;
|
|
; Returns:
|
|
; Nothing
|
|
;
|
|
; Error Returns:
|
|
; AX = 0
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; Calls:
|
|
;
|
|
; History:
|
|
; Mon 16-Mar-1991 14:19:04 -by- Matthew Felton [mattfe}
|
|
;-----------------------------------------------------------------------;
|
|
|
|
DKernelThunk WOWKillRemoteTask
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; WOWNotifyWOW32
|
|
;
|
|
; Tells the 32-bit world some cool stuff about the 16-bit world.
|
|
;
|
|
; Arguments:
|
|
; none
|
|
;
|
|
; Returns:
|
|
; Nothing
|
|
;
|
|
; Error Returns:
|
|
; AX = 0
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; Calls:
|
|
;
|
|
; History:
|
|
; Mon 16-Mar-1991 14:19:04 -by- Matthew Felton [mattfe}
|
|
;-----------------------------------------------------------------------;
|
|
|
|
DKernelThunk WOWNotifyWOW32
|
|
|
|
DKernelThunk KSYSERRORBOX
|
|
|
|
DKernelThunk WOWDelFile, %(size WOWDelFile16)
|
|
DKernelThunk VirtualAlloc
|
|
DKernelThunk VirtualFree
|
|
; DKernelThunk VirtualLock Unused
|
|
; DKernelThunk VirtualUnlock Unused
|
|
DKernelThunk GlobalMemoryStatus
|
|
DKernelThunk GetDriveType
|
|
DKernelThunk LoadLibraryEx32W, %(size LOADLIBRARYEX32)
|
|
DKernelThunk FreeLibrary32W, %(size FREELIBRARY32)
|
|
DKernelThunk GetProcAddress32W,%(size GETPROCADDRESS32)
|
|
DKernelThunk GetVDMPointer32W, %(size GETVDMPOINTER32)
|
|
DKernelThunk ICallProc32W,0
|
|
|
|
; These Thunks Shouldn't be Called - They are Thunked to Trap Them.
|
|
|
|
; DKernelThunk GetTaskQueueES
|
|
; DKernelThunk GetTaskQueueDS
|
|
DKernelThunk PostEvent
|
|
; DKernelThunk IsTaskLocked
|
|
; DKernelThunk IsWinOldApTask
|
|
DKernelThunk WaitEvent
|
|
DKernelThunk OldYield,0
|
|
; DKernelThunk GetTaskQueue
|
|
DKernelThunk SetPriority
|
|
; DKernelThunk SetTaskQueue
|
|
DKernelThunk DirectedYield
|
|
DKernelThunk LockCurrentTask
|
|
DKernelThunk WriteOutProfiles,0
|
|
|
|
;
|
|
; ExitKernel is small wrapper which takes exit status in AX and pushes it
|
|
; for the convenience of ExitKernelThunk, a regular WOW stack-based thunk.
|
|
; The FUN_ aliasing below allows us to generate the thunk with the name
|
|
; ExitKernelThunk while using the arguments and thunk table entry already
|
|
; set up for ExitKernel.
|
|
;
|
|
|
|
FUN_ExitKernelThunk equ FUN_ExitKernel
|
|
DKernelThunk ExitKernelThunk, %(size EXITKERNEL16)
|
|
|
|
; FatalExitC is called by FatalExit and takes the same one word parameter
|
|
; indicating fatalexit code.
|
|
|
|
FUN_FatalExitC equ FUN_FatalExit
|
|
DKernelThunk FatalExitC, %(size FATALEXIT16)
|
|
|
|
; Thunk for WowGetModuleFileName reuses the GetModuleFileName slot.
|
|
|
|
FUN_WowGetModuleFileName equ FUN_GetModuleFileName
|
|
DKernelThunk WowGetModuleFileName, %(size GetModuleFileName16)
|
|
|
|
; Thunk for WowGetModuleHandle reuses the GetModuleHandle slot.
|
|
|
|
FUN_WowGetModuleHandle equ FUN_GetModuleHandle
|
|
DKernelThunk WowGetModuleHandle
|
|
|
|
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------;
|
|
; CallProc32W
|
|
;
|
|
; Generic Thunk Routine
|
|
; Transitions to 32 bits and calls specified routine
|
|
;
|
|
; Arguments:
|
|
; Variable number of Parameters for function they want to call
|
|
; up to 32.
|
|
;
|
|
; DWORD fAddressConvert - Bit Field, for 16:16 address Convertion
|
|
; eg (bit 1 means convert parameter 1 from 16:16
|
|
; to flat address before calling routine)
|
|
; DWORD cParams - Number of DWORD parameters (so we can clean the stack
|
|
; and so 32 bit land know how many params to copy to
|
|
; 32 bit stack before call.
|
|
; DWORD lpProcAddress - 32 bit native address to call (use LoadLibraryEx32W
|
|
; and GetProcAddress32W to figure this out).
|
|
;
|
|
; Returns:
|
|
; What ever the API returned on 32 bit side in AX:DX
|
|
;
|
|
; Error Returns:
|
|
; AX = 0, more than 32 parameters.
|
|
;
|
|
; Registers Preserved:
|
|
; Registers Destroyed:
|
|
;
|
|
; History:
|
|
; Mon 12-Mar-1993 14:19:04 -by- Matthew Felton [mattfe}
|
|
;-----------------------------------------------------------------------;
|
|
assumes ds,nothing
|
|
assumes es,nothing
|
|
|
|
cProc CallProc32W,<PUBLIC,FAR>
|
|
; PARMD cParams
|
|
cBegin nogen
|
|
push bp
|
|
mov bp,sp
|
|
|
|
; Disable CDECL source bit
|
|
and word ptr [bp+8],NOT CPEX32_SOURCE_CDECL
|
|
|
|
cCall ICallProc32W
|
|
|
|
; Clean Up Callers Stack to remove Parameters Passed
|
|
|
|
mov bx, WORD PTR [bp+6] ; get the # of DWORDS this API took
|
|
shl bx, 2 ; convert it to offset into aRets table
|
|
add bx, codeoffset aRets
|
|
pop bp
|
|
jmp bx ; dispatch to the right RETF n
|
|
|
|
CRETENTRIES equ 020h
|
|
; generate the retf n codetable
|
|
|
|
bytes = 0
|
|
REPT CRETENTRIES
|
|
IFE bytes
|
|
aRets:
|
|
ENDIF
|
|
retf bytes + 4*3 ; 4*3 - Always
|
|
nop
|
|
bytes = bytes + 4
|
|
ENDM
|
|
|
|
cEnd
|
|
|
|
public _CallProcEx32W
|
|
|
|
_CallProcEx32W PROC FAR
|
|
push bp
|
|
mov bp,sp
|
|
|
|
; Enable CDECL source bit
|
|
or word ptr [bp+8],CPEX32_SOURCE_CDECL
|
|
|
|
cCall ICallProc32W
|
|
|
|
pop bp
|
|
ret
|
|
_CallProcEx32W ENDP
|
|
|
|
; get the address of the array containing the selector bases
|
|
DKernelThunk WOWGetFlatAddressArray, 0
|
|
|
|
sEnd CODE
|
|
|
|
end
|
|
|