mirror of
https://github.com/reactos/reactos.git
synced 2025-05-04 18:31:40 +00:00
[NDK/KERNEL32]
Improve definition of FIBER. Based on ks386.inc, ksarm.h and ksamd64.inc svn path=/trunk/; revision=67473
This commit is contained in:
parent
58de1d8ba9
commit
4d59b2ba82
3 changed files with 54 additions and 47 deletions
|
@ -17,10 +17,10 @@ C_ASSERT(FIELD_OFFSET(FIBER, ExceptionList) == 0x04);
|
|||
C_ASSERT(FIELD_OFFSET(FIBER, StackBase) == 0x08);
|
||||
C_ASSERT(FIELD_OFFSET(FIBER, StackLimit) == 0x0C);
|
||||
C_ASSERT(FIELD_OFFSET(FIBER, DeallocationStack) == 0x10);
|
||||
C_ASSERT(FIELD_OFFSET(FIBER, Context) == 0x14);
|
||||
C_ASSERT(FIELD_OFFSET(FIBER, FiberContext) == 0x14);
|
||||
C_ASSERT(FIELD_OFFSET(FIBER, GuaranteedStackBytes) == 0x2E0);
|
||||
C_ASSERT(FIELD_OFFSET(FIBER, FlsData) == 0x2E4);
|
||||
C_ASSERT(FIELD_OFFSET(FIBER, ActivationContextStack) == 0x2E8);
|
||||
C_ASSERT(FIELD_OFFSET(FIBER, ActivationContextStackPointer) == 0x2E8);
|
||||
#endif // _M_IX86
|
||||
|
||||
/* PRIVATE FUNCTIONS **********************************************************/
|
||||
|
@ -30,7 +30,7 @@ WINAPI
|
|||
BaseRundownFls(IN PVOID FlsData)
|
||||
{
|
||||
/* No FLS support yet */
|
||||
|
||||
|
||||
}
|
||||
|
||||
/* PUBLIC FUNCTIONS ***********************************************************/
|
||||
|
@ -106,20 +106,20 @@ ConvertThreadToFiberEx(LPVOID lpParameter,
|
|||
}
|
||||
|
||||
/* Copy some contextual data from the thread to the fiber */
|
||||
Fiber->Parameter = lpParameter;
|
||||
Fiber->FiberData = lpParameter;
|
||||
Fiber->ExceptionList = Teb->NtTib.ExceptionList;
|
||||
Fiber->StackBase = Teb->NtTib.StackBase;
|
||||
Fiber->StackLimit = Teb->NtTib.StackLimit;
|
||||
Fiber->DeallocationStack = Teb->DeallocationStack;
|
||||
Fiber->FlsData = Teb->FlsData;
|
||||
Fiber->GuaranteedStackBytes = Teb->GuaranteedStackBytes;
|
||||
Fiber->ActivationContextStack = Teb->ActivationContextStackPointer;
|
||||
Fiber->Context.ContextFlags = CONTEXT_FULL;
|
||||
Fiber->ActivationContextStackPointer = Teb->ActivationContextStackPointer;
|
||||
Fiber->FiberContext.ContextFlags = CONTEXT_FULL;
|
||||
|
||||
/* Save FPU State if requested */
|
||||
if (dwFlags & FIBER_FLAG_FLOAT_SWITCH)
|
||||
{
|
||||
Fiber->Context.ContextFlags |= CONTEXT_FLOATING_POINT;
|
||||
Fiber->FiberContext.ContextFlags |= CONTEXT_FLOATING_POINT;
|
||||
}
|
||||
|
||||
/* Associate the fiber to the current thread */
|
||||
|
@ -168,7 +168,7 @@ CreateFiberEx(SIZE_T dwStackCommitSize,
|
|||
PFIBER Fiber;
|
||||
NTSTATUS Status;
|
||||
INITIAL_TEB InitialTeb;
|
||||
PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL;
|
||||
PACTIVATION_CONTEXT_STACK ActivationContextStackPointer = NULL;
|
||||
DPRINT("Creating Fiber\n");
|
||||
|
||||
/* Check for invalid flags */
|
||||
|
@ -180,7 +180,7 @@ CreateFiberEx(SIZE_T dwStackCommitSize,
|
|||
}
|
||||
|
||||
/* Allocate the Activation Context Stack */
|
||||
Status = RtlAllocateActivationContextStack(&ActivationContextStack);
|
||||
Status = RtlAllocateActivationContextStack(&ActivationContextStackPointer);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
/* Fail */
|
||||
|
@ -193,7 +193,7 @@ CreateFiberEx(SIZE_T dwStackCommitSize,
|
|||
if (!Fiber)
|
||||
{
|
||||
/* Free the activation context stack */
|
||||
RtlFreeActivationContextStack(ActivationContextStack);
|
||||
RtlFreeActivationContextStack(ActivationContextStackPointer);
|
||||
|
||||
/* Fail */
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
|
@ -211,7 +211,7 @@ CreateFiberEx(SIZE_T dwStackCommitSize,
|
|||
RtlFreeHeap(GetProcessHeap(), 0, Fiber);
|
||||
|
||||
/* Free the activation context stack */
|
||||
RtlFreeActivationContextStack(ActivationContextStack);
|
||||
RtlFreeActivationContextStack(ActivationContextStackPointer);
|
||||
|
||||
/* Failure */
|
||||
BaseSetLastNTError(Status);
|
||||
|
@ -219,24 +219,24 @@ CreateFiberEx(SIZE_T dwStackCommitSize,
|
|||
}
|
||||
|
||||
/* Clear the context */
|
||||
RtlZeroMemory(&Fiber->Context, sizeof(CONTEXT));
|
||||
RtlZeroMemory(&Fiber->FiberContext, sizeof(CONTEXT));
|
||||
|
||||
/* Copy the data into the fiber */
|
||||
Fiber->StackBase = InitialTeb.StackBase;
|
||||
Fiber->StackLimit = InitialTeb.StackLimit;
|
||||
Fiber->DeallocationStack = InitialTeb.AllocatedStackBase;
|
||||
Fiber->Parameter = lpParameter;
|
||||
Fiber->FiberData = lpParameter;
|
||||
Fiber->ExceptionList = EXCEPTION_CHAIN_END;
|
||||
Fiber->GuaranteedStackBytes = 0;
|
||||
Fiber->FlsData = NULL;
|
||||
Fiber->ActivationContextStack = ActivationContextStack;
|
||||
Fiber->Context.ContextFlags = CONTEXT_FULL;
|
||||
Fiber->ActivationContextStackPointer = ActivationContextStackPointer;
|
||||
Fiber->FiberContext.ContextFlags = CONTEXT_FULL;
|
||||
|
||||
/* Save FPU State if requested */
|
||||
Fiber->Context.ContextFlags = (dwFlags & FIBER_FLAG_FLOAT_SWITCH) ? CONTEXT_FLOATING_POINT : 0;
|
||||
Fiber->FiberContext.ContextFlags = (dwFlags & FIBER_FLAG_FLOAT_SWITCH) ? CONTEXT_FLOATING_POINT : 0;
|
||||
|
||||
/* initialize the context for the fiber */
|
||||
BaseInitializeContext(&Fiber->Context,
|
||||
BaseInitializeContext(&Fiber->FiberContext,
|
||||
lpParameter,
|
||||
lpStartAddress,
|
||||
InitialTeb.StackBase,
|
||||
|
@ -271,7 +271,7 @@ DeleteFiber(LPVOID lpFiber)
|
|||
if (Fiber->FlsData) BaseRundownFls(Fiber->FlsData);
|
||||
|
||||
/* Get rid of the activation context stack */
|
||||
RtlFreeActivationContextStack(Fiber->ActivationContextStack);
|
||||
RtlFreeActivationContextStack(Fiber->ActivationContextStackPointer);
|
||||
|
||||
/* Free the fiber data */
|
||||
RtlFreeHeap(GetProcessHeap(), 0, lpFiber);
|
||||
|
|
|
@ -350,29 +350,29 @@ OFFSET(CONTEXT_SEGSS, CONTEXT, SegSs),
|
|||
SIZE(CONTEXT_FRAME_LENGTH, CONTEXT),
|
||||
|
||||
HEADER("FIBER"),
|
||||
OFFSET(FIBER_PARAMETER, FIBER, Parameter),
|
||||
OFFSET(FIBER_PARAMETER, FIBER, FiberData),
|
||||
OFFSET(FIBER_EXCEPTION_LIST, FIBER, ExceptionList),
|
||||
OFFSET(FIBER_STACK_BASE, FIBER, StackBase),
|
||||
OFFSET(FIBER_STACK_LIMIT, FIBER, StackLimit),
|
||||
OFFSET(FIBER_DEALLOCATION_STACK, FIBER, DeallocationStack),
|
||||
OFFSET(FIBER_CONTEXT, FIBER, Context),
|
||||
OFFSET(FIBER_CONTEXT_FLAGS, FIBER, Context.ContextFlags),
|
||||
OFFSET(FIBER_CONTEXT_EAX, FIBER, Context.Eax),
|
||||
OFFSET(FIBER_CONTEXT_EBX, FIBER, Context.Ebx),
|
||||
OFFSET(FIBER_CONTEXT_ECX, FIBER, Context.Ecx),
|
||||
OFFSET(FIBER_CONTEXT_EDX, FIBER, Context.Edx),
|
||||
OFFSET(FIBER_CONTEXT_ESI, FIBER, Context.Esi),
|
||||
OFFSET(FIBER_CONTEXT_EDI, FIBER, Context.Edi),
|
||||
OFFSET(FIBER_CONTEXT_EBP, FIBER, Context.Ebp),
|
||||
OFFSET(FIBER_CONTEXT_EIP, FIBER, Context.Eip),
|
||||
OFFSET(FIBER_CONTEXT_ESP, FIBER, Context.Esp),
|
||||
OFFSET(FIBER_CONTEXT_DR6, FIBER, Context.Dr6),
|
||||
OFFSET(FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD, FIBER, Context.FloatSave.ControlWord),
|
||||
OFFSET(FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD, FIBER, Context.FloatSave.StatusWord),
|
||||
OFFSET(FIBER_CONTEXT_FLOAT_SAVE_TAG_WORD, FIBER, Context.FloatSave.TagWord),
|
||||
OFFSET(FIBER_CONTEXT, FIBER, FiberContext),
|
||||
OFFSET(FIBER_CONTEXT_FLAGS, FIBER, FiberContext.ContextFlags),
|
||||
OFFSET(FIBER_CONTEXT_EAX, FIBER, FiberContext.Eax),
|
||||
OFFSET(FIBER_CONTEXT_EBX, FIBER, FiberContext.Ebx),
|
||||
OFFSET(FIBER_CONTEXT_ECX, FIBER, FiberContext.Ecx),
|
||||
OFFSET(FIBER_CONTEXT_EDX, FIBER, FiberContext.Edx),
|
||||
OFFSET(FIBER_CONTEXT_ESI, FIBER, FiberContext.Esi),
|
||||
OFFSET(FIBER_CONTEXT_EDI, FIBER, FiberContext.Edi),
|
||||
OFFSET(FIBER_CONTEXT_EBP, FIBER, FiberContext.Ebp),
|
||||
OFFSET(FIBER_CONTEXT_EIP, FIBER, FiberContext.Eip),
|
||||
OFFSET(FIBER_CONTEXT_ESP, FIBER, FiberContext.Esp),
|
||||
OFFSET(FIBER_CONTEXT_DR6, FIBER, FiberContext.Dr6),
|
||||
OFFSET(FIBER_CONTEXT_FLOAT_SAVE_CONTROL_WORD, FIBER, FiberContext.FloatSave.ControlWord),
|
||||
OFFSET(FIBER_CONTEXT_FLOAT_SAVE_STATUS_WORD, FIBER, FiberContext.FloatSave.StatusWord),
|
||||
OFFSET(FIBER_CONTEXT_FLOAT_SAVE_TAG_WORD, FIBER, FiberContext.FloatSave.TagWord),
|
||||
OFFSET(FIBER_GUARANTEED_STACK_BYTES, FIBER, GuaranteedStackBytes),
|
||||
OFFSET(FIBER_FLS_DATA, FIBER, FlsData),
|
||||
OFFSET(FIBER_ACTIVATION_CONTEXT_STACK, FIBER, ActivationContextStack),
|
||||
OFFSET(FIBER_ACTIVATION_CONTEXT_STACK, FIBER, ActivationContextStackPointer),
|
||||
|
||||
HEADER("KTSS"),
|
||||
OFFSET(KTSS_IOMAPBASE, KTSS, IoMapBase),
|
||||
|
|
|
@ -168,18 +168,25 @@ Author:
|
|||
#define KI_EXCEPTION_INTERNAL 0x10000000
|
||||
#define KI_EXCEPTION_ACCESS_VIOLATION (KI_EXCEPTION_INTERNAL | 0x04)
|
||||
|
||||
typedef struct _FIBER /* Field offsets: */
|
||||
{ /* 32 bit 64 bit */
|
||||
/* this must be the first field */
|
||||
PVOID Parameter; /* 0x00 0x00 */
|
||||
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; /* 0x04 0x08 */
|
||||
PVOID StackBase; /* 0x08 0x10 */
|
||||
PVOID StackLimit; /* 0x0C 0x18 */
|
||||
PVOID DeallocationStack; /* 0x10 0x20 */
|
||||
CONTEXT Context; /* 0x14 0x28 */
|
||||
ULONG GuaranteedStackBytes; /* 0x2E0 */
|
||||
PVOID FlsData; /* 0x2E4 */
|
||||
struct _ACTIVATION_CONTEXT_STACK *ActivationContextStack;/* 0x2E8 */
|
||||
typedef struct _FIBER /* Field offsets: */
|
||||
{ /* i386 arm x64 */
|
||||
PVOID FiberData; /* 0x000 0x000 0x000 */
|
||||
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;/* 0x004 0x004 0x008 */
|
||||
PVOID StackBase; /* 0x008 0x008 0x010 */
|
||||
PVOID StackLimit; /* 0x00C 0x00C 0x018 */
|
||||
PVOID DeallocationStack; /* 0x010 0x010 0x020 */
|
||||
CONTEXT FiberContext; /* 0x014 0x018 0x030 */
|
||||
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
|
||||
PVOID Wx86Tib; /* 0x2E0 0x1b8 0x500 */
|
||||
struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer; /* 0x2E4 0x1bc 0x508 */
|
||||
PVOID FlsData; /* 0x2E8 0x1c0 0x510 */
|
||||
ULONG GuaranteedStackBytes; /* 0x2EC 0x1c4 0x518 */
|
||||
ULONG TebFlags; /* 0x2F0 0x1c8 0x51C */
|
||||
#else
|
||||
ULONG GuaranteedStackBytes; /* 0x2E0 */
|
||||
PVOID FlsData; /* 0x2E4 */
|
||||
struct _ACTIVATION_CONTEXT_STACK *ActivationContextStackPointer;
|
||||
#endif
|
||||
} FIBER, *PFIBER;
|
||||
|
||||
#ifndef NTOS_MODE_USER
|
||||
|
|
Loading…
Reference in a new issue