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.
109 lines
2.5 KiB
109 lines
2.5 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: clstub16.cxx
|
|
//
|
|
// Contents: 32->16 bit call forwarding stub
|
|
//
|
|
// History: 25-Feb-93 DrewB Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include <headers.cxx>
|
|
#pragma hdrstop
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CallStub16, public
|
|
//
|
|
// Synopsis: Invokes a 16-bit routine on behalf of the 32-bit code
|
|
//
|
|
// Arguments: [pcd] - Data describing the call to be made
|
|
//
|
|
// Returns: Appropriate status code
|
|
//
|
|
// History: 18-Feb-94 DrewB Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
DWORD __loadds FAR PASCAL CallStub16(LPCALLDATA pcd)
|
|
{
|
|
DWORD dwRes;
|
|
DWORD pfn;
|
|
WORD cbStack;
|
|
DWORD pvStack;
|
|
|
|
thkAssert(pcd != NULL);
|
|
|
|
pfn = pcd->vpfn;
|
|
cbStack = (WORD)pcd->cbStack;
|
|
pvStack = pcd->vpvStack16;
|
|
|
|
thkDebugOut((DEB_ITRACE, "In CallStub16(%08lX, %u, %08lX)\n",
|
|
pfn, cbStack, pvStack));
|
|
|
|
// Check for wildly out-of-range stack sizes
|
|
thkAssert(cbStack < 0x100);
|
|
|
|
// Make sure that the stack size is even to
|
|
// maintain alignment and allow free use of movsw
|
|
thkAssert((cbStack & 1) == 0);
|
|
|
|
__asm
|
|
{
|
|
// Make space on the real stack for the stack given to us from 32-bits
|
|
sub sp, cbStack
|
|
|
|
// Simple sanity checks on new stack pointer
|
|
jc StackOverflow
|
|
cmp sp, 512
|
|
jb StackOverflow
|
|
|
|
// Copy pvStack to the real stack
|
|
push ds
|
|
push si
|
|
push es
|
|
push di
|
|
|
|
mov ds, WORD PTR pvStack+2
|
|
mov si, WORD PTR pvStack
|
|
|
|
mov ax, ss
|
|
mov es, ax
|
|
mov di, sp
|
|
// Skip over saved registers
|
|
add di, 8
|
|
|
|
mov cx, cbStack
|
|
shr cx, 1
|
|
cld
|
|
rep movsw
|
|
|
|
pop di
|
|
pop es
|
|
pop si
|
|
pop ds
|
|
|
|
// Call the routine
|
|
call DWORD PTR pfn
|
|
|
|
jmp End
|
|
|
|
StackOverflow:
|
|
// E_OUTOFMEMORY
|
|
mov dx, 8000h
|
|
mov ax, 0002h
|
|
|
|
End:
|
|
mov WORD PTR dwRes, ax
|
|
mov WORD PTR dwRes+2, dx
|
|
|
|
add sp, cbStack
|
|
}
|
|
|
|
thkDebugOut((DEB_ITRACE, "Out CallStub16: return %ld\n",dwRes));
|
|
|
|
return dwRes;
|
|
}
|