+ RtlAcquirePebLock();
+
+ ppFlsSlots = NtCurrentTeb()->FlsData;
+
+ if (!Peb->FlsCallback &&
+ !(Peb->FlsCallback = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
+ FLS_MAXIMUM_AVAILABLE * sizeof(PVOID))))
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ dwFlsIndex = FLS_OUT_OF_INDEXES;
+ }
+ else
+ {
+ dwFlsIndex = RtlFindClearBitsAndSet(Peb->FlsBitmap, 1, 1);
+ if (dwFlsIndex != FLS_OUT_OF_INDEXES)
+ {
+ if (!ppFlsSlots &&
+ !(ppFlsSlots = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
+ (FLS_MAXIMUM_AVAILABLE + 2) * sizeof(PVOID))))
+ {
+ RtlClearBits(Peb->FlsBitmap, dwFlsIndex, 1);
+ dwFlsIndex = FLS_OUT_OF_INDEXES;
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ }
+ else
+ {
+ if (!NtCurrentTeb()->FlsData)
+ NtCurrentTeb()->FlsData = ppFlsSlots;
+
+ if (lpCallback)
+ DPRINT1("FlsAlloc: Got lpCallback 0x%p, UNIMPLEMENTED!", lpCallback);
+
+ ppFlsSlots[dwFlsIndex + 2] = NULL; /* clear the value */
+ Peb->FlsCallback[dwFlsIndex] = lpCallback;
+ }
+ }
+ else
+ {
+ SetLastError(ERROR_NO_MORE_ITEMS);
+ }
+ }
+ RtlReleasePebLock();
+ return dwFlsIndex;