Pregunta

Mire este código a continuación.

#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);
}

He asignado solo 32 bytes, pero cuando intento escribir más allá del tamaño asignado, no recibo ningún error. ¿Es esto por diseño o este es un error en el código de Windows? Sin embargo, si incluye la parte comentada, da un error, como se esperaba.

Pregunto esto porque estoy pensando en usar esta "característica" para mi ventaja. ¿Yo puedo? Para su información, he ganado XP VER 2002 SP 3, pero sospecho que esto es "arreglado" en Windows más nuevos "que podría fallar mi código, idk. Cualquier enlace útil que explique algunas partes internas de esto realmente ayudaría.

Gracias

¿Fue útil?

Solución

El Administrador de memoria virtual tiene que mapear la memoria de la página, por lo que la extensión en efecto se redondeará al 4KB más cercano (o lo que sea el tamaño de la página de su sistema).

No creo que esté documentado si las escrituras en la misma página que los datos mapeados, pero más allá del final de la asignación, se comprometerán al archivo. Así que no confíe en ese comportamiento, podría cambiar fácilmente entre las versiones de Windows.

Otros consejos

Esto no es diferente al escribir más allá del final de un búfer que se asigna en el montón. El sistema operativo solo puede abofetear los dedos si escribe a la memoria virtual que no está asignada. El mapeo se basa en la página, una página es 4096 bytes. Tendrás que escribir más allá de esta página para obtener el Kaboom. Cambie su for-bucle para terminar en (4096+4)/4 para reproducirlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top