[KERNEL32]

- We can now free the fiber activation context stack since RtlFreeActivationContextStack is implemented.
- Free the thread activation context stack if we fail at creating a remote thread.

svn path=/trunk/; revision=58549
This commit is contained in:
Hermès Bélusca-Maïto 2013-03-17 22:50:51 +00:00
parent b24c620ea3
commit b0ef5a574c
2 changed files with 24 additions and 17 deletions

View file

@ -15,15 +15,15 @@
typedef struct _FIBER /* Field offsets: */ typedef struct _FIBER /* Field offsets: */
{ /* 32 bit 64 bit */ { /* 32 bit 64 bit */
/* this must be the first field */ /* this must be the first field */
LPVOID Parameter; /* 0x00 0x00 */ PVOID Parameter; /* 0x00 0x00 */
struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList; /* 0x04 0x08 */ PEXCEPTION_REGISTRATION_RECORD ExceptionList; /* 0x04 0x08 */
LPVOID StackBase; /* 0x08 0x10 */ PVOID StackBase; /* 0x08 0x10 */
LPVOID StackLimit; /* 0x0C 0x18 */ PVOID StackLimit; /* 0x0C 0x18 */
LPVOID DeallocationStack; /* 0x10 0x20 */ PVOID DeallocationStack; /* 0x10 0x20 */
CONTEXT Context; /* 0x14 0x28 */ CONTEXT Context; /* 0x14 0x28 */
ULONG GuaranteedStackBytes; /* 0x2E0 */ ULONG GuaranteedStackBytes; /* 0x2E0 */
PVOID FlsData; /* 0x2E4 */ PVOID FlsData; /* 0x2E4 */
PVOID ActivationContextStack; /* 0x2E8 */ PACTIVATION_CONTEXT_STACK ActivationContextStack; /* 0x2E8 */
} FIBER, *PFIBER; } FIBER, *PFIBER;
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/
@ -171,7 +171,7 @@ CreateFiberEx(SIZE_T dwStackCommitSize,
PFIBER Fiber; PFIBER Fiber;
NTSTATUS Status; NTSTATUS Status;
INITIAL_TEB InitialTeb; INITIAL_TEB InitialTeb;
PVOID ActivationContextStack = NULL; PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL;
DPRINT("Creating Fiber\n"); DPRINT("Creating Fiber\n");
/* Check for invalid flags */ /* Check for invalid flags */
@ -210,9 +210,8 @@ CreateFiberEx(SIZE_T dwStackCommitSize,
/* Free the fiber */ /* Free the fiber */
RtlFreeHeap(GetProcessHeap(), 0, Fiber); RtlFreeHeap(GetProcessHeap(), 0, Fiber);
/* Free the activation context */ /* Free the activation context stack */
DPRINT1("Leaking activation stack because nobody implemented free"); RtlFreeActivationContextStack(ActivationContextStack);
//RtlFreeActivationContextStack(&ActivationContextStack);
/* Failure */ /* Failure */
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
@ -271,9 +270,8 @@ DeleteFiber(LPVOID lpFiber)
/* Get rid of FLS */ /* Get rid of FLS */
if (Fiber->FlsData) BaseRundownFls(Fiber->FlsData); if (Fiber->FlsData) BaseRundownFls(Fiber->FlsData);
/* Get rid of the activation stack */ /* Get rid of the activation context stack */
DPRINT1("Leaking activation stack because nobody implemented free"); RtlFreeActivationContextStack(Fiber->ActivationContextStack);
//RtlFreeActivationContextStack(Fiber->ActivationContextStack);
/* Free the fiber data */ /* Free the fiber data */
RtlFreeHeap(GetProcessHeap(), 0, lpFiber); RtlFreeHeap(GetProcessHeap(), 0, lpFiber);

View file

@ -171,7 +171,7 @@ CreateRemoteThread(IN HANDLE hProcess,
ULONG Dummy; ULONG Dummy;
PTEB Teb; PTEB Teb;
THREAD_BASIC_INFORMATION ThreadBasicInfo; THREAD_BASIC_INFORMATION ThreadBasicInfo;
PVOID ActivationContextStack = NULL; PACTIVATION_CONTEXT_STACK ActivationContextStack = NULL;
ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo; ACTIVATION_CONTEXT_BASIC_INFORMATION ActCtxInfo;
ULONG_PTR Cookie; ULONG_PTR Cookie;
ULONG ReturnLength; ULONG ReturnLength;
@ -191,7 +191,7 @@ CreateRemoteThread(IN HANDLE hProcess,
dwCreationFlags & STACK_SIZE_PARAM_IS_A_RESERVATION ? dwCreationFlags & STACK_SIZE_PARAM_IS_A_RESERVATION ?
dwStackSize : 0, dwStackSize : 0,
&InitialTeb); &InitialTeb);
if(!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
BaseSetLastNTError(Status); BaseSetLastNTError(Status);
return NULL; return NULL;
@ -260,7 +260,7 @@ CreateRemoteThread(IN HANDLE hProcess,
Teb->ActivationContextStackPointer = ActivationContextStack; Teb->ActivationContextStackPointer = ActivationContextStack;
/* Query the Context */ /* Query the Context */
// WARNING!!! THIS IS USING THE WIN32 FLAG BECAUSE REACTOS CONTINUES TO BE A POS!!! /// // WARNING!!! THIS IS USING THE WIN32 FLAG BECAUSE REACTOS CONTINUES TO BE A POS!!! ///
Status = RtlQueryInformationActivationContext(QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX, Status = RtlQueryInformationActivationContext(QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX,
NULL, NULL,
0, 0,
@ -274,6 +274,11 @@ CreateRemoteThread(IN HANDLE hProcess,
ERROR_DBGBREAK("SXS: %s - Failing thread create because " ERROR_DBGBREAK("SXS: %s - Failing thread create because "
"RtlQueryInformationActivationContext() failed with status %08lx\n", "RtlQueryInformationActivationContext() failed with status %08lx\n",
__FUNCTION__, Status); __FUNCTION__, Status);
/* Free the activation context stack */
// RtlFreeThreadActivationContextStack();
RtlFreeActivationContextStack(Teb->ActivationContextStackPointer);
return NULL; return NULL;
} }
@ -291,6 +296,11 @@ CreateRemoteThread(IN HANDLE hProcess,
ERROR_DBGBREAK("SXS: %s - Failing thread create because " ERROR_DBGBREAK("SXS: %s - Failing thread create because "
"RtlActivateActivationContextEx() failed with status %08lx\n", "RtlActivateActivationContextEx() failed with status %08lx\n",
__FUNCTION__, Status); __FUNCTION__, Status);
/* Free the activation context stack */
// RtlFreeThreadActivationContextStack();
RtlFreeActivationContextStack(Teb->ActivationContextStackPointer);
return NULL; return NULL;
} }
} }
@ -299,7 +309,6 @@ CreateRemoteThread(IN HANDLE hProcess,
/* Notify CSR */ /* Notify CSR */
if (!BaseRunningInServerProcess) if (!BaseRunningInServerProcess)
{ {
/* Notify CSR */
Status = BasepNotifyCsrOfThread(hThread, &ClientId); Status = BasepNotifyCsrOfThread(hThread, &ClientId);
ASSERT(NT_SUCCESS(Status)); ASSERT(NT_SUCCESS(Status));
} }