MCPcopy Index your code
hub / github.com/RustPython/RustPython / CreateProcess

Function CreateProcess

crates/vm/src/stdlib/_winapi.rs:257–356  ·  view source on GitHub ↗
(
        args: CreateProcessArgs,
        vm: &VirtualMachine,
    )

Source from the content-addressed store, hash-verified

255
256 #[pyfunction]
257 fn CreateProcess(
258 args: CreateProcessArgs,
259 vm: &VirtualMachine,
260 ) -> PyResult<(WinHandle, WinHandle, u32, u32)> {
261 let mut si: windows_sys::Win32::System::Threading::STARTUPINFOEXW =
262 unsafe { core::mem::zeroed() };
263 si.StartupInfo.cb = core::mem::size_of_val(&si) as _;
264
265 macro_rules! si_attr {
266 ($attr:ident, $t:ty) => {{
267 si.StartupInfo.$attr = <Option<$t>>::try_from_object(
268 vm,
269 args.startup_info.get_attr(stringify!($attr), vm)?,
270 )?
271 .unwrap_or(0) as _
272 }};
273 ($attr:ident) => {{
274 si.StartupInfo.$attr = <Option<_>>::try_from_object(
275 vm,
276 args.startup_info.get_attr(stringify!($attr), vm)?,
277 )?
278 .unwrap_or(0)
279 }};
280 }
281 si_attr!(dwFlags);
282 si_attr!(wShowWindow);
283 si_attr!(hStdInput, isize);
284 si_attr!(hStdOutput, isize);
285 si_attr!(hStdError, isize);
286
287 let mut env = args
288 .env_mapping
289 .map(|m| getenvironment(m, vm))
290 .transpose()?;
291 let env = env.as_mut().map_or_else(null_mut, |v| v.as_mut_ptr());
292
293 let mut attrlist =
294 getattributelist(args.startup_info.get_attr("lpAttributeList", vm)?, vm)?;
295 si.lpAttributeList = attrlist
296 .as_mut()
297 .map_or_else(null_mut, |l| l.attrlist.as_mut_ptr() as _);
298
299 let wstr = |s: PyStrRef| {
300 let ws = widestring::WideCString::from_str(s.expect_str())
301 .map_err(|err| err.to_pyexception(vm))?;
302 Ok(ws.into_vec_with_nul())
303 };
304
305 // Validate no embedded null bytes in command name and command line
306 if let Some(ref name) = args.name
307 && name.as_bytes().contains(&0)
308 {
309 return Err(crate::exceptions::cstring_error(vm));
310 }
311 if let Some(ref cmd) = args.command_line
312 && cmd.as_bytes().contains(&0)
313 {
314 return Err(crate::exceptions::cstring_error(vm));

Callers

nothing calls this directly

Calls 15

getenvironmentFunction · 0.85
getattributelistFunction · 0.85
cstring_errorFunction · 0.85
WindowsSysResultClass · 0.85
WinHandleClass · 0.85
as_mut_ptrMethod · 0.80
expect_strMethod · 0.80
into_pyresultMethod · 0.80
ErrClass · 0.50
mapMethod · 0.45
as_mutMethod · 0.45
get_attrMethod · 0.45

Tested by

no test coverage detected