ネイティブの Win32 環境で動作させるために必要なコード (変更できない) がいくつかあります。このコードはmmap()
とを呼び出すので、 、 などmunmap()
を使用してこれらの関数を作成し、同じことを実現しました。最初はこれで問題なく動作し、コードは期待どおりにファイルにアクセスできます。残念ながら、コードはファイルの不要になった選択部分に進みます。CreateFileMapping()
MapViewOfFile()
munmap()
x = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
...
munmap(x, hdr_size);
munmap(x + foo, bar);
...
残念ながら、マップされた範囲の中央にポインターを渡すと、マッピングUnmapViewOfFile()
全体が破棄されます。さらに悪いことに、これが部分的なマップ解除要求であることを検出して無視する方法がわかりません。
範囲を呼び出してみVirtualFree()
ましたが、当然のことながら、これにより ERROR_INVALID_PARAMETER が生成されます。
部分的なマッピング解除を検出して無視できるように、静的/グローバル変数を使用してすべての開いているメモリ マッピングを追跡する必要があると考え始めていますが、より良いアイデアがあることを願っています...
編集:
上記で十分に明示的ではなかったため、 UnMapViewOfFile のドキュメントはその関数の動作を正確に反映していません。
ビュー全体のマッピングを解除して断片を再マッピングすることは、適切な解決策ではありません。新しいマッピングのベース アドレスを提案することしかできず、それを実際に制御することはできないからです。don'tのセマンティクスでmunmap()
は、まだマップされている部分のベース アドレスを変更できません。
私が本当に必要としているのは、既にマップされているメモリ領域のベース アドレスとサイズを見つける方法です。
edit2:問題をそのように言い直すと、VirtualQuery()
関数で十分であるように見えます。