Системная ошибка 0x5: createFileMapping ()
-
10-10-2019 - |
Вопрос
Я хочу реализовать МПК с использованием именованной общей памяти.
Для этого один из шагов - получить ручку к Картирование объекта памяти, с использованием 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-битное плагическое приложение (.dll)
У кого -нибудь такой же опыт, и способ исправить это, пожалуйста? Я использую сайт MSDN в качестве ссылки, поэтому я не думаю, что в коде есть проблемы.
Решение
Похоже, у вас недостаточно привилегий.
От MSDN:
Создание объекта сопоставления файлов в глобальном пространстве имен из сеанса, кроме Session Zero, требует привилегии SecreateGlobalPrivilege. Для получения дополнительной информации см. Промыслы имен объектов ядра.
...
Создание объекта со картинами файлов в глобальном пространстве имен, используя CreateFileMapping, из сеанса, отличного от Session Zero, является привилегированной операцией. Из-за этого приложение, работающее в произвольном сеансе сеанса сеанса на рабочем столе (хост сеанса RD), должно быть включено SecreateGlobalPrivilege для успешного создания объекта отображения файлов в глобальном пространстве имен. Проверка привилегий ограничена созданием объектов картирования файлов и не применяется к открытию существующих. Например, если служба или система создают объект отображения файлов, любой процесс, работающий в любом сеансе, может получить доступ к этому объекту со отображением файлов, при условии, что пользователь имеет необходимый доступ.
Другие советы
Администраторы, услуги и сетевые услуги по умолчанию имеют secreateglobalprivilege. Вы должны помнить, однако, что Windows7/Vista не запускает все как администратор. Так что используйте «Начните как администратор», чтобы сделать «Global » работать для вашего приложения. Если вы отлаживаете, начните Visual Studio в качестве администратора.
Для создания глобальных отображений файлов вам нужны SeCreateGlobalPrivilege
Привилегия - у вас есть это? Наверняка подразумевает, что это проблема с разрешениями.
Ссылка на службы терминала в документации о глобальном пространстве имен немного вводит в заблуждение, поскольку подразумевает, что вам нужно беспокоиться об этом, только если у вас есть необычная ситуация.
На самом деле как IIS, так и системные службы работают в Session Zero, и первый / единственный пользователь, который входит в систему запуска в сессии 1 - поэтому вам нужно использовать глобальное пространство имен для связи между IIS или службой и обычной программой.