我遇到了从我自己的一个进程中生成的进程附加问题。当我尝试使用Visual Studio 2005(调试 - >附加到进程)附加到进程时,我收到错误消息:“无法附加到进程。系统找不到指定的文件。”
在我的程序中,我使用命令
生成了我后来要附加的进程BOOL res = CreateProcess(exe, cmdLine, NULL, NULL, FALSE, 0, NULL,
workingDir, &startupInfo, &procInfo);
如果我从命令提示符手动启动第二个进程,我可以毫无问题地附加到它。我也可以使用WinDbg附加到它,而不是Visual Studio 2005.我是否从VS内部启动了第一个进程(因此以管理员身份运行)或者是否从命令提示符启动它没有区别作为普通用户。我在Vista 64位下以管理员身份运行Visual Studio,可执行文件都是64位。
有没有人见过这个或者对我可能做错了什么的想法?任何帮助表示赞赏。
更新: 我还尝试使用以下代码为新进程和线程设置安全性属性:
DWORD dwRes, dwDisposition;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld =
SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
SECURITY_ATTRIBUTES sa;
LONG lRes;
HKEY hkSub = NULL;
// Create a well-known SID for the Everyone group.
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1, SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0, &pEveryoneSID))
{...}
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = GENERIC_ALL;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;
// Create a SID for the BUILTIN\Administrators group.
if(! AllocateAndInitializeSid(&SIDAuthNT, 2, SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pAdminSID))
{...}
// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow the Administrators group full access to
// the key.
ea[1].grfAccessPermissions = GENERIC_ALL;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName = (LPTSTR) pAdminSID;
// Create a new ACL that contains the new ACEs.
dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);
if (ERROR_SUCCESS != dwRes)
{...}
// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD)
{...}
if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
{...}
// Add the ACL to the security descriptor.
if (!SetSecurityDescriptorDacl(pSD, TRUE, pACL, FALSE))
{...}
// Initialize a security attributes structure.
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;
CreateProcess(exe, cmdLine, &sa, &sa, ...
没有运气。
更新:我也可以使用Visual Studio 2008(仍然使用VS2005编译)附加到该进程,这可以解决我的直接需求。由于这是在Vista x64下,可能会有一些形式的“Vista魔术”在这里发挥,VS2005与Vista不搭配?为什么只有我已经构建并从我的代码中开始的进程才会出现这种情况我无法理解......
答案 0 :(得分:4)
我对Win7有同样的错误。我解决了 我试图通过附加到正在运行的服务来远程调试。然后我终于发现我需要以管理员身份运行msvcmon。
答案 1 :(得分:2)
好的,我终于找到了导致这个问题的原因。我会在这里发布以防万一其他人遇到这个(从答案的稀缺性,我想这不常见,但嘿......)。
问题是用于启动可执行文件的路径包含一个由单个点组成的路径元素,如下所示:
c:\dir1\.\dir2\program.exe
显然让VS2005去寻找可执行文件
c:\dir1\dir1\dir2\program.exe
当然不存在......谢谢你马克Process Monitor!删除。按照预期再次加入过程工作。
答案 2 :(得分:-1)
我认为你需要正确定义所谓的SECURITY_ATTRIBUTES
你把它作为这个NULL的CreateProcess(exe,cmdLine,NULL,NULL,
在这种情况下,他们按系统定义
并且可能用VS权限定义
并且VS显然不允许调试自己的进程;)