ntdll: Implement RtlSetUserFlagsHeap.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53741
This commit is contained in:
Rémi Bernon 2022-10-13 17:03:08 +02:00 committed by Alexandre Julliard
parent bba4fa0fbb
commit fe3c5e93e2
2 changed files with 28 additions and 7 deletions

View file

@ -2361,15 +2361,12 @@ static void test_block_layout( HANDLE heap, DWORD global_flags, DWORD heap_flags
SetLastError( 0xdeadbeef );
ret = pRtlSetUserFlagsHeap( heap, 0, ptr0, 0, 0x1000 );
ok( !ret, "RtlSetUserFlagsHeap succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() );
SetLastError( 0xdeadbeef );
ret = pRtlSetUserFlagsHeap( heap, 0, ptr0, 0x100, 0 );
ok( !ret, "RtlSetUserFlagsHeap succeeded\n" );
todo_wine
ok( GetLastError() == ERROR_INVALID_PARAMETER, "got error %lu\n", GetLastError() );
ret = pRtlSetUserFlagsHeap( heap, 0, ptr0, 0x400, 0x200 );
todo_wine
ok( ret, "RtlSetUserFlagsHeap failed, error %lu\n", GetLastError() );
tmp_ptr = NULL;
@ -2377,7 +2374,6 @@ static void test_block_layout( HANDLE heap, DWORD global_flags, DWORD heap_flags
ret = pRtlGetUserInfoHeap( heap, 0, ptr0, (void **)&tmp_ptr, &tmp_flags );
ok( ret, "RtlGetUserInfoHeap failed, error %lu\n", GetLastError() );
ok( tmp_ptr == (void *)0xdeadbeef, "got ptr %p\n", tmp_ptr );
todo_wine
ok( tmp_flags == 0xa00 || broken(tmp_flags == 0xc00) /* w1064v1507 */,
"got flags %#lx\n", tmp_flags );
@ -2391,7 +2387,6 @@ static void test_block_layout( HANDLE heap, DWORD global_flags, DWORD heap_flags
ret = pRtlGetUserInfoHeap( heap, 0, ptr0, (void **)&tmp_ptr, &tmp_flags );
ok( ret, "RtlGetUserInfoHeap failed, error %lu\n", GetLastError() );
ok( tmp_ptr == (void *)0xdeadbee0, "got ptr %p\n", tmp_ptr );
todo_wine
ok( tmp_flags == 0xa00 || broken(tmp_flags == 0xc00) /* w1064v1507 */,
"got flags %#lx\n", tmp_flags );

View file

@ -2093,6 +2093,32 @@ BOOLEAN WINAPI RtlSetUserValueHeap( HANDLE handle, ULONG flags, void *ptr, void
*/
BOOLEAN WINAPI RtlSetUserFlagsHeap( HANDLE handle, ULONG flags, void *ptr, ULONG clear, ULONG set )
{
FIXME( "handle %p, flags %#x, ptr %p, clear %#x, set %#x stub!\n", handle, flags, ptr, clear, set );
return FALSE;
struct block *block;
BOOLEAN ret = FALSE;
struct heap *heap;
SUBHEAP *subheap;
TRACE( "handle %p, flags %#x, ptr %p, clear %#x, set %#x.\n", handle, flags, ptr, clear, set );
if ((clear | set) & ~(0xe00))
{
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
if (!(heap = unsafe_heap_from_handle( handle ))) return TRUE;
heap_lock( heap, flags );
if (!(block = unsafe_block_from_ptr( heap, ptr, &subheap )))
WARN( "Failed to find block %p in heap %p\n", ptr, handle );
else if (!(block_get_flags( block ) & BLOCK_FLAG_USER_INFO))
WARN( "Block %p wasn't allocated with user info\n", ptr );
else
{
block_set_flags( block, BLOCK_USER_FLAGS( clear ), BLOCK_USER_FLAGS( set ) );
ret = TRUE;
}
heap_unlock( heap, flags );
return ret;
}