#include <9pm/windows.h>
#include <9pm/u.h>
#include <9pm/libc.h>
BOOL WINAPI
CreateProcess(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags,
LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation)
{
char *app, *cmd, *cd;
Rune *rp;
char *env, *p;
STARTUPINFOA si;
int n;
BOOL b;
if(win_useunicode)
return CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes,
lpThreadAttributes, bInheritHandles, dwCreationFlags,
lpEnvironment, lpCurrentDirectory, lpStartupInfo,
lpProcessInformation);
app = 0;
if(lpApplicationName)
app = win_wstr2utf(lpApplicationName);
cmd = 0;
if(lpApplicationName)
cmd = win_wstr2utf(lpCommandLine);
cd = 0;
if(lpCurrentDirectory)
cd = win_wstr2utf(lpCurrentDirectory);
memcpy(&si, lpStartupInfo, sizeof(si));
if(lpStartupInfo->lpDesktop)
si.lpDesktop = win_wstr2utf(lpStartupInfo->lpDesktop);
if(lpStartupInfo->lpTitle)
si.lpTitle = win_wstr2utf(lpStartupInfo->lpTitle);
if(lpEnvironment) {
for(rp=lpEnvironment,n=0; !(rp[0]==0 && rp[1]==0); rp++)
n += runelen(*rp);
n+=2;
env = win_malloc(n);
for(rp=lpEnvironment,p=env; !(rp[0]==0 && rp[1]==0); rp++)
p += runetochar(p, rp);
*p++ = 0;
*p++ = 0;
} else
env = 0;
b = CreateProcessA(app, cmd, lpProcessAttributes,
lpThreadAttributes, bInheritHandles, dwCreationFlags,
env, cd, &si,
lpProcessInformation);
win_free(env);
win_free(cmd);
win_free(app);
win_free(cd);
win_free(si.lpDesktop);
win_free(si.lpTitle);
return b;
}
syntax highlighted by Code2HTML, v. 0.9.1