win32u: Implement NtUserBuildHimcList syscall.

This commit is contained in:
Rémi Bernon 2023-03-17 14:54:25 +01:00 committed by Alexandre Julliard
parent 7297a8e69c
commit ac95a5d483
2 changed files with 22 additions and 18 deletions

View file

@ -400,8 +400,25 @@ void cleanup_imm_thread(void)
*/
NTSTATUS WINAPI NtUserBuildHimcList( UINT thread_id, UINT count, HIMC *buffer, UINT *size )
{
FIXME( "thread_id %#x, count %u, buffer %p, size %p stub!\n", thread_id, count, buffer, size );
return STATUS_NOT_IMPLEMENTED;
HANDLE handle = 0;
struct imc *imc;
TRACE( "thread_id %#x, count %u, buffer %p, size %p\n", thread_id, count, buffer, size );
if (!buffer) return STATUS_UNSUCCESSFUL;
if (!thread_id) thread_id = GetCurrentThreadId();
*size = 0;
user_lock();
while (count && (imc = next_process_user_handle_ptr( &handle, NTUSER_OBJ_IMC )))
{
if (thread_id != -1 && imc->thread_id != thread_id) continue;
buffer[(*size)++] = handle;
count--;
}
user_unlock();
return STATUS_SUCCESS;
}
BOOL WINAPI DECLSPEC_HIDDEN ImmProcessKey( HWND hwnd, HKL hkl, UINT vkey, LPARAM key_data, DWORD unknown )

View file

@ -332,13 +332,11 @@ static DWORD CALLBACK test_NtUserBuildHimcList_thread( void *arg )
size = 0xdeadbeef;
memset( buf, 0xcd, sizeof(buf) );
status = NtUserBuildHimcList( GetCurrentThreadId(), ARRAYSIZE( buf ), buf, &size );
todo_wine
ok( !status, "NtUserBuildHimcList failed: %#lx\n", status );
todo_wine
ok( size == 1, "size = %u\n", size );
ok( !!buf[0], "buf[0] = %p\n", buf[0] );
todo_wine
ok( buf[0] != himc[0], "buf[0] = %p\n", buf[0] );
ok( buf[0] != himc[1], "buf[0] = %p\n", buf[0] );
himc[2] = buf[0];
@ -347,13 +345,15 @@ static DWORD CALLBACK test_NtUserBuildHimcList_thread( void *arg )
size = 0xdeadbeef;
memset( buf, 0xcd, sizeof(buf) );
status = NtUserBuildHimcList( -1, ARRAYSIZE( buf ), buf, &size );
todo_wine
ok( !status, "NtUserBuildHimcList failed: %#lx\n", status );
todo_wine
ok( size == 3, "size = %u\n", size );
qsort( buf, size, sizeof(*buf), himc_compare );
/* FIXME: Wine only lazily creates a default thread IMC */
todo_wine
ok( buf[0] == himc[0], "buf[0] = %p\n", buf[0] );
todo_wine
ok( buf[1] == himc[1], "buf[1] = %p\n", buf[1] );
todo_wine
ok( buf[2] == himc[2], "buf[2] = %p\n", buf[2] );
@ -371,9 +371,7 @@ static void test_NtUserBuildHimcList(void)
size = 0xdeadbeef;
memset( buf, 0xcd, sizeof(buf) );
status = NtUserBuildHimcList( GetCurrentThreadId(), ARRAYSIZE( buf ), buf, &size );
todo_wine
ok( !status, "NtUserBuildHimcList failed: %#lx\n", status );
todo_wine
ok( size == 1, "size = %u\n", size );
ok( !!buf[0], "buf[0] = %p\n", buf[0] );
himc[0] = buf[0];
@ -388,40 +386,31 @@ static void test_NtUserBuildHimcList(void)
size = 0xdeadbeef;
memset( buf, 0xcd, sizeof(buf) );
status = NtUserBuildHimcList( GetCurrentThreadId(), ARRAYSIZE( buf ), buf, &size );
todo_wine
ok( !status, "NtUserBuildHimcList failed: %#lx\n", status );
todo_wine
ok( size == 2, "size = %u\n", size );
qsort( buf, size, sizeof(*buf), himc_compare );
ok( buf[0] == himc[0], "buf[0] = %p\n", buf[0] );
todo_wine
ok( buf[1] == himc[1], "buf[1] = %p\n", buf[1] );
size = 0xdeadbeef;
memset( buf, 0xcd, sizeof(buf) );
status = NtUserBuildHimcList( 0, ARRAYSIZE( buf ), buf, &size );
todo_wine
ok( !status, "NtUserBuildHimcList failed: %#lx\n", status );
todo_wine
ok( size == 2, "size = %u\n", size );
qsort( buf, size, sizeof(*buf), himc_compare );
ok( buf[0] == himc[0], "buf[0] = %p\n", buf[0] );
todo_wine
ok( buf[1] == himc[1], "buf[1] = %p\n", buf[1] );
size = 0xdeadbeef;
memset( buf, 0xcd, sizeof(buf) );
status = NtUserBuildHimcList( -1, ARRAYSIZE( buf ), buf, &size );
todo_wine
ok( !status, "NtUserBuildHimcList failed: %#lx\n", status );
todo_wine
ok( size == 2, "size = %u\n", size );
qsort( buf, size, sizeof(*buf), himc_compare );
ok( buf[0] == himc[0], "buf[0] = %p\n", buf[0] );
todo_wine
ok( buf[1] == himc[1], "buf[1] = %p\n", buf[1] );
thread = CreateThread( NULL, 0, test_NtUserBuildHimcList_thread, himc, 0, NULL );
@ -439,11 +428,9 @@ static void test_NtUserBuildHimcList(void)
ok( status == STATUS_INVALID_PARAMETER, "NtUserBuildHimcList returned %#lx\n", status );
size = 0xdeadbeef;
status = NtUserBuildHimcList( GetCurrentThreadId(), 1, NULL, &size );
todo_wine
ok( status == STATUS_UNSUCCESSFUL, "NtUserBuildHimcList returned %#lx\n", status );
size = 0xdeadbeef;
status = NtUserBuildHimcList( GetCurrentThreadId(), 0, buf, &size );
todo_wine
ok( !status, "NtUserBuildHimcList failed: %#lx\n", status );
ok( size == 0, "size = %u\n", size );