Системная ошибка 0x5: CreateFileMapping () - PullRequest
11 голосов
/ 22 октября 2010

Я хочу реализовать IPC с использованием именованной общей памяти.

Для этого одним из шагов является получение дескриптора Mapping Memory Object , используя CreateFileMapping ().

Я делаю это именно так, как рекомендует сайт MSDN: http://msdn.microsoft.com/en-us/library/aa366551(v=VS.85).aspx:

hFileMappingHandle = CreateFileMapping
    (
        INVALID_HANDLE_VALUE,      // use paging file
        NULL,                      // default security 
        PAGE_READWRITE,            // read/write access
        0,            // maximum object size (high-order DWORD) 
        256,            // maximum object size (low-order DWORD)  
        "Global\\MyFileMappingObject"          // name of mapping object
    ); 
DWORD dwError = GetLastError();

Однако возвращаемый дескриптор всегда 0x0 и Код системной ошибки возвращается: 0x5 (Доступ запрещен)

  • Только Именованный общий доступ к памяти желательно (необщий доступ к файлам).
  • Windows 7 x64 бит ОС
  • Администраторские права пользователя
  • Разработанное приложение: 64-битный плагинapplication (. dll)

У кого-нибудь есть такой же опыт и способ его исправить, пожалуйста?Я использую сайт MSDN в качестве ссылки, поэтому я не думаю, что в коде есть проблема.

Ответы [ 4 ]

11 голосов
/ 22 октября 2010

Похоже, у вас недостаточно привилегий.

Из MSDN:

Создание объекта сопоставления файлов в глобальное пространство имен из сеанса другой чем нулевая сессия требует SeCreateGlobalPrivilege привилегия. За больше информации, см. Kernel Object Пространства имен.

...

Создание объекта сопоставления файлов в глобальном пространстве имен, используя CreateFileMapping, из сеанса кроме нулевой сессии является привилегированная операция. Из-за этого, приложение работает в произвольном Узел сеансов удаленных рабочих столов (RD) Сеанс хоста) сеанс сервера должен иметь SeCreateGlobalPrivilege включен в порядок создания объекта сопоставления файлов в глобальном пространстве имен успешно. Проверка привилегий ограничена создание объектов отображения файлов и не распространяется на открытие существующих из них. Например, если услуга или система создает объект сопоставления файлов, любой процесс, запущенный в любой сессии, может получить доступ к этому объекту сопоставления файлов при условии, что пользователь имеет необходимый доступ.

2 голосов
/ 15 августа 2011

Администраторы, службы и сетевые службы имеют SeCreateGlobalPrivilege по умолчанию. Вы должны помнить, однако, что Windows7 / Vista не запускает все как администратор. Поэтому используйте «Начать как администратор», чтобы «Глобал» работал для вашего приложения. Если вы отлаживаете, запустите Visual Studio с правами администратора.

1 голос
/ 22 октября 2010

Для создания глобальных сопоставлений файлов вам нужна привилегия SeCreateGlobalPrivilege - она ​​у вас есть?Отказ в доступе подразумевает, что это проблема с разрешениями, наверняка.

0 голосов
/ 24 октября 2014

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

Фактически, как IIS, так и системные службы работают в нулевом сеансе, и первый / единственный пользователь, который войдет в систему, запускается в сеансе 1, поэтому необходимо использовать глобальное пространство имен для связи между IIS или службой и обычной программой.

...