欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决 win10 64位系统下服务进程创建system32文件夹下可执行程序进程失败的问题

程序员文章站 2022-07-03 09:30:49
...

问题描述:

操作系统是Win10 64位。自己写了一个窗口应用(32位),就叫它DemoWin.exe吧,把它放到 C:\Windows\System32 文件夹下。然后安装了一个服务(32位),在服务里调用CreateProcessAsUser创建 DemoWin.exe 进程。代码如下:

dwSessionId = WTSGetActiveConsoleSessionId();  

WTSQueryUserToken(dwSessionId, &hUserToken);	//读取当前登录用户的令牌信息  
dwCreationFlags = CREATE_NEW_CONSOLE;//创建参数  

ZeroMemory(&si,sizeof(STARTUPINFO));  
ZeroMemory(&pi,sizeof(pi));  

si.cb = sizeof(STARTUPINFO);  
si.lpDesktop = "winsta0\\default";	//指定创建进程的窗口站,Windows下唯一可交互的窗口站就是WinSta0\Default  

//设置当前进程的令牌信息  
if (!SetTokenInformation(hUserToken, TokenSessionId, (void*)&dwSessionId, sizeof(DWORD)))  
{
	dwRet = GetLastError();  
	return FALSE;
}  

//创建进程环境块,保证环境块是在用户桌面的环境下  
LPVOID pEnv = NULL;  
if (CreateEnvironmentBlock(&pEnv, hUserTokenDup, TRUE))  
{  
	dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;  
}  

//创建用户进程  
if (!CreateProcessAsUser(hUserToken, NULL, lpCommand, NULL, NULL, FALSE, dwCreationFlags, pEnv, NULL, &si, &pi))  
{  
	dwRet = GetLastError();  
	return FALSE;
}  

CreateProcessAsUser 失败,返回错误码0x00000002(ERROR_FILE_NOT_FOUND)


问题原因:

刚开始以为是权限问题,后来搜索网上才发现,原来是路径问题。

在Windows7 64位操作系统下,VisualStudio编译32位应用,调用CreateProcess运行System32文件夹下文件会失败,GetLastError返回值是2。查询Error Lookup返回信息:系统找不到指定文件。
其原因在于64位操作系统对于32位程序调用System32下文件的处理方式。对于64位操作系统来说,C:\Windows\System32文件夹不再是系统文件夹,而是为64位操作系统预留的。当同名的64位和32位DLL同时存在于一个系统之中时,system32用于存储32位DLL,并且这些DLL是为64位应用调用的。因为file system redirector机制的存在,SysWOW64透明化了不同位文件的调用。

如果一个32位应用程序需要调用System32下的文件,最好改用Sysnative这个System32的别名,否则将调用失败。实际上,并不存在Sysnative这个文件夹,这只是Windows为32位应用开发者提供的一种便利,64位应用中并不能使用它。

参考资料:https://blog.csdn.net/csyounth/article/details/7847492