mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 08:25:03 +00:00
[KERNEL32] Implement FlsAlloc/FlsFree based on Wine's implementation.
This commit is contained in:
parent
75e80632d1
commit
ac620c2e8e
4 changed files with 105 additions and 67 deletions
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
# This file is autogenerated by update.py
|
# This file is autogenerated by update.py
|
||||||
|
|
||||||
@ stub FlsAlloc
|
@ stdcall FlsAlloc() kernel32.FlsAlloc
|
||||||
@ stub FlsFree
|
@ stdcall FlsFree() kernel32.FlsFree
|
||||||
@ stub FlsGetValue
|
@ stdcall FlsGetValue() kernel32.FlsGetValue
|
||||||
@ stub FlsSetValue
|
@ stdcall FlsSetValue() kernel32.FlsSetValue
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
|
|
||||||
# This file is autogenerated by update.py
|
# This file is autogenerated by update.py
|
||||||
|
|
||||||
@ stub FlsAlloc
|
@ stdcall FlsAlloc() kernel32.FlsAlloc
|
||||||
@ stub FlsFree
|
@ stdcall FlsFree() kernel32.FlsFree
|
||||||
@ stub FlsGetValue
|
@ stdcall FlsGetValue() kernel32.FlsGetValue
|
||||||
@ stub FlsSetValue
|
@ stdcall FlsSetValue() kernel32.FlsSetValue
|
||||||
@ stub IsThreadAFiber
|
@ stub IsThreadAFiber
|
||||||
|
|
|
@ -312,32 +312,97 @@ IsThreadAFiber(VOID)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
DWORD
|
DWORD
|
||||||
WINAPI
|
WINAPI
|
||||||
FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback)
|
FlsAlloc(PFLS_CALLBACK_FUNCTION lpCallback)
|
||||||
{
|
{
|
||||||
(void)lpCallback;
|
DWORD dwFlsIndex;
|
||||||
|
PPEB Peb = NtCurrentPeb();
|
||||||
|
PVOID *ppFlsSlots;
|
||||||
|
|
||||||
UNIMPLEMENTED;
|
RtlAcquirePebLock();
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return FLS_OUT_OF_INDEXES;
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
BOOL
|
BOOL
|
||||||
WINAPI
|
WINAPI
|
||||||
FlsFree(DWORD dwFlsIndex)
|
FlsFree(DWORD dwFlsIndex)
|
||||||
{
|
{
|
||||||
(void)dwFlsIndex;
|
BOOL ret;
|
||||||
|
PPEB Peb = NtCurrentPeb();
|
||||||
|
PVOID *ppFlsSlots;
|
||||||
|
|
||||||
UNIMPLEMENTED;
|
if (dwFlsIndex >= FLS_MAXIMUM_AVAILABLE)
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
{
|
||||||
return FALSE;
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlAcquirePebLock();
|
||||||
|
|
||||||
|
ppFlsSlots = NtCurrentTeb()->FlsData;
|
||||||
|
ret = RtlAreBitsSet(Peb->FlsBitmap, dwFlsIndex, 1);
|
||||||
|
if (ret)
|
||||||
|
{
|
||||||
|
RtlClearBits(Peb->FlsBitmap, dwFlsIndex, 1);
|
||||||
|
/* FIXME: call Fls callback */
|
||||||
|
/* FIXME: add equivalent of ThreadZeroTlsCell here */
|
||||||
|
if (ppFlsSlots)
|
||||||
|
ppFlsSlots[dwFlsIndex + 2] = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
RtlReleasePebLock();
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -349,22 +414,16 @@ WINAPI
|
||||||
FlsGetValue(DWORD dwFlsIndex)
|
FlsGetValue(DWORD dwFlsIndex)
|
||||||
{
|
{
|
||||||
PVOID *ppFlsSlots;
|
PVOID *ppFlsSlots;
|
||||||
PVOID pRetVal;
|
|
||||||
|
|
||||||
if(dwFlsIndex >= 128) goto l_InvalidParam;
|
|
||||||
|
|
||||||
ppFlsSlots = NtCurrentTeb()->FlsData;
|
ppFlsSlots = NtCurrentTeb()->FlsData;
|
||||||
|
if (!dwFlsIndex || dwFlsIndex >= FLS_MAXIMUM_AVAILABLE || !ppFlsSlots)
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if(ppFlsSlots == NULL) goto l_InvalidParam;
|
SetLastError(ERROR_SUCCESS);
|
||||||
|
return ppFlsSlots[dwFlsIndex + 2];
|
||||||
SetLastError(0);
|
|
||||||
pRetVal = ppFlsSlots[dwFlsIndex + 2];
|
|
||||||
|
|
||||||
return pRetVal;
|
|
||||||
|
|
||||||
l_InvalidParam:
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -377,43 +436,22 @@ FlsSetValue(DWORD dwFlsIndex,
|
||||||
PVOID lpFlsData)
|
PVOID lpFlsData)
|
||||||
{
|
{
|
||||||
PVOID *ppFlsSlots;
|
PVOID *ppFlsSlots;
|
||||||
TEB *pTeb = NtCurrentTeb();
|
|
||||||
|
|
||||||
if(dwFlsIndex >= 128) goto l_InvalidParam;
|
if (!dwFlsIndex || dwFlsIndex >= FLS_MAXIMUM_AVAILABLE)
|
||||||
|
|
||||||
ppFlsSlots = pTeb->FlsData;
|
|
||||||
|
|
||||||
if (ppFlsSlots == NULL)
|
|
||||||
{
|
{
|
||||||
PEB *pPeb = pTeb->ProcessEnvironmentBlock;
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
ppFlsSlots = RtlAllocateHeap(pPeb->ProcessHeap,
|
|
||||||
HEAP_ZERO_MEMORY,
|
|
||||||
(128 + 2) * sizeof(PVOID));
|
|
||||||
if(ppFlsSlots == NULL) goto l_OutOfMemory;
|
|
||||||
|
|
||||||
pTeb->FlsData = ppFlsSlots;
|
|
||||||
|
|
||||||
RtlAcquirePebLock();
|
|
||||||
|
|
||||||
/* TODO: initialization */
|
|
||||||
|
|
||||||
RtlReleasePebLock();
|
|
||||||
}
|
}
|
||||||
|
if (!NtCurrentTeb()->FlsData &&
|
||||||
|
!(NtCurrentTeb()->FlsData = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY,
|
||||||
|
(FLS_MAXIMUM_AVAILABLE + 2) * sizeof(PVOID))))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
ppFlsSlots = NtCurrentTeb()->FlsData;
|
||||||
ppFlsSlots[dwFlsIndex + 2] = lpFlsData;
|
ppFlsSlots[dwFlsIndex + 2] = lpFlsData;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
l_OutOfMemory:
|
|
||||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
|
||||||
goto l_Fail;
|
|
||||||
|
|
||||||
l_InvalidParam:
|
|
||||||
SetLastError(ERROR_INVALID_PARAMETER);
|
|
||||||
|
|
||||||
l_Fail:
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -235,10 +235,10 @@
|
||||||
231 stdcall FindResourceW(long wstr wstr)
|
231 stdcall FindResourceW(long wstr wstr)
|
||||||
232 stdcall FindVolumeClose(ptr)
|
232 stdcall FindVolumeClose(ptr)
|
||||||
233 stdcall FindVolumeMountPointClose(ptr)
|
233 stdcall FindVolumeMountPointClose(ptr)
|
||||||
;234 stdcall FlsAlloc(ptr)
|
234 stdcall FlsAlloc(ptr)
|
||||||
;235 stdcall FlsFree(long)
|
235 stdcall FlsFree(long)
|
||||||
;236 stdcall FlsGetValue(long)
|
236 stdcall FlsGetValue(long)
|
||||||
;237 stdcall FlsSetValue(long ptr)
|
237 stdcall FlsSetValue(long ptr)
|
||||||
238 stdcall FlushConsoleInputBuffer(long)
|
238 stdcall FlushConsoleInputBuffer(long)
|
||||||
239 stdcall FlushFileBuffers(long)
|
239 stdcall FlushFileBuffers(long)
|
||||||
240 stdcall FlushInstructionCache(long long long)
|
240 stdcall FlushInstructionCache(long long long)
|
||||||
|
|
Loading…
Reference in a new issue