Разрешения на доступ к общей памяти в Windows - PullRequest
7 голосов
/ 07 октября 2008

Я разработал приложение для Windows, которое использует разделяемую память, то есть файлы, отображаемые в память, для межпроцессного взаимодействия. У меня есть служба Windows, которая выполняет некоторую обработку и периодически записывает данные в отображенный файл памяти. У меня есть отдельное приложение для Windows, которое читает из отображенного файла памяти и отображает информацию. Приложение работает должным образом на Windows XP, XP Pro и Server 2003, но НЕ на Vista.

Я вижу, что данные, записываемые в отображенный в память файл, корректно обрабатываются службой Windows, потому что я могу открыть файл в текстовом редакторе и просмотреть сохраненные сообщения, но приложение «потребителя» не может прочитать файл. Здесь следует отметить одну интересную вещь: если я закрою потребительское приложение и перезапущу его, оно будет использовать сообщения, которые ранее были записаны в файл отображения памяти.

Кроме того, еще одна странная вещь заключается в том, что я получаю такое же поведение, когда подключаюсь к хосту Windows с помощью удаленного рабочего стола и запускаю / использую приложение потребителя через удаленный рабочий стол. Однако, если я вызываю удаленный рабочий стол и подключаюсь к сеансу консоли целевого хоста с помощью следующей команды: mstsc -v:servername /F -console, все работает отлично.

Так вот почему я думаю, что проблема связана с разрешениями. Кто-нибудь может прокомментировать это?

EDIT:

ACL, который я использую для создания файла отображения памяти и объектов Mutex, которые синхронизируют доступ, выглядит следующим образом:

TCHAR * szSD = TEXT("D:")
               TEXT("(A;;RPWPCCDCLCSWRCWDWOGAFA;;;S-1-1-0)")
               TEXT("(A;;GA;;;BG)")
               TEXT("(A;;GA;;;AN)")
               TEXT("(A;;GA;;;AU)")
               TEXT("(A;;GA;;;LS)")
               TEXT("(A;;GA;;;RD)")
               TEXT("(A;;GA;;;WD)")
               TEXT("(A;;GA;;;BA)"); 

Я думаю, что это может быть частью проблемы.

Ответы [ 4 ]

9 голосов
/ 09 октября 2008

Итак, я нашел решение своей проблемы:

В Windows XP все именованные объекты ядра, такие как мьютекс, семафор и отображенные в память объекты, хранятся в одном пространстве имен. Поэтому, когда разные процессы в разных пользовательских сеансах ссылаются на определенный объект, используя его имя, они получают дескриптор этого объекта. Однако из соображений безопасности терминальные службы Windows создают отдельное пространство имен для объектов ядра, на которые ссылаются процессы, запущенные в этом сеансе. В Windows Vista это встроено и в это поведение, поэтому мое приложение не работало корректно в Vista. Чтобы уточнить, у меня есть служба Windows, которая выполняется в нулевом сеансе, и приложение, которое выполняется в сеансе пользователя, поэтому мои именованные объекты создавались в отдельных пространствах имен.

Быстрое решение этой проблемы состояло в использовании глобального пространства имен, добавляя «Global \» к каждому имени объекта ядра , которое я использовал и которое добилось цели.

3 голосов
/ 09 октября 2008

Префикс «Global \» может не работать с общей памятью. См. «Влияние изоляции сеанса 0 на службы и драйверы в Windows Vista» для решения.

1 голос
/ 07 октября 2008

С каким доступом вы открываете раздел общей памяти? Попробуйте с FILE_MAP_ALL_ACCESS и продолжайте свой путь вниз. Также убедитесь, что у вас нет условия гонки между производителем и потребителями - какой из них создает общую память? Убедитесь, что он создан, прежде чем другой попытается его открыть. Одним из методов является создание раздела в родительском элементе до запуска дочернего процесса - если вы используете архитектуру родительского / дочернего процесса.

Вашему ребенку может потребоваться повышенная версия Vista, чтобы получить доступ к общей памяти. Это также может быть связано с сеансом окна, который вы используете. Службы работают в сеансе 0 (я думаю), в то время как другие приложения (особенно если вы входите через удаленный рабочий стол) могут работать в другом сеансе.

0 голосов
/ 07 октября 2008

Вы пытались переместить файл в другое место. Попробуйте поместить его в папку «Shared Documents», эта папка кажется наиболее доступной в Vista.

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