Системная ошибка 0x5: CreateFileMapping()
Я хочу реализовать IPC с использованием именованной общей памяти.
Чтобы сделать это, одним из шагов является получение дескриптора объекта Mapping Memory, используя CreateFileMapping().
Я делаю это точно, как веб-сайт MSDN reccommends: 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 (Access Denied.)
- Только Доступ к именам памяти (не общий доступ к файлам).
- операционная система Windows 7 x64
- Доступные права администратора
- Разработанное приложение: приложение с 64-битным подключаемым модулем (. dll)
Есть ли у кого-то такой же опыт и способ его исправить? Я использую сайт MSDN в качестве ссылки, поэтому я не думаю, что в коде есть проблемы.
Ответы
Ответ 1
Похоже, у вас недостаточно привилегий.
Из MSDN:
Создание объекта сопоставления файлов в глобальное пространство имен из сеанса другое чем нулевой сеанс Привилегия SeCreateGlobalPrivilege. Для Дополнительная информация, см. Объект ядра Пространства имен.
...
Создание объекта сопоставления файлов в глобальном пространстве имен, используя CreateFileMapping из сеанса кроме нуля сеанса, является привилегированная работа. Из-за этого, приложение, выполняемое произвольным Узел сеанса удаленных рабочих столов (RD Session Host) должен иметь Функция SeCreateGlobalPrivilege включена в для создания объекта сопоставления файлов в глобальном пространстве имен. Проверка привилегий ограничивается создание объектов сопоставления файлов и не распространяется на открытие существующих из них. Например, если служба или система создает объект сопоставления файлов, любой процесс, выполняющийся в любом сеансе, может доступ к этому файло-картографическому объекту при условии, что пользователь имеет необходимый доступ.
Ответ 2
Администраторы, службы и сетевые службы по умолчанию имеют SeCreateGlobalPrivilege. Вы должны помнить, что Windows7/Vista не запускает все как admin. Поэтому используйте "Начать как администратор", чтобы сделать "Global" работу для вашего приложения. Если вы отлаживаете, запустите Visual Studio также как администратор.
Ответ 3
Чтобы создавать глобальные сопоставления файлов, вам нужна привилегия SeCreateGlobalPrivilege
- есть ли у вас это? Отказано в доступе, это означает, что это проблема с разрешениями.
Ответ 4
Ссылка на службы терминалов в документации о глобальном пространстве имен немного вводит в заблуждение, так как это подразумевает, что вам нужно только беспокоиться об этом, если у вас есть необычная ситуация.
Фактически, как IIS, так и системные службы запускаются в сеансе нуль, а первый/единственный пользователь должен запускать сеансы в сеансе 1 - поэтому вы должны использовать глобальное пространство имен для связи между IIS или службой и обычной программой.