kernelbase: Move FlsGetValue() implementation to ntdll.RtlFlsGetValue().
Signed-off-by: Paul Gofman <pgofman@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e596f4047b
commit
defcbc8b97
|
@ -40,6 +40,7 @@ static BOOL (WINAPI *pFlsSetValue)(DWORD,PVOID);
|
||||||
static NTSTATUS (WINAPI *pRtlFlsAlloc)(PFLS_CALLBACK_FUNCTION,DWORD*);
|
static NTSTATUS (WINAPI *pRtlFlsAlloc)(PFLS_CALLBACK_FUNCTION,DWORD*);
|
||||||
static NTSTATUS (WINAPI *pRtlFlsFree)(ULONG);
|
static NTSTATUS (WINAPI *pRtlFlsFree)(ULONG);
|
||||||
static NTSTATUS (WINAPI *pRtlFlsSetValue)(ULONG,void *);
|
static NTSTATUS (WINAPI *pRtlFlsSetValue)(ULONG,void *);
|
||||||
|
static NTSTATUS (WINAPI *pRtlFlsGetValue)(ULONG,void **);
|
||||||
static void *fibers[3];
|
static void *fibers[3];
|
||||||
static BYTE testparam = 185;
|
static BYTE testparam = 185;
|
||||||
static DWORD fls_index_to_set = FLS_OUT_OF_INDEXES;
|
static DWORD fls_index_to_set = FLS_OUT_OF_INDEXES;
|
||||||
|
@ -72,6 +73,7 @@ static VOID init_funcs(void)
|
||||||
X(RtlFlsAlloc);
|
X(RtlFlsAlloc);
|
||||||
X(RtlFlsFree);
|
X(RtlFlsFree);
|
||||||
X(RtlFlsSetValue);
|
X(RtlFlsSetValue);
|
||||||
|
X(RtlFlsGetValue);
|
||||||
#undef X
|
#undef X
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -205,6 +207,16 @@ static void test_FiberLocalStorage(void)
|
||||||
|
|
||||||
if (pRtlFlsAlloc)
|
if (pRtlFlsAlloc)
|
||||||
{
|
{
|
||||||
|
if (pRtlFlsGetValue)
|
||||||
|
{
|
||||||
|
status = pRtlFlsGetValue(0, NULL);
|
||||||
|
ok(status == STATUS_INVALID_PARAMETER, "Got unexpected status %#x.\n", status);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
win_skip("RtlFlsGetValue is not available.\n");
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < FLS_TEST_INDEX_COUNT; ++i)
|
for (i = 0; i < FLS_TEST_INDEX_COUNT; ++i)
|
||||||
{
|
{
|
||||||
fls_indices[i] = 0xdeadbeef;
|
fls_indices[i] = 0xdeadbeef;
|
||||||
|
@ -225,8 +237,21 @@ static void test_FiberLocalStorage(void)
|
||||||
/* FLS limits are increased since Win10 18312. */
|
/* FLS limits are increased since Win10 18312. */
|
||||||
ok(count && (count <= 127 || (count > 4000 && count < 4096)), "Got unexpected count %u.\n", count);
|
ok(count && (count <= 127 || (count > 4000 && count < 4096)), "Got unexpected count %u.\n", count);
|
||||||
|
|
||||||
|
if (0)
|
||||||
|
{
|
||||||
|
/* crashes on Windows. */
|
||||||
|
pRtlFlsGetValue(fls_indices[0], NULL);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < count; ++i)
|
for (i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
|
if (pRtlFlsGetValue)
|
||||||
|
{
|
||||||
|
status = pRtlFlsGetValue(fls_indices[i], &val);
|
||||||
|
ok(!status, "Got unexpected status %#x.\n", status);
|
||||||
|
ok(val == (void *)(ULONG_PTR)(i + 1), "Got unexpected val %p.\n", val);
|
||||||
|
}
|
||||||
|
|
||||||
status = pRtlFlsFree(fls_indices[i]);
|
status = pRtlFlsFree(fls_indices[i]);
|
||||||
ok(!status, "Got unexpected status %#x.\n", status);
|
ok(!status, "Got unexpected status %#x.\n", status);
|
||||||
}
|
}
|
||||||
|
@ -250,6 +275,14 @@ static void test_FiberLocalStorage(void)
|
||||||
ok( val == NULL,
|
ok( val == NULL,
|
||||||
"getting fls index 127 (unallocated) failed with error %u\n", GetLastError() );
|
"getting fls index 127 (unallocated) failed with error %u\n", GetLastError() );
|
||||||
|
|
||||||
|
if (pRtlFlsGetValue)
|
||||||
|
{
|
||||||
|
val = (void *)0xdeadbeef;
|
||||||
|
status = pRtlFlsGetValue(127, &val);
|
||||||
|
ok( !status, "Got unexpected status %#x.\n", status );
|
||||||
|
ok( !val, "Got unexpected val %p.\n", val );
|
||||||
|
}
|
||||||
|
|
||||||
ret = pFlsSetValue( 127, (void*) 0x217 );
|
ret = pFlsSetValue( 127, (void*) 0x217 );
|
||||||
ok( ret, "setting fls index 127 (unallocated) failed with error %u\n", GetLastError() );
|
ok( ret, "setting fls index 127 (unallocated) failed with error %u\n", GetLastError() );
|
||||||
|
|
||||||
|
@ -259,6 +292,14 @@ static void test_FiberLocalStorage(void)
|
||||||
ok( GetLastError() == ERROR_SUCCESS,
|
ok( GetLastError() == ERROR_SUCCESS,
|
||||||
"getting fls index 127 (unallocated) failed with error %u\n", GetLastError() );
|
"getting fls index 127 (unallocated) failed with error %u\n", GetLastError() );
|
||||||
|
|
||||||
|
if (pRtlFlsGetValue)
|
||||||
|
{
|
||||||
|
val = (void *)0xdeadbeef;
|
||||||
|
status = pRtlFlsGetValue(127, &val);
|
||||||
|
ok( !status, "Got unexpected status %#x.\n", status );
|
||||||
|
ok( val == (void*)0x217, "Got unexpected val %p.\n", val );
|
||||||
|
}
|
||||||
|
|
||||||
/* FlsFree, FlsGetValue, and FlsSetValue out of bounds should return
|
/* FlsFree, FlsGetValue, and FlsSetValue out of bounds should return
|
||||||
* ERROR_INVALID_PARAMETER
|
* ERROR_INVALID_PARAMETER
|
||||||
*/
|
*/
|
||||||
|
@ -283,6 +324,14 @@ static void test_FiberLocalStorage(void)
|
||||||
val = pFlsGetValue( 0 );
|
val = pFlsGetValue( 0 );
|
||||||
ok( !val, "fls index 0 set to %p\n", val );
|
ok( !val, "fls index 0 set to %p\n", val );
|
||||||
ok( GetLastError() == ERROR_INVALID_PARAMETER, "setting fls index wrong error %u\n", GetLastError() );
|
ok( GetLastError() == ERROR_INVALID_PARAMETER, "setting fls index wrong error %u\n", GetLastError() );
|
||||||
|
if (pRtlFlsGetValue)
|
||||||
|
{
|
||||||
|
val = (void *)0xdeadbeef;
|
||||||
|
status = pRtlFlsGetValue(0, &val);
|
||||||
|
ok( status == STATUS_INVALID_PARAMETER, "Got unexpected status %#x.\n", status );
|
||||||
|
ok( val == (void*)0xdeadbeef, "Got unexpected val %p.\n", val );
|
||||||
|
}
|
||||||
|
|
||||||
SetLastError( 0xdeadbeef );
|
SetLastError( 0xdeadbeef );
|
||||||
ret = pFlsSetValue( 0, (void *)0xdeadbeef );
|
ret = pFlsSetValue( 0, (void *)0xdeadbeef );
|
||||||
ok( !ret, "setting fls index 0 succeeded\n" );
|
ok( !ret, "setting fls index 0 succeeded\n" );
|
||||||
|
|
|
@ -1086,13 +1086,11 @@ BOOL WINAPI DECLSPEC_HOTPATCH FlsFree( DWORD index )
|
||||||
*/
|
*/
|
||||||
PVOID WINAPI DECLSPEC_HOTPATCH FlsGetValue( DWORD index )
|
PVOID WINAPI DECLSPEC_HOTPATCH FlsGetValue( DWORD index )
|
||||||
{
|
{
|
||||||
if (!index || index >= 8 * sizeof(NtCurrentTeb()->Peb->FlsBitmapBits) || !NtCurrentTeb()->FlsSlots)
|
void *data;
|
||||||
{
|
|
||||||
SetLastError( ERROR_INVALID_PARAMETER );
|
if (!set_ntstatus( RtlFlsGetValue( index, &data ))) return NULL;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
SetLastError( ERROR_SUCCESS );
|
SetLastError( ERROR_SUCCESS );
|
||||||
return NtCurrentTeb()->FlsSlots[index];
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -668,6 +668,7 @@
|
||||||
@ stdcall RtlFirstFreeAce(ptr ptr)
|
@ stdcall RtlFirstFreeAce(ptr ptr)
|
||||||
@ stdcall RtlFlsAlloc(ptr ptr)
|
@ stdcall RtlFlsAlloc(ptr ptr)
|
||||||
@ stdcall RtlFlsFree(long)
|
@ stdcall RtlFlsFree(long)
|
||||||
|
@ stdcall RtlFlsGetValue(long ptr)
|
||||||
@ stdcall RtlFlsSetValue(long ptr)
|
@ stdcall RtlFlsSetValue(long ptr)
|
||||||
@ stub RtlFlushPropertySet
|
@ stub RtlFlushPropertySet
|
||||||
# @ stub RtlFlushSecureMemoryCache
|
# @ stub RtlFlushSecureMemoryCache
|
||||||
|
|
|
@ -329,3 +329,17 @@ NTSTATUS WINAPI DECLSPEC_HOTPATCH RtlFlsSetValue( ULONG index, void *data )
|
||||||
NtCurrentTeb()->FlsSlots[index] = data;
|
NtCurrentTeb()->FlsSlots[index] = data;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* RtlFlsGetValue (NTDLL.@)
|
||||||
|
*/
|
||||||
|
NTSTATUS WINAPI DECLSPEC_HOTPATCH RtlFlsGetValue( ULONG index, void **data )
|
||||||
|
{
|
||||||
|
if (!index || index >= 8 * sizeof(NtCurrentTeb()->Peb->FlsBitmapBits) || !NtCurrentTeb()->FlsSlots)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
*data = NtCurrentTeb()->FlsSlots[index];
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
|
@ -3373,6 +3373,7 @@ NTSYSAPI ULONG WINAPI RtlFindSetRuns(PCRTL_BITMAP,PRTL_BITMAP_RUN,ULONG,BOOL
|
||||||
NTSYSAPI BOOLEAN WINAPI RtlFirstFreeAce(PACL,PACE_HEADER *);
|
NTSYSAPI BOOLEAN WINAPI RtlFirstFreeAce(PACL,PACE_HEADER *);
|
||||||
NTSYSAPI NTSTATUS WINAPI RtlFlsAlloc(PFLS_CALLBACK_FUNCTION,ULONG *);
|
NTSYSAPI NTSTATUS WINAPI RtlFlsAlloc(PFLS_CALLBACK_FUNCTION,ULONG *);
|
||||||
NTSYSAPI NTSTATUS WINAPI RtlFlsFree(ULONG);
|
NTSYSAPI NTSTATUS WINAPI RtlFlsFree(ULONG);
|
||||||
|
NTSYSAPI NTSTATUS WINAPI RtlFlsGetValue(ULONG,void **);
|
||||||
NTSYSAPI NTSTATUS WINAPI RtlFlsSetValue(ULONG,void *);
|
NTSYSAPI NTSTATUS WINAPI RtlFlsSetValue(ULONG,void *);
|
||||||
NTSYSAPI NTSTATUS WINAPI RtlFormatCurrentUserKeyPath(PUNICODE_STRING);
|
NTSYSAPI NTSTATUS WINAPI RtlFormatCurrentUserKeyPath(PUNICODE_STRING);
|
||||||
NTSYSAPI NTSTATUS WINAPI RtlFormatMessage(LPCWSTR,ULONG,BOOLEAN,BOOLEAN,BOOLEAN,__ms_va_list *,LPWSTR,ULONG,ULONG*);
|
NTSYSAPI NTSTATUS WINAPI RtlFormatMessage(LPCWSTR,ULONG,BOOLEAN,BOOLEAN,BOOLEAN,__ms_va_list *,LPWSTR,ULONG,ULONG*);
|
||||||
|
|
Loading…
Reference in New Issue