以下のこのコードを見てください。
#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 バージョン 2002 SP 3 を持っていますが、これは新しい Windows で「修正」されていると思われ、コード IDK が失敗する可能性があります。これの内部を説明する便利なリンクは本当に役に立ちます。
ありがとう