-- v2: ntdll: Use NtAlertMultipleThreadByThreadId() in RtlWakeAddressAll(). ntdll: Implement NtAlertMultipleThreadByThreadId().
From: Paul Gofman pgofman@codeweavers.com
--- dlls/ntdll/ntdll.spec | 2 + dlls/ntdll/ntsyscalls.h | 638 ++++++++++++++++++------------------ dlls/ntdll/signal_arm64ec.c | 1 + dlls/ntdll/tests/sync.c | 49 +++ dlls/ntdll/unix/sync.c | 27 ++ dlls/wow64/process.c | 20 ++ include/winternl.h | 1 + 7 files changed, 420 insertions(+), 318 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index ac4dff7ff40..99201bf0f28 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -142,6 +142,7 @@ # @ stub NtAddBootEntry @ stdcall -syscall NtAdjustGroupsToken(long long ptr long ptr ptr) @ stdcall -syscall=0x0041 NtAdjustPrivilegesToken(long long ptr long ptr ptr) +@ stdcall -syscall NtAlertMultipleThreadByThreadId(ptr long ptr ptr) @ stdcall -syscall NtAlertResumeThread(long ptr) @ stdcall -syscall NtAlertThread(long) @ stdcall -syscall NtAlertThreadByThreadId(ptr) @@ -1212,6 +1213,7 @@ # @ stub ZwAddBootEntry @ stdcall -private ZwAdjustGroupsToken(long long ptr long ptr ptr) NtAdjustGroupsToken @ stdcall -private ZwAdjustPrivilegesToken(long long ptr long ptr ptr) NtAdjustPrivilegesToken +@ stdcall -private ZwAlertMultipleThreadByThreadId(ptr long ptr ptr) NtAlertMultipleThreadByThreadId @ stdcall -private ZwAlertResumeThread(long ptr) NtAlertResumeThread @ stdcall -private ZwAlertThread(long) NtAlertThread @ stdcall -private ZwAlertThreadByThreadId(ptr) NtAlertThreadByThreadId diff --git a/dlls/ntdll/ntsyscalls.h b/dlls/ntdll/ntsyscalls.h index 94ef1c52781..30a07abfd51 100644 --- a/dlls/ntdll/ntsyscalls.h +++ b/dlls/ntdll/ntsyscalls.h @@ -101,169 +101,170 @@ SYSCALL_ENTRY( 0x0061, NtCancelTimer, 8 ) \ SYSCALL_ENTRY( 0x0062, NtSetTimer, 28 ) \ SYSCALL_ENTRY( 0x0063, NtAdjustGroupsToken, 24 ) \ - SYSCALL_ENTRY( 0x0064, NtAlertResumeThread, 8 ) \ - SYSCALL_ENTRY( 0x0065, NtAlertThread, 4 ) \ - SYSCALL_ENTRY( 0x0066, NtAlertThreadByThreadId, 4 ) \ - SYSCALL_ENTRY( 0x0067, NtAllocateLocallyUniqueId, 4 ) \ - SYSCALL_ENTRY( 0x0068, NtAllocateReserveObject, 12 ) \ - SYSCALL_ENTRY( 0x0069, NtAllocateUuids, 16 ) \ - SYSCALL_ENTRY( 0x006a, NtAllocateVirtualMemoryEx, 28 ) \ - SYSCALL_ENTRY( 0x006b, NtAreMappedFilesTheSame, 8 ) \ - SYSCALL_ENTRY( 0x006c, NtAssignProcessToJobObject, 8 ) \ - SYSCALL_ENTRY( 0x006d, NtCancelIoFileEx, 12 ) \ - SYSCALL_ENTRY( 0x006e, NtCancelSynchronousIoFile, 12 ) \ - SYSCALL_ENTRY( 0x006f, NtCommitTransaction, 8 ) \ - SYSCALL_ENTRY( 0x0070, NtCompareObjects, 8 ) \ - SYSCALL_ENTRY( 0x0071, NtCompareTokens, 12 ) \ - SYSCALL_ENTRY( 0x0072, NtCompleteConnectPort, 4 ) \ - SYSCALL_ENTRY( 0x0073, NtConnectPort, 32 ) \ - SYSCALL_ENTRY( 0x0074, NtContinueEx, 8 ) \ - SYSCALL_ENTRY( 0x0075, NtConvertBetweenAuxiliaryCounterAndPerformanceCounter, 16 ) \ - SYSCALL_ENTRY( 0x0076, NtCreateDirectoryObject, 12 ) \ - SYSCALL_ENTRY( 0x0077, NtCreateIoCompletion, 16 ) \ - SYSCALL_ENTRY( 0x0078, NtCreateJobObject, 12 ) \ - SYSCALL_ENTRY( 0x0079, NtCreateKeyTransacted, 32 ) \ - SYSCALL_ENTRY( 0x007a, NtCreateKeyedEvent, 16 ) \ - SYSCALL_ENTRY( 0x007b, NtCreateLowBoxToken, 36 ) \ - SYSCALL_ENTRY( 0x007c, NtCreateMailslotFile, 32 ) \ - SYSCALL_ENTRY( 0x007d, NtCreateMutant, 16 ) \ - SYSCALL_ENTRY( 0x007e, NtCreateNamedPipeFile, 56 ) \ - SYSCALL_ENTRY( 0x007f, NtCreatePagingFile, 16 ) \ - SYSCALL_ENTRY( 0x0080, NtCreatePort, 20 ) \ - SYSCALL_ENTRY( 0x0081, NtCreateSectionEx, 36 ) \ - SYSCALL_ENTRY( 0x0082, NtCreateSemaphore, 20 ) \ - SYSCALL_ENTRY( 0x0083, NtCreateSymbolicLinkObject, 16 ) \ - SYSCALL_ENTRY( 0x0084, NtCreateThreadEx, 44 ) \ - SYSCALL_ENTRY( 0x0085, NtCreateTimer, 16 ) \ - SYSCALL_ENTRY( 0x0086, NtCreateToken, 52 ) \ - SYSCALL_ENTRY( 0x0087, NtCreateTransaction, 40 ) \ - SYSCALL_ENTRY( 0x0088, NtCreateUserProcess, 44 ) \ - SYSCALL_ENTRY( 0x0089, NtDebugActiveProcess, 8 ) \ - SYSCALL_ENTRY( 0x008a, NtDebugContinue, 12 ) \ - SYSCALL_ENTRY( 0x008b, NtDeleteAtom, 4 ) \ - SYSCALL_ENTRY( 0x008c, NtDeleteFile, 4 ) \ - SYSCALL_ENTRY( 0x008d, NtDeleteKey, 4 ) \ - SYSCALL_ENTRY( 0x008e, NtDeleteValueKey, 8 ) \ - SYSCALL_ENTRY( 0x008f, NtDisplayString, 4 ) \ - SYSCALL_ENTRY( 0x0090, NtFilterToken, 24 ) \ - SYSCALL_ENTRY( 0x0091, NtFlushBuffersFileEx, 20 ) \ - SYSCALL_ENTRY( 0x0092, NtFlushInstructionCache, 12 ) \ - SYSCALL_ENTRY( 0x0093, NtFlushKey, 4 ) \ - SYSCALL_ENTRY( 0x0094, NtFlushProcessWriteBuffers, 0 ) \ - SYSCALL_ENTRY( 0x0095, NtFlushVirtualMemory, 16 ) \ - SYSCALL_ENTRY( 0x0096, NtGetContextThread, 8 ) \ - SYSCALL_ENTRY( 0x0097, NtGetCurrentProcessorNumber, 0 ) \ - SYSCALL_ENTRY( 0x0098, NtGetNextProcess, 20 ) \ - SYSCALL_ENTRY( 0x0099, NtGetNextThread, 24 ) \ - SYSCALL_ENTRY( 0x009a, NtGetNlsSectionPtr, 20 ) \ - SYSCALL_ENTRY( 0x009b, NtGetWriteWatch, 28 ) \ - SYSCALL_ENTRY( 0x009c, NtImpersonateAnonymousToken, 4 ) \ - SYSCALL_ENTRY( 0x009d, NtInitializeNlsFiles, 12 ) \ - SYSCALL_ENTRY( 0x009e, NtInitiatePowerAction, 16 ) \ - SYSCALL_ENTRY( 0x009f, NtListenPort, 8 ) \ - SYSCALL_ENTRY( 0x00a0, NtLoadDriver, 4 ) \ - SYSCALL_ENTRY( 0x00a1, NtLoadKey, 8 ) \ - SYSCALL_ENTRY( 0x00a2, NtLoadKey2, 12 ) \ - SYSCALL_ENTRY( 0x00a3, NtLoadKeyEx, 32 ) \ - SYSCALL_ENTRY( 0x00a4, NtLockFile, 40 ) \ - SYSCALL_ENTRY( 0x00a5, NtLockVirtualMemory, 16 ) \ + SYSCALL_ENTRY( 0x0064, NtAlertMultipleThreadByThreadId, 16 ) \ + SYSCALL_ENTRY( 0x0065, NtAlertResumeThread, 8 ) \ + SYSCALL_ENTRY( 0x0066, NtAlertThread, 4 ) \ + SYSCALL_ENTRY( 0x0067, NtAlertThreadByThreadId, 4 ) \ + SYSCALL_ENTRY( 0x0068, NtAllocateLocallyUniqueId, 4 ) \ + SYSCALL_ENTRY( 0x0069, NtAllocateReserveObject, 12 ) \ + SYSCALL_ENTRY( 0x006a, NtAllocateUuids, 16 ) \ + SYSCALL_ENTRY( 0x006b, NtAllocateVirtualMemoryEx, 28 ) \ + SYSCALL_ENTRY( 0x006c, NtAreMappedFilesTheSame, 8 ) \ + SYSCALL_ENTRY( 0x006d, NtAssignProcessToJobObject, 8 ) \ + SYSCALL_ENTRY( 0x006e, NtCancelIoFileEx, 12 ) \ + SYSCALL_ENTRY( 0x006f, NtCancelSynchronousIoFile, 12 ) \ + SYSCALL_ENTRY( 0x0070, NtCommitTransaction, 8 ) \ + SYSCALL_ENTRY( 0x0071, NtCompareObjects, 8 ) \ + SYSCALL_ENTRY( 0x0072, NtCompareTokens, 12 ) \ + SYSCALL_ENTRY( 0x0073, NtCompleteConnectPort, 4 ) \ + SYSCALL_ENTRY( 0x0074, NtConnectPort, 32 ) \ + SYSCALL_ENTRY( 0x0075, NtContinueEx, 8 ) \ + SYSCALL_ENTRY( 0x0076, NtConvertBetweenAuxiliaryCounterAndPerformanceCounter, 16 ) \ + SYSCALL_ENTRY( 0x0077, NtCreateDirectoryObject, 12 ) \ + SYSCALL_ENTRY( 0x0078, NtCreateIoCompletion, 16 ) \ + SYSCALL_ENTRY( 0x0079, NtCreateJobObject, 12 ) \ + SYSCALL_ENTRY( 0x007a, NtCreateKeyTransacted, 32 ) \ + SYSCALL_ENTRY( 0x007b, NtCreateKeyedEvent, 16 ) \ + SYSCALL_ENTRY( 0x007c, NtCreateLowBoxToken, 36 ) \ + SYSCALL_ENTRY( 0x007d, NtCreateMailslotFile, 32 ) \ + SYSCALL_ENTRY( 0x007e, NtCreateMutant, 16 ) \ + SYSCALL_ENTRY( 0x007f, NtCreateNamedPipeFile, 56 ) \ + SYSCALL_ENTRY( 0x0080, NtCreatePagingFile, 16 ) \ + SYSCALL_ENTRY( 0x0081, NtCreatePort, 20 ) \ + SYSCALL_ENTRY( 0x0082, NtCreateSectionEx, 36 ) \ + SYSCALL_ENTRY( 0x0083, NtCreateSemaphore, 20 ) \ + SYSCALL_ENTRY( 0x0084, NtCreateSymbolicLinkObject, 16 ) \ + SYSCALL_ENTRY( 0x0085, NtCreateThreadEx, 44 ) \ + SYSCALL_ENTRY( 0x0086, NtCreateTimer, 16 ) \ + SYSCALL_ENTRY( 0x0087, NtCreateToken, 52 ) \ + SYSCALL_ENTRY( 0x0088, NtCreateTransaction, 40 ) \ + SYSCALL_ENTRY( 0x0089, NtCreateUserProcess, 44 ) \ + SYSCALL_ENTRY( 0x008a, NtDebugActiveProcess, 8 ) \ + SYSCALL_ENTRY( 0x008b, NtDebugContinue, 12 ) \ + SYSCALL_ENTRY( 0x008c, NtDeleteAtom, 4 ) \ + SYSCALL_ENTRY( 0x008d, NtDeleteFile, 4 ) \ + SYSCALL_ENTRY( 0x008e, NtDeleteKey, 4 ) \ + SYSCALL_ENTRY( 0x008f, NtDeleteValueKey, 8 ) \ + SYSCALL_ENTRY( 0x0090, NtDisplayString, 4 ) \ + SYSCALL_ENTRY( 0x0091, NtFilterToken, 24 ) \ + SYSCALL_ENTRY( 0x0092, NtFlushBuffersFileEx, 20 ) \ + SYSCALL_ENTRY( 0x0093, NtFlushInstructionCache, 12 ) \ + SYSCALL_ENTRY( 0x0094, NtFlushKey, 4 ) \ + SYSCALL_ENTRY( 0x0095, NtFlushProcessWriteBuffers, 0 ) \ + SYSCALL_ENTRY( 0x0096, NtFlushVirtualMemory, 16 ) \ + SYSCALL_ENTRY( 0x0097, NtGetContextThread, 8 ) \ + SYSCALL_ENTRY( 0x0098, NtGetCurrentProcessorNumber, 0 ) \ + SYSCALL_ENTRY( 0x0099, NtGetNextProcess, 20 ) \ + SYSCALL_ENTRY( 0x009a, NtGetNextThread, 24 ) \ + SYSCALL_ENTRY( 0x009b, NtGetNlsSectionPtr, 20 ) \ + SYSCALL_ENTRY( 0x009c, NtGetWriteWatch, 28 ) \ + SYSCALL_ENTRY( 0x009d, NtImpersonateAnonymousToken, 4 ) \ + SYSCALL_ENTRY( 0x009e, NtInitializeNlsFiles, 12 ) \ + SYSCALL_ENTRY( 0x009f, NtInitiatePowerAction, 16 ) \ + SYSCALL_ENTRY( 0x00a0, NtListenPort, 8 ) \ + SYSCALL_ENTRY( 0x00a1, NtLoadDriver, 4 ) \ + SYSCALL_ENTRY( 0x00a2, NtLoadKey, 8 ) \ + SYSCALL_ENTRY( 0x00a3, NtLoadKey2, 12 ) \ + SYSCALL_ENTRY( 0x00a4, NtLoadKeyEx, 32 ) \ + SYSCALL_ENTRY( 0x00a5, NtLockFile, 40 ) \ SYSCALL_ENTRY( 0x00a6, NtCreateDebugObject, 16 ) \ - SYSCALL_ENTRY( 0x00a7, NtMakePermanentObject, 4 ) \ - SYSCALL_ENTRY( 0x00a8, NtMakeTemporaryObject, 4 ) \ - SYSCALL_ENTRY( 0x00a9, NtMapViewOfSectionEx, 36 ) \ - SYSCALL_ENTRY( 0x00aa, NtNotifyChangeDirectoryFile, 36 ) \ - SYSCALL_ENTRY( 0x00ab, NtNotifyChangeKey, 40 ) \ - SYSCALL_ENTRY( 0x00ac, NtNotifyChangeMultipleKeys, 48 ) \ - SYSCALL_ENTRY( 0x00ad, NtOpenIoCompletion, 12 ) \ - SYSCALL_ENTRY( 0x00ae, NtOpenJobObject, 12 ) \ - SYSCALL_ENTRY( 0x00af, NtOpenKeyEx, 16 ) \ - SYSCALL_ENTRY( 0x00b0, NtOpenKeyTransacted, 16 ) \ - SYSCALL_ENTRY( 0x00b1, NtOpenKeyTransactedEx, 20 ) \ - SYSCALL_ENTRY( 0x00b2, NtOpenKeyedEvent, 12 ) \ - SYSCALL_ENTRY( 0x00b3, NtOpenMutant, 12 ) \ - SYSCALL_ENTRY( 0x00b4, NtOpenProcessToken, 12 ) \ - SYSCALL_ENTRY( 0x00b5, NtOpenSemaphore, 12 ) \ - SYSCALL_ENTRY( 0x00b6, NtOpenSymbolicLinkObject, 12 ) \ - SYSCALL_ENTRY( 0x00b7, NtOpenThread, 16 ) \ - SYSCALL_ENTRY( 0x00b8, NtOpenTimer, 12 ) \ - SYSCALL_ENTRY( 0x00b9, NtPrivilegeCheck, 12 ) \ - SYSCALL_ENTRY( 0x00ba, NtPulseEvent, 8 ) \ - SYSCALL_ENTRY( 0x00bb, NtQueryDirectoryObject, 28 ) \ - SYSCALL_ENTRY( 0x00bc, NtQueryEaFile, 36 ) \ - SYSCALL_ENTRY( 0x00bd, NtQueryFullAttributesFile, 8 ) \ - SYSCALL_ENTRY( 0x00be, NtQueryInformationAtom, 20 ) \ - SYSCALL_ENTRY( 0x00bf, NtQueryInformationJobObject, 20 ) \ - SYSCALL_ENTRY( 0x00c0, NtQueryInstallUILanguage, 4 ) \ - SYSCALL_ENTRY( 0x00c1, NtQueryIoCompletion, 20 ) \ - SYSCALL_ENTRY( 0x00c2, NtQueryLicenseValue, 20 ) \ - SYSCALL_ENTRY( 0x00c3, NtQueryMultipleValueKey, 24 ) \ - SYSCALL_ENTRY( 0x00c4, NtQueryMutant, 20 ) \ - SYSCALL_ENTRY( 0x00c5, NtQuerySecurityObject, 20 ) \ - SYSCALL_ENTRY( 0x00c6, NtQuerySemaphore, 20 ) \ - SYSCALL_ENTRY( 0x00c7, NtQuerySymbolicLinkObject, 12 ) \ - SYSCALL_ENTRY( 0x00c8, NtQuerySystemEnvironmentValue, 16 ) \ - SYSCALL_ENTRY( 0x00c9, NtQuerySystemEnvironmentValueEx, 20 ) \ - SYSCALL_ENTRY( 0x00ca, NtQuerySystemInformationEx, 24 ) \ - SYSCALL_ENTRY( 0x00cb, NtQueryTimerResolution, 12 ) \ - SYSCALL_ENTRY( 0x00cc, NtQueueApcThreadEx, 24 ) \ - SYSCALL_ENTRY( 0x00cd, NtQueueApcThreadEx2, 28 ) \ - SYSCALL_ENTRY( 0x00ce, NtRaiseException, 12 ) \ - SYSCALL_ENTRY( 0x00cf, NtRaiseHardError, 24 ) \ - SYSCALL_ENTRY( 0x00d0, NtRegisterThreadTerminatePort, 4 ) \ - SYSCALL_ENTRY( 0x00d1, NtReleaseKeyedEvent, 16 ) \ - SYSCALL_ENTRY( 0x00d2, NtRemoveIoCompletionEx, 24 ) \ - SYSCALL_ENTRY( 0x00d3, NtRemoveProcessDebug, 8 ) \ - SYSCALL_ENTRY( 0x00d4, NtRenameKey, 8 ) \ - SYSCALL_ENTRY( 0x00d5, NtReplaceKey, 12 ) \ - SYSCALL_ENTRY( 0x00d6, NtResetEvent, 8 ) \ - SYSCALL_ENTRY( 0x00d7, NtResetWriteWatch, 12 ) \ - SYSCALL_ENTRY( 0x00d8, NtRestoreKey, 12 ) \ - SYSCALL_ENTRY( 0x00d9, NtResumeProcess, 4 ) \ - SYSCALL_ENTRY( 0x00da, NtRollbackTransaction, 8 ) \ - SYSCALL_ENTRY( 0x00db, NtSaveKey, 8 ) \ - SYSCALL_ENTRY( 0x00dc, NtSecureConnectPort, 36 ) \ - SYSCALL_ENTRY( 0x00dd, NtSetContextThread, 8 ) \ - SYSCALL_ENTRY( 0x00de, NtSetDebugFilterState, 12 ) \ - SYSCALL_ENTRY( 0x00df, NtSetDefaultLocale, 8 ) \ - SYSCALL_ENTRY( 0x00e0, NtSetDefaultUILanguage, 4 ) \ - SYSCALL_ENTRY( 0x00e1, NtSetEaFile, 16 ) \ - SYSCALL_ENTRY( 0x00e2, NtSetInformationDebugObject, 20 ) \ - SYSCALL_ENTRY( 0x00e3, NtSetInformationJobObject, 16 ) \ - SYSCALL_ENTRY( 0x00e4, NtSetInformationKey, 16 ) \ - SYSCALL_ENTRY( 0x00e5, NtSetInformationToken, 16 ) \ - SYSCALL_ENTRY( 0x00e6, NtSetInformationVirtualMemory, 24 ) \ - SYSCALL_ENTRY( 0x00e7, NtSetIntervalProfile, 8 ) \ - SYSCALL_ENTRY( 0x00e8, NtSetIoCompletion, 20 ) \ - SYSCALL_ENTRY( 0x00e9, NtSetIoCompletionEx, 24 ) \ - SYSCALL_ENTRY( 0x00ea, NtSetLdtEntries, 24 ) \ - SYSCALL_ENTRY( 0x00eb, NtSetSecurityObject, 12 ) \ - SYSCALL_ENTRY( 0x00ec, NtSetSystemInformation, 12 ) \ - SYSCALL_ENTRY( 0x00ed, NtSetSystemTime, 8 ) \ - SYSCALL_ENTRY( 0x00ee, NtSetThreadExecutionState, 8 ) \ - SYSCALL_ENTRY( 0x00ef, NtSetTimerResolution, 12 ) \ - SYSCALL_ENTRY( 0x00f0, NtSetVolumeInformationFile, 20 ) \ - SYSCALL_ENTRY( 0x00f1, NtShutdownSystem, 4 ) \ - SYSCALL_ENTRY( 0x00f2, NtSignalAndWaitForSingleObject, 16 ) \ - SYSCALL_ENTRY( 0x00f3, NtSuspendProcess, 4 ) \ - SYSCALL_ENTRY( 0x00f4, NtSuspendThread, 8 ) \ - SYSCALL_ENTRY( 0x00f5, NtSystemDebugControl, 24 ) \ - SYSCALL_ENTRY( 0x00f6, NtTerminateJobObject, 8 ) \ - SYSCALL_ENTRY( 0x00f7, NtTestAlert, 0 ) \ - SYSCALL_ENTRY( 0x00f8, NtTraceControl, 24 ) \ - SYSCALL_ENTRY( 0x00f9, NtUnloadDriver, 4 ) \ - SYSCALL_ENTRY( 0x00fa, NtUnloadKey, 4 ) \ - SYSCALL_ENTRY( 0x00fb, NtUnlockFile, 20 ) \ - SYSCALL_ENTRY( 0x00fc, NtUnlockVirtualMemory, 16 ) \ - SYSCALL_ENTRY( 0x00fd, NtUnmapViewOfSectionEx, 12 ) \ - SYSCALL_ENTRY( 0x00fe, NtWaitForAlertByThreadId, 8 ) \ - SYSCALL_ENTRY( 0x00ff, NtWaitForDebugEvent, 16 ) \ - SYSCALL_ENTRY( 0x0100, NtWaitForKeyedEvent, 16 ) \ - SYSCALL_ENTRY( 0x0101, NtWow64AllocateVirtualMemory64, 28 ) \ - SYSCALL_ENTRY( 0x0102, NtWow64GetNativeSystemInformation, 16 ) \ - SYSCALL_ENTRY( 0x0103, NtWow64IsProcessorFeaturePresent, 4 ) \ - SYSCALL_ENTRY( 0x0104, NtWow64QueryInformationProcess64, 20 ) \ - SYSCALL_ENTRY( 0x0105, NtWow64ReadVirtualMemory64, 28 ) \ - SYSCALL_ENTRY( 0x0106, NtWow64WriteVirtualMemory64, 28 ) + SYSCALL_ENTRY( 0x00a7, NtLockVirtualMemory, 16 ) \ + SYSCALL_ENTRY( 0x00a8, NtMakePermanentObject, 4 ) \ + SYSCALL_ENTRY( 0x00a9, NtMakeTemporaryObject, 4 ) \ + SYSCALL_ENTRY( 0x00aa, NtMapViewOfSectionEx, 36 ) \ + SYSCALL_ENTRY( 0x00ab, NtNotifyChangeDirectoryFile, 36 ) \ + SYSCALL_ENTRY( 0x00ac, NtNotifyChangeKey, 40 ) \ + SYSCALL_ENTRY( 0x00ad, NtNotifyChangeMultipleKeys, 48 ) \ + SYSCALL_ENTRY( 0x00ae, NtOpenIoCompletion, 12 ) \ + SYSCALL_ENTRY( 0x00af, NtOpenJobObject, 12 ) \ + SYSCALL_ENTRY( 0x00b0, NtOpenKeyEx, 16 ) \ + SYSCALL_ENTRY( 0x00b1, NtOpenKeyTransacted, 16 ) \ + SYSCALL_ENTRY( 0x00b2, NtOpenKeyTransactedEx, 20 ) \ + SYSCALL_ENTRY( 0x00b3, NtOpenKeyedEvent, 12 ) \ + SYSCALL_ENTRY( 0x00b4, NtOpenMutant, 12 ) \ + SYSCALL_ENTRY( 0x00b5, NtOpenProcessToken, 12 ) \ + SYSCALL_ENTRY( 0x00b6, NtOpenSemaphore, 12 ) \ + SYSCALL_ENTRY( 0x00b7, NtOpenSymbolicLinkObject, 12 ) \ + SYSCALL_ENTRY( 0x00b8, NtOpenThread, 16 ) \ + SYSCALL_ENTRY( 0x00b9, NtOpenTimer, 12 ) \ + SYSCALL_ENTRY( 0x00ba, NtPrivilegeCheck, 12 ) \ + SYSCALL_ENTRY( 0x00bb, NtPulseEvent, 8 ) \ + SYSCALL_ENTRY( 0x00bc, NtQueryDirectoryObject, 28 ) \ + SYSCALL_ENTRY( 0x00bd, NtQueryEaFile, 36 ) \ + SYSCALL_ENTRY( 0x00be, NtQueryFullAttributesFile, 8 ) \ + SYSCALL_ENTRY( 0x00bf, NtQueryInformationAtom, 20 ) \ + SYSCALL_ENTRY( 0x00c0, NtQueryInformationJobObject, 20 ) \ + SYSCALL_ENTRY( 0x00c1, NtQueryInstallUILanguage, 4 ) \ + SYSCALL_ENTRY( 0x00c2, NtQueryIoCompletion, 20 ) \ + SYSCALL_ENTRY( 0x00c3, NtQueryLicenseValue, 20 ) \ + SYSCALL_ENTRY( 0x00c4, NtQueryMultipleValueKey, 24 ) \ + SYSCALL_ENTRY( 0x00c5, NtQueryMutant, 20 ) \ + SYSCALL_ENTRY( 0x00c6, NtQuerySecurityObject, 20 ) \ + SYSCALL_ENTRY( 0x00c7, NtQuerySemaphore, 20 ) \ + SYSCALL_ENTRY( 0x00c8, NtQuerySymbolicLinkObject, 12 ) \ + SYSCALL_ENTRY( 0x00c9, NtQuerySystemEnvironmentValue, 16 ) \ + SYSCALL_ENTRY( 0x00ca, NtQuerySystemEnvironmentValueEx, 20 ) \ + SYSCALL_ENTRY( 0x00cb, NtQuerySystemInformationEx, 24 ) \ + SYSCALL_ENTRY( 0x00cc, NtQueryTimerResolution, 12 ) \ + SYSCALL_ENTRY( 0x00cd, NtQueueApcThreadEx, 24 ) \ + SYSCALL_ENTRY( 0x00ce, NtQueueApcThreadEx2, 28 ) \ + SYSCALL_ENTRY( 0x00cf, NtRaiseException, 12 ) \ + SYSCALL_ENTRY( 0x00d0, NtRaiseHardError, 24 ) \ + SYSCALL_ENTRY( 0x00d1, NtRegisterThreadTerminatePort, 4 ) \ + SYSCALL_ENTRY( 0x00d2, NtReleaseKeyedEvent, 16 ) \ + SYSCALL_ENTRY( 0x00d3, NtRemoveIoCompletionEx, 24 ) \ + SYSCALL_ENTRY( 0x00d4, NtRemoveProcessDebug, 8 ) \ + SYSCALL_ENTRY( 0x00d5, NtRenameKey, 8 ) \ + SYSCALL_ENTRY( 0x00d6, NtReplaceKey, 12 ) \ + SYSCALL_ENTRY( 0x00d7, NtResetEvent, 8 ) \ + SYSCALL_ENTRY( 0x00d8, NtResetWriteWatch, 12 ) \ + SYSCALL_ENTRY( 0x00d9, NtRestoreKey, 12 ) \ + SYSCALL_ENTRY( 0x00da, NtResumeProcess, 4 ) \ + SYSCALL_ENTRY( 0x00db, NtRollbackTransaction, 8 ) \ + SYSCALL_ENTRY( 0x00dc, NtSaveKey, 8 ) \ + SYSCALL_ENTRY( 0x00dd, NtSecureConnectPort, 36 ) \ + SYSCALL_ENTRY( 0x00de, NtSetContextThread, 8 ) \ + SYSCALL_ENTRY( 0x00df, NtSetDebugFilterState, 12 ) \ + SYSCALL_ENTRY( 0x00e0, NtSetDefaultLocale, 8 ) \ + SYSCALL_ENTRY( 0x00e1, NtSetDefaultUILanguage, 4 ) \ + SYSCALL_ENTRY( 0x00e2, NtSetEaFile, 16 ) \ + SYSCALL_ENTRY( 0x00e3, NtSetInformationDebugObject, 20 ) \ + SYSCALL_ENTRY( 0x00e4, NtSetInformationJobObject, 16 ) \ + SYSCALL_ENTRY( 0x00e5, NtSetInformationKey, 16 ) \ + SYSCALL_ENTRY( 0x00e6, NtSetInformationToken, 16 ) \ + SYSCALL_ENTRY( 0x00e7, NtSetInformationVirtualMemory, 24 ) \ + SYSCALL_ENTRY( 0x00e8, NtSetIntervalProfile, 8 ) \ + SYSCALL_ENTRY( 0x00e9, NtSetIoCompletion, 20 ) \ + SYSCALL_ENTRY( 0x00ea, NtSetIoCompletionEx, 24 ) \ + SYSCALL_ENTRY( 0x00eb, NtSetLdtEntries, 24 ) \ + SYSCALL_ENTRY( 0x00ec, NtSetSecurityObject, 12 ) \ + SYSCALL_ENTRY( 0x00ed, NtSetSystemInformation, 12 ) \ + SYSCALL_ENTRY( 0x00ee, NtSetSystemTime, 8 ) \ + SYSCALL_ENTRY( 0x00ef, NtSetThreadExecutionState, 8 ) \ + SYSCALL_ENTRY( 0x00f0, NtSetTimerResolution, 12 ) \ + SYSCALL_ENTRY( 0x00f1, NtSetVolumeInformationFile, 20 ) \ + SYSCALL_ENTRY( 0x00f2, NtShutdownSystem, 4 ) \ + SYSCALL_ENTRY( 0x00f3, NtSignalAndWaitForSingleObject, 16 ) \ + SYSCALL_ENTRY( 0x00f4, NtSuspendProcess, 4 ) \ + SYSCALL_ENTRY( 0x00f5, NtSuspendThread, 8 ) \ + SYSCALL_ENTRY( 0x00f6, NtSystemDebugControl, 24 ) \ + SYSCALL_ENTRY( 0x00f7, NtTerminateJobObject, 8 ) \ + SYSCALL_ENTRY( 0x00f8, NtTestAlert, 0 ) \ + SYSCALL_ENTRY( 0x00f9, NtTraceControl, 24 ) \ + SYSCALL_ENTRY( 0x00fa, NtUnloadDriver, 4 ) \ + SYSCALL_ENTRY( 0x00fb, NtUnloadKey, 4 ) \ + SYSCALL_ENTRY( 0x00fc, NtUnlockFile, 20 ) \ + SYSCALL_ENTRY( 0x00fd, NtUnlockVirtualMemory, 16 ) \ + SYSCALL_ENTRY( 0x00fe, NtUnmapViewOfSectionEx, 12 ) \ + SYSCALL_ENTRY( 0x00ff, NtWaitForAlertByThreadId, 8 ) \ + SYSCALL_ENTRY( 0x0100, NtWaitForDebugEvent, 16 ) \ + SYSCALL_ENTRY( 0x0101, NtWaitForKeyedEvent, 16 ) \ + SYSCALL_ENTRY( 0x0102, NtWow64AllocateVirtualMemory64, 28 ) \ + SYSCALL_ENTRY( 0x0103, NtWow64GetNativeSystemInformation, 16 ) \ + SYSCALL_ENTRY( 0x0104, NtWow64IsProcessorFeaturePresent, 4 ) \ + SYSCALL_ENTRY( 0x0105, NtWow64QueryInformationProcess64, 20 ) \ + SYSCALL_ENTRY( 0x0106, NtWow64ReadVirtualMemory64, 28 ) \ + SYSCALL_ENTRY( 0x0107, NtWow64WriteVirtualMemory64, 28 ) #ifdef _WIN64 #define ALL_SYSCALLS \ SYSCALL_ENTRY( 0x0000, NtAccessCheck, 64 ) \ @@ -366,163 +367,164 @@ SYSCALL_ENTRY( 0x0061, NtCancelTimer, 16 ) \ SYSCALL_ENTRY( 0x0062, NtSetTimer, 56 ) \ SYSCALL_ENTRY( 0x0063, NtAdjustGroupsToken, 48 ) \ - SYSCALL_ENTRY( 0x0064, NtAlertResumeThread, 16 ) \ - SYSCALL_ENTRY( 0x0065, NtAlertThread, 8 ) \ - SYSCALL_ENTRY( 0x0066, NtAlertThreadByThreadId, 8 ) \ - SYSCALL_ENTRY( 0x0067, NtAllocateLocallyUniqueId, 8 ) \ - SYSCALL_ENTRY( 0x0068, NtAllocateReserveObject, 24 ) \ - SYSCALL_ENTRY( 0x0069, NtAllocateUuids, 32 ) \ - SYSCALL_ENTRY( 0x006a, NtAllocateVirtualMemoryEx, 56 ) \ - SYSCALL_ENTRY( 0x006b, NtAreMappedFilesTheSame, 16 ) \ - SYSCALL_ENTRY( 0x006c, NtAssignProcessToJobObject, 16 ) \ - SYSCALL_ENTRY( 0x006d, NtCancelIoFileEx, 24 ) \ - SYSCALL_ENTRY( 0x006e, NtCancelSynchronousIoFile, 24 ) \ - SYSCALL_ENTRY( 0x006f, NtCommitTransaction, 16 ) \ - SYSCALL_ENTRY( 0x0070, NtCompareObjects, 16 ) \ - SYSCALL_ENTRY( 0x0071, NtCompareTokens, 24 ) \ - SYSCALL_ENTRY( 0x0072, NtCompleteConnectPort, 8 ) \ - SYSCALL_ENTRY( 0x0073, NtConnectPort, 64 ) \ - SYSCALL_ENTRY( 0x0074, NtContinueEx, 16 ) \ - SYSCALL_ENTRY( 0x0075, NtConvertBetweenAuxiliaryCounterAndPerformanceCounter, 32 ) \ - SYSCALL_ENTRY( 0x0076, NtCreateDirectoryObject, 24 ) \ - SYSCALL_ENTRY( 0x0077, NtCreateIoCompletion, 32 ) \ - SYSCALL_ENTRY( 0x0078, NtCreateJobObject, 24 ) \ - SYSCALL_ENTRY( 0x0079, NtCreateKeyTransacted, 64 ) \ - SYSCALL_ENTRY( 0x007a, NtCreateKeyedEvent, 32 ) \ - SYSCALL_ENTRY( 0x007b, NtCreateLowBoxToken, 72 ) \ - SYSCALL_ENTRY( 0x007c, NtCreateMailslotFile, 64 ) \ - SYSCALL_ENTRY( 0x007d, NtCreateMutant, 32 ) \ - SYSCALL_ENTRY( 0x007e, NtCreateNamedPipeFile, 112 ) \ - SYSCALL_ENTRY( 0x007f, NtCreatePagingFile, 32 ) \ - SYSCALL_ENTRY( 0x0080, NtCreatePort, 40 ) \ - SYSCALL_ENTRY( 0x0081, NtCreateSectionEx, 72 ) \ - SYSCALL_ENTRY( 0x0082, NtCreateSemaphore, 40 ) \ - SYSCALL_ENTRY( 0x0083, NtCreateSymbolicLinkObject, 32 ) \ - SYSCALL_ENTRY( 0x0084, NtCreateThreadEx, 88 ) \ - SYSCALL_ENTRY( 0x0085, NtCreateTimer, 32 ) \ - SYSCALL_ENTRY( 0x0086, NtCreateToken, 104 ) \ - SYSCALL_ENTRY( 0x0087, NtCreateTransaction, 80 ) \ - SYSCALL_ENTRY( 0x0088, NtCreateUserProcess, 88 ) \ - SYSCALL_ENTRY( 0x0089, NtDebugActiveProcess, 16 ) \ - SYSCALL_ENTRY( 0x008a, NtDebugContinue, 24 ) \ - SYSCALL_ENTRY( 0x008b, NtDeleteAtom, 8 ) \ - SYSCALL_ENTRY( 0x008c, NtDeleteFile, 8 ) \ - SYSCALL_ENTRY( 0x008d, NtDeleteKey, 8 ) \ - SYSCALL_ENTRY( 0x008e, NtDeleteValueKey, 16 ) \ - SYSCALL_ENTRY( 0x008f, NtDisplayString, 8 ) \ - SYSCALL_ENTRY( 0x0090, NtFilterToken, 48 ) \ - SYSCALL_ENTRY( 0x0091, NtFlushBuffersFileEx, 40 ) \ - SYSCALL_ENTRY( 0x0092, NtFlushInstructionCache, 24 ) \ - SYSCALL_ENTRY( 0x0093, NtFlushKey, 8 ) \ - SYSCALL_ENTRY( 0x0094, NtFlushProcessWriteBuffers, 0 ) \ - SYSCALL_ENTRY( 0x0095, NtFlushVirtualMemory, 32 ) \ - SYSCALL_ENTRY( 0x0096, NtGetContextThread, 16 ) \ - SYSCALL_ENTRY( 0x0097, NtGetCurrentProcessorNumber, 0 ) \ - SYSCALL_ENTRY( 0x0098, NtGetNextProcess, 40 ) \ - SYSCALL_ENTRY( 0x0099, NtGetNextThread, 48 ) \ - SYSCALL_ENTRY( 0x009a, NtGetNlsSectionPtr, 40 ) \ - SYSCALL_ENTRY( 0x009b, NtGetWriteWatch, 56 ) \ - SYSCALL_ENTRY( 0x009c, NtImpersonateAnonymousToken, 8 ) \ - SYSCALL_ENTRY( 0x009d, NtInitializeNlsFiles, 24 ) \ - SYSCALL_ENTRY( 0x009e, NtInitiatePowerAction, 32 ) \ - SYSCALL_ENTRY( 0x009f, NtListenPort, 16 ) \ - SYSCALL_ENTRY( 0x00a0, NtLoadDriver, 8 ) \ - SYSCALL_ENTRY( 0x00a1, NtLoadKey, 16 ) \ - SYSCALL_ENTRY( 0x00a2, NtLoadKey2, 24 ) \ - SYSCALL_ENTRY( 0x00a3, NtLoadKeyEx, 64 ) \ - SYSCALL_ENTRY( 0x00a4, NtLockFile, 80 ) \ - SYSCALL_ENTRY( 0x00a5, NtLockVirtualMemory, 32 ) \ + SYSCALL_ENTRY( 0x0064, NtAlertMultipleThreadByThreadId, 32 ) \ + SYSCALL_ENTRY( 0x0065, NtAlertResumeThread, 16 ) \ + SYSCALL_ENTRY( 0x0066, NtAlertThread, 8 ) \ + SYSCALL_ENTRY( 0x0067, NtAlertThreadByThreadId, 8 ) \ + SYSCALL_ENTRY( 0x0068, NtAllocateLocallyUniqueId, 8 ) \ + SYSCALL_ENTRY( 0x0069, NtAllocateReserveObject, 24 ) \ + SYSCALL_ENTRY( 0x006a, NtAllocateUuids, 32 ) \ + SYSCALL_ENTRY( 0x006b, NtAllocateVirtualMemoryEx, 56 ) \ + SYSCALL_ENTRY( 0x006c, NtAreMappedFilesTheSame, 16 ) \ + SYSCALL_ENTRY( 0x006d, NtAssignProcessToJobObject, 16 ) \ + SYSCALL_ENTRY( 0x006e, NtCancelIoFileEx, 24 ) \ + SYSCALL_ENTRY( 0x006f, NtCancelSynchronousIoFile, 24 ) \ + SYSCALL_ENTRY( 0x0070, NtCommitTransaction, 16 ) \ + SYSCALL_ENTRY( 0x0071, NtCompareObjects, 16 ) \ + SYSCALL_ENTRY( 0x0072, NtCompareTokens, 24 ) \ + SYSCALL_ENTRY( 0x0073, NtCompleteConnectPort, 8 ) \ + SYSCALL_ENTRY( 0x0074, NtConnectPort, 64 ) \ + SYSCALL_ENTRY( 0x0075, NtContinueEx, 16 ) \ + SYSCALL_ENTRY( 0x0076, NtConvertBetweenAuxiliaryCounterAndPerformanceCounter, 32 ) \ + SYSCALL_ENTRY( 0x0077, NtCreateDirectoryObject, 24 ) \ + SYSCALL_ENTRY( 0x0078, NtCreateIoCompletion, 32 ) \ + SYSCALL_ENTRY( 0x0079, NtCreateJobObject, 24 ) \ + SYSCALL_ENTRY( 0x007a, NtCreateKeyTransacted, 64 ) \ + SYSCALL_ENTRY( 0x007b, NtCreateKeyedEvent, 32 ) \ + SYSCALL_ENTRY( 0x007c, NtCreateLowBoxToken, 72 ) \ + SYSCALL_ENTRY( 0x007d, NtCreateMailslotFile, 64 ) \ + SYSCALL_ENTRY( 0x007e, NtCreateMutant, 32 ) \ + SYSCALL_ENTRY( 0x007f, NtCreateNamedPipeFile, 112 ) \ + SYSCALL_ENTRY( 0x0080, NtCreatePagingFile, 32 ) \ + SYSCALL_ENTRY( 0x0081, NtCreatePort, 40 ) \ + SYSCALL_ENTRY( 0x0082, NtCreateSectionEx, 72 ) \ + SYSCALL_ENTRY( 0x0083, NtCreateSemaphore, 40 ) \ + SYSCALL_ENTRY( 0x0084, NtCreateSymbolicLinkObject, 32 ) \ + SYSCALL_ENTRY( 0x0085, NtCreateThreadEx, 88 ) \ + SYSCALL_ENTRY( 0x0086, NtCreateTimer, 32 ) \ + SYSCALL_ENTRY( 0x0087, NtCreateToken, 104 ) \ + SYSCALL_ENTRY( 0x0088, NtCreateTransaction, 80 ) \ + SYSCALL_ENTRY( 0x0089, NtCreateUserProcess, 88 ) \ + SYSCALL_ENTRY( 0x008a, NtDebugActiveProcess, 16 ) \ + SYSCALL_ENTRY( 0x008b, NtDebugContinue, 24 ) \ + SYSCALL_ENTRY( 0x008c, NtDeleteAtom, 8 ) \ + SYSCALL_ENTRY( 0x008d, NtDeleteFile, 8 ) \ + SYSCALL_ENTRY( 0x008e, NtDeleteKey, 8 ) \ + SYSCALL_ENTRY( 0x008f, NtDeleteValueKey, 16 ) \ + SYSCALL_ENTRY( 0x0090, NtDisplayString, 8 ) \ + SYSCALL_ENTRY( 0x0091, NtFilterToken, 48 ) \ + SYSCALL_ENTRY( 0x0092, NtFlushBuffersFileEx, 40 ) \ + SYSCALL_ENTRY( 0x0093, NtFlushInstructionCache, 24 ) \ + SYSCALL_ENTRY( 0x0094, NtFlushKey, 8 ) \ + SYSCALL_ENTRY( 0x0095, NtFlushProcessWriteBuffers, 0 ) \ + SYSCALL_ENTRY( 0x0096, NtFlushVirtualMemory, 32 ) \ + SYSCALL_ENTRY( 0x0097, NtGetContextThread, 16 ) \ + SYSCALL_ENTRY( 0x0098, NtGetCurrentProcessorNumber, 0 ) \ + SYSCALL_ENTRY( 0x0099, NtGetNextProcess, 40 ) \ + SYSCALL_ENTRY( 0x009a, NtGetNextThread, 48 ) \ + SYSCALL_ENTRY( 0x009b, NtGetNlsSectionPtr, 40 ) \ + SYSCALL_ENTRY( 0x009c, NtGetWriteWatch, 56 ) \ + SYSCALL_ENTRY( 0x009d, NtImpersonateAnonymousToken, 8 ) \ + SYSCALL_ENTRY( 0x009e, NtInitializeNlsFiles, 24 ) \ + SYSCALL_ENTRY( 0x009f, NtInitiatePowerAction, 32 ) \ + SYSCALL_ENTRY( 0x00a0, NtListenPort, 16 ) \ + SYSCALL_ENTRY( 0x00a1, NtLoadDriver, 8 ) \ + SYSCALL_ENTRY( 0x00a2, NtLoadKey, 16 ) \ + SYSCALL_ENTRY( 0x00a3, NtLoadKey2, 24 ) \ + SYSCALL_ENTRY( 0x00a4, NtLoadKeyEx, 64 ) \ + SYSCALL_ENTRY( 0x00a5, NtLockFile, 80 ) \ SYSCALL_ENTRY( 0x00a6, NtCreateDebugObject, 32 ) \ - SYSCALL_ENTRY( 0x00a7, NtMakePermanentObject, 8 ) \ - SYSCALL_ENTRY( 0x00a8, NtMakeTemporaryObject, 8 ) \ - SYSCALL_ENTRY( 0x00a9, NtMapViewOfSectionEx, 72 ) \ - SYSCALL_ENTRY( 0x00aa, NtNotifyChangeDirectoryFile, 72 ) \ - SYSCALL_ENTRY( 0x00ab, NtNotifyChangeKey, 80 ) \ - SYSCALL_ENTRY( 0x00ac, NtNotifyChangeMultipleKeys, 96 ) \ - SYSCALL_ENTRY( 0x00ad, NtOpenIoCompletion, 24 ) \ - SYSCALL_ENTRY( 0x00ae, NtOpenJobObject, 24 ) \ - SYSCALL_ENTRY( 0x00af, NtOpenKeyEx, 32 ) \ - SYSCALL_ENTRY( 0x00b0, NtOpenKeyTransacted, 32 ) \ - SYSCALL_ENTRY( 0x00b1, NtOpenKeyTransactedEx, 40 ) \ - SYSCALL_ENTRY( 0x00b2, NtOpenKeyedEvent, 24 ) \ - SYSCALL_ENTRY( 0x00b3, NtOpenMutant, 24 ) \ - SYSCALL_ENTRY( 0x00b4, NtOpenProcessToken, 24 ) \ - SYSCALL_ENTRY( 0x00b5, NtOpenSemaphore, 24 ) \ - SYSCALL_ENTRY( 0x00b6, NtOpenSymbolicLinkObject, 24 ) \ - SYSCALL_ENTRY( 0x00b7, NtOpenThread, 32 ) \ - SYSCALL_ENTRY( 0x00b8, NtOpenTimer, 24 ) \ - SYSCALL_ENTRY( 0x00b9, NtPrivilegeCheck, 24 ) \ - SYSCALL_ENTRY( 0x00ba, NtPulseEvent, 16 ) \ - SYSCALL_ENTRY( 0x00bb, NtQueryDirectoryObject, 56 ) \ - SYSCALL_ENTRY( 0x00bc, NtQueryEaFile, 72 ) \ - SYSCALL_ENTRY( 0x00bd, NtQueryFullAttributesFile, 16 ) \ - SYSCALL_ENTRY( 0x00be, NtQueryInformationAtom, 40 ) \ - SYSCALL_ENTRY( 0x00bf, NtQueryInformationJobObject, 40 ) \ - SYSCALL_ENTRY( 0x00c0, NtQueryInstallUILanguage, 8 ) \ - SYSCALL_ENTRY( 0x00c1, NtQueryIoCompletion, 40 ) \ - SYSCALL_ENTRY( 0x00c2, NtQueryLicenseValue, 40 ) \ - SYSCALL_ENTRY( 0x00c3, NtQueryMultipleValueKey, 48 ) \ - SYSCALL_ENTRY( 0x00c4, NtQueryMutant, 40 ) \ - SYSCALL_ENTRY( 0x00c5, NtQuerySecurityObject, 40 ) \ - SYSCALL_ENTRY( 0x00c6, NtQuerySemaphore, 40 ) \ - SYSCALL_ENTRY( 0x00c7, NtQuerySymbolicLinkObject, 24 ) \ - SYSCALL_ENTRY( 0x00c8, NtQuerySystemEnvironmentValue, 32 ) \ - SYSCALL_ENTRY( 0x00c9, NtQuerySystemEnvironmentValueEx, 40 ) \ - SYSCALL_ENTRY( 0x00ca, NtQuerySystemInformationEx, 48 ) \ - SYSCALL_ENTRY( 0x00cb, NtQueryTimerResolution, 24 ) \ - SYSCALL_ENTRY( 0x00cc, NtQueueApcThreadEx, 48 ) \ - SYSCALL_ENTRY( 0x00cd, NtQueueApcThreadEx2, 56 ) \ - SYSCALL_ENTRY( 0x00ce, NtRaiseException, 24 ) \ - SYSCALL_ENTRY( 0x00cf, NtRaiseHardError, 48 ) \ - SYSCALL_ENTRY( 0x00d0, NtRegisterThreadTerminatePort, 8 ) \ - SYSCALL_ENTRY( 0x00d1, NtReleaseKeyedEvent, 32 ) \ - SYSCALL_ENTRY( 0x00d2, NtRemoveIoCompletionEx, 48 ) \ - SYSCALL_ENTRY( 0x00d3, NtRemoveProcessDebug, 16 ) \ - SYSCALL_ENTRY( 0x00d4, NtRenameKey, 16 ) \ - SYSCALL_ENTRY( 0x00d5, NtReplaceKey, 24 ) \ - SYSCALL_ENTRY( 0x00d6, NtResetEvent, 16 ) \ - SYSCALL_ENTRY( 0x00d7, NtResetWriteWatch, 24 ) \ - SYSCALL_ENTRY( 0x00d8, NtRestoreKey, 24 ) \ - SYSCALL_ENTRY( 0x00d9, NtResumeProcess, 8 ) \ - SYSCALL_ENTRY( 0x00da, NtRollbackTransaction, 16 ) \ - SYSCALL_ENTRY( 0x00db, NtSaveKey, 16 ) \ - SYSCALL_ENTRY( 0x00dc, NtSecureConnectPort, 72 ) \ - SYSCALL_ENTRY( 0x00dd, NtSetContextThread, 16 ) \ - SYSCALL_ENTRY( 0x00de, NtSetDebugFilterState, 24 ) \ - SYSCALL_ENTRY( 0x00df, NtSetDefaultLocale, 16 ) \ - SYSCALL_ENTRY( 0x00e0, NtSetDefaultUILanguage, 8 ) \ - SYSCALL_ENTRY( 0x00e1, NtSetEaFile, 32 ) \ - SYSCALL_ENTRY( 0x00e2, NtSetInformationDebugObject, 40 ) \ - SYSCALL_ENTRY( 0x00e3, NtSetInformationJobObject, 32 ) \ - SYSCALL_ENTRY( 0x00e4, NtSetInformationKey, 32 ) \ - SYSCALL_ENTRY( 0x00e5, NtSetInformationToken, 32 ) \ - SYSCALL_ENTRY( 0x00e6, NtSetInformationVirtualMemory, 48 ) \ - SYSCALL_ENTRY( 0x00e7, NtSetIntervalProfile, 16 ) \ - SYSCALL_ENTRY( 0x00e8, NtSetIoCompletion, 40 ) \ - SYSCALL_ENTRY( 0x00e9, NtSetIoCompletionEx, 48 ) \ - SYSCALL_ENTRY( 0x00ea, NtSetLdtEntries, 32 ) \ - SYSCALL_ENTRY( 0x00eb, NtSetSecurityObject, 24 ) \ - SYSCALL_ENTRY( 0x00ec, NtSetSystemInformation, 24 ) \ - SYSCALL_ENTRY( 0x00ed, NtSetSystemTime, 16 ) \ - SYSCALL_ENTRY( 0x00ee, NtSetThreadExecutionState, 16 ) \ - SYSCALL_ENTRY( 0x00ef, NtSetTimerResolution, 24 ) \ - SYSCALL_ENTRY( 0x00f0, NtSetVolumeInformationFile, 40 ) \ - SYSCALL_ENTRY( 0x00f1, NtShutdownSystem, 8 ) \ - SYSCALL_ENTRY( 0x00f2, NtSignalAndWaitForSingleObject, 32 ) \ - SYSCALL_ENTRY( 0x00f3, NtSuspendProcess, 8 ) \ - SYSCALL_ENTRY( 0x00f4, NtSuspendThread, 16 ) \ - SYSCALL_ENTRY( 0x00f5, NtSystemDebugControl, 48 ) \ - SYSCALL_ENTRY( 0x00f6, NtTerminateJobObject, 16 ) \ - SYSCALL_ENTRY( 0x00f7, NtTestAlert, 0 ) \ - SYSCALL_ENTRY( 0x00f8, NtTraceControl, 48 ) \ - SYSCALL_ENTRY( 0x00f9, NtUnloadDriver, 8 ) \ - SYSCALL_ENTRY( 0x00fa, NtUnloadKey, 8 ) \ - SYSCALL_ENTRY( 0x00fb, NtUnlockFile, 40 ) \ - SYSCALL_ENTRY( 0x00fc, NtUnlockVirtualMemory, 32 ) \ - SYSCALL_ENTRY( 0x00fd, NtUnmapViewOfSectionEx, 24 ) \ - SYSCALL_ENTRY( 0x00fe, NtWaitForAlertByThreadId, 16 ) \ - SYSCALL_ENTRY( 0x00ff, NtWaitForDebugEvent, 32 ) \ - SYSCALL_ENTRY( 0x0100, NtWaitForKeyedEvent, 32 ) + SYSCALL_ENTRY( 0x00a7, NtLockVirtualMemory, 32 ) \ + SYSCALL_ENTRY( 0x00a8, NtMakePermanentObject, 8 ) \ + SYSCALL_ENTRY( 0x00a9, NtMakeTemporaryObject, 8 ) \ + SYSCALL_ENTRY( 0x00aa, NtMapViewOfSectionEx, 72 ) \ + SYSCALL_ENTRY( 0x00ab, NtNotifyChangeDirectoryFile, 72 ) \ + SYSCALL_ENTRY( 0x00ac, NtNotifyChangeKey, 80 ) \ + SYSCALL_ENTRY( 0x00ad, NtNotifyChangeMultipleKeys, 96 ) \ + SYSCALL_ENTRY( 0x00ae, NtOpenIoCompletion, 24 ) \ + SYSCALL_ENTRY( 0x00af, NtOpenJobObject, 24 ) \ + SYSCALL_ENTRY( 0x00b0, NtOpenKeyEx, 32 ) \ + SYSCALL_ENTRY( 0x00b1, NtOpenKeyTransacted, 32 ) \ + SYSCALL_ENTRY( 0x00b2, NtOpenKeyTransactedEx, 40 ) \ + SYSCALL_ENTRY( 0x00b3, NtOpenKeyedEvent, 24 ) \ + SYSCALL_ENTRY( 0x00b4, NtOpenMutant, 24 ) \ + SYSCALL_ENTRY( 0x00b5, NtOpenProcessToken, 24 ) \ + SYSCALL_ENTRY( 0x00b6, NtOpenSemaphore, 24 ) \ + SYSCALL_ENTRY( 0x00b7, NtOpenSymbolicLinkObject, 24 ) \ + SYSCALL_ENTRY( 0x00b8, NtOpenThread, 32 ) \ + SYSCALL_ENTRY( 0x00b9, NtOpenTimer, 24 ) \ + SYSCALL_ENTRY( 0x00ba, NtPrivilegeCheck, 24 ) \ + SYSCALL_ENTRY( 0x00bb, NtPulseEvent, 16 ) \ + SYSCALL_ENTRY( 0x00bc, NtQueryDirectoryObject, 56 ) \ + SYSCALL_ENTRY( 0x00bd, NtQueryEaFile, 72 ) \ + SYSCALL_ENTRY( 0x00be, NtQueryFullAttributesFile, 16 ) \ + SYSCALL_ENTRY( 0x00bf, NtQueryInformationAtom, 40 ) \ + SYSCALL_ENTRY( 0x00c0, NtQueryInformationJobObject, 40 ) \ + SYSCALL_ENTRY( 0x00c1, NtQueryInstallUILanguage, 8 ) \ + SYSCALL_ENTRY( 0x00c2, NtQueryIoCompletion, 40 ) \ + SYSCALL_ENTRY( 0x00c3, NtQueryLicenseValue, 40 ) \ + SYSCALL_ENTRY( 0x00c4, NtQueryMultipleValueKey, 48 ) \ + SYSCALL_ENTRY( 0x00c5, NtQueryMutant, 40 ) \ + SYSCALL_ENTRY( 0x00c6, NtQuerySecurityObject, 40 ) \ + SYSCALL_ENTRY( 0x00c7, NtQuerySemaphore, 40 ) \ + SYSCALL_ENTRY( 0x00c8, NtQuerySymbolicLinkObject, 24 ) \ + SYSCALL_ENTRY( 0x00c9, NtQuerySystemEnvironmentValue, 32 ) \ + SYSCALL_ENTRY( 0x00ca, NtQuerySystemEnvironmentValueEx, 40 ) \ + SYSCALL_ENTRY( 0x00cb, NtQuerySystemInformationEx, 48 ) \ + SYSCALL_ENTRY( 0x00cc, NtQueryTimerResolution, 24 ) \ + SYSCALL_ENTRY( 0x00cd, NtQueueApcThreadEx, 48 ) \ + SYSCALL_ENTRY( 0x00ce, NtQueueApcThreadEx2, 56 ) \ + SYSCALL_ENTRY( 0x00cf, NtRaiseException, 24 ) \ + SYSCALL_ENTRY( 0x00d0, NtRaiseHardError, 48 ) \ + SYSCALL_ENTRY( 0x00d1, NtRegisterThreadTerminatePort, 8 ) \ + SYSCALL_ENTRY( 0x00d2, NtReleaseKeyedEvent, 32 ) \ + SYSCALL_ENTRY( 0x00d3, NtRemoveIoCompletionEx, 48 ) \ + SYSCALL_ENTRY( 0x00d4, NtRemoveProcessDebug, 16 ) \ + SYSCALL_ENTRY( 0x00d5, NtRenameKey, 16 ) \ + SYSCALL_ENTRY( 0x00d6, NtReplaceKey, 24 ) \ + SYSCALL_ENTRY( 0x00d7, NtResetEvent, 16 ) \ + SYSCALL_ENTRY( 0x00d8, NtResetWriteWatch, 24 ) \ + SYSCALL_ENTRY( 0x00d9, NtRestoreKey, 24 ) \ + SYSCALL_ENTRY( 0x00da, NtResumeProcess, 8 ) \ + SYSCALL_ENTRY( 0x00db, NtRollbackTransaction, 16 ) \ + SYSCALL_ENTRY( 0x00dc, NtSaveKey, 16 ) \ + SYSCALL_ENTRY( 0x00dd, NtSecureConnectPort, 72 ) \ + SYSCALL_ENTRY( 0x00de, NtSetContextThread, 16 ) \ + SYSCALL_ENTRY( 0x00df, NtSetDebugFilterState, 24 ) \ + SYSCALL_ENTRY( 0x00e0, NtSetDefaultLocale, 16 ) \ + SYSCALL_ENTRY( 0x00e1, NtSetDefaultUILanguage, 8 ) \ + SYSCALL_ENTRY( 0x00e2, NtSetEaFile, 32 ) \ + SYSCALL_ENTRY( 0x00e3, NtSetInformationDebugObject, 40 ) \ + SYSCALL_ENTRY( 0x00e4, NtSetInformationJobObject, 32 ) \ + SYSCALL_ENTRY( 0x00e5, NtSetInformationKey, 32 ) \ + SYSCALL_ENTRY( 0x00e6, NtSetInformationToken, 32 ) \ + SYSCALL_ENTRY( 0x00e7, NtSetInformationVirtualMemory, 48 ) \ + SYSCALL_ENTRY( 0x00e8, NtSetIntervalProfile, 16 ) \ + SYSCALL_ENTRY( 0x00e9, NtSetIoCompletion, 40 ) \ + SYSCALL_ENTRY( 0x00ea, NtSetIoCompletionEx, 48 ) \ + SYSCALL_ENTRY( 0x00eb, NtSetLdtEntries, 32 ) \ + SYSCALL_ENTRY( 0x00ec, NtSetSecurityObject, 24 ) \ + SYSCALL_ENTRY( 0x00ed, NtSetSystemInformation, 24 ) \ + SYSCALL_ENTRY( 0x00ee, NtSetSystemTime, 16 ) \ + SYSCALL_ENTRY( 0x00ef, NtSetThreadExecutionState, 16 ) \ + SYSCALL_ENTRY( 0x00f0, NtSetTimerResolution, 24 ) \ + SYSCALL_ENTRY( 0x00f1, NtSetVolumeInformationFile, 40 ) \ + SYSCALL_ENTRY( 0x00f2, NtShutdownSystem, 8 ) \ + SYSCALL_ENTRY( 0x00f3, NtSignalAndWaitForSingleObject, 32 ) \ + SYSCALL_ENTRY( 0x00f4, NtSuspendProcess, 8 ) \ + SYSCALL_ENTRY( 0x00f5, NtSuspendThread, 16 ) \ + SYSCALL_ENTRY( 0x00f6, NtSystemDebugControl, 48 ) \ + SYSCALL_ENTRY( 0x00f7, NtTerminateJobObject, 16 ) \ + SYSCALL_ENTRY( 0x00f8, NtTestAlert, 0 ) \ + SYSCALL_ENTRY( 0x00f9, NtTraceControl, 48 ) \ + SYSCALL_ENTRY( 0x00fa, NtUnloadDriver, 8 ) \ + SYSCALL_ENTRY( 0x00fb, NtUnloadKey, 8 ) \ + SYSCALL_ENTRY( 0x00fc, NtUnlockFile, 40 ) \ + SYSCALL_ENTRY( 0x00fd, NtUnlockVirtualMemory, 32 ) \ + SYSCALL_ENTRY( 0x00fe, NtUnmapViewOfSectionEx, 24 ) \ + SYSCALL_ENTRY( 0x00ff, NtWaitForAlertByThreadId, 16 ) \ + SYSCALL_ENTRY( 0x0100, NtWaitForDebugEvent, 32 ) \ + SYSCALL_ENTRY( 0x0101, NtWaitForKeyedEvent, 32 ) #else #define ALL_SYSCALLS ALL_SYSCALLS32 #endif diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 45387d86f11..566a8d0ec5e 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -347,6 +347,7 @@ DEFINE_SYSCALL(NtAccessCheckByTypeAndAuditAlarm, (UNICODE_STRING *subsystem, HAN DEFINE_SYSCALL(NtAddAtom, (const WCHAR *name, ULONG length, RTL_ATOM *atom)) DEFINE_SYSCALL(NtAdjustGroupsToken, (HANDLE token, BOOLEAN reset, TOKEN_GROUPS *groups, ULONG length, TOKEN_GROUPS *prev, ULONG *retlen)) DEFINE_SYSCALL(NtAdjustPrivilegesToken, (HANDLE token, BOOLEAN disable, TOKEN_PRIVILEGES *privs, DWORD length, TOKEN_PRIVILEGES *prev, DWORD *retlen)) +DEFINE_SYSCALL(NtAlertMultipleThreadByThreadId, (HANDLE *tids, ULONG count, void *unk1, void *unk2)) DEFINE_SYSCALL(NtAlertResumeThread, (HANDLE handle, ULONG *count)) DEFINE_SYSCALL(NtAlertThread, (HANDLE handle)) DEFINE_SYSCALL(NtAlertThreadByThreadId, (HANDLE tid)) diff --git a/dlls/ntdll/tests/sync.c b/dlls/ntdll/tests/sync.c index a443c581bca..61b393d6465 100644 --- a/dlls/ntdll/tests/sync.c +++ b/dlls/ntdll/tests/sync.c @@ -26,6 +26,7 @@ #include "winternl.h" #include "wine/test.h"
+static NTSTATUS (WINAPI *pNtAlertMultipleThreadByThreadId)( HANDLE *, ULONG, void *, void * ); static NTSTATUS (WINAPI *pNtAlertThreadByThreadId)( HANDLE ); static NTSTATUS (WINAPI *pNtClose)( HANDLE ); static NTSTATUS (WINAPI *pNtCreateEvent) ( PHANDLE, ACCESS_MASK, const OBJECT_ATTRIBUTES *, EVENT_TYPE, BOOLEAN); @@ -775,12 +776,22 @@ static DWORD WINAPI tid_alert_thread( void *arg ) return 0; }
+static DWORD WINAPI tid_wait_alert_thread( void *arg ) +{ + NTSTATUS ret; + + ret = pNtWaitForAlertByThreadId( (void *)0x123, NULL ); + ok(ret == STATUS_ALERTED, "got %#lx\n", ret); + return 0; +} + static void test_tid_alert( char **argv ) { LARGE_INTEGER timeout = {{0}}; char cmdline[MAX_PATH]; STARTUPINFOA si = {0}; PROCESS_INFORMATION pi; + HANDLE tids[2]; HANDLE thread; NTSTATUS ret; DWORD tid; @@ -841,6 +852,43 @@ static void test_tid_alert( char **argv ) ok(!WaitForSingleObject( pi.hProcess, 1000 ), "wait failed\n"); CloseHandle( pi.hProcess ); CloseHandle( pi.hThread ); + + if (!pNtAlertMultipleThreadByThreadId) + { + win_skip( "NtAlertMultipleThreadByThreadId is not avaliable.\n" ); + return; + } + + timeout.QuadPart = 0; + ret = pNtAlertMultipleThreadByThreadId( NULL, 0, NULL, NULL ); + ok( !ret, "got %#lx.\n", ret ); + ret = pNtAlertMultipleThreadByThreadId( NULL, 1, NULL, NULL ); + ok( ret == STATUS_ACCESS_VIOLATION, "got %#lx.\n", ret ); + + ret = pNtWaitForAlertByThreadId( (HANDLE)(ULONG_PTR)GetCurrentThreadId(), &timeout ); + ok(ret == STATUS_TIMEOUT, "got %#lx\n", ret); + tids[0] = (HANDLE)(ULONG_PTR)GetCurrentThreadId(); + tids[1] = (HANDLE)0xdeadbeef; + ret = pNtAlertMultipleThreadByThreadId( tids, 2, NULL, NULL ); + ok( ret == STATUS_INVALID_CID, "got %#lx.\n", ret ); + ret = pNtWaitForAlertByThreadId( (HANDLE)(ULONG_PTR)GetCurrentThreadId(), &timeout ); + ok(ret == STATUS_TIMEOUT, "got %#lx\n", ret); + tids[1] = tids[0]; + ret = pNtAlertMultipleThreadByThreadId( tids, 2, NULL, NULL ); + ok( !ret, "got %#lx.\n", ret ); + ret = pNtWaitForAlertByThreadId( (HANDLE)(ULONG_PTR)GetCurrentThreadId(), &timeout ); + ok(ret == STATUS_ALERTED, "got %#lx\n", ret); + ret = pNtWaitForAlertByThreadId( (HANDLE)(ULONG_PTR)GetCurrentThreadId(), &timeout ); + ok(ret == STATUS_TIMEOUT, "got %#lx\n", ret); + + thread = CreateThread( NULL, 0, tid_wait_alert_thread, (HANDLE)(DWORD_PTR)GetCurrentThreadId(), 0, &tid ); + tids[1] = (HANDLE)(ULONG_PTR)tid; + ret = pNtAlertMultipleThreadByThreadId( tids, 2, NULL, NULL ); + ok( !ret, "got %#lx.\n", ret ); + ret = pNtWaitForAlertByThreadId( (HANDLE)(ULONG_PTR)GetCurrentThreadId(), &timeout ); + ok(ret == STATUS_ALERTED, "got %#lx\n", ret); + WaitForSingleObject( thread, INFINITE ); + CloseHandle( thread ); }
struct test_completion_port_scheduling_param @@ -1144,6 +1192,7 @@ START_TEST(sync)
if (argc > 2) return;
+ pNtAlertMultipleThreadByThreadId = (void *)GetProcAddress(module, "NtAlertMultipleThreadByThreadId"); pNtAlertThreadByThreadId = (void *)GetProcAddress(module, "NtAlertThreadByThreadId"); pNtClose = (void *)GetProcAddress(module, "NtClose"); pNtCreateEvent = (void *)GetProcAddress(module, "NtCreateEvent"); diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index 07ffe854104..a56d0a10cc8 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -3392,6 +3392,14 @@ static unsigned int handle_to_index( HANDLE handle, unsigned int *block_idx ) return idx % TID_ALERT_BLOCK_SIZE; }
+static BOOL is_alert_tid_valid( HANDLE tid ) +{ + unsigned int block_idx; + + handle_to_index( tid, &block_idx ); + return block_idx <= ARRAY_SIZE(tid_alert_blocks); +} + static union tid_alert_entry *get_tid_alert_entry( HANDLE tid ) { unsigned int block_idx, idx = handle_to_index( tid, &block_idx ); @@ -3462,6 +3470,25 @@ static union tid_alert_entry *get_tid_alert_entry( HANDLE tid ) }
+/*********************************************************************** + * NtAlertMultipleThreadByThreadId (NTDLL.@) + */ +NTSTATUS WINAPI NtAlertMultipleThreadByThreadId( HANDLE *tids, ULONG count, void *unk1, void *unk2 ) +{ + unsigned int i; + + TRACE( "%p %d %p %p\n", tids, (int)count, unk1, unk2 ); + + if (unk1 || unk2) FIXME( "unk1 %p, unk2 %p.\n", unk1, unk2 ); + for (i = 0; i < count; ++i) + { + if (!is_alert_tid_valid( tids[i] )) return STATUS_INVALID_CID; + } + for (i = 0; i < count; ++i) NtAlertThreadByThreadId( tids[i] ); + return STATUS_SUCCESS; +} + + /*********************************************************************** * NtAlertThreadByThreadId (NTDLL.@) */ diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index f5173f8df10..6172810bdee 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -269,6 +269,26 @@ void put_vm_counters( VM_COUNTERS_EX32 *info32, const VM_COUNTERS_EX *info, ULON }
+/********************************************************************** + * wow64_NtAlertMultipleThreadByThreadId + */ +NTSTATUS WINAPI wow64_NtAlertMultipleThreadByThreadId( UINT *args ) +{ + LONG *handles_ptr = get_ptr( &args ); + ULONG count = get_ulong( &args ); + void *unk1 = get_ptr( &args ); + void *unk2 = get_ptr( &args ); + HANDLE handles_buf[256], *handles; + unsigned int i; + + if (count <= ARRAY_SIZE(handles_buf)) handles = handles_buf; + else handles = Wow64AllocateTemp( count * sizeof(*handles) ); + for (i = 0; i < count; ++i) handles[i] = (HANDLE)(ULONG_PTR)handles_ptr[i]; + + return NtAlertMultipleThreadByThreadId( handles, count, unk1, unk2 ); +} + + /********************************************************************** * wow64_NtAlertResumeThread */ diff --git a/include/winternl.h b/include/winternl.h index 2c985465096..cc6dea9a0d8 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -4505,6 +4505,7 @@ NTSYSAPI NTSTATUS WINAPI NtAccessCheckByTypeAndAuditAlarm(UNICODE_STRING*,HANDL NTSYSAPI NTSTATUS WINAPI NtAddAtom(const WCHAR*,ULONG,RTL_ATOM*); NTSYSAPI NTSTATUS WINAPI NtAdjustGroupsToken(HANDLE,BOOLEAN,PTOKEN_GROUPS,ULONG,PTOKEN_GROUPS,PULONG); NTSYSAPI NTSTATUS WINAPI NtAdjustPrivilegesToken(HANDLE,BOOLEAN,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD); +NTSYSAPI NTSTATUS WINAPI NtAlertMultipleThreadByThreadId(HANDLE*,ULONG,void*,void*); NTSYSAPI NTSTATUS WINAPI NtAlertResumeThread(HANDLE,PULONG); NTSYSAPI NTSTATUS WINAPI NtAlertThread(HANDLE ThreadHandle); NTSYSAPI NTSTATUS WINAPI NtAlertThreadByThreadId(HANDLE);
From: Paul Gofman pgofman@codeweavers.com
--- dlls/ntdll/sync.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-)
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c index 1bd62612efe..0aa94d326c3 100644 --- a/dlls/ntdll/sync.c +++ b/dlls/ntdll/sync.c @@ -931,8 +931,8 @@ void WINAPI RtlWakeAddressAll( const void *addr ) { struct futex_queue *queue = get_futex_queue( addr ); struct futex_entry *entry, *next; - unsigned int count = 0, i; - DWORD tids[256]; + unsigned int count = 0; + HANDLE tids[256];
TRACE("%p\n", addr);
@@ -949,19 +949,18 @@ void WINAPI RtlWakeAddressAll( const void *addr ) { entry->addr = NULL; list_remove( &entry->entry ); - /* Try to buffer wakes, so that we don't make a system call while - * holding a spinlock. */ - if (count < ARRAY_SIZE(tids)) - tids[count++] = entry->tid; - else - NtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)entry->tid ); + if (count == ARRAY_SIZE(tids)) + { + NtAlertMultipleThreadByThreadId( tids, count, NULL, NULL ); + count = 0; + } + tids[count++] = (HANDLE)(ULONG_PTR)entry->tid; } }
spin_unlock( &queue->lock ); - - for (i = 0; i < count; ++i) - NtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)tids[i] ); + if (count) + NtAlertMultipleThreadByThreadId( tids, count, NULL, NULL ); }
/***********************************************************************
Looks good to me. I wouldn't get rid of the comment, personally—we do still want to avoid making syscalls with a spinlock held.
This merge request was approved by Elizabeth Figura.
My logic under removing that comment was that before this MR the use of intermediate array and alerting after the loop was some added local array code, and comment probably served for explicitly justifying these additions. With the MR there is no special case for handling inside or outside spin lock. This way I'd probably need to change the comment to explain why we won't remove the array and just use NtAlertThreadById always, but that is probably obvious, and we usually don't comment on such things? Of course I can add those considerations (avoid multiple syscalls and especially syscalls in spin lock) back to comment if it feels better,
My logic under removing that comment was that before this MR the use of intermediate array and alerting after the loop was some added local array code, and comment probably served for explicitly justifying these additions. With the MR there is no special case for handling inside or outside spin lock.
There is, though? We do the last wake outside the lock, vectored or not. We'd do the whole wake outside the lock if we could, but we don't know how large it'll have to be.
If we'd pretend for a second we can just remove spin lock there, it wouldn't change anything in that code once we use NtAlertMultipleThreadByThreadId to group waits? We'd be still adding to an array while we can, calling NtAlertMultipleThreadByThreadId if it overflows or after the loop to submit what we have left.
If we'd pretend for a second we can just remove spin lock there, it wouldn't change anything in that code once we use NtAlertMultipleThreadByThreadId to group wakes? We'd be still adding to an array while we can, calling NtAlertMultipleThreadByThreadId if it overflows or after the loop to submit what we have left.
Correct. But it *does* change where we put the lock/unlock. We could unlock after doing the final alert, but we explicitly don't want to do that.
Oh, but it seems to me that would be a bit different comment with a bit different meaning: the important part to say here is not the previous text but, at spin_unlock, something like "Try not to make a system call while holding a spinlock, even while releasing spin lock here may be responsible for spurious wakeup"? Anyway, if you feel like it is better to add this comment or something else, not like I am really against.