У меня проблемы с подключением к процессу, порожденному одним из моих собственных процессов. Когда я пытаюсь подключиться к процессу с помощью Visual Studio 2005 (Отладка -> Присоединить к процессу), я получаю сообщение об ошибке: «Невозможно подключиться к процессу. Система не может найти указанный файл».
В моей программе я породил процесс, который позже хочу присоединить, используя команду
BOOL res = CreateProcess(exe, cmdLine, NULL, NULL, FALSE, 0, NULL,
workingDir, &startupInfo, &procInfo);
Если я вручную запускаю второй процесс из командной строки, я могу подключиться к нему без проблем. Я также могу подключиться к нему с помощью WinDbg, но не Visual Studio 2005. Нет разницы, запустил ли я первый процесс изнутри VS (таким образом, работает от имени администратора) или я запустил его из командной строки. как обычный пользователь. Я использую Visual Studio в качестве администратора в 64-разрядной версии Vista, а все исполняемые файлы 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? Почему это так только для процессов, которые я построил и запустил из своего кода, я не могу понять ...