2008-10-06 11 views
6

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

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

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

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

EDIT:

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

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)"); 

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

ответ

0

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

+0

Общие документы - это очень небезопасное место для файлов, связанных с МПК, - не делайте этого. –

1

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

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

+0

Итак, я использую FILE_MAP_ALL_ACCESS для сопоставления разделяемой памяти, и я разработал код, чтобы неважно, кто сначала создает общую память. Но ваше предложение о сеансе интересно. Я займусь этим. –

6

Так что я нашел решение моей проблемы:

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

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

+0

Возможно, вы создали дыру в вашей системе. –

+1

Ну, есть смешанные мысли об этом. Бывают случаи, когда вы хотите предоставить услуги более высокие права и способности (например, Local System), чем пользовательское приложение, которое должно быть в состоянии взаимодействовать с этой службой. Можно утверждать, что вы включаете защиту, предоставляя услугу, а не приложение, доступную всем. Однако вы можете видеть, что служба существует вообще как потенциальная дыра в безопасности. Но я не согласен. – Dan

3

Префикс «Глобальный» может не работать в общей памяти. См. "Impact of Session 0 Isolation on Services and Drivers in Windows Vista" для решения.

+2

Этот документ проверяет мои решения ... в нем говорится: «Правильный способ синхронизации пользовательских приложений с сервисом заключается в явном использовании префикса Global \». –

 Смежные вопросы

  • Нет связанных вопросов^_^