#include <k32.h>
#include <ndk/rtltypes.h>
#include <ndk/rtlfuncs.h>
#include <debug.h>
Go to the source code of this file.
◆ NDEBUG
◆ BaseRundownFls()
Definition at line 33 of file fiber.c.
34{
38
39 pFlsData = FlsData;
40
45
46 for (
n = 1;
n <= FlsHighIndex; ++
n)
47 {
49 if (lpCallback && pFlsData->
Data[
n])
50 {
51 lpCallback(pFlsData->
Data[
n]);
52 }
53 }
54
56}
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 65 of file fiber.c.
66{
69 DPRINT1(
"Converting Fiber to Thread\n");
70
71
73#if (NTDDI_VERSION < NTDDI_LONGHORN)
74 if (!Teb->HasFiberData)
75#else
76 if (!Teb->DbgHasFiberData)
77#endif
78 {
79
82 }
83
84
85#if (NTDDI_VERSION < NTDDI_LONGHORN)
86 Teb->HasFiberData =
FALSE;
87#else
88 Teb->DbgHasFiberData =
FALSE;
89#endif
92
93
96 0,
98
99
101}
#define ERROR_ALREADY_THREAD
◆ ConvertThreadToFiber()
Definition at line 179 of file fiber.c.
180{
181
183 0);
184}
LPVOID WINAPI ConvertThreadToFiberEx(_In_opt_ LPVOID lpParameter, _In_ DWORD dwFlags)
Referenced by Fbt_CreateFiber(), and init_funcs().
◆ ConvertThreadToFiberEx()
Definition at line 108 of file fiber.c.
110{
113 DPRINT1(
"Converting Thread to Fiber\n");
114
115
116 if (
dwFlags & ~FIBER_FLAG_FLOAT_SWITCH)
117 {
118
121 }
122
123
125#if (NTDDI_VERSION < NTDDI_LONGHORN)
126 if (Teb->HasFiberData)
127#else
128 if (Teb->DbgHasFiberData)
129#endif
130 {
131
134 }
135
136
138 0,
140 if (!Fiber)
141 {
142
145 }
146
147
156
157
161
162
164#if (NTDDI_VERSION < NTDDI_LONGHORN)
165 Teb->HasFiberData =
TRUE;
166#else
167 Teb->DbgHasFiberData =
TRUE;
168#endif
169
170
172}
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 191 of file fiber.c.
194{
195
197 0,
198 0,
199 lpStartAddress,
200 lpParameter);
201}
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 208 of file fiber.c.
213{
218 DPRINT(
"Creating Fiber\n");
219
220
221 if (
dwFlags & ~FIBER_FLAG_FLOAT_SWITCH)
222 {
223
226 }
227
228
229 ActivationContextStackPointer =
NULL;
230 Status = RtlAllocateActivationContextStack(&ActivationContextStackPointer);
232 {
233
236 }
237
238
240 0,
242 if (!Fiber)
243 {
244
246
247
250 }
251
252
254 dwStackCommitSize,
255 dwStackReserveSize,
256 &InitialTeb);
258 {
259
261 0,
262 Fiber);
263
264
266
267
270 }
271
272
275
276
285
286
290
291
293 lpParameter,
294 lpStartAddress,
296 2);
297
298
299 return Fiber;
300}
#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 307 of file fiber.c.
308{
312
313
316
317#if (NTDDI_VERSION < NTDDI_LONGHORN)
318 if ((Teb->HasFiberData) &&
320#else
321 if ((Teb->DbgHasFiberData) &&
323#endif
324 {
325
327 }
328
329
335
336
338
339
341
342
344 0,
345 lpFiber);
346}
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 368 of file fiber.c.
369{
370#if (DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA)
373
376 {
379 }
380
381 return dwFlsIndex;
382#else
386
388
390
394 {
397 }
398 else
399 {
402 {
403 if (!pFlsData &&
405 {
409 }
410 else
411 {
413 {
416 }
417
420
423 }
424 }
425 else
426 {
428 }
429 }
431 return dwFlsIndex;
432#endif
433}
#define RtlFindClearBitsAndSet
#define ERROR_NO_MORE_ITEMS
#define InsertTailList(ListHead, Entry)
#define FLS_OUT_OF_INDEXES
NTSYSAPI NTSTATUS WINAPI RtlFlsAlloc(PFLS_CALLBACK_FUNCTION, ULONG *)
#define FLS_MAXIMUM_AVAILABLE
Referenced by __acrt_FlsAlloc(), fls_exit_deadlock_child(), init_funcs(), and START_TEST().
◆ FlsFree()
Definition at line 441 of file fiber.c.
442{
443#if (DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA)
447 {
450 }
451
453#else
456
458 {
461 }
462
464
466 {
469 {
472
475
477 {
479
481 if (pFlsData->
Data[dwFlsIndex])
482 {
483 if (lpCallback)
484 {
485 lpCallback(pFlsData->
Data[dwFlsIndex]);
486 }
488 }
489 }
491 }
492 else
493 {
495 }
496 }
498 {
500 }
502
504#endif
505}
struct _LIST_ENTRY * Flink
#define CONTAINING_RECORD(address, type, field)
NTSYSAPI NTSTATUS WINAPI RtlFlsFree(ULONG)
Referenced by __acrt_FlsFree(), init_funcs(), and Test_RtlFlsGetSetValue().
◆ FlsGetValue()
◆ FlsSetValue()
◆ IsThreadAFiber()
Definition at line 353 of file fiber.c.
354{
355
356#if (NTDDI_VERSION < NTDDI_LONGHORN)
358#else
360#endif
361}