我附加到從我自己的進程中產生的進程問題。當我嘗試使用Visual Studio 2005(調試 - >附加到進程)附加到進程時,收到錯誤消息:「無法附加到進程,系統找不到指定的文件。」無法附加到使用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中不會很好嗎?爲什麼這是隻爲我建立的,並從我的代碼開始我真的不能明白流程,我認爲你需要正確地定義如此命名SECURITY_ATTRIBUTES
的情況下...
你能夠附加到其他進程嗎? – avakar 2010-01-08 12:08:23
是的,我可以附加到其他進程(如notepad.exe),我已經開始以相同的方式。只是不是我的exe文件,無論我是否在發佈或調試模式或32/64位構建。 – villintehaspam 2010-01-12 18:49:32