Windows NT 4.0 source code leak
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

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