NtWorkerFactoryWorkerReady
Signalisiert dem Kernel, dass ein Threadpool-Worker arbeitsbereit ist — Teil des internen ntdll!TppWorkerThread-Handshakes.
Prototyp
NTSTATUS NtWorkerFactoryWorkerReady( HANDLE WorkerFactoryHandle );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| WorkerFactoryHandle | HANDLE | in | Handle auf die Worker Factory, zu der dieser Worker-Thread gehört. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0x1 | win10-1507 |
| Win10 1607 | 0x1 | win10-1607 |
| Win10 1703 | 0x1 | win10-1703 |
| Win10 1709 | 0x1 | win10-1709 |
| Win10 1803 | 0x1 | win10-1803 |
| Win10 1809 | 0x1 | win10-1809 |
| Win10 1903 | 0x1 | win10-1903 |
| Win10 1909 | 0x1 | win10-1909 |
| Win10 2004 | 0x1 | win10-2004 |
| Win10 20H2 | 0x1 | win10-20h2 |
| Win10 21H1 | 0x1 | win10-21h1 |
| Win10 21H2 | 0x1 | win10-21h2 |
| Win10 22H2 | 0x1 | win10-22h2 |
| Win11 21H2 | 0x1 | win11-21h2 |
| Win11 22H2 | 0x1 | win11-22h2 |
| Win11 23H2 | 0x1 | win11-23h2 |
| Win11 24H2 | 0x1 | win11-24h2 |
| Server 2016 | 0x1 | winserver-2016 |
| Server 2019 | 0x1 | winserver-2019 |
| Server 2022 | 0x1 | winserver-2022 |
| Server 2025 | 0x1 | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 01 00 00 00 mov eax, 0x1 F6 04 25 08 03 FE 7F 01 test byte ptr [0x7FFE0308], 1 75 03 jne short +3 0F 05 syscall C3 ret CD 2E int 2Eh C3 ret
Undokumentierte Hinweise
Die stabilste Syscall-Nummer der gesamten Tabelle — `0x1` seit Windows 7. Sie wird ausschließlich von `ntdll!TppWorkerThread` (der kanonischen StartRoutine jeder Worker Factory) aufgerufen und teilt dem Kernel mit: „dieser Worker hat seinen letzten Dispatch beendet, dekrementiere meinen Pending-Zähler, ich gehe zurück in NtWaitForWorkViaWorkerFactory“. Die Buchführung erlaubt dem Kernel zu entscheiden, ob mehr Worker erzeugt, leerlaufende stillgelegt oder die Anzahl konstant gehalten werden soll.
Häufige Malware-Nutzung
Wird von Malware praktisch nie direkt aufgerufen — er ist Teil der internen Threadpool-Buchführung und ergibt nur im Kontext einer echten `TppWorkerThread`-Schleife Sinn. Ausnahme: PoolParty-Varianten, bei denen der Shellcode selbst den Worker-Handshake emuliert, um die Buchführung des Threadpools (und damit die Reaktionsfähigkeit des Elternprozesses) nach Übernahme eines Workers konsistent zu halten. Das Auslassen des Ready/Wait/Release-Zyklus lässt den `PendingWorkerCount` des Kernels driften und kann dadurch den Rest des Opfer-Threadpools aushungern — beobachtbar als hängende Anwendung.
Erkennungsmöglichkeiten
Isoliert praktisch nicht erkennbar — jeder Windows-Prozess mit CRT, .NET-Runtime oder COM-Apartment emittiert tausende pro Sekunde. Detektion wird nur möglich, wenn er *fehlt*: eine Worker Factory, deren Ready-Zähler nie steigt, während ihr Completion-Port entleert wird, weist darauf hin, dass etwas den Handshake umgeht (ein PoolParty-Shellcode, der die Schleife nicht emuliert hat, oder ein Debugger, der einen Worker hält). Eine Heuristik, kein Primärsignal.
Direkte Syscall-Beispiele
cSkeleton of ntdll!TppWorkerThread
// Approximate reverse of the user-mode loop driven by NtCreateWorkerFactory.
// Do NOT call directly — this is what TppWorkerThread does on every worker.
VOID WINAPI TppWorkerThreadLike(PVOID context) {
HANDLE hWf = ((PTHREADPOOL_INTERNAL)context)->WorkerFactoryHandle;
for (;;) {
FILE_IO_COMPLETION_INFORMATION info;
NTSTATUS s = NtWaitForWorkViaWorkerFactory(hWf, &info);
if (!NT_SUCCESS(s)) break;
// Dispatch the callback that info.KeyContext encodes.
DispatchCallback(&info);
// Tell the kernel we're done and ready for the next item.
NtWorkerFactoryWorkerReady(hWf);
}
}asmx64 direct stub (SSN 0x1)
; Stable across every Windows 10/11 build.
NtWorkerFactoryWorkerReady PROC
mov r10, rcx
mov eax, 1
syscall
ret
NtWorkerFactoryWorkerReady ENDPMITRE ATT&CK-Mappings
Last verified: 2026-05-20