ERROR_INVALID_HANDLE al llamar a GetModuleFileNameEx después de CreateProcess

Después de una llamada exitosa a CreateProcess, estoy tratando de obtener la ruta del proceso creado usando GetModuleFileNameEx (los parámetros lpApplicationName y lpCommandLine pueden variar o ser nulos, por lo que no son confiables en este caso). El problema es que GetModuleFileNameEx falla con el error 6 (ERROR_INVALID_HANDLE), dejando su búfer con datos no válidos. No puedo entender el motivo, ya que CreateProcess tiene éxito y el identificador del proceso debería haberse guardado correctamente en pi.hProcess.

Espero que puedas arrojar algo de luz, gracias de antemano!

EDITAR: Una actualización: noté que al eliminar CREATE_SUSPENDED también se elimina este problema, pero necesito ese indicador establecido. ¿Como lo puedo hacer?

// Defining GetModuleFileNameExA function typedef DWORD (WINAPI *fGetModuleFileNameExA) ( HANDLE hProcess, HMODULE hModule, LPSTR lpFilename, DWORD nSize ); //Load dinamically DLL function on program startup: fGetModuleFileNameExA _GetModuleFileNameExA = (fGetModuleFileNameExA) GetProcAddress( LoadLibraryA("Psapi.dll"), "GetModuleFileNameExA"); // **** OTHER UNRELATED CODE HERE **** PROCESS_INFORMATION pi; //This call succeeds if (!CreateProcessW( ApplicationName, CommandLine, NewProcess.lpProcessAttributes, NewProcess.lpThreadAttributes, NewProcess.bInheritHandles, CREATE_SUSPENDED | CREATE_NEW_CONSOLE, NULL, CurrentDirectory, &NewProcess.bufStartupInfo, &pi) ) MessageBoxA(0, "Error creating process", "", 0); char ProcessPath[MAX_PATH]; //Problem here: call fails with error 6 if (!_GetModuleFileNameExA(pi.hProcess, NULL, ProcessPath, MAX_PATH)) {GetLastError();} //Invalid data is displayed MessageBoxA(0, ProcessPath, "GetModuleFileNameEx",0); 

De la documentación de CreateProcess en MSDN:

Tenga en cuenta que la función vuelve antes de que el proceso haya finalizado la inicialización. Si no se puede localizar una DLL requerida o no se puede inicializar, el proceso se termina. Para obtener el estado de terminación de un proceso, llame a GetExitCodeProcess .

El subproceso que llama puede usar la función WaitForInputIdle para esperar hasta que el nuevo proceso haya finalizado su inicialización y esté esperando la entrada del usuario sin ninguna entrada pendiente. Esto puede ser útil para la sincronización entre los procesos padre e hijo, porque CreateProcess regresa sin esperar a que el nuevo proceso termine su inicialización. Por ejemplo, el proceso de creación usaría WaitForInputIdle antes de intentar encontrar una ventana asociada con el nuevo proceso.

Pregunta similar