File mapping

Тема в разделе "WASM.BEGINNERS", создана пользователем JCronuz, 23 сен 2008.

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Приветствую.

    Интересует следующее:

    1) Как с помощью файлового мэппинга записать данные т.е. вызываю
    Код (Text):
    1. invoke CreateFile....
    2. mov hFile,eax
    3. invoke CreateFileMapping, hFile, NULL, PAGE_READWRITE, 0, 0, 0
    ;Не понятно как записывать чтолибо

    2) Остаются ли изменения внесенные по средство мэппинга после того как
    удален обьект из памяти


    Заранее благадарю.
     
  2. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Ещё надо вызвать MapViewOfFile

    если стоит флаг на запись, тоесть у тебя он стоит PAGE_READWRITE

    то данные скидываются на диск, только не знаю сразу или после выгрузки файла из памяти
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Это понятно, как можно записать сами данные с помощью VirtualAlloc, WriteProcessMemory?
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    MapViewOfFile вернет тебе начальный адрес памяти отмапленого файла.
    Запись ничем не отличается от записи в обычную память.
    После закрытия маппинга все данные сохраняются.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    JCronuz
    Где ж понятно? MapViewOfFile - это и есть своеобразный аналог VirtualAlloc для данного случая. В WriteProcessMemory нет необходимости: писать можно элементарными инструкциями.
     
  6. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    // Разобрался
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    'Файловы мэппинг' не обьесняет сути. Есть обьект 'Секция'. По сути это часть файла(секция не связанная с файлом это условность, используется своп), которая может быть отображена в адресное пространство, данные могут быть сохранены из проекции в файл. Несколько проекций секции составляют разделяемую память, где изменение значения в первой проекции приводит к такимже изменениям в остальных проекциях(если секция файловая(помимо свопа), то необходимо заюзать сервис сохраняющий её в файл). В проекции секции отображаются данные из самой секции и как следствие освобождение(удаление) проекции не приводит к изменению самой секции.
    2FED, Partner, JCronuz
    Данные сохраняются в файл посредством NtFlushVirtualMemory(к этому сервису сводится FlushViewOfFile()).
     
  8. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Clerk Тоесть ты хочешь сказать что при UnmapViewOfFile данные не сохраняются?
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ага.
     
  10. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Неправда. Сохраняются. Не моментально, но кэш сбрасывается и данные сохраняются.

    "If the function succeeds, the return value is nonzero, and all dirty pages within the specified range are written "lazily" to disk." (MSDN)

    FlushViewOfFile поможет, когда нужно сбросить кэш не закрывая вью.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Partner
    Примеры в студию.
     
  12. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Т.е. в документации ошибка ?
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Clerk в своем амплуа :lol:
    "Как много нам открытий чудных ..." (С) и далее по тексту :lol:
     
  14. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Clerk ну я например делал изменения в файле и не вызывал FlushViewOfFile и данные сохранялись.
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Clerk
    Примеры в студию.
    Код (Text):
    1. #define STRICT
    2. #define WIN32_LEAN_AND_MEAN
    3. #include <windows.h>
    4. #include <stdio.h>
    5. #include <stdlib.h>
    6.  
    7. static void perr(const char *format, ...)
    8. {
    9.   va_list ap;
    10.   va_start(ap, format);
    11.   printf("error: ");
    12.   vprintf(format, ap);
    13.   va_end(ap);
    14.   exit(1);
    15. }
    16.  
    17.  
    18. int main(int argc, char *argv[])
    19. {
    20.   LARGE_INTEGER s;
    21.   HANDLE f, m;
    22.   char *p = " ";
    23.  
    24.   if (1 == argc)
    25.     perr("usage \"%s\" filename\n", argv[0]);
    26.  
    27.   f = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ,
    28.                  NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    29.   if (INVALID_HANDLE_VALUE == f)
    30.     perr("CreateFile(\"%s\") failed x%08X\n", argv[1], GetLastError());
    31.  
    32.   s.LowPart = GetFileSize(f, (DWORD *)&s.HighPart);
    33.   if (INVALID_FILE_SIZE == s.LowPart)
    34.   {
    35.     CloseHandle(f);
    36.     perr("GetFileSize failed %d\n", GetLastError());
    37.   }
    38.  
    39.   if (0 == s.QuadPart)
    40.   {
    41.     DWORD r = 0;
    42.     if (FALSE == WriteFile(f, p, 1, &r, NULL) || 1 != r)
    43.       perr("WriteFile failed %d\n", GetLastError());
    44.   }
    45.  
    46.   m = CreateFileMapping(f, NULL, PAGE_READWRITE, 0, 0, NULL);
    47.   CloseHandle(f);
    48.   if (NULL == m)
    49.     perr("CreateFileMapping failed x%08X\n", GetLastError());
    50.  
    51.   p = (char *) MapViewOfFile(m, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
    52.   CloseHandle(m);
    53.   if (NULL == p)
    54.     perr("MapViewOfFile failed x%08X\n", GetLastError());
    55.  
    56.   *p = 't';
    57.  
    58.   if (FALSE == UnmapViewOfFile(p))
    59.     perr("UnmapViewOfFile failed x%08X\n", GetLastError());
    60.    
    61.   printf("ok\n");
    62.   return 0;
    63. }
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Не проверял, но надеюсь код рабочий. Не знал потомучто не юзал никогда.
     
  17. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    JCronuz
    Учитывай, что когда будешь писать, то проверяй "А не вышел ли указатель куда я пишу за область файла?", т.е базовый адрес + размер файла и все это с выравниванием

    ЗЫ:
    Буду теперь всегда так делать, если кто-то чтото спросит и я нашел на васме, но нет нюанса, а чел допустил ошибку, то тему подниму, не смотря что старая и запощу нюанс )))
     
  18. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    EvilsInterrupt благодарю, так и сделаю