win32u: Store the service table entry directly into the ntdll variable.

This commit is contained in:
Alexandre Julliard 2023-11-17 09:57:56 +01:00
parent c8ecc35966
commit 92b6ab2d6e
4 changed files with 6 additions and 36 deletions

View file

@ -919,37 +919,6 @@ static NTSTATUS dlopen_dll( const char *so_name, UNICODE_STRING *nt_name, void *
}
/***********************************************************************
* ntdll_init_syscalls
*/
NTSTATUS ntdll_init_syscalls( SYSTEM_SERVICE_TABLE *table, void **dispatcher )
{
struct syscall_info
{
void *dispatcher;
UINT version;
USHORT id;
USHORT limit;
/* USHORT names[limit]; */
/* BYTE args[limit]; */
} *info = (struct syscall_info *)dispatcher;
if (info->version != 0xca110001)
{
ERR( "invalid syscall table version %x\n", info->version );
NtTerminateProcess( GetCurrentProcess(), STATUS_INVALID_PARAMETER );
}
if (info->limit != table->ServiceLimit)
{
ERR( "syscall count mismatch %u / %lu\n", info->limit, table->ServiceLimit );
NtTerminateProcess( GetCurrentProcess(), STATUS_INVALID_PARAMETER );
}
info->dispatcher = __wine_syscall_dispatcher;
KeServiceDescriptorTable[info->id] = *table;
return STATUS_SUCCESS;
}
/***********************************************************************
* load_so_dll
*/

View file

@ -61,7 +61,7 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved )
__wine_syscall_dispatcher = *dispatcher_ptr;
if (!NtQueryVirtualMemory( GetCurrentProcess(), inst, MemoryWineUnixFuncs,
&win32u_handle, sizeof(win32u_handle), NULL ))
__wine_unix_call( win32u_handle, 0, &__wine_syscall_dispatcher );
__wine_unix_call( win32u_handle, 0, NULL );
break;
}
return TRUE;

View file

@ -58,7 +58,7 @@ static BYTE arguments[ARRAY_SIZE(syscalls)] =
#undef SYSCALL_ENTRY
};
static SYSTEM_SERVICE_TABLE syscall_table =
static const SYSTEM_SERVICE_TABLE syscall_table =
{
(ULONG_PTR *)syscalls,
0,
@ -66,7 +66,7 @@ static SYSTEM_SERVICE_TABLE syscall_table =
arguments
};
static NTSTATUS init( void *dispatcher )
static NTSTATUS init( void *args )
{
#ifdef _WIN64
if (NtCurrentTeb()->WowTebOffset)
@ -78,7 +78,8 @@ static NTSTATUS init( void *dispatcher )
}
#endif
return ntdll_init_syscalls( &syscall_table, dispatcher );
KeServiceDescriptorTable[1] = syscall_table;
return STATUS_SUCCESS;
}
const unixlib_entry_t __wine_unix_call_funcs[] =

View file

@ -31,6 +31,7 @@ typedef NTSTATUS (*unixlib_entry_t)( void *args );
extern DECLSPEC_EXPORT const unixlib_entry_t __wine_unix_call_funcs[];
extern DECLSPEC_EXPORT const unixlib_entry_t __wine_unix_call_wow64_funcs[];
extern DECLSPEC_EXPORT SYSTEM_SERVICE_TABLE KeServiceDescriptorTable[4];
/* some useful helpers from ntdll */
NTSYSAPI const char *ntdll_get_build_dir(void);
@ -39,7 +40,6 @@ NTSYSAPI DWORD ntdll_umbstowcs( const char *src, DWORD srclen, WCHAR *dst, DWORD
NTSYSAPI int ntdll_wcstoumbs( const WCHAR *src, DWORD srclen, char *dst, DWORD dstlen, BOOL strict );
NTSYSAPI int ntdll_wcsicmp( const WCHAR *str1, const WCHAR *str2 );
NTSYSAPI int ntdll_wcsnicmp( const WCHAR *str1, const WCHAR *str2, int n );
NTSYSAPI NTSTATUS ntdll_init_syscalls( SYSTEM_SERVICE_TABLE *table, void **dispatcher );
/* exception handling */