转:http://blog.csdn.net/glc22/article/details/77227367
 
在使用CreateProcessAsUser时出现了 0xC0000005访问冲突问题,百思不得其解。终于在子航的博客http://www.cnblogs.com/hezihang/p/3387283.html找到问题根源
 
错误代码:
  1. #include <WtsApi32.h>
  2. #pragma comment(lib, "WtsApi32.lib")
  3. bool MyImpersonateLoggedOnUser()
  4. {
  5. HANDLE hToken = NULL;
  6. DWORD dwConsoleSessionId = WTSGetActiveConsoleSessionId();
  7. if (WTSQueryUserToken(dwConsoleSessionId, &hToken))
  8. {
  9. if (ImpersonateLoggedOnUser(hToken))
  10. {
  11. // 保存Token
  12. WCHAR *szCmdLine = L"c:\\notepad.exe";  //错误在这里
  13. STARTUPINFO si;
  14. ZeroMemory(&si, sizeof(STARTUPINFO));
  15. si.cb = sizeof(STARTUPINFO);
  16. si.lpDesktop = L"winsta0\\default";
  17. PROCESS_INFORMATION pi;
  18. ZeroMemory(&pi, sizeof(pi));
  19. // hToken为当前登陆用户的令牌
  20. LPVOID lpEnvBlock = NULL;
  21. BOOL bEnv = false;// CreateEnvironmentBlock(&lpEnvBlock, hToken, FALSE);
  22. DWORD dwFlags = CREATE_NEW_CONSOLE;
  23. if (bEnv)
  24. {
  25. dwFlags |= CREATE_UNICODE_ENVIRONMENT;
  26. }
  27. // 环境变量创建失败仍然可以创建进程,但会影响到后面的进程获取环境变量内容
  28. bool bRet = CreateProcessAsUser(
  29. hToken,
  30. NULL,
  31. szCmdLine,
  32. NULL,
  33. NULL,
  34. FALSE,
  35. dwFlags,
  36. bEnv ? lpEnvBlock : NULL,
  37. NULL,
  38. &si,
  39. &pi);
  40. int a = GetLastError();
  41. // 使用完毕需要释放环境变量的空间
  42. if (bEnv)
  43. {
  44. DestroyEnvironmentBlock(lpEnvBlock);
  45. }
  46. WaitForSingleObject(pi.hProcess, INFINITE);
  47. return true;
  48. }
  49. }
  50. return false;
  51. }
szCmdLine指针是保存在堆上,但字符串“c:\\notepad.exe”是一个常量,它是保存在常量区的,被写保护了,CreateProcessAsUser 访问堆上的地址出了问题
如果把“c:\\notepad.exe"定义到栈或者全局变量就不存在此问题了。
修改后的代码:      
  1. #include <WtsApi32.h>
  2. #pragma comment(lib, "WtsApi32.lib")
  3. bool MyImpersonateLoggedOnUser()
  4. {
  5. HANDLE hToken = NULL;
  6. DWORD dwConsoleSessionId = WTSGetActiveConsoleSessionId();
  7. if (WTSQueryUserToken(dwConsoleSessionId, &hToken))
  8. {
  9. if (ImpersonateLoggedOnUser(hToken))
  10. {
  11. // 保存Token
  12. WCHAR szCmdLine[] = L"c:\\notepad.exe";   //改变了szCmdLine的地址空间
  13. STARTUPINFO si;
  14. ZeroMemory(&si, sizeof(STARTUPINFO));
  15. si.cb = sizeof(STARTUPINFO);
  16. si.lpDesktop = L"winsta0\\default";
  17. PROCESS_INFORMATION pi;
  18. ZeroMemory(&pi, sizeof(pi));
  19. // hToken为当前登陆用户的令牌
  20. LPVOID lpEnvBlock = NULL;
  21. BOOL bEnv = false;// CreateEnvironmentBlock(&lpEnvBlock, hToken, FALSE);
  22. DWORD dwFlags = CREATE_NEW_CONSOLE;
  23. if (bEnv)
  24. {
  25. dwFlags |= CREATE_UNICODE_ENVIRONMENT;
  26. }
  27. // 环境变量创建失败仍然可以创建进程,但会影响到后面的进程获取环境变量内容
  28. bool bRet = CreateProcessAsUser(
  29. hToken,
  30. NULL,
  31. szCmdLine,
  32. NULL,
  33. NULL,
  34. FALSE,
  35. dwFlags,
  36. bEnv ? lpEnvBlock : NULL,
  37. NULL,
  38. &si,
  39. &pi);
  40. int a = GetLastError();
  41. // 使用完毕需要释放环境变量的空间
  42. if (bEnv)
  43. {
  44. DestroyEnvironmentBlock(lpEnvBlock);
  45. }
  46. WaitForSingleObject(pi.hProcess, INFINITE);
  47. return true;
  48. }
  49. }
  50. return false;
  51. }

转: CreateProcessAsUser 0xC0000005访问冲突问题的更多相关文章

  1. C++中一个0xC0000005访问冲突问题

    在冯.诺依曼结构CPU(如i386,ARM A8,A9)的保护模式或者哈佛结构(如8051, ARM M0,.. M3)的CPU下,C++编译器将放置常量的内存设置为只读模式或者放入只读内存中,如果出 ...

  2. [精品]CAD批量处理工具

     需要此工具请Q:3567 618 336 CAD批量处理工具是基于AutoCAD二次开发的批处理插件.将程序加载到CAD中,使用自定义的Lisp代码就可对多个文档进行批量操作. 1.文件说明 CAD ...

  3. __stdcall __cdecl 引起的程序崩溃

    崩溃弹出的截图如下 看到0xC0000005, 访问冲突的问题, 九成九是内存访问违规, 比如访问了已经释放的指针, 又或者是离开函数时栈被破坏之类. 找了一下午一直没有头绪, 好在有一份可以执行的源 ...

  4. 问题解决——使用CriticalSection后 0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突

    ================声明===================== 本文原创,转载请保持文章的完整性(含本声明),并显要的著名作者和出处. 本文链接:http://blog.csdn.ne ...

  5. 启动MFC程序的时候报错:0xC0000005: 读取位置 0x00000000 时发生访问冲突

    此程序的结构是 MouseCap.h #pragma once #include <afxwin.h> class MouseCapApp : public CWinApp { publi ...

  6. 0xC0000005: 读取位置 0x00000000 时发生访问冲突

    遇见这种问题一般都是空指针,即:指针里没有赋值~ 如果你对null 进行操作就会产生空指针异常 Object obj = new Object(); 你要知道 obj是一个Object指针变量,指向O ...

  7. xx.exe 中的 0x014180bd 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突(当指针访问异常时,应考虑是不是对象未创建)。

    xx.exe 中的 0x014180bd 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefeee 时发生访问冲突

  8. vc++,MFC,组合框控件设置时0xC0000005: 读取位置 0x00000020 时发生访问冲突

    511.exe 中的 0x78bb5dec (mfc90ud.dll) 处未处理的异常: 0xC0000005: 读取位置 0x00000020 时发生访问冲突 _AFXWIN_INLINE int ...

  9. 调试器地址出现大小端紊乱,引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。

    今天在编写一系列新增需求代码后,开始调试代码 发现上个版本正常可运行的代码出现了:引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突. 上个版本数代码 ...

随机推荐

  1. JavaScript中callee与caller,apply与call解析

    1. arguments.callee 1.1 解释 返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文. 1,.2 说明 callee 属性的初始值就是正被执行的 ...

  2. expect 批量增加用户及配置密码

    start.sh #!/bin/bash password="111111" username="test" if [ $# == 1 ] then usern ...

  3. NOIP模拟赛16

    NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2 期望得分:100+100+ =200+ 实际得分:100+40+70=210 T1天天寄快递 直接模拟,代码丢了...... T2天天和不 ...

  4. hdu 2121 Ice_cream’s world II

    Ice_cream’s world II http://acm.hdu.edu.cn/showproblem.php?pid=2121 Time Limit: 3000/1000 MS (Java/O ...

  5. 2015/10/9 Python基础(21):可调用和可执行对象

    在Python中有多种运行外部程序的方法,比如,运行操作系统命令或另外的Python脚本,或执行一个磁盘上的文件,或通过网络来运行文件.这完全取决于想要干什么.特定的环境包括: 在当前脚本继续运行 创 ...

  6. Web应用程序完全测试指南

    随着Web技术和移动互联网的发展,越来越多的应用被迁移到了云端,这也使得用户可以随时随地使用它们.目前大量的优质应用,逐渐提升了用户的品味,也降低了用户的容忍度,如果你的Web应用无法使用户满意,那么 ...

  7. 【洛谷 P4542】 [ZJOI2011]营救皮卡丘(费用流)

    题目链接 用最多经过\(k\)条经过\(0\)的路径覆盖所有点. 定义\(ds[i][j]\)表示从\(i\)到\(j\)不经过大于\(max(i,j)\)的点的最短路,显然可以用弗洛伊德求. 然后每 ...

  8. 【总结】前端必须收藏的CSS3动效库!!!

    现在的网站和App的设计中越来越重视用户体验,而优秀的动效则能使你的应用更具交互性,从而吸引更多用户的使用. 如果你对CSS3中定义动效还不熟练,或希望采用更加简单直接的方式在你的应用中引入动效的话, ...

  9. SQLite3使用详解

    sqlite常量的定义(SQLite3返回值的意思): SQLITE_OK           = 0;  返回成功 SQLITE_ERROR        = 1;  SQL错误或错误的数据库 SQ ...

  10. Deep Learning基础--各个损失函数的总结与比较

    损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好.损失函数是经验 ...