<INTRO>
A partir de Windows Vista se puede "elegir" el proceso padre para un nuevo proceso (siempre que se tenga permisos para abrir el proceso).
</INTRO>
Corta,ehh? xD El caso es que lo he estado probando en Windows 7 x64 y me funciona con la versión ANSI (CreateProcessA) pero no con CreateProcessW. El código que uso es éste:
Código:
/* ... */
if(SysGetVersion() < OSV_WIN_VISTA)
{
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
if(!pwzExePath || lstrlenW(pwzExePath) > MAX_PATH)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
STARTUPINFOEXW st = { sizeof(STARTUPINFOEXW) };
GetStartupInfoW(&st.StartupInfo);
PROCESS_INFORMATION pci;
SIZE_T cbList = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &cbList);
st.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(SYS_HEAP, 0, cbList);
DBG_ASSERT(st.lpAttributeList);
InitializeProcThreadAttributeList(st.lpAttributeList, 1, 0, &cbList);
UpdateProcThreadAttribute(st.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &hParent, sizeof(HANDLE),
NULL, NULL);
DBG_MSGBOX_TRACE_W(pwzExePath);
BOOL bRet = CreateProcessW(NULL, L"C:\\Windows\\system32\\cmd.exe" /*pwzExePath*/, NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT,
NULL, NULL, &st.StartupInfo, &pci);
DeleteProcThreadAttributeList(st.lpAttributeList);
HeapFree(SYS_HEAP, 0, st.lpAttributeList);
if(bRet)
{
DBG_MSGBOX_TRACE("No error");
CloseHandle(pci.hProcess);
CloseHandle(pci.hThread);
}
else
DBG_MSGBOX_TRACE("Error");
return bRet;
if(SysGetVersion() < OSV_WIN_VISTA)
{
SetLastError(ERROR_NOT_SUPPORTED);
return FALSE;
}
if(!pwzExePath || lstrlenW(pwzExePath) > MAX_PATH)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
STARTUPINFOEXW st = { sizeof(STARTUPINFOEXW) };
GetStartupInfoW(&st.StartupInfo);
PROCESS_INFORMATION pci;
SIZE_T cbList = 0;
InitializeProcThreadAttributeList(NULL, 1, 0, &cbList);
st.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(SYS_HEAP, 0, cbList);
DBG_ASSERT(st.lpAttributeList);
InitializeProcThreadAttributeList(st.lpAttributeList, 1, 0, &cbList);
UpdateProcThreadAttribute(st.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &hParent, sizeof(HANDLE),
NULL, NULL);
DBG_MSGBOX_TRACE_W(pwzExePath);
BOOL bRet = CreateProcessW(NULL, L"C:\\Windows\\system32\\cmd.exe" /*pwzExePath*/, NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT,
NULL, NULL, &st.StartupInfo, &pci);
DeleteProcThreadAttributeList(st.lpAttributeList);
HeapFree(SYS_HEAP, 0, st.lpAttributeList);
if(bRet)
{
DBG_MSGBOX_TRACE("No error");
CloseHandle(pci.hProcess);
CloseHandle(pci.hThread);
}
else
DBG_MSGBOX_TRACE("Error");
return bRet;
Nota: supongo que debe de ser algo relacionado con la especificacion del tamaño de las estructuras, pero como todavía no hay un ollydbg para x64 y no me aclaro con el windbg (y se cuelga mucho, no se si solo me pasa a mi), no he podido debuggearlo