Странное поведение файла карты памяти, некоторые наблюдения и некоторые вопросы - PullRequest
2 голосов
/ 20 марта 2011

Пожалуйста, посмотрите на этот код ниже.

#include <windows.h>

void Write(char *pBuffer)
{
//  pBuffer -= 4*sizeof(int);
    for(int i = 0; i<20; i++)
        *(pBuffer + sizeof(int)*i) = i+1;
}

void main()
{
    HANDLE hFile = ::CreateFile("file", GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

    if(INVALID_HANDLE_VALUE == hFile)
    {
        ::MessageBox(NULL, "", "Error", 0);
        return;
    }

    HANDLE hMMF = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 32, NULL);

    char *pBuffer = (char*)::MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 0);

    Write(pBuffer);

    ::FlushViewOfFile(pBuffer, 100);

    ::UnmapViewOfFile(pBuffer);
}

Я выделил только 32 байта, но когда я пытаюсь записать после выделенного размера, я не получаю никакой ошибки вообще.Это по замыслу или это ошибка в коде Windows?Однако, если вы включите закомментированную часть, она выдаст ошибку, как и ожидалось.

Я спрашиваю об этом, потому что думаю об использовании этой «функции» в своих интересах.Могу я?К вашему сведению, у меня Win XP ver 2002 SP 3, но я подозреваю, что это «исправлено» в новой Windows, что может привести к сбою моего кода, IDK.Любая полезная ссылка, объясняющая некоторые внутренности этого, действительно помогла бы.

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 марта 2011

Это ничем не отличается от записи за конец буфера, который расположен в куче.Операционная система может дать вам пощечину, только если вы пишете в виртуальную память, которая не отображаетсяОтображение основано на странице, одна страница составляет 4096 байт.Вам нужно будет пройти мимо этой страницы, чтобы получить kaboom.Измените цикл for на (4096 + 4) / 4, чтобы воспроизвести его.

0 голосов
/ 20 марта 2011

Диспетчер виртуальной памяти должен отображать память по странице, так что экстент фактически будет округлен до ближайших 4 КБ (или независимо от размера вашей системной страницы).

Я не думаю, что задокументировано, будут ли записи в ту же страницу, что и сопоставленные данные, но после конца сопоставления, возвращаться в файл. Так что не полагайтесь на это поведение, оно может легко меняться между версиями Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...