#include <k32.h>
#include <ndk/rtltypes.h>
#include <debug.h>
Go to the source code of this file.
◆ NDEBUG
◆ BaseRundownFls()
Definition at line 32 of file fiber.c.
33{
37
38 pFlsData = FlsData;
39
44
45 for (
n = 1;
n <= FlsHighIndex; ++
n)
46 {
48 if (lpCallback && pFlsData->
Data[
n])
49 {
50 lpCallback(pFlsData->
Data[
n]);
51 }
52 }
53
55}
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define RemoveEntryList(Entry)
PVOID Data[RTL_FLS_MAXIMUM_AVAILABLE]
VOID(WINAPI * PFLS_CALLBACK_FUNCTION)(PVOID)
NTSYSAPI void WINAPI RtlReleasePebLock(void)
NTSYSAPI void WINAPI RtlAcquirePebLock(void)
Referenced by DeleteFiber().
◆ ConvertFiberToThread()
Definition at line 64 of file fiber.c.
65{
68 DPRINT1(
"Converting Fiber to Thread\n");
69
70
72 if (!Teb->HasFiberData)
73 {
74
77 }
78
79
80 Teb->HasFiberData =
FALSE;
83
84
87 0,
89
90
92}
#define ERROR_ALREADY_THREAD
◆ ConvertThreadToFiber()
Definition at line 162 of file fiber.c.
163{
164
166 0);
167}
LPVOID WINAPI ConvertThreadToFiberEx(_In_opt_ LPVOID lpParameter, _In_ DWORD dwFlags)
Referenced by Fbt_CreateFiber(), and init_funcs().
◆ ConvertThreadToFiberEx()
Definition at line 99 of file fiber.c.
101{
104 DPRINT1(
"Converting Thread to Fiber\n");
105
106
107 if (
dwFlags & ~FIBER_FLAG_FLOAT_SWITCH)
108 {
109
112 }
113
114
116 if (Teb->HasFiberData)
117 {
118
121 }
122
123
125 0,
127 if (!Fiber)
128 {
129
132 }
133
134
143
144
148
149
151 Teb->HasFiberData =
TRUE;
152
153
155}
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
#define ERROR_NOT_ENOUGH_MEMORY
#define ERROR_INVALID_PARAMETER
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
#define CONTEXT_FLOATING_POINT
ULONG GuaranteedStackBytes
struct _ACTIVATION_CONTEXT_STACK * ActivationContextStackPointer
struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList
struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList
PVOID ActivationContextStackPointer
ULONG GuaranteedStackBytes
#define ERROR_ALREADY_FIBER
Referenced by ConvertThreadToFiber(), and init_funcs().
◆ CreateFiber()
Definition at line 174 of file fiber.c.
177{
178
180 0,
181 0,
182 lpStartAddress,
183 lpParameter);
184}
LPVOID WINAPI CreateFiberEx(_In_ SIZE_T dwStackCommitSize, _In_ SIZE_T dwStackReserveSize, _In_ DWORD dwFlags, _In_ LPFIBER_START_ROUTINE lpStartAddress, _In_opt_ LPVOID lpParameter)
Referenced by Fbt_CreateFiber(), and init_funcs().
◆ CreateFiberEx()
Definition at line 191 of file fiber.c.
196{
201 DPRINT(
"Creating Fiber\n");
202
203
204 if (
dwFlags & ~FIBER_FLAG_FLOAT_SWITCH)
205 {
206
209 }
210
211
212 ActivationContextStackPointer =
NULL;
213 Status = RtlAllocateActivationContextStack(&ActivationContextStackPointer);
215 {
216
219 }
220
221
223 0,
225 if (!Fiber)
226 {
227
229
230
233 }
234
235
237 dwStackCommitSize,
238 dwStackReserveSize,
239 &InitialTeb);
241 {
242
244 0,
245 Fiber);
246
247
249
250
253 }
254
255
258
259
268
269
273
274
276 lpParameter,
277 lpStartAddress,
279 2);
280
281
282 return Fiber;
283}
#define NT_SUCCESS(StatCode)
NTSTATUS WINAPI BaseCreateStack(_In_ HANDLE hProcess, _In_opt_ SIZE_T StackCommit, _In_opt_ SIZE_T StackReserve, _Out_ PINITIAL_TEB InitialTeb)
VOID WINAPI BaseInitializeContext(IN PCONTEXT Context, IN PVOID Parameter, IN PVOID StartAddress, IN PVOID StackAddress, IN ULONG ContextType)
#define EXCEPTION_CHAIN_END
#define NtCurrentProcess()
DWORD BaseSetLastNTError(IN NTSTATUS Status)
#define RtlZeroMemory(Destination, Length)
NTSYSAPI void WINAPI RtlFreeActivationContextStack(ACTIVATION_CONTEXT_STACK *)
Referenced by CreateFiber(), and init_funcs().
◆ DeleteFiber()
Definition at line 290 of file fiber.c.
291{
295
296
299 if ((Teb->HasFiberData) &&
301 {
302
304 }
305
306
312
313
315
316
318
319
321 0,
322 lpFiber);
323}
VOID WINAPI BaseRundownFls(_In_ PVOID FlsData)
VOID WINAPI ExitThread(IN DWORD uExitCode)
NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UBaseAddress, IN PSIZE_T URegionSize, IN ULONG FreeType)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Referenced by Fbt_AfterSwitch(), Fbt_Dispatch(), init_funcs(), subtest_fiber_actctx_preservation(), and subtest_fiber_actctx_switch().
◆ FlsAlloc()
Definition at line 341 of file fiber.c.
342{
346
348
350
354 {
357 }
358 else
359 {
362 {
363 if (!pFlsData &&
365 {
369 }
370 else
371 {
373 {
376 }
377
380
383 }
384 }
385 else
386 {
388 }
389 }
391 return dwFlsIndex;
392}
#define RtlFindClearBitsAndSet
#define ERROR_NO_MORE_ITEMS
#define InsertTailList(ListHead, Entry)
#define FLS_OUT_OF_INDEXES
#define FLS_MAXIMUM_AVAILABLE
Referenced by __acrt_FlsAlloc(), fls_exit_deadlock_child(), and init_funcs().
◆ FlsFree()
Definition at line 400 of file fiber.c.
401{
404
406 {
409 }
410
412
414 {
417 {
420
423
425 {
427
429 if (pFlsData->
Data[dwFlsIndex])
430 {
431 if (lpCallback)
432 {
433 lpCallback(pFlsData->
Data[dwFlsIndex]);
434 }
436 }
437 }
439 }
440 else
441 {
443 }
444 }
446 {
448 }
450
452}
struct _LIST_ENTRY * Flink
#define CONTAINING_RECORD(address, type, field)
Referenced by __acrt_FlsFree(), and init_funcs().
◆ FlsGetValue()
◆ FlsSetValue()
◆ IsThreadAFiber()