Adapted for new register functions support (ESP_reg in register
functions now points after the arguments).
This commit is contained in:
parent
06b978991b
commit
0a277b638c
|
@ -96,12 +96,10 @@ static void EXC_DefaultHandling( EXCEPTION_RECORD *rec, CONTEXT *context )
|
|||
}
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
* EXC_RaiseException
|
||||
*
|
||||
* Implementation of NtRaiseException.
|
||||
/***********************************************************************
|
||||
* RtlRaiseException (NTDLL.464)
|
||||
*/
|
||||
static void EXC_RaiseException( EXCEPTION_RECORD *rec, CONTEXT *context )
|
||||
void WINAPI REGS_FUNC(RtlRaiseException)( EXCEPTION_RECORD *rec, CONTEXT *context )
|
||||
{
|
||||
PEXCEPTION_FRAME frame, dispatch, nested_frame;
|
||||
EXCEPTION_RECORD newrec;
|
||||
|
@ -160,16 +158,17 @@ static void EXC_RaiseException( EXCEPTION_RECORD *rec, CONTEXT *context )
|
|||
|
||||
|
||||
/*******************************************************************
|
||||
* EXC_RtlUnwind
|
||||
*
|
||||
* Implementation of RtlUnwind.
|
||||
* RtlUnwind (KERNEL32.590) (NTDLL.518)
|
||||
*/
|
||||
static void EXC_RtlUnwind( EXCEPTION_FRAME *pEndFrame, EXCEPTION_RECORD *pRecord,
|
||||
CONTEXT *context )
|
||||
void WINAPI REGS_FUNC(RtlUnwind)( PEXCEPTION_FRAME pEndFrame, LPVOID unusedEip,
|
||||
PEXCEPTION_RECORD pRecord, DWORD returnEax,
|
||||
CONTEXT *context )
|
||||
{
|
||||
EXCEPTION_RECORD record, newrec;
|
||||
PEXCEPTION_FRAME frame, dispatch;
|
||||
|
||||
EAX_reg(context) = returnEax;
|
||||
|
||||
/* build an exception record, if we do not have one */
|
||||
if (!pRecord)
|
||||
{
|
||||
|
@ -235,68 +234,14 @@ static void EXC_RtlUnwind( EXCEPTION_FRAME *pEndFrame, EXCEPTION_RECORD *pRecord
|
|||
* Real prototype:
|
||||
* DWORD WINAPI NtRaiseException( EXCEPTION_RECORD *rec, CONTEXT *ctx, BOOL first );
|
||||
*/
|
||||
REGS_ENTRYPOINT(NtRaiseException)
|
||||
void WINAPI REGS_FUNC(NtRaiseException)( EXCEPTION_RECORD *rec, CONTEXT *ctx,
|
||||
BOOL first, CONTEXT *context )
|
||||
{
|
||||
DWORD ret;
|
||||
EXCEPTION_RECORD *rec;
|
||||
CONTEXT *ctx;
|
||||
BOOL first;
|
||||
|
||||
ret = STACK32_POP(context); /* return addr */
|
||||
rec = (PEXCEPTION_RECORD)STACK32_POP(context);
|
||||
ctx = (PCONTEXT)STACK32_POP(context);
|
||||
first = (BOOL)STACK32_POP(context);
|
||||
STACK32_PUSH(context,ret); /* restore return addr */
|
||||
|
||||
EXC_RaiseException( rec, ctx );
|
||||
REGS_FUNC(RtlRaiseException)( rec, ctx );
|
||||
*context = *ctx;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* RtlRaiseException (NTDLL.464)
|
||||
*
|
||||
* Real prototype:
|
||||
* void WINAPI RtlRaiseException(PEXCEPTION_RECORD pRecord)
|
||||
*/
|
||||
REGS_ENTRYPOINT(RtlRaiseException)
|
||||
{
|
||||
EXCEPTION_RECORD *rec;
|
||||
DWORD ret;
|
||||
|
||||
ret = STACK32_POP(context); /* return addr */
|
||||
rec = (PEXCEPTION_RECORD)STACK32_POP(context);
|
||||
STACK32_PUSH(context,ret); /* restore return addr */
|
||||
|
||||
rec->ExceptionAddress = (LPVOID)EIP_reg(context);
|
||||
EXC_RaiseException( rec, context );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************
|
||||
* RtlUnwind (KERNEL32.590) (NTDLL.518)
|
||||
*
|
||||
* The real prototype is:
|
||||
* void WINAPI RtlUnwind( PEXCEPTION_FRAME pEndFrame, LPVOID unusedEip,
|
||||
* PEXCEPTION_RECORD pRecord, DWORD returnEax );
|
||||
*/
|
||||
REGS_ENTRYPOINT(RtlUnwind)
|
||||
{
|
||||
PEXCEPTION_FRAME pEndFrame;
|
||||
PEXCEPTION_RECORD pRecord;
|
||||
|
||||
/* get the arguments from the stack */
|
||||
DWORD ret = STACK32_POP(context); /* return addr */
|
||||
pEndFrame = (PEXCEPTION_FRAME)STACK32_POP(context);
|
||||
(void)STACK32_POP(context); /* unused arg */
|
||||
pRecord = (PEXCEPTION_RECORD)STACK32_POP(context);
|
||||
EAX_reg(context) = STACK32_POP(context);
|
||||
STACK32_PUSH(context,ret); /* restore return addr */
|
||||
|
||||
EXC_RtlUnwind( pEndFrame, pRecord, context );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* RtlRaiseStatus (NTDLL.465)
|
||||
*
|
||||
|
|
|
@ -374,11 +374,11 @@ BOOLEAN WINAPI RtlGetNtProductType(LPDWORD type)
|
|||
* NTDLL_alloca_probe [NTDLL.861]
|
||||
* Glorified "enter xxxx".
|
||||
*/
|
||||
REGS_ENTRYPOINT(NTDLL_chkstk)
|
||||
void WINAPI REGS_FUNC(NTDLL_chkstk)( CONTEXT *context )
|
||||
{
|
||||
ESP_reg(context) -= EAX_reg(context);
|
||||
}
|
||||
REGS_ENTRYPOINT(NTDLL_alloca_probe)
|
||||
void WINAPI REGS_FUNC(NTDLL_alloca_probe)( CONTEXT *context )
|
||||
{
|
||||
ESP_reg(context) -= EAX_reg(context);
|
||||
}
|
||||
|
|
|
@ -85,6 +85,6 @@ typedef void *VA_LIST16;
|
|||
#define STACK32_POP(context) (*(*(DWORD **)&ESP_reg(context))++)
|
||||
|
||||
/* Win32 register functions */
|
||||
#define REGS_ENTRYPOINT(name) void WINAPI __regs_##name( CONTEXT *context )
|
||||
#define REGS_FUNC(name) __regs_##name
|
||||
|
||||
#endif /* __WINE_STACKFRAME_H */
|
||||
|
|
|
@ -1560,21 +1560,24 @@ HMODULE WINAPI MapHModuleSL(HMODULE16 hmod) {
|
|||
/***************************************************************************
|
||||
* MapHInstLS (KERNEL32.516)
|
||||
*/
|
||||
REGS_ENTRYPOINT(MapHInstLS) {
|
||||
void WINAPI REGS_FUNC(MapHInstLS)( CONTEXT *context )
|
||||
{
|
||||
EAX_reg(context) = MapHModuleLS(EAX_reg(context));
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* MapHInstSL (KERNEL32.518)
|
||||
*/
|
||||
REGS_ENTRYPOINT(MapHInstSL) {
|
||||
void WINAPI REGS_FUNC(MapHInstSL)( CONTEXT *context )
|
||||
{
|
||||
EAX_reg(context) = MapHModuleSL(EAX_reg(context));
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* MapHInstLS_PN (KERNEL32.517)
|
||||
*/
|
||||
REGS_ENTRYPOINT(MapHInstLS_PN) {
|
||||
void WINAPI REGS_FUNC(MapHInstLS_PN)( CONTEXT *context )
|
||||
{
|
||||
if (EAX_reg(context))
|
||||
EAX_reg(context) = MapHModuleLS(EAX_reg(context));
|
||||
}
|
||||
|
@ -1582,7 +1585,8 @@ REGS_ENTRYPOINT(MapHInstLS_PN) {
|
|||
/***************************************************************************
|
||||
* MapHInstSL_PN (KERNEL32.519)
|
||||
*/
|
||||
REGS_ENTRYPOINT(MapHInstSL_PN) {
|
||||
void WINAPI REGS_FUNC(MapHInstSL_PN)( CONTEXT *context )
|
||||
{
|
||||
if (EAX_reg(context))
|
||||
EAX_reg(context) = MapHModuleSL(EAX_reg(context));
|
||||
}
|
||||
|
|
|
@ -558,11 +558,9 @@ LPVOID WINAPI MapSLFix( SEGPTR sptr )
|
|||
* UnMapSLFixArray (KERNEL32.701)
|
||||
*/
|
||||
|
||||
REGS_ENTRYPOINT(UnMapSLFixArray) /* SEGPTR sptr[], INT32 length */
|
||||
void WINAPI REGS_FUNC(UnMapSLFixArray)( SEGPTR sptr[], INT length, CONTEXT *context )
|
||||
{
|
||||
/* Must not change EAX, hence defined as 'register' function */
|
||||
/* We need to remove the arguments ourselves */
|
||||
ESP_reg( context ) += 8;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -642,17 +640,17 @@ x_SMapLS_IP_EBP_x(CONTEXT *context,int argoff) {
|
|||
EAX_reg(context) = ptr;
|
||||
}
|
||||
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_8) {x_SMapLS_IP_EBP_x(context,8);}
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_12) {x_SMapLS_IP_EBP_x(context,12);}
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_16) {x_SMapLS_IP_EBP_x(context,16);}
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_20) {x_SMapLS_IP_EBP_x(context,20);}
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_24) {x_SMapLS_IP_EBP_x(context,24);}
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_28) {x_SMapLS_IP_EBP_x(context,28);}
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_32) {x_SMapLS_IP_EBP_x(context,32);}
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_36) {x_SMapLS_IP_EBP_x(context,36);}
|
||||
REGS_ENTRYPOINT(SMapLS_IP_EBP_40) {x_SMapLS_IP_EBP_x(context,40);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_8)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,8);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_12)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,12);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_16)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,16);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_20)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,20);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_24)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,24);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_28)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,28);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_32)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,32);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_36)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,36);}
|
||||
void WINAPI REGS_FUNC(SMapLS_IP_EBP_40)(CONTEXT *context) {x_SMapLS_IP_EBP_x(context,40);}
|
||||
|
||||
REGS_ENTRYPOINT(SMapLS)
|
||||
void WINAPI REGS_FUNC(SMapLS)( CONTEXT *context )
|
||||
{
|
||||
if (EAX_reg(context)>=0x10000) {
|
||||
EAX_reg(context) = MapLS((LPVOID)EAX_reg(context));
|
||||
|
@ -662,7 +660,7 @@ REGS_ENTRYPOINT(SMapLS)
|
|||
}
|
||||
}
|
||||
|
||||
REGS_ENTRYPOINT(SUnMapLS)
|
||||
void WINAPI REGS_FUNC(SUnMapLS)( CONTEXT *context )
|
||||
{
|
||||
if (EAX_reg(context)>=0x10000)
|
||||
UnMapLS((SEGPTR)EAX_reg(context));
|
||||
|
@ -674,15 +672,15 @@ x_SUnMapLS_IP_EBP_x(CONTEXT *context,int argoff) {
|
|||
UnMapLS(*(DWORD*)(EBP_reg(context)+argoff));
|
||||
*(DWORD*)(EBP_reg(context)+argoff)=0;
|
||||
}
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_8) { x_SUnMapLS_IP_EBP_x(context,8); }
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_12) { x_SUnMapLS_IP_EBP_x(context,12); }
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_16) { x_SUnMapLS_IP_EBP_x(context,16); }
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_20) { x_SUnMapLS_IP_EBP_x(context,20); }
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_24) { x_SUnMapLS_IP_EBP_x(context,24); }
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_28) { x_SUnMapLS_IP_EBP_x(context,28); }
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_32) { x_SUnMapLS_IP_EBP_x(context,32); }
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_36) { x_SUnMapLS_IP_EBP_x(context,36); }
|
||||
REGS_ENTRYPOINT(SUnMapLS_IP_EBP_40) { x_SUnMapLS_IP_EBP_x(context,40); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_8)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,8); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_12)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,12); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_16)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,16); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_20)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,20); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_24)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,24); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_28)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,28); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_32)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,32); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_36)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,36); }
|
||||
void WINAPI REGS_FUNC(SUnMapLS_IP_EBP_40)(CONTEXT *context) { x_SUnMapLS_IP_EBP_x(context,40); }
|
||||
|
||||
/**********************************************************************
|
||||
* AllocMappedBuffer (KERNEL32.38)
|
||||
|
@ -703,7 +701,7 @@ REGS_ENTRYPOINT(SUnMapLS_IP_EBP_40) { x_SUnMapLS_IP_EBP_x(context,40); }
|
|||
* The SEGPTR is used by the caller!
|
||||
*/
|
||||
|
||||
REGS_ENTRYPOINT(AllocMappedBuffer)
|
||||
void WINAPI REGS_FUNC(AllocMappedBuffer)( CONTEXT *context )
|
||||
{
|
||||
HGLOBAL handle = GlobalAlloc(0, EDI_reg(context) + 8);
|
||||
DWORD *buffer = (DWORD *)GlobalLock(handle);
|
||||
|
@ -736,7 +734,7 @@ REGS_ENTRYPOINT(AllocMappedBuffer)
|
|||
* Input: EDI register: pointer to buffer
|
||||
*/
|
||||
|
||||
REGS_ENTRYPOINT(FreeMappedBuffer)
|
||||
void WINAPI REGS_FUNC(FreeMappedBuffer)( CONTEXT *context )
|
||||
{
|
||||
if (EDI_reg(context))
|
||||
{
|
||||
|
|
|
@ -180,7 +180,7 @@ type win32
|
|||
172 stdcall NtQueryValueKey(long long long long long long) NtQueryValueKey
|
||||
173 stub NtQueryVirtualMemory
|
||||
174 stub NtQueryVolumeInformationFile
|
||||
175 register NtRaiseException() NtRaiseException
|
||||
175 register NtRaiseException(ptr ptr long) NtRaiseException
|
||||
176 stub NtRaiseHardError
|
||||
177 stdcall NtReadFile(long long long long long long long long long) NtReadFile
|
||||
178 stub NtReadRequestData
|
||||
|
@ -469,7 +469,7 @@ type win32
|
|||
461 stub RtlQuerySecurityObject
|
||||
462 stub RtlQueryTagHeap
|
||||
463 stub RtlQueryTimeZoneInformation
|
||||
464 register RtlRaiseException() RtlRaiseException
|
||||
464 register RtlRaiseException(ptr) RtlRaiseException
|
||||
465 stdcall RtlRaiseStatus(long) RtlRaiseStatus
|
||||
466 stub RtlRandom
|
||||
467 stub RtlReAllocateHeap
|
||||
|
@ -523,7 +523,7 @@ type win32
|
|||
515 stdcall RtlUnicodeToOemN(ptr long ptr ptr long) RtlUnicodeToOemN
|
||||
516 stub RtlUniform
|
||||
517 stub RtlUnlockHeap
|
||||
518 register RtlUnwind() RtlUnwind
|
||||
518 register RtlUnwind(ptr ptr ptr long) RtlUnwind
|
||||
519 stub RtlUpcaseUnicodeChar
|
||||
520 stdcall RtlUpcaseUnicodeString(ptr ptr long) RtlUpcaseUnicodeString
|
||||
521 stub RtlUpcaseUnicodeStringToAnsiString
|
||||
|
|
102
win32/kernel32.c
102
win32/kernel32.c
|
@ -248,11 +248,11 @@ UINT WINAPI ThunkConnect32(
|
|||
* QT_Thunk (KERNEL32)
|
||||
*
|
||||
* The target address is in EDX.
|
||||
* The 16 bit arguments start at ESP+4.
|
||||
* The number of 16bit argumentbytes is EBP-ESP-0x44 (68 Byte thunksetup).
|
||||
* The 16 bit arguments start at ESP.
|
||||
* The number of 16bit argument bytes is EBP-ESP-0x40 (64 Byte thunksetup).
|
||||
* [ok]
|
||||
*/
|
||||
REGS_ENTRYPOINT(QT_Thunk)
|
||||
void WINAPI REGS_FUNC(QT_Thunk)( CONTEXT *context )
|
||||
{
|
||||
CONTEXT context16;
|
||||
DWORD argsize;
|
||||
|
@ -265,10 +265,10 @@ REGS_ENTRYPOINT(QT_Thunk)
|
|||
EBP_reg(&context16) = OFFSETOF( thdb->cur_stack )
|
||||
+ (WORD)&((STACK16FRAME*)0)->bp;
|
||||
|
||||
argsize = EBP_reg(context)-ESP_reg(context)-0x44;
|
||||
argsize = EBP_reg(context)-ESP_reg(context)-0x40;
|
||||
|
||||
memcpy( ((LPBYTE)THREAD_STACK16(thdb))-argsize,
|
||||
(LPBYTE)ESP_reg(context)+4, argsize );
|
||||
(LPBYTE)ESP_reg(context), argsize );
|
||||
|
||||
EAX_reg(context) = Callbacks->CallRegisterShortProc( &context16, argsize );
|
||||
EDX_reg(context) = HIWORD(EAX_reg(context));
|
||||
|
@ -316,15 +316,12 @@ REGS_ENTRYPOINT(QT_Thunk)
|
|||
* ... (unclear)
|
||||
* (ebp-64)
|
||||
*
|
||||
* ESP is EBP-68 on return.
|
||||
* ESP is EBP-64 after return.
|
||||
*
|
||||
*/
|
||||
|
||||
REGS_ENTRYPOINT(FT_Prolog)
|
||||
void WINAPI REGS_FUNC(FT_Prolog)( CONTEXT *context )
|
||||
{
|
||||
/* Pop return address to thunk code */
|
||||
EIP_reg(context) = STACK32_POP(context);
|
||||
|
||||
/* Build stack frame */
|
||||
STACK32_PUSH(context, EBP_reg(context));
|
||||
EBP_reg(context) = ESP_reg(context);
|
||||
|
@ -342,9 +339,6 @@ REGS_ENTRYPOINT(FT_Prolog)
|
|||
|
||||
*(DWORD *)(EBP_reg(context) - 48) = EAX_reg(context);
|
||||
*(DWORD *)(EBP_reg(context) - 52) = EDX_reg(context);
|
||||
|
||||
/* Push return address back onto stack */
|
||||
STACK32_PUSH(context, EIP_reg(context));
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
|
@ -368,7 +362,7 @@ REGS_ENTRYPOINT(FT_Prolog)
|
|||
* sufficient ...
|
||||
*/
|
||||
|
||||
REGS_ENTRYPOINT(FT_Thunk)
|
||||
void WINAPI REGS_FUNC(FT_Thunk)( CONTEXT *context )
|
||||
{
|
||||
DWORD mapESPrelative = *(DWORD *)(EBP_reg(context) - 20);
|
||||
DWORD callTarget = *(DWORD *)(EBP_reg(context) - 52);
|
||||
|
@ -385,9 +379,9 @@ REGS_ENTRYPOINT(FT_Thunk)
|
|||
EBP_reg(&context16) = OFFSETOF( thdb->cur_stack )
|
||||
+ (WORD)&((STACK16FRAME*)0)->bp;
|
||||
|
||||
argsize = EBP_reg(context)-ESP_reg(context)-0x44;
|
||||
argsize = EBP_reg(context)-ESP_reg(context)-0x40;
|
||||
newstack = ((LPBYTE)THREAD_STACK16(thdb))-argsize;
|
||||
oldstack = (LPBYTE)ESP_reg(context)+4;
|
||||
oldstack = (LPBYTE)ESP_reg(context);
|
||||
|
||||
memcpy( newstack, oldstack, argsize );
|
||||
|
||||
|
@ -435,25 +429,23 @@ static void FT_Exit(CONTEXT *context, int nPopArgs)
|
|||
EIP_reg(context) = STACK32_POP(context);
|
||||
/* Remove arguments */
|
||||
ESP_reg(context) += nPopArgs;
|
||||
/* Push return address back onto stack */
|
||||
STACK32_PUSH(context, EIP_reg(context));
|
||||
}
|
||||
|
||||
REGS_ENTRYPOINT(FT_Exit0) { FT_Exit(context, 0); }
|
||||
REGS_ENTRYPOINT(FT_Exit4) { FT_Exit(context, 4); }
|
||||
REGS_ENTRYPOINT(FT_Exit8) { FT_Exit(context, 8); }
|
||||
REGS_ENTRYPOINT(FT_Exit12) { FT_Exit(context, 12); }
|
||||
REGS_ENTRYPOINT(FT_Exit16) { FT_Exit(context, 16); }
|
||||
REGS_ENTRYPOINT(FT_Exit20) { FT_Exit(context, 20); }
|
||||
REGS_ENTRYPOINT(FT_Exit24) { FT_Exit(context, 24); }
|
||||
REGS_ENTRYPOINT(FT_Exit28) { FT_Exit(context, 28); }
|
||||
REGS_ENTRYPOINT(FT_Exit32) { FT_Exit(context, 32); }
|
||||
REGS_ENTRYPOINT(FT_Exit36) { FT_Exit(context, 36); }
|
||||
REGS_ENTRYPOINT(FT_Exit40) { FT_Exit(context, 40); }
|
||||
REGS_ENTRYPOINT(FT_Exit44) { FT_Exit(context, 44); }
|
||||
REGS_ENTRYPOINT(FT_Exit48) { FT_Exit(context, 48); }
|
||||
REGS_ENTRYPOINT(FT_Exit52) { FT_Exit(context, 52); }
|
||||
REGS_ENTRYPOINT(FT_Exit56) { FT_Exit(context, 56); }
|
||||
void WINAPI REGS_FUNC(FT_Exit0)(CONTEXT *context) { FT_Exit(context, 0); }
|
||||
void WINAPI REGS_FUNC(FT_Exit4)(CONTEXT *context) { FT_Exit(context, 4); }
|
||||
void WINAPI REGS_FUNC(FT_Exit8)(CONTEXT *context) { FT_Exit(context, 8); }
|
||||
void WINAPI REGS_FUNC(FT_Exit12)(CONTEXT *context) { FT_Exit(context, 12); }
|
||||
void WINAPI REGS_FUNC(FT_Exit16)(CONTEXT *context) { FT_Exit(context, 16); }
|
||||
void WINAPI REGS_FUNC(FT_Exit20)(CONTEXT *context) { FT_Exit(context, 20); }
|
||||
void WINAPI REGS_FUNC(FT_Exit24)(CONTEXT *context) { FT_Exit(context, 24); }
|
||||
void WINAPI REGS_FUNC(FT_Exit28)(CONTEXT *context) { FT_Exit(context, 28); }
|
||||
void WINAPI REGS_FUNC(FT_Exit32)(CONTEXT *context) { FT_Exit(context, 32); }
|
||||
void WINAPI REGS_FUNC(FT_Exit36)(CONTEXT *context) { FT_Exit(context, 36); }
|
||||
void WINAPI REGS_FUNC(FT_Exit40)(CONTEXT *context) { FT_Exit(context, 40); }
|
||||
void WINAPI REGS_FUNC(FT_Exit44)(CONTEXT *context) { FT_Exit(context, 44); }
|
||||
void WINAPI REGS_FUNC(FT_Exit48)(CONTEXT *context) { FT_Exit(context, 48); }
|
||||
void WINAPI REGS_FUNC(FT_Exit52)(CONTEXT *context) { FT_Exit(context, 52); }
|
||||
void WINAPI REGS_FUNC(FT_Exit56)(CONTEXT *context) { FT_Exit(context, 56); }
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
|
@ -560,7 +552,7 @@ DWORD WINAPI ThunkInitLS(
|
|||
* (Those two values should be equal anyway ...?)
|
||||
*
|
||||
*/
|
||||
REGS_ENTRYPOINT(Common32ThkLS)
|
||||
void WINAPI REGS_FUNC(Common32ThkLS)( CONTEXT *context )
|
||||
{
|
||||
CONTEXT context16;
|
||||
DWORD argsize;
|
||||
|
@ -581,15 +573,12 @@ REGS_ENTRYPOINT(Common32ThkLS)
|
|||
argsize = 6 * 4;
|
||||
|
||||
memcpy( ((LPBYTE)THREAD_STACK16(thdb))-argsize,
|
||||
(LPBYTE)ESP_reg(context)+4, argsize );
|
||||
(LPBYTE)ESP_reg(context), argsize );
|
||||
|
||||
EAX_reg(context) = Callbacks->CallRegisterLongProc(&context16, argsize + 32);
|
||||
|
||||
/* Clean up caller's stack frame */
|
||||
|
||||
EIP_reg(context) = STACK32_POP(context);
|
||||
ESP_reg(context) += argsize;
|
||||
STACK32_PUSH(context, EIP_reg(context));
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -619,7 +608,7 @@ REGS_ENTRYPOINT(Common32ThkLS)
|
|||
* (Note that this function seems only to be used for
|
||||
* OLECLI32 -> OLECLI and OLESVR32 -> OLESVR thunking.)
|
||||
*/
|
||||
REGS_ENTRYPOINT(OT_32ThkLSF)
|
||||
void WINAPI REGS_FUNC(OT_32ThkLSF)( CONTEXT *context )
|
||||
{
|
||||
CONTEXT context16;
|
||||
DWORD argsize;
|
||||
|
@ -632,14 +621,14 @@ REGS_ENTRYPOINT(OT_32ThkLSF)
|
|||
EBP_reg(&context16) = OFFSETOF( thdb->cur_stack )
|
||||
+ (WORD)&((STACK16FRAME*)0)->bp;
|
||||
|
||||
argsize = 2 * *(WORD *)(ESP_reg(context) + 4) + 2;
|
||||
argsize = 2 * *(WORD *)ESP_reg(context) + 2;
|
||||
|
||||
memcpy( ((LPBYTE)THREAD_STACK16(thdb))-argsize,
|
||||
(LPBYTE)ESP_reg(context)+4, argsize );
|
||||
(LPBYTE)ESP_reg(context), argsize );
|
||||
|
||||
EAX_reg(context) = Callbacks->CallRegisterShortProc(&context16, argsize);
|
||||
|
||||
memcpy( (LPBYTE)ESP_reg(context)+4,
|
||||
memcpy( (LPBYTE)ESP_reg(context),
|
||||
((LPBYTE)THREAD_STACK16(thdb))-argsize, argsize );
|
||||
}
|
||||
|
||||
|
@ -723,11 +712,12 @@ LPVOID WINAPI ThunkInitLSF(
|
|||
* (this is where the FT_Prolog call stub gets written to)
|
||||
*
|
||||
* Note: The two DWORD arguments get popped from the stack.
|
||||
* The first arg is popped by the relay code and stored in EIP_reg.
|
||||
*
|
||||
*/
|
||||
REGS_ENTRYPOINT(FT_PrologPrime)
|
||||
void WINAPI REGS_FUNC(FT_PrologPrime)( CONTEXT *context )
|
||||
{
|
||||
DWORD targetTableOffset = STACK32_POP(context);
|
||||
DWORD targetTableOffset = EIP_reg(context);
|
||||
LPBYTE relayCode = (LPBYTE)STACK32_POP(context);
|
||||
DWORD *targetTable = *(DWORD **)(relayCode+targetTableOffset);
|
||||
DWORD targetNr = LOBYTE(ECX_reg(context));
|
||||
|
@ -737,7 +727,7 @@ REGS_ENTRYPOINT(FT_PrologPrime)
|
|||
/* We should actually call the relay code now, */
|
||||
/* but we skip it and go directly to FT_Prolog */
|
||||
EDX_reg(context) = targetTable[targetNr];
|
||||
__regs_FT_Prolog(context);
|
||||
REGS_FUNC(FT_Prolog)(context);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -751,7 +741,7 @@ REGS_ENTRYPOINT(FT_PrologPrime)
|
|||
* EAX start of relay code
|
||||
*
|
||||
*/
|
||||
REGS_ENTRYPOINT(QT_ThunkPrime)
|
||||
void WINAPI REGS_FUNC(QT_ThunkPrime)( CONTEXT *context )
|
||||
{
|
||||
DWORD targetTableOffset = EDX_reg(context);
|
||||
LPBYTE relayCode = (LPBYTE)EAX_reg(context);
|
||||
|
@ -763,7 +753,7 @@ REGS_ENTRYPOINT(QT_ThunkPrime)
|
|||
/* We should actually call the relay code now, */
|
||||
/* but we skip it and go directly to QT_Thunk */
|
||||
EDX_reg(context) = targetTable[targetNr];
|
||||
__regs_QT_Thunk(context);
|
||||
REGS_FUNC(QT_Thunk)(context);
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -877,15 +867,15 @@ DWORD WINAPIV SSCall(
|
|||
/**********************************************************************
|
||||
* W32S_BackTo32 (KERNEL32.51)
|
||||
*/
|
||||
REGS_ENTRYPOINT(W32S_BackTo32)
|
||||
void WINAPI REGS_FUNC(W32S_BackTo32)( CONTEXT *context )
|
||||
{
|
||||
LPDWORD stack = (LPDWORD)ESP_reg( context );
|
||||
FARPROC proc = (FARPROC) stack[0];
|
||||
FARPROC proc = (FARPROC)EIP_reg(context);
|
||||
|
||||
EAX_reg( context ) = proc( stack[2], stack[3], stack[4], stack[5], stack[6],
|
||||
stack[7], stack[8], stack[9], stack[10], stack[11] );
|
||||
EAX_reg( context ) = proc( stack[1], stack[2], stack[3], stack[4], stack[5],
|
||||
stack[6], stack[7], stack[8], stack[9], stack[10] );
|
||||
|
||||
EIP_reg( context ) = stack[1];
|
||||
EIP_reg( context ) = STACK32_POP(context);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
|
@ -1021,7 +1011,7 @@ HANDLE WINAPI WOWHandle32(
|
|||
/***********************************************************************
|
||||
* K32Thk1632Prolog (KERNEL32.492)
|
||||
*/
|
||||
REGS_ENTRYPOINT(K32Thk1632Prolog)
|
||||
void WINAPI REGS_FUNC(K32Thk1632Prolog)( CONTEXT *context )
|
||||
{
|
||||
LPBYTE code = (LPBYTE)EIP_reg(context) - 5;
|
||||
|
||||
|
@ -1054,7 +1044,7 @@ REGS_ENTRYPOINT(K32Thk1632Prolog)
|
|||
|
||||
THDB *thdb = THREAD_Current();
|
||||
DWORD argSize = EBP_reg(context) - ESP_reg(context);
|
||||
char *stack16 = (char *)ESP_reg(context);
|
||||
char *stack16 = (char *)ESP_reg(context) - 4;
|
||||
char *stack32 = (char *)thdb->cur_stack - argSize;
|
||||
STACK16FRAME *frame16 = (STACK16FRAME *)stack16 - 1;
|
||||
|
||||
|
@ -1068,7 +1058,7 @@ REGS_ENTRYPOINT(K32Thk1632Prolog)
|
|||
memcpy(stack32, stack16, argSize);
|
||||
thdb->cur_stack = PTR_SEG_OFF_TO_SEGPTR(stackSel, (DWORD)frame16 - stackBase);
|
||||
|
||||
ESP_reg(context) = (DWORD)stack32;
|
||||
ESP_reg(context) = (DWORD)stack32 + 4;
|
||||
EBP_reg(context) = ESP_reg(context) + argSize;
|
||||
|
||||
TRACE_(thunk)("after SYSTHUNK hack: EBP: %08lx ESP: %08lx cur_stack: %08lx\n",
|
||||
|
@ -1081,7 +1071,7 @@ REGS_ENTRYPOINT(K32Thk1632Prolog)
|
|||
/***********************************************************************
|
||||
* K32Thk1632Epilog (KERNEL32.491)
|
||||
*/
|
||||
REGS_ENTRYPOINT(K32Thk1632Epilog)
|
||||
void WINAPI REGS_FUNC(K32Thk1632Epilog)( CONTEXT *context )
|
||||
{
|
||||
LPBYTE code = (LPBYTE)EIP_reg(context) - 13;
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ LPVOID WINAPI GetPK16SysVar(void)
|
|||
/**********************************************************************
|
||||
* CommonUnimpStub (KERNEL32.17)
|
||||
*/
|
||||
REGS_ENTRYPOINT(CommonUnimpStub)
|
||||
void WINAPI REGS_FUNC(CommonUnimpStub)( CONTEXT *context )
|
||||
{
|
||||
if (EAX_reg(context))
|
||||
MESSAGE( "*** Unimplemented Win32 API: %s\n", (LPSTR)EAX_reg(context) );
|
||||
|
|
Loading…
Reference in New Issue