diff --git a/reactos/dll/win32/kernel32/misc/utils.c b/reactos/dll/win32/kernel32/misc/utils.c index cebd500232b..04fde77fc82 100644 --- a/reactos/dll/win32/kernel32/misc/utils.c +++ b/reactos/dll/win32/kernel32/misc/utils.c @@ -364,7 +364,7 @@ BasepInitializeContext(IN PCONTEXT Context, } else if (ContextType == 2) /* For Fibers */ { - //Context->Eip = (ULONG)BaseFiberStartup; + Context->Eip = (ULONG)BaseFiberStartup; } else /* For first thread in a Process */ { diff --git a/reactos/dll/win32/kernel32/thread/fiber.c b/reactos/dll/win32/kernel32/thread/fiber.c index 656bc6ee19d..6ba2016b648 100644 --- a/reactos/dll/win32/kernel32/thread/fiber.c +++ b/reactos/dll/win32/kernel32/thread/fiber.c @@ -146,9 +146,8 @@ CreateFiberEx(SIZE_T dwStackCommitSize, PFIBER pfCurFiber; NTSTATUS nErrCode; INITIAL_TEB usFiberInitialTeb; - CONTEXT ctxFiberContext; PVOID ActivationContextStack = NULL; - DPRINT1("Creating Fiber\n"); + DPRINT("Creating Fiber\n"); #ifdef SXS_SUPPORT_ENABLED /* Allocate the Activation Context Stack */ @@ -203,7 +202,7 @@ CreateFiberEx(SIZE_T dwStackCommitSize, } /* initialize the context for the fiber */ - BasepInitializeContext(&ctxFiberContext, + BasepInitializeContext(&pfCurFiber->Context, lpParameter, lpStartAddress, usFiberInitialTeb.StackBase, @@ -253,10 +252,10 @@ WINAPI BaseFiberStartup(VOID) { #ifdef _M_IX86 - PFIBER Fiber = GetFiberData(); + PFIBER Fiber = GetCurrentFiber(); /* Call the Thread Startup Routine */ - DPRINT1("Starting Fiber\n"); + DPRINT("Starting Fiber\n"); BaseThreadStartup((LPTHREAD_START_ROUTINE)Fiber->Context.Eax, (LPVOID)Fiber->Context.Ebx); #else diff --git a/reactos/dll/win32/kernel32/thread/i386/fiber.S b/reactos/dll/win32/kernel32/thread/i386/fiber.S index cf8bbe06064..57358ffeed4 100644 --- a/reactos/dll/win32/kernel32/thread/i386/fiber.S +++ b/reactos/dll/win32/kernel32/thread/i386/fiber.S @@ -24,7 +24,11 @@ _SwitchToFiber@4: mov [eax+FIBER_CONTEXT_ESI], esi mov [eax+FIBER_CONTEXT_EDI], edi mov [eax+FIBER_CONTEXT_EBP], ebp - + + /* Save the return address */ + mov ebx, [esp] + mov [eax+FIBER_CONTEXT_EIP], ebx + /* Check if we're to save FPU State */ cmp dword ptr [eax+FIBER_CONTEXT_FLAGS], CONTEXT_FULL | CONTEXT_FLOATING_POINT jnz NoFpuStateSave @@ -115,7 +119,7 @@ NoFpuStateRestore: mov eax, [ecx+FIBER_FLS_DATA] mov [edx+TEB_FLS_DATA], eax - /* Return */ - ret 4 - + /* Jump to new fiber */ + jmp [ecx+FIBER_CONTEXT_EIP] + /* EOF */