1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

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 * load_so_dll
*/ */

View file

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

View file

@ -58,7 +58,7 @@ static BYTE arguments[ARRAY_SIZE(syscalls)] =
#undef SYSCALL_ENTRY #undef SYSCALL_ENTRY
}; };
static SYSTEM_SERVICE_TABLE syscall_table = static const SYSTEM_SERVICE_TABLE syscall_table =
{ {
(ULONG_PTR *)syscalls, (ULONG_PTR *)syscalls,
0, 0,
@ -66,7 +66,7 @@ static SYSTEM_SERVICE_TABLE syscall_table =
arguments arguments
}; };
static NTSTATUS init( void *dispatcher ) static NTSTATUS init( void *args )
{ {
#ifdef _WIN64 #ifdef _WIN64
if (NtCurrentTeb()->WowTebOffset) if (NtCurrentTeb()->WowTebOffset)
@ -78,7 +78,8 @@ static NTSTATUS init( void *dispatcher )
} }
#endif #endif
return ntdll_init_syscalls( &syscall_table, dispatcher ); KeServiceDescriptorTable[1] = syscall_table;
return STATUS_SUCCESS;
} }
const unixlib_entry_t __wine_unix_call_funcs[] = 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_funcs[];
extern DECLSPEC_EXPORT const unixlib_entry_t __wine_unix_call_wow64_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 */ /* some useful helpers from ntdll */
NTSYSAPI const char *ntdll_get_build_dir(void); 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_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_wcsicmp( const WCHAR *str1, const WCHAR *str2 );
NTSYSAPI int ntdll_wcsnicmp( const WCHAR *str1, const WCHAR *str2, int n ); 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 */ /* exception handling */