ReactOS 0.4.17-dev-1190-g4c812f4
fiber.c File Reference
#include <k32.h>
#include <ndk/rtltypes.h>
#include <ndk/rtlfuncs.h>
#include <debug.h>
Include dependency graph for fiber.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

VOID WINAPI BaseRundownFls (_In_ PVOID FlsData)
 
BOOL WINAPI ConvertFiberToThread (VOID)
 
LPVOID WINAPI ConvertThreadToFiberEx (_In_opt_ LPVOID lpParameter, _In_ DWORD dwFlags)
 
LPVOID WINAPI ConvertThreadToFiber (_In_opt_ LPVOID lpParameter)
 
LPVOID WINAPI CreateFiber (_In_ SIZE_T dwStackSize, _In_ LPFIBER_START_ROUTINE lpStartAddress, _In_opt_ LPVOID lpParameter)
 
LPVOID WINAPI CreateFiberEx (_In_ SIZE_T dwStackCommitSize, _In_ SIZE_T dwStackReserveSize, _In_ DWORD dwFlags, _In_ LPFIBER_START_ROUTINE lpStartAddress, _In_opt_ LPVOID lpParameter)
 
VOID WINAPI DeleteFiber (_In_ LPVOID lpFiber)
 
BOOL WINAPI IsThreadAFiber (VOID)
 
DWORD WINAPI FlsAlloc (PFLS_CALLBACK_FUNCTION lpCallback)
 
BOOL WINAPI FlsFree (DWORD dwFlsIndex)
 
PVOID WINAPI FlsGetValue (DWORD dwFlsIndex)
 
BOOL WINAPI FlsSetValue (DWORD dwFlsIndex, PVOID lpFlsData)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 14 of file fiber.c.

Function Documentation

◆ BaseRundownFls()

VOID WINAPI BaseRundownFls ( _In_ PVOID  FlsData)

Definition at line 33 of file fiber.c.

34{
35 ULONG n, FlsHighIndex;
36 PRTL_FLS_DATA pFlsData;
37 PFLS_CALLBACK_FUNCTION lpCallback;
38
39 pFlsData = FlsData;
40
42 FlsHighIndex = NtCurrentPeb()->FlsHighIndex;
43 RemoveEntryList(&pFlsData->ListEntry);
45
46 for (n = 1; n <= FlsHighIndex; ++n)
47 {
48 lpCallback = NtCurrentPeb()->FlsCallback[n];
49 if (lpCallback && pFlsData->Data[n])
50 {
51 lpCallback(pFlsData->Data[n]);
52 }
53 }
54
55 RtlFreeHeap(RtlGetProcessHeap(), 0, FlsData);
56}
#define NtCurrentPeb()
Definition: FLS.c:22
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:634
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
GLdouble n
Definition: glext.h:7729
LIST_ENTRY ListEntry
Definition: rtltypes.h:1228
PVOID Data[RTL_FLS_MAXIMUM_AVAILABLE]
Definition: rtltypes.h:1229
uint32_t ULONG
Definition: typedefs.h:59
VOID(WINAPI * PFLS_CALLBACK_FUNCTION)(PVOID)
Definition: winbase.h:1178
NTSYSAPI void WINAPI RtlReleasePebLock(void)
Definition: libsupp.c:95
NTSYSAPI void WINAPI RtlAcquirePebLock(void)
Definition: libsupp.c:85

Referenced by DeleteFiber().

◆ ConvertFiberToThread()

BOOL WINAPI ConvertFiberToThread ( VOID  )

Definition at line 65 of file fiber.c.

66{
67 PTEB Teb;
69 DPRINT1("Converting Fiber to Thread\n");
70
71 /* Check if the thread is already not a fiber */
72 Teb = NtCurrentTeb();
73#if (NTDDI_VERSION < NTDDI_LONGHORN)
74 if (!Teb->HasFiberData)
75#else
76 if (!Teb->DbgHasFiberData)
77#endif
78 {
79 /* Fail */
81 return FALSE;
82 }
83
84 /* This thread won't run a fiber anymore */
85#if (NTDDI_VERSION < NTDDI_LONGHORN)
86 Teb->HasFiberData = FALSE;
87#else
88 Teb->DbgHasFiberData = FALSE;
89#endif
91 Teb->NtTib.FiberData = NULL;
92
93 /* Free the fiber */
95 RtlFreeHeap(RtlGetProcessHeap(),
96 0,
97 FiberData);
98
99 /* Success */
100 return TRUE;
101}
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define SetLastError(x)
Definition: compat.h:752
#define NtCurrentTeb
#define ASSERT(a)
Definition: mode.c:44
PVOID FiberData
Definition: compat.h:716
Definition: compat.h:836
NT_TIB NtTib
Definition: ntddk_ex.h:332
#define ERROR_ALREADY_THREAD
Definition: winerror.h:1108

◆ ConvertThreadToFiber()

LPVOID WINAPI ConvertThreadToFiber ( _In_opt_ LPVOID  lpParameter)

Definition at line 179 of file fiber.c.

180{
181 /* Call the newer function */
182 return ConvertThreadToFiberEx(lpParameter,
183 0);
184}
LPVOID WINAPI ConvertThreadToFiberEx(_In_opt_ LPVOID lpParameter, _In_ DWORD dwFlags)
Definition: fiber.c:108

Referenced by Fbt_CreateFiber(), and init_funcs().

◆ ConvertThreadToFiberEx()

LPVOID WINAPI ConvertThreadToFiberEx ( _In_opt_ LPVOID  lpParameter,
_In_ DWORD  dwFlags 
)

Definition at line 108 of file fiber.c.

110{
111 PTEB Teb;
112 PFIBER Fiber;
113 DPRINT1("Converting Thread to Fiber\n");
114
115 /* Check for invalid flags */
116 if (dwFlags & ~FIBER_FLAG_FLOAT_SWITCH)
117 {
118 /* Fail */
120 return NULL;
121 }
122
123 /* Are we already a fiber? */
124 Teb = NtCurrentTeb();
125#if (NTDDI_VERSION < NTDDI_LONGHORN)
126 if (Teb->HasFiberData)
127#else
128 if (Teb->DbgHasFiberData)
129#endif
130 {
131 /* Fail */
133 return NULL;
134 }
135
136 /* Allocate the fiber */
137 Fiber = RtlAllocateHeap(RtlGetProcessHeap(),
138 0,
139 sizeof(FIBER));
140 if (!Fiber)
141 {
142 /* Fail */
144 return NULL;
145 }
146
147 /* Copy some contextual data from the thread to the fiber */
148 Fiber->FiberData = lpParameter;
149 Fiber->ExceptionList = Teb->NtTib.ExceptionList;
150 Fiber->StackBase = Teb->NtTib.StackBase;
151 Fiber->StackLimit = Teb->NtTib.StackLimit;
153 Fiber->FlsData = Teb->FlsData;
156
157 /* Save FPU State if requested, otherwise just the basic registers */
158 Fiber->FiberContext.ContextFlags = (dwFlags & FIBER_FLAG_FLOAT_SWITCH) ?
161
162 /* Associate the fiber to the current thread */
163 Teb->NtTib.FiberData = Fiber;
164#if (NTDDI_VERSION < NTDDI_LONGHORN)
165 Teb->HasFiberData = TRUE;
166#else
167 Teb->DbgHasFiberData = TRUE;
168#endif
169
170 /* Return opaque fiber data */
171 return (LPVOID)Fiber;
172}
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define CONTEXT_FLOATING_POINT
Definition: nt_native.h:1375
#define CONTEXT_FULL
Definition: nt_native.h:1378
ULONG ContextFlags
Definition: nt_native.h:1429
PVOID StackLimit
Definition: ketypes.h:146
CONTEXT FiberContext
Definition: ketypes.h:148
PVOID DeallocationStack
Definition: ketypes.h:147
ULONG GuaranteedStackBytes
Definition: ketypes.h:153
PVOID StackBase
Definition: ketypes.h:145
struct _ACTIVATION_CONTEXT_STACK * ActivationContextStackPointer
Definition: ketypes.h:151
struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList
Definition: ketypes.h:144
PVOID FiberData
Definition: ketypes.h:143
PVOID FlsData
Definition: ketypes.h:152
PVOID StackLimit
Definition: compat.h:713
PVOID StackBase
Definition: compat.h:712
struct _EXCEPTION_REGISTRATION_RECORD * ExceptionList
Definition: compat.h:711
PVOID ActivationContextStackPointer
Definition: compat.h:854
ULONG GuaranteedStackBytes
Definition: winternl.h:668
PVOID DeallocationStack
Definition: compat.h:878
#define ERROR_ALREADY_FIBER
Definition: winerror.h:1107

Referenced by ConvertThreadToFiber(), and init_funcs().

◆ CreateFiber()

LPVOID WINAPI CreateFiber ( _In_ SIZE_T  dwStackSize,
_In_ LPFIBER_START_ROUTINE  lpStartAddress,
_In_opt_ LPVOID  lpParameter 
)

Definition at line 191 of file fiber.c.

194{
195 /* Call the Newer Function */
196 return CreateFiberEx(dwStackSize,
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)
Definition: fiber.c:208

Referenced by Fbt_CreateFiber(), and init_funcs().

◆ CreateFiberEx()

LPVOID WINAPI CreateFiberEx ( _In_ SIZE_T  dwStackCommitSize,
_In_ SIZE_T  dwStackReserveSize,
_In_ DWORD  dwFlags,
_In_ LPFIBER_START_ROUTINE  lpStartAddress,
_In_opt_ LPVOID  lpParameter 
)

Definition at line 208 of file fiber.c.

213{
214 PFIBER Fiber;
216 INITIAL_TEB InitialTeb;
217 PACTIVATION_CONTEXT_STACK ActivationContextStackPointer;
218 DPRINT("Creating Fiber\n");
219
220 /* Check for invalid flags */
221 if (dwFlags & ~FIBER_FLAG_FLOAT_SWITCH)
222 {
223 /* Fail */
225 return NULL;
226 }
227
228 /* Allocate the Activation Context Stack */
229 ActivationContextStackPointer = NULL;
230 Status = RtlAllocateActivationContextStack(&ActivationContextStackPointer);
231 if (!NT_SUCCESS(Status))
232 {
233 /* Fail */
235 return NULL;
236 }
237
238 /* Allocate the fiber */
239 Fiber = RtlAllocateHeap(RtlGetProcessHeap(),
240 0,
241 sizeof(FIBER));
242 if (!Fiber)
243 {
244 /* Free the activation context stack */
245 RtlFreeActivationContextStack(ActivationContextStackPointer);
246
247 /* Fail */
249 return NULL;
250 }
251
252 /* Create the stack for the fiber */
254 dwStackCommitSize,
255 dwStackReserveSize,
256 &InitialTeb);
257 if (!NT_SUCCESS(Status))
258 {
259 /* Free the fiber */
261 0,
262 Fiber);
263
264 /* Free the activation context stack */
265 RtlFreeActivationContextStack(ActivationContextStackPointer);
266
267 /* Failure */
269 return NULL;
270 }
271
272 /* Clear the context */
274 sizeof(CONTEXT));
275
276 /* Copy the data into the fiber */
277 Fiber->StackBase = InitialTeb.StackBase;
278 Fiber->StackLimit = InitialTeb.StackLimit;
279 Fiber->DeallocationStack = InitialTeb.AllocatedStackBase;
280 Fiber->FiberData = lpParameter;
282 Fiber->GuaranteedStackBytes = 0;
283 Fiber->FlsData = NULL;
284 Fiber->ActivationContextStackPointer = ActivationContextStackPointer;
285
286 /* Save FPU State if requested, otherwise just the basic registers */
287 Fiber->FiberContext.ContextFlags = (dwFlags & FIBER_FLAG_FLOAT_SWITCH) ?
290
291 /* Initialize the context for the fiber */
293 lpParameter,
294 lpStartAddress,
295 InitialTeb.StackBase,
296 2);
297
298 /* Return the Fiber */
299 return Fiber;
300}
LONG NTSTATUS
Definition: precomp.h:26
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define GetProcessHeap()
Definition: compat.h:736
NTSTATUS WINAPI BaseCreateStack(_In_ HANDLE hProcess, _In_opt_ SIZE_T StackCommit, _In_opt_ SIZE_T StackReserve, _Out_ PINITIAL_TEB InitialTeb)
Definition: utils.c:381
VOID WINAPI BaseInitializeContext(IN PCONTEXT Context, IN PVOID Parameter, IN PVOID StartAddress, IN PVOID StackAddress, IN ULONG ContextType)
Definition: utils.c:540
Status
Definition: gdiplustypes.h:24
#define EXCEPTION_CHAIN_END
Definition: rtltypes.h:63
#define NtCurrentProcess()
Definition: nt_native.h:1660
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:167
#define DPRINT
Definition: sndvol32.h:73
PVOID StackBase
Definition: pstypes.h:757
PVOID AllocatedStackBase
Definition: pstypes.h:759
PVOID StackLimit
Definition: pstypes.h:758
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
NTSYSAPI void WINAPI RtlFreeActivationContextStack(ACTIVATION_CONTEXT_STACK *)
Definition: actctx.c:5774

Referenced by CreateFiber(), and init_funcs().

◆ DeleteFiber()

VOID WINAPI DeleteFiber ( _In_ LPVOID  lpFiber)

Definition at line 307 of file fiber.c.

308{
309 SIZE_T Size;
310 PFIBER Fiber;
311 PTEB Teb;
312
313 /* Are we deleting ourselves? */
314 Teb = NtCurrentTeb();
315 Fiber = (PFIBER)lpFiber;
316
317#if (NTDDI_VERSION < NTDDI_LONGHORN)
318 if ((Teb->HasFiberData) &&
319 (Teb->NtTib.FiberData == Fiber))
320#else
321 if ((Teb->DbgHasFiberData) &&
322 (Teb->NtTib.FiberData == Fiber))
323#endif
324 {
325 /* Just exit */
326 ExitThread(1);
327 }
328
329 /* Not ourselves, de-allocate the stack */
330 Size = 0 ;
332 &Fiber->DeallocationStack,
333 &Size,
335
336 /* Get rid of FLS */
337 if (Fiber->FlsData) BaseRundownFls(Fiber->FlsData);
338
339 /* Get rid of the activation context stack */
341
342 /* Free the fiber data */
343 RtlFreeHeap(RtlGetProcessHeap(),
344 0,
345 lpFiber);
346}
VOID WINAPI BaseRundownFls(_In_ PVOID FlsData)
Definition: fiber.c:33
VOID WINAPI ExitThread(IN DWORD uExitCode)
Definition: thread.c:367
struct _FIBER * PFIBER
#define MEM_RELEASE
Definition: nt_native.h:1319
NTSTATUS NTAPI NtFreeVirtualMemory(IN HANDLE ProcessHandle, IN PVOID *UBaseAddress, IN PSIZE_T URegionSize, IN ULONG FreeType)
Definition: virtual.c:5192
ULONG_PTR SIZE_T
Definition: typedefs.h:80
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539

Referenced by Fbt_AfterSwitch(), Fbt_Dispatch(), init_funcs(), subtest_fiber_actctx_preservation(), and subtest_fiber_actctx_switch().

◆ FlsAlloc()

DWORD WINAPI FlsAlloc ( PFLS_CALLBACK_FUNCTION  lpCallback)

Definition at line 368 of file fiber.c.

369{
370#if (DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA)
372 DWORD dwFlsIndex;
373
374 Status = RtlFlsAlloc(lpCallback, &dwFlsIndex);
375 if (!NT_SUCCESS(Status))
376 {
378 return FLS_OUT_OF_INDEXES;
379 }
380
381 return dwFlsIndex;
382#else
383 DWORD dwFlsIndex;
385 PRTL_FLS_DATA pFlsData;
386
388
389 pFlsData = NtCurrentTeb()->FlsData;
390
391 if (!Peb->FlsCallback &&
392 !(Peb->FlsCallback = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
393 FLS_MAXIMUM_AVAILABLE * sizeof(PVOID))))
394 {
396 dwFlsIndex = FLS_OUT_OF_INDEXES;
397 }
398 else
399 {
400 dwFlsIndex = RtlFindClearBitsAndSet(Peb->FlsBitmap, 1, 1);
401 if (dwFlsIndex != FLS_OUT_OF_INDEXES)
402 {
403 if (!pFlsData &&
404 !(pFlsData = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(RTL_FLS_DATA))))
405 {
406 RtlClearBits(Peb->FlsBitmap, dwFlsIndex, 1);
407 dwFlsIndex = FLS_OUT_OF_INDEXES;
409 }
410 else
411 {
412 if (!NtCurrentTeb()->FlsData)
413 {
414 NtCurrentTeb()->FlsData = pFlsData;
416 }
417
418 pFlsData->Data[dwFlsIndex] = NULL; /* clear the value */
419 Peb->FlsCallback[dwFlsIndex] = lpCallback;
420
421 if (dwFlsIndex > Peb->FlsHighIndex)
422 Peb->FlsHighIndex = dwFlsIndex;
423 }
424 }
425 else
426 {
428 }
429 }
431 return dwFlsIndex;
432#endif
433}
#define RtlClearBits
Definition: dbgbitmap.h:331
#define RtlFindClearBitsAndSet
Definition: dbgbitmap.h:333
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
PPEB Peb
Definition: dllmain.c:27
#define InsertTailList(ListHead, Entry)
unsigned long DWORD
Definition: ntddk_ex.h:95
PVOID * FlsCallback
Definition: winternl.h:551
LIST_ENTRY FlsListHead
Definition: winternl.h:552
PRTL_BITMAP FlsBitmap
Definition: winternl.h:555
ULONG FlsHighIndex
Definition: winternl.h:561
#define FLS_OUT_OF_INDEXES
Definition: winbase.h:556
NTSYSAPI NTSTATUS WINAPI RtlFlsAlloc(PFLS_CALLBACK_FUNCTION, ULONG *)
#define FLS_MAXIMUM_AVAILABLE
Definition: winnt_old.h:1141

Referenced by __acrt_FlsAlloc(), fls_exit_deadlock_child(), init_funcs(), and START_TEST().

◆ FlsFree()

BOOL WINAPI FlsFree ( DWORD  dwFlsIndex)

Definition at line 441 of file fiber.c.

442{
443#if (DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA)
445 Status = RtlFlsFree(dwFlsIndex);
446 if (!NT_SUCCESS(Status))
447 {
449 return FALSE;
450 }
451
452 return TRUE;
453#else
454 BOOL ret;
456
457 if (dwFlsIndex >= FLS_MAXIMUM_AVAILABLE)
458 {
460 return FALSE;
461 }
462
464
466 {
467 ret = RtlAreBitsSet(Peb->FlsBitmap, dwFlsIndex, 1);
468 if (ret)
469 {
471 PFLS_CALLBACK_FUNCTION lpCallback;
472
473 RtlClearBits(Peb->FlsBitmap, dwFlsIndex, 1);
474 lpCallback = Peb->FlsCallback[dwFlsIndex];
475
476 for (Entry = Peb->FlsListHead.Flink; Entry != &Peb->FlsListHead; Entry = Entry->Flink)
477 {
478 PRTL_FLS_DATA pFlsData;
479
480 pFlsData = CONTAINING_RECORD(Entry, RTL_FLS_DATA, ListEntry);
481 if (pFlsData->Data[dwFlsIndex])
482 {
483 if (lpCallback)
484 {
485 lpCallback(pFlsData->Data[dwFlsIndex]);
486 }
487 pFlsData->Data[dwFlsIndex] = NULL;
488 }
489 }
490 Peb->FlsCallback[dwFlsIndex] = NULL;
491 }
492 else
493 {
495 }
496 }
498 {
500 }
501 _SEH2_END;
502
503 return ret;
504#endif
505}
#define RtlAreBitsSet
Definition: dbgbitmap.h:328
return ret
Definition: mutex.c:147
unsigned int BOOL
Definition: ntddk_ex.h:94
#define _SEH2_FINALLY
Definition: pseh2_64.h:153
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
Entry
Definition: section.c:5216
Definition: typedefs.h:120
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
NTSYSAPI NTSTATUS WINAPI RtlFlsFree(ULONG)

Referenced by __acrt_FlsFree(), init_funcs(), and Test_RtlFlsGetSetValue().

◆ FlsGetValue()

PVOID WINAPI FlsGetValue ( DWORD  dwFlsIndex)

Definition at line 513 of file fiber.c.

514{
515 PRTL_FLS_DATA pFlsData;
516
517 pFlsData = NtCurrentTeb()->FlsData;
518 if (!dwFlsIndex || dwFlsIndex >= FLS_MAXIMUM_AVAILABLE || !pFlsData)
519 {
521 return NULL;
522 }
523
525 return pFlsData->Data[dwFlsIndex];
526}
#define ERROR_SUCCESS
Definition: deptool.c:10

Referenced by __acrt_FlsGetValue(), init_funcs(), START_TEST(), and Test_RtlFlsGetSetValue().

◆ FlsSetValue()

BOOL WINAPI FlsSetValue ( DWORD  dwFlsIndex,
PVOID  lpFlsData 
)

Definition at line 534 of file fiber.c.

536{
537 PRTL_FLS_DATA pFlsData;
538
539 if (!dwFlsIndex || dwFlsIndex >= FLS_MAXIMUM_AVAILABLE)
540 {
542 return FALSE;
543 }
544
545 pFlsData = NtCurrentTeb()->FlsData;
546
547 if (!NtCurrentTeb()->FlsData &&
548 !(NtCurrentTeb()->FlsData = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
549 sizeof(RTL_FLS_DATA))))
550 {
552 return FALSE;
553 }
554 if (!pFlsData)
555 {
556 pFlsData = NtCurrentTeb()->FlsData;
558 InsertTailList(&NtCurrentPeb()->FlsListHead, &pFlsData->ListEntry);
560 }
561 pFlsData->Data[dwFlsIndex] = lpFlsData;
562 return TRUE;
563}

Referenced by __acrt_FlsSetValue(), fls_exit_deadlock_child(), fls_exit_deadlock_thread(), init_funcs(), START_TEST(), Test_RtlFlsAllocFree(), and Test_RtlFlsGetSetValue().

◆ IsThreadAFiber()

BOOL WINAPI IsThreadAFiber ( VOID  )

Definition at line 353 of file fiber.c.

354{
355 /* Return flag in the TEB */
356#if (NTDDI_VERSION < NTDDI_LONGHORN)
357 return NtCurrentTeb()->HasFiberData;
358#else
359 return NtCurrentTeb()->DbgHasFiberData;
360#endif
361}