The famous CreateProcess function may fail with an access violation. For example, this innocent looking code causes a crash:
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
CreateProcess(0, _T("notepad"), 0, 0, FALSE,
0, 0, 0, &si, &pi);
What’s wrong with this code? Apparently nothing.
The key here is that CreateProcess is not actually a function at all, but a macro that’s expanded toCreateProcessA or CreateProcessW depending a compile time constant (UNICODE).
If we open the docs, we find for the second argument: “The Unicode version of this function,CreateProcessW, can modify the contents of this string”.
The string I passed is a constant string, coming from a region marked as “read only” and this is why the access violation occurs. Changing CreateProcess to CreateProcessA avoids the crash. The reason is that the A function translates the string to unicode and calls the W function. The translated string is in a read/write buffer, so no problem there. This should generally be avoided because of the extra step A functions do.
In recent versions of Visual Studio the default libraries are unicode (as they should be, as the Windows 9x family of OSes is finally dead and buried). This is while a transition from (e.g.) Visual Studio 2003 to 2008 may cause old code to crash.
So, the general solution should be:
TCHAR name[] = _T("Notepad.exe");
CreateProcess(0, name, 0, 0, FALSE, 0, 0, 0, &si, &pi);
This still doesn’t answer the question: why? Why would CreateProcessW want to write back to the supplied string? What could it possibly write? It can’t write arbitrary stuff as the size of the buffer is unknown to the function and can cause access violation or memory corruption. But it does write something back (looks like the same string passed to it). For me, it’s still a mystery.
相关推荐
通过进程打开另一个进程的三种方法:CreateProcess,WinExec,ShellExecute ,给出了调用的实现代码,源码中有CreateProcess,ShellExecute的函数说明,包含一个可执行的演示程序和源码 用VC2008编写的
创建进程实例,使用CreateProcess()函数打开一个程序的实例 CreateProcess()函数是Windows操作系统中用于创建新进程的API函数。该函数可以用来创建一个新的进程实例,并指定其执行的命令行参数、安全性设置、...
在Windows操作系统中,创建一个新的进程并执行一个系统程序通常是通过API函数`CreateProcess`来实现的。`CreateProcess`是Windows API提供的一种低级进程创建方法,它允许开发者具有较高的控制权,例如设置进程和...
用CreateProcess创建进程后,得到主窗口句柄。
标题中的“新建程序进程CreateProcess”指的是在编程中创建新的操作系统进程的过程,这通常涉及到操作系统级别的操作,如在Windows系统中使用API函数`CreateProcess`。`CreateProcess`是Windows API提供的一种机制,...
在Windows操作系统中,`CreateProcess`函数是用于创建新进程和其主线程的关键API。它提供了灵活的方式来启动和控制一个程序,包括指定命令行参数、环境变量、工作目录以及进程和线程的安全属性。本篇文章将深入探讨`...
标题 "解决createprocess error code 740" 指的是在尝试运行一个应用程序时遇到的一个特定错误,其中 `CreateProcess` 是 Windows API 中用于创建新进程的函数。错误代码 740 表示 "请求的操作需要提升的权限",意味...
**CreateProcess函数详解** 在Windows操作系统中,`CreateProcess`函数是用于创建新进程和其初始主线程的关键API。这个函数允许程序员启动新的应用程序,并控制它们的执行环境。`CreateProcess`不仅创建新进程,还...
createprocess创建进程并获取进程窗口HWND,不管窗口是否在显示状态都可以获取。
在这个场景中,"CreateProcess拦截exe程序"指的是通过API Hook来拦截`CreateProcess`函数,这是一种Windows API,用于创建新的进程和其初始线程。下面我们将深入探讨`CreateProcess`、API Hook的基本概念以及如何...
本篇文章将探讨如何使用`CreateProcess`函数在Windows环境中创建进程,并通过Visual Studio(VS)的调试器对其进行附加调试。`CreateProcess`是Windows API提供的一种功能,用于启动新的进程或线程。这个例子特别...
在IT领域,特别是操作系统设计和进程管理中,"父子进程,createprocess" 是一个关键的概念。这个主题涉及到操作系统如何创建新的进程以及它们如何并发执行。本文将深入探讨这个主题,结合给定的描述,我们将专注于...
本教程将深入讲解如何使用`CreateProcess`函数在VC++中创建一个新的进程,并在VB环境下编写代码进行DLL注入。 `CreateProcess`是Windows API中的一个关键函数,它负责启动新的进程并可选地创建新的线程。这个函数...
"hook_createprocess"这个主题涉及的是在Visual Studio 2010环境下,通过编写DLL动态链接库来实现对`CreateProcess`函数的钩子,以便在创建新进程时进行干预。`CreateProcess`是Windows API中用于启动新进程的关键...
本文将深入探讨两种常见的方法:ShellExecute和CreateProcess。这两种方法都是Windows API提供的功能,用于执行应用程序,但它们在使用场景和特性上有所不同。 **ShellExecute** ShellExecute是Windows Shell服务...
在这个特定的案例中,"API_HOOK_CreateProcess进程监视"指的是利用API钩子来监控系统的CreateProcess函数。CreateProcess是Windows操作系统中的一个关键API,它负责创建新的进程和执行新的可执行文件。 当我们谈论...
利用管道执行cmd,显示回显内容,管道加createprocess实现该功能
windows下eclipse跑junit报错:CreateProcess error=206后面跟着乱码。 把这个jar替换掉就好了,放在:eclipse/plugins/下面。 参考:https://bugs.eclipse.org/bugs/show_bug.cgi?id=327193