`
cppmule
  • 浏览: 449168 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

CreateProcess causes Access Violation

 
阅读更多

 CreateProcess causes Access Violation

Published at Jan 17 2010, 11:39 AM by pavely | 4 comment(s) 

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.

Comments List

# re: Gotcha: CreateProcess causes Access Violation

Published at Sunday, March 28, 2010 10:21 PM by Sasha Goldshtein  

This topic has been beaten to death with a club by Raymond Chen:

blogs.msdn.com/.../9673254.aspx

# re: Gotcha: CreateProcess causes Access Violation

Published at Sunday, March 28, 2010 10:40 PM by pavely  

I guess I'm behind the times...

# re: Gotcha: CreateProcess causes Access Violation

Published at Tuesday, April 20, 2010 4:54 AM by mmxida  

Thanks, that's really helpful!

# re: Gotcha: CreateProcess causes Access Violation

Published at Monday, January 23, 2012 2:46 PM by Raj Kumar  

Thanks . its perfectly working fine and helped.

Leave a Comment

Title (required)
Name (
required
)
分享到:
评论

相关推荐

    CreateProcess

    通过进程打开另一个进程的三种方法:CreateProcess,WinExec,ShellExecute ,给出了调用的实现代码,源码中有CreateProcess,ShellExecute的函数说明,包含一个可执行的演示程序和源码 用VC2008编写的

    一个CREATEPROCESS()的实例

    创建进程实例,使用CreateProcess()函数打开一个程序的实例 CreateProcess()函数是Windows操作系统中用于创建新进程的API函数。该函数可以用来创建一个新的进程实例,并指定其执行的命令行参数、安全性设置、...

    以CreateProcess为例运行系统程序并输出结果

    在Windows操作系统中,创建一个新的进程并执行一个系统程序通常是通过API函数`CreateProcess`来实现的。`CreateProcess`是Windows API提供的一种低级进程创建方法,它允许开发者具有较高的控制权,例如设置进程和...

    CreateProcess调用后,获得主窗口句柄

    用CreateProcess创建进程后,得到主窗口句柄。

    新建程序进程CreateProcess

    标题中的“新建程序进程CreateProcess”指的是在编程中创建新的操作系统进程的过程,这通常涉及到操作系统级别的操作,如在Windows系统中使用API函数`CreateProcess`。`CreateProcess`是Windows API提供的一种机制,...

    用CreateProcess创建进程

    在Windows操作系统中,`CreateProcess`函数是用于创建新进程和其主线程的关键API。它提供了灵活的方式来启动和控制一个程序,包括指定命令行参数、环境变量、工作目录以及进程和线程的安全属性。本篇文章将深入探讨`...

    解决createprocess error code 740

    标题 "解决createprocess error code 740" 指的是在尝试运行一个应用程序时遇到的一个特定错误,其中 `CreateProcess` 是 Windows API 中用于创建新进程的函数。错误代码 740 表示 "请求的操作需要提升的权限",意味...

    CreateProcess函数 详细使用说明

    **CreateProcess函数详解** 在Windows操作系统中,`CreateProcess`函数是用于创建新进程和其初始主线程的关键API。这个函数允许程序员启动新的应用程序,并控制它们的执行环境。`CreateProcess`不仅创建新进程,还...

    createprocess创建进程并获取进程窗口HWND

    createprocess创建进程并获取进程窗口HWND,不管窗口是否在显示状态都可以获取。

    CreateProcess拦截exe程序

    在这个场景中,"CreateProcess拦截exe程序"指的是通过API Hook来拦截`CreateProcess`函数,这是一种Windows API,用于创建新的进程和其初始线程。下面我们将深入探讨`CreateProcess`、API Hook的基本概念以及如何...

    一个简单的可以Debug用CreateProcess创建的进程例子

    本篇文章将探讨如何使用`CreateProcess`函数在Windows环境中创建进程,并通过Visual Studio(VS)的调试器对其进行附加调试。`CreateProcess`是Windows API提供的一种功能,用于启动新的进程或线程。这个例子特别...

    父子进程,createprocess

    在IT领域,特别是操作系统设计和进程管理中,"父子进程,createprocess" 是一个关键的概念。这个主题涉及到操作系统如何创建新的进程以及它们如何并发执行。本文将深入探讨这个主题,结合给定的描述,我们将专注于...

    CreateProcess创建暂停进程进行DLL注入-[VC.Dll+VB.Code]

    本教程将深入讲解如何使用`CreateProcess`函数在VC++中创建一个新的进程,并在VB环境下编写代码进行DLL注入。 `CreateProcess`是Windows API中的一个关键函数,它负责启动新的进程并可选地创建新的线程。这个函数...

    vs2010下hook_createprocess

    "hook_createprocess"这个主题涉及的是在Visual Studio 2010环境下,通过编写DLL动态链接库来实现对`CreateProcess`函数的钩子,以便在创建新进程时进行干预。`CreateProcess`是Windows API中用于启动新进程的关键...

    ShellExecute和CreateProcess打开指定程序

    本文将深入探讨两种常见的方法:ShellExecute和CreateProcess。这两种方法都是Windows API提供的功能,用于执行应用程序,但它们在使用场景和特性上有所不同。 **ShellExecute** ShellExecute是Windows Shell服务...

    API_HOOK_CreateProcess进程监视:知道你运行了哪些程序.zip

    在这个特定的案例中,"API_HOOK_CreateProcess进程监视"指的是利用API钩子来监控系统的CreateProcess函数。CreateProcess是Windows操作系统中的一个关键API,它负责创建新的进程和执行新的可执行文件。 当我们谈论...

    pipe-CMD.rar_CMD回显_CreateProcess_c++ cmd pipe_windows管道cmd_管道 c

    利用管道执行cmd,显示回显内容,管道加createprocess实现该功能

    windows下eclipse跑junit报错:CreateProcess error=206

    windows下eclipse跑junit报错:CreateProcess error=206后面跟着乱码。 把这个jar替换掉就好了,放在:eclipse/plugins/下面。 参考:https://bugs.eclipse.org/bugs/show_bug.cgi?id=327193

Global site tag (gtag.js) - Google Analytics