Set %fs and %gs in the register context to their current value when

calling 16-bit code.
This commit is contained in:
Alexandre Julliard 2003-11-05 00:46:44 +00:00
parent 83d6e26b31
commit 47f62a402a
6 changed files with 25 additions and 10 deletions

View file

@ -1463,6 +1463,8 @@ DWORD NE_StartTask(void)
context.SegCs = GlobalHandleToSel16(pSegTable[pModule->cs - 1].hSeg);
context.SegDs = GlobalHandleToSel16(pTask->hInstance);
context.SegEs = pTask->hPDB;
context.SegFs = wine_get_fs();
context.SegGs = wine_get_gs();
context.Eip = pModule->ip;
context.Ebx = pModule->stack_size;
context.Ecx = pModule->heap_size;

View file

@ -670,14 +670,14 @@ static BOOL NE_InitDLL( NE_MODULE *pModule )
context.Ecx = heap;
context.Edi = hInst;
context.SegDs = ds;
context.SegEs = ds; /* who knows ... */
context.SegCs = SEL(pSegTable[pModule->cs-1].hSeg);
context.SegDs = ds;
context.SegEs = ds; /* who knows ... */
context.SegFs = wine_get_fs();
context.SegGs = wine_get_gs();
context.SegCs = SEL(pSegTable[pModule->cs-1].hSeg);
context.Eip = pModule->ip;
context.Ebp = OFFSETOF(NtCurrentTeb()->cur_stack) + (WORD)&((STACK16FRAME*)0)->bp;
pModule->cs = 0; /* Don't initialize it twice */
TRACE_(dll)("Calling LibMain, cs:ip=%04lx:%04lx ds=%04lx di=%04x cx=%04x\n",
context.SegCs, context.Eip, context.SegDs,
@ -775,7 +775,8 @@ static void NE_CallDllEntryPoint( NE_MODULE *pModule, DWORD dwReason )
memset( &context, 0, sizeof(context) );
context.SegDs = ds;
context.SegEs = ds; /* who knows ... */
context.SegFs = wine_get_fs();
context.SegGs = wine_get_gs();
context.SegCs = HIWORD(entryPoint);
context.Eip = LOWORD(entryPoint);
context.Ebp = OFFSETOF( NtCurrentTeb()->cur_stack )

View file

@ -169,8 +169,10 @@ static void call_timer_proc16( WORD timer )
CONTEXT86 context;
FARPROC16 proc = SYS_Timers[timer-1].callback16;
memset( &context, '\0', sizeof(context) );
memset( &context, 0, sizeof(context) );
context.SegFs = wine_get_fs();
context.SegGs = wine_get_gs();
context.SegCs = SELECTOROF( proc );
context.Eip = OFFSETOF( proc );
context.Ebp = OFFSETOF( NtCurrentTeb()->cur_stack )

View file

@ -349,6 +349,8 @@ void WINAPI QT_Thunk( CONTEXT86 *context )
memcpy(&context16,context,sizeof(context16));
context16.SegFs = wine_get_fs();
context16.SegGs = wine_get_gs();
context16.SegCs = HIWORD(context->Edx);
context16.Eip = LOWORD(context->Edx);
/* point EBP to the STACK16FRAME on the stack
@ -478,6 +480,8 @@ void WINAPI FT_Thunk( CONTEXT86 *context )
memcpy(&context16,context,sizeof(context16));
context16.SegFs = wine_get_fs();
context16.SegGs = wine_get_gs();
context16.SegCs = HIWORD(callTarget);
context16.Eip = LOWORD(callTarget);
context16.Ebp = OFFSETOF( NtCurrentTeb()->cur_stack )
@ -690,6 +694,8 @@ void WINAPI Common32ThkLS( CONTEXT86 *context )
memcpy(&context16,context,sizeof(context16));
context16.SegFs = wine_get_fs();
context16.SegGs = wine_get_gs();
context16.Edi = LOWORD(context->Ecx);
context16.SegCs = HIWORD(context->Eax);
context16.Eip = LOWORD(context->Eax);
@ -747,6 +753,8 @@ void WINAPI OT_32ThkLSF( CONTEXT86 *context )
memcpy(&context16,context,sizeof(context16));
context16.SegFs = wine_get_fs();
context16.SegGs = wine_get_gs();
context16.SegCs = HIWORD(context->Edx);
context16.Eip = LOWORD(context->Edx);
context16.Ebp = OFFSETOF( NtCurrentTeb()->cur_stack )

View file

@ -590,8 +590,8 @@ static void StartPM( CONTEXT86 *context )
pm_ctx.Edx = cs;
pm_ctx.SegDs = ds;
pm_ctx.SegEs = es;
pm_ctx.SegFs = 0;
pm_ctx.SegGs = 0;
pm_ctx.SegFs = wine_get_fs();
pm_ctx.SegGs = wine_get_gs();
pm_ctx.EFlags &= ~V86_FLAG;
TRACE("DOS program is now entering %d-bit protected mode\n",

View file

@ -252,8 +252,10 @@ static LRESULT WINAPI WINPROC_CallWndProc16( WNDPROC16 proc, HWND16 hwnd,
/* Window procedures want ax = hInstance, ds = es = ss */
memset(&context, '\0', sizeof(context));
memset(&context, 0, sizeof(context));
context.SegDs = context.SegEs = SELECTOROF(teb->cur_stack);
context.SegFs = wine_get_fs();
context.SegGs = wine_get_gs();
if (!(context.Eax = GetWindowWord( HWND_32(hwnd), GWL_HINSTANCE ))) context.Eax = context.SegDs;
context.SegCs = SELECTOROF(proc);
context.Eip = OFFSETOF(proc);