Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странный File Mapping, зависит от последовательности? ) 
V
    Опции темы
Alix
Дата 20.9.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Есть две программы. Просто приложение и сервис. Используют абсолютно одинаковый код для создания отображения файла. Вот он:
Код

type
  // Shared data struct definition
  PSharedData = ^TSharedData;
  TSharedData = packed record
    // на след три параметра не обращаем внимания
    hXPCWindow : HWND; // XPC wnd for PostMessage 
    hMyWindow  : HWND; // MAPP wnd
    number : HWND;
    xpcomCount : integer;    // number of instances, using shared memory
  end;

var
  // Shared memory handler
  hSharedMemory : THandle;
  // Shared structure
  pShared : PSharedData;

const
  guid_id = '219d665a-96c3-4d3c-bfcc-26afaa4c8f1e';

...

function prepareSharedMemory : boolean;
begin
  result := true;

  hSharedMemory := CreateFileMapping(INVALID_HANDLE_VALUE,
                                     nil,
                                     PAGE_READWRITE,
                                     0,
                                     sizeof(TSharedData),
                                     guid_id);

  if (hSharedMemory <> 0) and (GetLastError() <> ERROR_ALREADY_EXISTS) then begin

    pShared := PSharedData(MapViewOfFile(hSharedMemory,
                                         FILE_MAP_WRITE or FILE_MAP_READ,
                                         0,
                                         0,
                                         sizeof(TSharedData)));

    pShared^.xpcomCount := 1;
  end else if (hSharedMemory <> 0) then begin
    pShared := PSharedData(MapViewOfFile(hSharedMemory,
                                        FILE_MAP_WRITE or FILE_MAP_READ,
                                        0,
                                        0,
                                        sizeof(TSharedData)));
    inc(pShared^.xpcomCount);
  end else begin
    result := false;
  end;
end;

procedure freeSharedMemory;
begin
  // it was not even initialized
  if hSharedMemory = 0 then
    exit;

  // freeing shared memory
  if pShared^.xpcomCount <= 1 then begin
    UnmapViewOfFile(pShared);
    CloseHandle(hSharedMemory);
  end else begin
    dec(pShared^.xpcomCount);
  end;
end;


Если вначале открываю приложение, а потом сервис, то всё чудесно коннектится. Сервис по таймеру в лог пишет кол-во клиентов (pShared.xpcomCount). Если запустить еще одно приложение, то кол-во клиентов станет 3. Ну т.е. все работает. Закрытие в любом порядке тоже успешно. Но если вначале запускаю сервис, то от приложение, то получаю ERROR_ACCESS_DENIED после CreateFileMapping. 
В чем может быть дело? Ведь код одинаков...  (сервис был создан как SERVICE_WIN32_OWN_PROCESS)

Проверка по таймеру в приложении такая:
Код

   memo1.Lines.Add('Launched: ' + inttostr(pShared^.xpcomCount));


При необходимости выложу полные коды, там просто чистить надо будет.

Это сообщение отредактировал(а) Alix - 20.9.2007, 17:12


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
MetalFan
Дата 20.9.2007, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



тебе надо второй параметр прописать в CreateFileMapping, а именно параметры безопасности (LPSECURITY_ATTRIBUTES)...
что прописать - точно не скажу, может кто еще осведомленный подскажет

Добавлено @ 18:00
p.s. гдето была (на королевстве чтоль) очень хорошая статейка про DACL и проч

Это сообщение отредактировал(а) MetalFan - 20.9.2007, 18:20


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alix
Дата 20.9.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



А зачем? Если первое приложение запускается или даже два приложения между собой, то ведь все работает. Из MSDN:
Цитата

lpAttributes 
[in] A pointer to a SECURITY_ATTRIBUTES structure that determines whether or not a returned handle can be inherited by child processes. 
If lpAttributes is NULL, the handle cannot be inherited. 

The lpSecurityDescriptor member of the structure specifies a security descriptor for a new file mapping object. 

If lpAttributes is NULL, the file mapping object gets a default security descriptor. The access control lists (ACL) in the default security descriptor for a file mapping object come from the primary or impersonation token of the creator. However, doing this involves potential security risks. To avoid the risks, use a valid SECURITY_ATTRIBUTES structure.

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

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

Это сообщение отредактировал(а) Alix - 20.9.2007, 18:20


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
MetalFan
Дата 20.9.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



сервис, AFAIK, работает под системной учетной записью... может из этого  ноги растут


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alix
Дата 21.9.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Возможно кому-то будет интересно, начало кода функции prepareShareMemory изменилось на такой:
Код

var
  SD : TSecurityDescriptor;
  SA : TSecurityAttributes;

begin

  // Init security attribs
  ZeroMemory(@SA, SizeOf(SA));
  SA.nLength := sizeof(SA);
  InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
  SetSecurityDescriptorDacl(@SD, true, nil, false);
  SA.lpSecurityDescriptor := @SD;

  hSharedMemory := CreateFileMapping(INVALID_HANDLE_VALUE,
                                     @SA,                          // Specifying them at creation
                                     PAGE_READWRITE,
                                     0,
                                     sizeof(TSharedData),
                                     guid_id);
...


Это сообщение отредактировал(а) Alix - 21.9.2007, 11:45


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.