概要


メモリを保護する。

引数

  • addr: 保護するメモリの開始アドレス。
  • len: メモリの大きさ。
  • prot: 保護の種類。

戻り値


成功したら0, 失敗したら-1.

宣言


/* Portable implementation of mprotect.  The implementation does not
   necessarily support PROT_EXEC or PROT_WRITE without PROT_READ.  The
   only guarantees are that no writing will be allowed without
   PROT_WRITE and no access will be allowed for PROT_NONE.  */

mprotectの移植可能な実装。この実装は、PROT_READなしでPROT_EXECまたはPROT_WRITEをサポートする必要がない。保証されることは、PROT_WRITEなしではいかなる書き込みも許可されず、PROT_NONEではいかなるアクセスも許可されない。

extern int _gst_mem_protect (PTR addr,
                             size_t len,
                             int prot)
  ATTRIBUTE_HIDDEN;

実装



int
_gst_mem_protect (PTR addr, size_t len, int prot)
{
#if defined HAVE_MPROTECT
  return mprotect (addr, len, prot);

#elif defined WIN32
  DWORD oldprot;
  int my_prot;

  switch (prot & (PROT_READ | PROT_WRITE | PROT_EXEC))
  {
  case PROT_NONE:
    my_prot = 0; break;

  case PROT_READ:
    my_prot = PAGE_READONLY; break;

  case PROT_WRITE:
  case PROT_READ | PROT_WRITE:
    my_prot = PAGE_READWRITE; break;

  case PROT_EXEC:
    my_prot = PAGE_EXECUTE; break;

  case PROT_EXEC | PROT_READ:
    my_prot = PAGE_EXECUTE_READ; break;

  case PROT_EXEC | PROT_WRITE:
  case PROT_EXEC | PROT_READ | PROT_WRITE:
    my_prot = PAGE_EXECUTE_READWRITE; break;

  default:
    return -1;
  }

  if (VirtualProtect (addr, len, my_prot, &oldprot))
    return 0;
  else
    return -1;
#else
  return -1;
#endif
}
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

管理人/副管理人のみ編集できます