Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Shared memory (CreateFileMapping): права доступа [D7]


Михаил   (16.06.22 13:41

Господа! Требуется заюзать shared memory.
Пишу нижеследующий код. Он выполняется только под админом; при попытке запуска под обычным юзером выдаёт ошибку "отказано в доступе". Ось - Вин10. Вопрос: как побороть и вообще способен ли shared memory работать под обычным пользователем.

Var
FSD:TSecurityDescriptor;
FPSD:PSecurityDescriptor;
SA:TSecurityAttributes;
PSA:PSecurityAttributes;
begin
hMapFile:=0;
if InitializeSecurityDescriptor(@FSD,SECURITY_DESCRIPTOR_REVISION)
    and
   SetSecurityDescriptorDacl(@FSD,true,nil,false)
 then FPSD:=@FSD
 else
 begin
 RaiseLastOSError('InitializeSecurityDescriptor error');
 exit;
 end;
if (FPSD<>nil) then
               begin
               ZeroMemory(@SA,SizeOf(SA));
               SA.nLength:=SizeOf(SA);
               SA.lpSecurityDescriptor:=FPSD;
               SA.bInheritHandle:=true;
               PSA:=@SA;
               end else PSA:=nil;
hMapFile:=CreateFileMapping(
                INVALID_HANDLE_VALUE,    // use paging file
                //THandle($FFFFFFFF),
                PSA,                     // security attributes
                PAGE_READWRITE,          // read/write access
                0,                       // maximum object size (high-order DWORD)
                BUF_SIZE,                // maximum object size (low-order DWORD)
                sName);                  // name of mapping object
if (hMapFile=0)
 then RaiseLastOSError('CreateFileMapping error')
 else OpenButton.Enabled:=false;
end;


Rouse_ ©   (16.06.22 14:34[1]

Просто не назначай декриптор (второй параметр в nil).
Вот пример рабочего IPC через MMF
https://github.com/AlexanderBagel/ProcessMemoryMap/blob/master/uIPC.pas


Михаил   (16.06.22 17:11[2]

Увы, тоже самое и с nil.


Михаил   (16.06.22 18:02[3]

Попробовал запустить под 7-й виндой.
Там запускается только под юзером с административными правами, из под обычного юзера та же ошибка.
Так что походу эта фича только для серверных приложений.


Rouse_ ©   (16.06.22 19:43[4]

А ты случаем проеrт что-то типа setup/install/update или типа такого не назвал? Для таких экзешников автоматом требуется админские права


Rouse_ ©   (16.06.22 19:45[5]

На, все запускается и работает

program test;

{$APPTYPE CONSOLE}

{$R *.res}

uses
 Windows;

var
 hMapFile: THandle;
begin
 hMapFile := CreateFileMapping(
   INVALID_HANDLE_VALUE,
   nil,
   PAGE_READWRITE,
   0,
   4096,
   'test');
 Writeln('hMapFile = ', hMapFile);
 Readln;
end.


Михаил   (17.06.22 12:26[6]

Странно, твоя демка работает.
>А ты случаем проеrт что-то типа setup/install/update или типа такого не назвал? Для таких экзешников автоматом требуется админские права

Прогу назвал Server.exe.


Михаил   (17.06.22 12:54[7]

Дело, как оказалось, было в имени ресурса. Я его назвал (константа sName в моей демке) "Global\MyFileMappingObject" (сдёрнул из какой-то демки).
Вот ыть как.
Спасибо.


Rouse_ ©   (17.06.22 16:04[8]

Для Global нужны админские права, да, об чем, собственно, в справке и написано


> Creating a file mapping object in the global namespace from
> a session other than session zero requires the SeCreateGlobalPrivilege
> privilege. Note that this privilege check is limited to
> the creation of file mapping objects and does not apply
> to opening existing ones. For example, if a service or the
> system creates a file mapping object in the global namespace,
>  any process running in any session can access that file
> mapping object provided that the caller has the required
> access rights.


Михаил   (22.06.22 08:51[9]

Проблема номер 2. Не могу адресовать более 4кБайт shared memory.
То есть:
1) В CreateFileMapping() указываю dwMaximumSizeHigh=0, dwMaximumSizeLow=262148 (специфика задачи)
2) Пишу в полученную память по указателю. В момент, когда смещение от начала памяти достигает 4096, вылазит "Access violation.... Write of address xxxxxxx".


KSergey ©   (22.06.22 11:37[10]

А чего в память пишете?
Покажите код
Может у вас указатель указывает на данные более 1 байта


Михаил   (22.06.22 11:42[11]

Да, у меня по указателю за один раз перепихивается 4 байта (такой тип данных). После чего указатель инкрементируется на 4, и всё повторяется.
Также пробовал для теста делать ZeroMemory() на весь размер памяти. При первом обращении (сразу после открытия) это проходит, а вот по второму разу по ходу программы вылезает та же ошибка.


Михаил   (22.06.22 12:04[12]

Попробовал перепихивать по 1 байту - та же ситуация.


Михаил   (22.06.22 12:24[13]

Всё, нашёл багу - неправильно указан был размер памяти при её открытии. Пардон за беспокойство.


Михаил   (09.08.22 18:32[14]

йцу


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо