Дублирование файловых дескрипторов между ошибками процессов - PullRequest
2 голосов
/ 13 июля 2010

DLL имеет следующие общие переменные (я использую MinGW):

int iCount __attribute__((section(".str"), shared)) = 0;
HANDLE hMainFile __attribute__((section(".shr"), shared)) = NULL;
HANDLE hProcess __attribute__((section(".shr"), shared)) = NULL;

и глобальную переменную:

HANDLE hFile = NULL;

Вот как я работаю с моей DLL_PROCESS_ATTACH:

case DLL_PROCESS_ATTACH:
  if(!iCount)
  {
    hMainFile = CreateFile("Hello.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    hFile = hMainFile;
    hProcess = GetCurrentProcess();
    iCount = 1;
  }
  else
  {
    DuplicateHandle(hProcess, hMainFile, GetCurrentProcess(), &hFile, 0, FALSE, DUPLICATE_SAME_ACCESS);
  }
  break;

Как видите, первый экземпляр DLL создаст файл и установит дескриптор общего файла.Остальные экземпляры DLL должны дублировать оригинальный дескриптор файла на тот, который совместим с его экземпляром.Тем не менее, DuplicateHandle всегда выдает ошибку «Дескриптор недействителен».Я в замешательстве, потому что не знаю, о какой ручке идет речь.Я подтвердил, что общие переменные действительно одинаковы для всех экземпляров.Может кто-нибудь сказать мне, что я здесь делаю не так?

1 Ответ

1 голос
/ 13 июля 2010

Вы не можете делиться такими ручками.Общий доступ к дескриптору Win32 гораздо более строг, чем вы можете себе представить.

Чтобы успешно использовать дескриптор в Win32, вам необходимо сделать следующее:

  • При вызове API, чтобы открытьобъект (CreateFile для файлов) передается в структуре SECURITY_ATTRIBUTES, где bInheritHandle имеет значение TRUE.
  • Только после создания всех разделяемых объектов запускайте дочерний процесс с CreateProcess, гарантируя, что параметр bInheritHandles имеет значение TRUE.

Это будет дублировать дескрипторы в дочернем процессе, гарантируя, что дублированные дескрипторы имеют одинаковые значения.

Это работает, только если вы можете соблюдать ограничение, что второй процесс ДОЛЖЕН бытьзапускается первым процессом и только после того, как все потенциально общие объекты были открыты.

Однако, в более общем случае, когда процессы могут запускаться в любом порядке, или необходимо разделить доступ к объектам, открытым послезапущен другой процесс: вы не можете напрямую поделитьсядескрипторы в этом случае - вы ДОЛЖНЫ открывать объекты по именам в обоих процессах - очевидно, используя флаги, которые совместимы с открываемым объектом несколько раз.

В случае CreateFile: FILE_SHARE_READ | FILE_SHARE_WRITE в качестве параметра fSharingModeнеобходимо дважды открыть «Hello.txt».

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