winapi - Windows: Atomisk suspendere en hel proces?

Indlæg af Hanne Mølgaard Plasc

Problem



Ved hjælp af Win32 API er det kun muligt at suspendere en enkelt tråd ved hjælp af SuspendThread(), men ikke en komplet proces i ét opkald.

Iterating over en proces tråde og suspendere dem en ad gangen er ikke en god mulighed, da det kan forårsage dødlås og uventet opførsel.


Dette er meningen at være noget, der er muligt i kernel ved hjælp af en funktion fra DDK (som jeg ikke kan huske sit navn).

Hvordan er det muligt at udsætte denne funktion til brugermodus?


Er der nogen anden måde at opnå dette uden at gå til kernen?


SysInternals proces explorer har mulighed for at suspendere processen. Hvordan gør det det?

Bedste reference


Undokumenteret funktion NtSuspendProcess i ntdll.dll lyder som hvad du leder efter. Sysinternals pssuspend og proces explorer begge benytter sig af dette.


De sædvanlige advarsler om ukodede funktioner gælder.


Dette svar har nogle flere detaljer:
Hvordan kan jeg fryse udførelsen af ​​et program?

Andre referencer 1


Faktisk er det præcis, hvad MiniDumpWriteDump ser ud til at gøre - det suspenderer alle tråde i processen (undtagen opkaldstråden) individuelt, før det skaber et dump. [4]


Dette alene må ikke forårsage en dødlås eller uventet opførsel, selvom det selvfølgelig nok er bedst at gøre det fra en separat proces.