TL;DR Use GetProcessVersion
.
All of these function are available in Windows XP [desktop apps | UWP apps].
GetProcessVersion
uses a Process ID and returns 0 if the process of the given id is not running.
GetExitCodeProcess
uses a Process handle and gives you the process exit code, if the code is STILL_ACTIVE (259) the process is still running so you could check if it is not STILL_ACTIVE (259) meaning that the process is not running. This is likely to work in basically every situation, unless the process exits with code 259.
WaitForSingleObject
uses a Process handle with the SYNCHRONIZE access right and returns 0 if the process is not running. You should not specify INFINITE for the dwMilliseconds parameter because the function would not return until the process state became signaled(process is terminated).