Невозможно присоединиться к созданному процессу с помощью Visual Studio 2005 - PullRequest
0 голосов
/ 08 января 2010

У меня проблемы с подключением к процессу, порожденному одним из моих собственных процессов. Когда я пытаюсь подключиться к процессу с помощью 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? Почему это так только для процессов, которые я построил и запустил из своего кода, я не могу понять ...

Ответы [ 3 ]

4 голосов
/ 18 мая 2011

У меня была такая же ошибка для Win7. Я решил это. Я пытался удаленно отладить, подключившись к работающей службе. Затем я наконец обнаружил, что мне нужно запустить msvcmon от имени администратора.

2 голосов
/ 14 января 2010

Хорошо, я наконец выяснил, что вызвало эту проблему.Я опубликую это здесь на случай, если кто-то еще столкнется с этим (из-за нехватки ответов, я думаю, это не так часто, но эй ...).

Проблема была в том, что путь, используемый для запускаИсполняемый файл содержал элемент пути, состоящий из одной точки, например:

c:\dir1\.\dir2\program.exe

, что, очевидно, заставило VS2005 искать исполняемый файл в

c:\dir1\dir1\dir2\program.exe

, который, конечно, не существует ..Спасибо, Марк, за Process Monitor !Удалениеснова подключился к процессу, как и ожидалось.

0 голосов
/ 08 января 2010

Я думаю, вам нужно правильно определить так называемый SECURITY_ATTRIBUTES
вы даете это как NULLs CreateProcess (exe, cmdLine, NULL, NULL,
как в таком случае они определяются системой и, вероятно, определяет с разрешениями VS
и VS не позволяет явно отлаживать свои собственные процессы;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...