diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 266d53f0eca..b15824346b7 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -116,13 +116,248 @@ SYSTEM_DLL_INIT_BLOCK *pLdrSystemDllInitBlock = NULL; static NTSTATUS (CDECL *p__wine_set_unix_funcs)( int version, const struct unix_funcs *funcs ); static void *p__wine_syscall_dispatcher; -extern SYSTEM_SERVICE_TABLE __wine_syscall_table DECLSPEC_HIDDEN; +static void * const syscalls[] = +{ + NtAcceptConnectPort, + NtAccessCheck, + NtAccessCheckAndAuditAlarm, + NtAddAtom, + NtAdjustGroupsToken, + NtAdjustPrivilegesToken, + NtAlertResumeThread, + NtAlertThread, + NtAllocateLocallyUniqueId, + NtAllocateUuids, + NtAllocateVirtualMemory, + NtAllocateVirtualMemoryEx, + NtAreMappedFilesTheSame, + NtAssignProcessToJobObject, + NtCallbackReturn, + NtCancelIoFile, + NtCancelIoFileEx, + NtCancelTimer, + NtClearEvent, + NtClearPowerRequest, + NtClose, + NtCompleteConnectPort, + NtConnectPort, + NtContinue, + NtCreateDebugObject, + NtCreateDirectoryObject, + NtCreateEvent, + NtCreateFile, + NtCreateIoCompletion, + NtCreateJobObject, + NtCreateKey, + NtCreateKeyTransacted, + NtCreateKeyedEvent, + NtCreateLowBoxToken, + NtCreateMailslotFile, + NtCreateMutant, + NtCreateNamedPipeFile, + NtCreatePagingFile, + NtCreatePort, + NtCreatePowerRequest, + NtCreateSection, + NtCreateSemaphore, + NtCreateSymbolicLinkObject, + NtCreateThread, + NtCreateThreadEx, + NtCreateTimer, + NtCreateUserProcess, + NtDebugActiveProcess, + NtDebugContinue, + NtDelayExecution, + NtDeleteAtom, + NtDeleteFile, + NtDeleteKey, + NtDeleteValueKey, + NtDeviceIoControlFile, + NtDisplayString, + NtDuplicateObject, + NtDuplicateToken, + NtEnumerateKey, + NtEnumerateValueKey, + NtFilterToken, + NtFindAtom, + NtFlushBuffersFile, + NtFlushInstructionCache, + NtFlushKey, + NtFlushProcessWriteBuffers, + NtFlushVirtualMemory, + NtFreeVirtualMemory, + NtFsControlFile, + NtGetContextThread, + NtGetCurrentProcessorNumber, + NtGetNextThread, + NtGetNlsSectionPtr, + NtGetWriteWatch, + NtImpersonateAnonymousToken, + NtInitiatePowerAction , + NtIsProcessInJob, + NtListenPort, + NtLoadDriver, + NtLoadKey, + NtLoadKey2, + NtLockFile, + NtLockVirtualMemory, + NtMakeTemporaryObject, + NtMapViewOfSection, + NtNotifyChangeDirectoryFile, + NtNotifyChangeKey, + NtNotifyChangeMultipleKeys, + NtOpenDirectoryObject, + NtOpenEvent, + NtOpenFile, + NtOpenIoCompletion, + NtOpenJobObject, + NtOpenKey, + NtOpenKeyEx, + NtOpenKeyTransacted, + NtOpenKeyTransactedEx, + NtOpenKeyedEvent, + NtOpenMutant, + NtOpenProcess, + NtOpenProcessToken, + NtOpenProcessTokenEx, + NtOpenSection, + NtOpenSemaphore, + NtOpenSymbolicLinkObject , + NtOpenThread, + NtOpenThreadToken, + NtOpenThreadTokenEx, + NtOpenTimer, + NtPowerInformation, + NtPrivilegeCheck, + NtProtectVirtualMemory, + NtPulseEvent, + NtQueryAttributesFile, + NtQueryDefaultLocale, + NtQueryDefaultUILanguage, + NtQueryDirectoryFile, + NtQueryDirectoryObject, + NtQueryEaFile, + NtQueryEvent, + NtQueryFullAttributesFile, + NtQueryInformationAtom, + NtQueryInformationFile, + NtQueryInformationJobObject, + NtQueryInformationProcess, + NtQueryInformationThread, + NtQueryInformationToken, + NtQueryInstallUILanguage, + NtQueryIoCompletion, + NtQueryKey, + NtQueryLicenseValue, + NtQueryMultipleValueKey, + NtQueryMutant, + NtQueryObject, + NtQueryPerformanceCounter, + NtQuerySection, + NtQuerySecurityObject, + NtQuerySemaphore , + NtQuerySymbolicLinkObject, + NtQuerySystemEnvironmentValue, + NtQuerySystemEnvironmentValueEx, + NtQuerySystemInformation, + NtQuerySystemInformationEx, + NtQuerySystemTime, + NtQueryTimer, + NtQueryTimerResolution, + NtQueryValueKey, + NtQueryVirtualMemory, + NtQueryVolumeInformationFile, + NtQueueApcThread, + NtRaiseException, + NtRaiseHardError, + NtReadFile, + NtReadFileScatter, + NtReadVirtualMemory, + NtRegisterThreadTerminatePort, + NtReleaseKeyedEvent, + NtReleaseMutant, + NtReleaseSemaphore, + NtRemoveIoCompletion, + NtRemoveIoCompletionEx, + NtRemoveProcessDebug, + NtRenameKey, + NtReplaceKey, + NtReplyWaitReceivePort, + NtRequestWaitReplyPort, + NtResetEvent, + NtResetWriteWatch, + NtRestoreKey, + NtResumeProcess, + NtResumeThread, + NtSaveKey, + NtSecureConnectPort, + NtSetContextThread, + NtSetDefaultLocale, + NtSetDefaultUILanguage, + NtSetEaFile, + NtSetEvent, + NtSetInformationDebugObject, + NtSetInformationFile, + NtSetInformationJobObject, + NtSetInformationKey, + NtSetInformationObject, + NtSetInformationProcess, + NtSetInformationThread, + NtSetInformationToken, + NtSetIntervalProfile, + NtSetIoCompletion, + NtSetLdtEntries, + NtSetPowerRequest, + NtSetSecurityObject, + NtSetSystemInformation, + NtSetSystemTime, + NtSetThreadExecutionState, + NtSetTimer, + NtSetTimerResolution, + NtSetValueKey, + NtSetVolumeInformationFile, + NtShutdownSystem, + NtSignalAndWaitForSingleObject, + NtSuspendProcess, + NtSuspendThread, + NtSystemDebugControl, + NtTerminateJobObject, + NtTerminateProcess, + NtTerminateThread, + NtTestAlert, + NtTraceControl, + NtUnloadDriver, + NtUnloadKey, + NtUnlockFile, + NtUnlockVirtualMemory, + NtUnmapViewOfSection, + NtWaitForDebugEvent, + NtWaitForKeyedEvent, + NtWaitForMultipleObjects, + NtWaitForSingleObject, +#ifndef _WIN64 + NtWow64AllocateVirtualMemory64, + NtWow64GetNativeSystemInformation, + NtWow64ReadVirtualMemory64, + NtWow64WriteVirtualMemory64, +#endif + NtWriteFile, + NtWriteFileGather, + NtWriteVirtualMemory, + NtYieldExecution, + __wine_dbg_write, + __wine_unix_call, + wine_nt_to_unix_file_name, + wine_server_call, + wine_server_fd_to_handle, + wine_server_handle_to_fd, + wine_unix_to_nt_file_name, +}; -static BYTE syscall_args[4096]; +static BYTE syscall_args[ARRAY_SIZE(syscalls)]; SYSTEM_SERVICE_TABLE KeServiceDescriptorTable[4]; - #ifdef __GNUC__ static void fatal_error( const char *err, ... ) __attribute__((noreturn, format(printf,1,2))); #endif @@ -1947,7 +2182,7 @@ static struct unix_funcs unix_funcs = */ static void start_main_thread(void) { - SYSTEM_SERVICE_TABLE syscall_table = __wine_syscall_table; + SYSTEM_SERVICE_TABLE syscall_table = { (ULONG_PTR *)syscalls, NULL, ARRAY_SIZE(syscalls), syscall_args }; NTSTATUS status; TEB *teb = virtual_alloc_first_teb(); @@ -1970,7 +2205,6 @@ static void start_main_thread(void) NtCreateKeyedEvent( &keyed_event, GENERIC_READ | GENERIC_WRITE, NULL, 0 ); load_ntdll(); if (main_image_info.Machine != current_machine) load_wow64_ntdll( main_image_info.Machine ); - syscall_table.ArgumentTable = syscall_args; ntdll_init_syscalls( 0, &syscall_table, p__wine_syscall_dispatcher ); status = p__wine_set_unix_funcs( NTDLL_UNIXLIB_VERSION, &unix_funcs ); if (status == STATUS_REVISION_MISMATCH) diff --git a/include/winternl.h b/include/winternl.h index ec2c95e99bc..fea9e9df117 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -3847,6 +3847,7 @@ NTSYSAPI NTSTATUS WINAPI NtCreateJobObject(PHANDLE,ACCESS_MASK,const OBJECT_ATT NTSYSAPI NTSTATUS WINAPI NtCreateKey(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*,ULONG,const UNICODE_STRING*,ULONG,PULONG); NTSYSAPI NTSTATUS WINAPI NtCreateKeyTransacted(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*,ULONG,const UNICODE_STRING*,ULONG,HANDLE,ULONG*); NTSYSAPI NTSTATUS WINAPI NtCreateKeyedEvent(HANDLE*,ACCESS_MASK,const OBJECT_ATTRIBUTES*,ULONG); +NTSYSAPI NTSTATUS WINAPI NtCreateLowBoxToken(HANDLE*,HANDLE,ACCESS_MASK,OBJECT_ATTRIBUTES*,SID*,ULONG,SID_AND_ATTRIBUTES*,ULONG,HANDLE*); NTSYSAPI NTSTATUS WINAPI NtCreateMailslotFile(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,ULONG,ULONG,ULONG,PLARGE_INTEGER); NTSYSAPI NTSTATUS WINAPI NtCreateMutant(HANDLE*,ACCESS_MASK,const OBJECT_ATTRIBUTES*,BOOLEAN); NTSYSAPI NTSTATUS WINAPI NtCreateNamedPipeFile(PHANDLE,ULONG,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,ULONG,ULONG,ULONG,ULONG,ULONG,ULONG,ULONG,ULONG,ULONG,PLARGE_INTEGER); diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index d9d6fcae0c6..fcd27117780 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -1426,6 +1426,8 @@ void output_syscalls( DLLSPEC *spec ) int i, count; ORDDEF **syscalls = NULL; + if (unix_lib) return; + for (i = count = 0; i < spec->nb_entry_points; i++) { ORDDEF *odp = &spec->entry_points[i]; @@ -1439,18 +1441,6 @@ void output_syscalls( DLLSPEC *spec ) output( "\n/* system calls */\n\n" ); output( "\t.text\n" ); - if (unix_lib) - { - output( "\t.data\n" ); - output( "\t.align %d\n", get_alignment( get_ptr_size() ) ); - output( "%s\n", asm_globl("__wine_syscall_table") ); - output( "\t%s .Lsyscall_table, 0, %u, 0\n", get_asm_ptr_keyword(), count ); - output( ".Lsyscall_table:\n" ); - for (i = 0; i < count; i++) - output( "\t%s %s\n", get_asm_ptr_keyword(), asm_name( get_link_name( syscalls[i] ))); - return; - } - for (i = 0; i < count; i++) { ORDDEF *odp = syscalls[i];