Почему я пропускаю ровно две ручки при вызове CreateProcess несколько раз или только один раз?

В соответствии с 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;
}

1

Решение

UKMonkey прав, он загрузит apphelp.dll который откроет две ручки:

Смотрите следующие два снимка экрана, показывающие загруженные / открытые dll и дескрипторы:

DDL и дескрипторы перед вызовом CreateProcess

DLLS и дескрипторы после вызова CreateProcess

Загрузка самой DLL по телефону LoadLibrary откроет ручку для SESSION MANAGERзвонит CreateProcess первый раз откроет ручку Custom Locale,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]