В соответствии с GetProcessHandleCount
Я теряю две ручки при звонке CreateProcess
, Пожалуйста, посмотрите на следующий минимальный пример, который создаст один дочерний процесс. Перед созданием дочернего процесса проверяется количество дескрипторов. Затем дескрипторы дочернего процесса возвращаются в PROCESS_INFORMATION
Структура закрыта, а затем ручки подсчитываются снова. Я получаю разницу 2
ручки — есть у кого идея почему?
Также интересно: если я создаю несколько дочерних процессов в цикле for в примере ниже, я также «пропускаю» ровно две ручки.
Редактировать: Обратите внимание, что в StartupInformation Structure никакие дескрипторы не возвращаются, поэтому закрывать там нечего.
Может кто-нибудь объяснить мне эту разницу двух ручек?
#include <windows.h>
#include <tchar.h>
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
std::wstring commandLine = L"C:\\windows\\system32\\cmd.exe";
BOOL closedHT = FALSE;
BOOL closedHP = FALSE;
BOOL createdProcess = FALSE;
// Count handles before creating child processes:
HANDLE hCurrent = GetCurrentProcess();
DWORD hCountBefore = 0;
::GetProcessHandleCount(hCurrent, &hCountBefore);
// Create one child-processes:
for (size_t i = 0; i < 1; i++)
{
STARTUPINFO startupInfo;
::ZeroMemory(&startupInfo, sizeof(startupInfo));
PROCESS_INFORMATION procInfo;
::ZeroMemory(&procInfo, sizeof(procInfo));
createdProcess = ::CreateProcess(NULL, (LPWSTR)commandLine.c_str(), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &procInfo);
closedHP = ::CloseHandle(procInfo.hProcess);
closedHT = ::CloseHandle(procInfo.hThread);
}
// And calculate the difference of handles:
DWORD hCountAfter = 0;
::GetProcessHandleCount(hCurrent, &hCountAfter);
DWORD diff = hCountAfter - hCountBefore;
if (createdProcess && closedHP && closedHT && diff != 0)
{
std::wcout << L"lost handles??: " << diff << std::endl;
}
else
{
std::wcout << L"Nothing got lost" << std::endl;
}
return 0;
}
UKMonkey прав, он загрузит apphelp.dll
который откроет две ручки:
Смотрите следующие два снимка экрана, показывающие загруженные / открытые dll и дескрипторы:
Загрузка самой DLL по телефону LoadLibrary
откроет ручку для SESSION MANAGER
звонит CreateProcess
первый раз откроет ручку Custom Locale
,
Других решений пока нет …