2012-03-16 2 views
4

_SH_DENYWR отрицает какую-либо другую попытку открыть файл с правами на запись (нарушение доли) _SH_SECURE Sets безопасный режим (совместно чтение, эксклюзивный доступ на запись)Какова разница между _SH_SECURE и _SH_DENYWR

_SH_SECURE кажется новее, основанный на факте, что документы, кажется, замаскируют его или опускают в зависимости от того, где вы смотрите. Почти нет информации о сети, которую я мог бы найти на ней.

Как они могут отличаться?

ответ

2

Поведение _SH_SECURE зависит от доступа к запрошенному в mode аргументе _fsopen()/_wfsopen(). Если только запрашивается доступ на чтение, то _SH_SECURE карты - FILE_SHARE_READ. В противном случае он отображает 0 (эксклюзивный доступ).

Контраст _SH_DENYWR, который всегда maps to FILE_SHARE_READ.

Соответствующая часть исходного кода CRT (строки 269-301 из open.c в Visual Studio 2010) выглядит следующим образом:

/* 
* decode sharing flags 
*/ 
switch (shflag) { 

    case _SH_DENYRW:  /* exclusive access */ 
     fileshare = 0L; 
     break; 

    case _SH_DENYWR:  /* share read access */ 
     fileshare = FILE_SHARE_READ; 
     break; 

    case _SH_DENYRD:  /* share write access */ 
     fileshare = FILE_SHARE_WRITE; 
     break; 

    case _SH_DENYNO:  /* share read and write access */ 
     fileshare = FILE_SHARE_READ | FILE_SHARE_WRITE; 
     break; 

    case _SH_SECURE:  /* share read access only if read-only */ 
     if (fileaccess == GENERIC_READ) 
      fileshare = FILE_SHARE_READ; 
     else 
      fileshare = 0L; 
     break; 

    default:    /* error, bad shflag */ 
     _doserrno = 0L; /* not an OS error */ 
     *pfh = -1; 
     _VALIDATE_RETURN_ERRCODE(("Invalid sharing flag" , 0), EINVAL); 
} 
Смежные вопросы