I use code from example in this answer. It works.
But I need to redirect standart input/output into files. Process startup info struct has fields:
public IntPtr hStdInput;
public IntPtr hStdOutput;
public IntPtr hStdError;
I tried something like this:
StartupInfo startupInfo = new StartupInfo();
startupInfo.cb = Marshal.SizeOf((object)startupInfo);
startupInfo.dwFlags = 128;
FileStream fs = new FileStream(filePath, FileMode.Open);
startupInfo.hStdInput = fs.Handle;
And it does not work.
How can I pass file as standart input/output?
UPD1.
How do I call CreateProccess:
StartupInfo startupInfo = new StartupInfo();
startupInfo.cb = Marshal.SizeOf((object)startupInfo);
startupInfo.dwFlags = 128;
FileStream fs = new FileStream(filePath, FileMode.Open);
startupInfo.hStdInput = fs.Handle;
Pinvoke.SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT | ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX);
CreationFlags dwCreationFlags = CreationFlags.CREATE_BREAKAWAY_FROM_JOB | CreationFlags.CREATE_SUSPENDED | CreationFlags.CREATE_SEPARATE_WOW_VDM;
SecurityAttributes securityAttributes = new SecurityAttributes();
securityAttributes.bInheritHandle = 1;
ProcessInformation pi;
if (!Pinvoke.CreateProcess(null, configuration.RunString, ref securityAttributes, ref securityAttributes, boolInheritHandles: true, dwCreationFlags: dwCreationFlags, lpEnvironment: IntPtr.Zero, lpszCurrentDir: configuration.Directory, startupInfo: ref startupInfo, pi: out pi))
throw new Win32Exception(Marshal.GetLastWin32Error());
UPD2.
I added SetHandleInformation
call, but it does not help:
FileStream fs = new FileStream(@"C:\input.txt", FileMode.Open, FileAccess.Read);
Pinvoke.SetHandleInformation(fs.Handle, 0x00000001, 0x00000001);
startupInfo.hStdInput = fs.Handle;