Нет доступа на запись в файле отображаемом в память
, не могу подружить FILE_MAP_WRITE и MapViewOfFile
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.140] |
|
|
Правила раздела C/C++: Системное программирование и WinAPI
FAQ Сайта (C++)
FAQ Форума
Наши Исходники
Поиск по Разделу
MSDN Library Online (Windows Driver Kit)
Google
Нет доступа на запись в файле отображаемом в память
, не могу подружить FILE_MAP_WRITE и MapViewOfFile
|
|
|
|
|
Вопрос по файлам отображаемым в память. Возникла проблема. В главном процессе создаю файл отображаемый в память:
![]() ![]() hFile = CreateFile("page.swp", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, NULL, sizeof(CLIENT_CONTEXT), "FastJobSwap"); lpContext = (LPCLIENT_CONTEXT) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); Заполняю его нужными мне данными, и далее пытаюсь открыть этот файл в дочернем процессе: ![]() ![]() hMap = OpenFileMapping(PAGE_READWRITE, FALSE, "FastJobSwap"); lpContext = (LPCLIENT_CONTEXT) MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); MapViewOfFile возвращает ошибку номер 5 (отказано в доступе). Если поменять флаг FILE_MAP_ALL_ACCESS на FILE_MAP_READ, то всё работает, все данные передаются в том виде, в каком мне надо (FILE_MAP_WRITE, как и следовало ожидать тоже не работает). Как сделать так, чтобы был доступ к отображённому файлу также и на запись, а не только на чтение? Вот на этой ссылке парень говорит, что у него всё заработало, когда он SECURITY_ATTRIBUTES добавил. Попробовал пойти его путём, но MapViewOfFile по-прежнему жалуется, что у неё нет доступа: StartService & SetHook & OpenFileMapping все вместе не работает |
|
Сообщ.
#2
,
|
|
|
|
![]() ![]() OpenFileMapping(FILE_MAP_ALL_ACCESS, |
|
Сообщ.
#3
,
|
|
|
|
Спасибо, Hryak, решение помогло, но возникла ещё одна проблема. Через структуру CLIENT_CONTEXT я передаю хэндл события (hEvent) созданного функцией CreateEvent. Логика работы моей программы подразумевает, что родительский процесс создаёт hEvent, передаёт его дочернему процессу, а тот, когда выполнит определённые действия устанавливает это событие (функцией SetEvent).
Но эта логика у меня не работает: функция SetEvent, вызванная в дочернем процессе возвращает ошибку. Тот же вызов в родительском процессе завершается успешно. Как я понял, между двумя процессами хэндлы нельзя так просто передавать, а как можно? |
|
Сообщ.
#4
,
|
|
|
|
Цитата Vedrus @ о родительский процесс создаёт hEvent, передаёт его дочернему процессу А как ты передаешь? Просто как число нельзя так просто. Нужно или делать хендл наследуемым и наследовать при создании дочернего процесса (тогда можно и как число передать), либо как у тебя с мапой сделано (именной объект ядра) или с помощью DuplicateHandle |
|
Сообщ.
#5
,
|
|
|
|
Спасибо за много вариантов. Я для себя ещё один нашёл, его и использовал - задал символьные имена событиям и через OpenEvent открыл их в дочернем процессе.
|
|
Сообщ.
#6
,
|
|
|
|
Цитата Vedrus @ для себя ещё один нашёл, его и использовал - задал символьные имена событиям и через OpenEvent открыл их в дочернем процессе. Это и есть Цитата Hryak @ Точнее, именное событие, а не хендл, конечно именной хендл |