Приветствую. Интересует следующее: 1) Как с помощью файлового мэппинга записать данные т.е. вызываю Код (Text): invoke CreateFile.... mov hFile,eax invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE, 0, 0, 0 ;Не понятно как записывать чтолибо 2) Остаются ли изменения внесенные по средство мэппинга после того как удален обьект из памяти Заранее благадарю.
Ещё надо вызвать MapViewOfFile если стоит флаг на запись, тоесть у тебя он стоит PAGE_READWRITE то данные скидываются на диск, только не знаю сразу или после выгрузки файла из памяти
MapViewOfFile вернет тебе начальный адрес памяти отмапленого файла. Запись ничем не отличается от записи в обычную память. После закрытия маппинга все данные сохраняются.
JCronuz Где ж понятно? MapViewOfFile - это и есть своеобразный аналог VirtualAlloc для данного случая. В WriteProcessMemory нет необходимости: писать можно элементарными инструкциями.
'Файловы мэппинг' не обьесняет сути. Есть обьект 'Секция'. По сути это часть файла(секция не связанная с файлом это условность, используется своп), которая может быть отображена в адресное пространство, данные могут быть сохранены из проекции в файл. Несколько проекций секции составляют разделяемую память, где изменение значения в первой проекции приводит к такимже изменениям в остальных проекциях(если секция файловая(помимо свопа), то необходимо заюзать сервис сохраняющий её в файл). В проекции секции отображаются данные из самой секции и как следствие освобождение(удаление) проекции не приводит к изменению самой секции. 2FED, Partner, JCronuz Данные сохраняются в файл посредством NtFlushVirtualMemory(к этому сервису сводится FlushViewOfFile()).
Неправда. Сохраняются. Не моментально, но кэш сбрасывается и данные сохраняются. "If the function succeeds, the return value is nonzero, and all dirty pages within the specified range are written "lazily" to disk." (MSDN) FlushViewOfFile поможет, когда нужно сбросить кэш не закрывая вью.
Clerk Примеры в студию. Код (Text): #define STRICT #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdio.h> #include <stdlib.h> static void perr(const char *format, ...) { va_list ap; va_start(ap, format); printf("error: "); vprintf(format, ap); va_end(ap); exit(1); } int main(int argc, char *argv[]) { LARGE_INTEGER s; HANDLE f, m; char *p = " "; if (1 == argc) perr("usage \"%s\" filename\n", argv[0]); f = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == f) perr("CreateFile(\"%s\") failed x%08X\n", argv[1], GetLastError()); s.LowPart = GetFileSize(f, (DWORD *)&s.HighPart); if (INVALID_FILE_SIZE == s.LowPart) { CloseHandle(f); perr("GetFileSize failed %d\n", GetLastError()); } if (0 == s.QuadPart) { DWORD r = 0; if (FALSE == WriteFile(f, p, 1, &r, NULL) || 1 != r) perr("WriteFile failed %d\n", GetLastError()); } m = CreateFileMapping(f, NULL, PAGE_READWRITE, 0, 0, NULL); CloseHandle(f); if (NULL == m) perr("CreateFileMapping failed x%08X\n", GetLastError()); p = (char *) MapViewOfFile(m, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); CloseHandle(m); if (NULL == p) perr("MapViewOfFile failed x%08X\n", GetLastError()); *p = 't'; if (FALSE == UnmapViewOfFile(p)) perr("UnmapViewOfFile failed x%08X\n", GetLastError()); printf("ok\n"); return 0; }
JCronuz Учитывай, что когда будешь писать, то проверяй "А не вышел ли указатель куда я пишу за область файла?", т.е базовый адрес + размер файла и все это с выравниванием ЗЫ: Буду теперь всегда так делать, если кто-то чтото спросит и я нашел на васме, но нет нюанса, а чел допустил ошибку, то тему подниму, не смотря что старая и запощу нюанс )))