Подтвердить что ты не робот

Системная ошибка 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 в качестве ссылки, поэтому я не думаю, что в коде есть проблемы.

4b9b3361

Ответ 1

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

Из MSDN:

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

...

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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