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..e431886aee2 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( (void *)GetCurrentThreadId(), &timeout ); + ok(ret == STATUS_TIMEOUT, "got %#lx\n", ret); + tids[0] = (HANDLE)GetCurrentThreadId(); + tids[1] = (HANDLE)0xdeadbeef; + ret = pNtAlertMultipleThreadByThreadId( tids, 2, NULL, NULL ); + ok( ret == STATUS_INVALID_CID, "got %#lx.\n", ret ); + ret = pNtWaitForAlertByThreadId( (void *)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( (void *)GetCurrentThreadId(), &timeout ); + ok(ret == STATUS_ALERTED, "got %#lx\n", ret); + ret = pNtWaitForAlertByThreadId( (void *)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)tid; + ret = pNtAlertMultipleThreadByThreadId( tids, 2, NULL, NULL ); + ok( !ret, "got %#lx.\n", ret ); + ret = pNtWaitForAlertByThreadId( (void *)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);