diff options
Diffstat (limited to 'docs/file-share-modes')
-rw-r--r-- | docs/file-share-modes | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/docs/file-share-modes b/docs/file-share-modes new file mode 100644 index 00000000000..7be1919912d --- /dev/null +++ b/docs/file-share-modes @@ -0,0 +1,173 @@ +Rules for opening shared files +============================== + +File is already open, with share set to none: + + Can not open again + + +File is already open for reading, with read share: + + Can open for reading only, share must include read (can have write too) + + +File is already open for reading, with write share: + + Can open for writing only, share must include read (can have write too) + + +File is already open for reading, with read + write share: + + Can open for read, writing or both, share must include read (can have write too) + + +File is already open for writing, with read share: + + Can open for reading only, share must include write (can have read too) + + +File is already open for writing, with write share: + + Can open for writing only, share must include write (can have read too) + + +File is already open for writing, with read + write share: + + Can open for reading, writing or both, share must include write (can have read too) + + +File is already open for reading + writing, with read share: + + Can open for reading only, share must be read + write + + +File is already open for reading + writing, with write share: + + Can open for for writing only, share must be read + write + + +File is already open for reading + writing, with read + write share: + + Can open for read, writing or both, share must be read + write + + + +Executive Summary +----------------- + + Second open must have access within first share, must set second share to at least first access + + + + +Documenting code +---------------- + + +#include <stdio.h> +#include <windows.h> + +int access[] = { + GENERIC_READ, + GENERIC_WRITE, + GENERIC_READ | GENERIC_WRITE +}; + +char *access_names[] = { + "G_READ", + "G_WRITE", + "G_READ|G_WRITE" +}; + +int share[] = { + FILE_SHARE_READ, + FILE_SHARE_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE +}; + +char *share_names[] = { + "SHARE_READ", + "SHARE_WRITE", + "SHARE_READ|SHARE_WRITE" +}; + +void lockfiles(int access1, int share1, int access2, int share2) +{ + HANDLE h1, h2; + BOOL ret; + + if (access2 == 0 && share2 == 0) { + printf("\n"); + printf("%22.22s\n%22.22s", access_names[access1], share_names[share1]); + } + + h1 = CreateFile("lockedfile", + access[access1], + share[share1], + NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (h1 == INVALID_HANDLE_VALUE) { + printf("Open1 failed: %d\n", GetLastError()); + return; + } + + h2 = CreateFile("lockedfile", + access[access2], + share[share2], + NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + if (h2 == INVALID_HANDLE_VALUE) { + printf(" %4.4s", ""); + } else { + printf(" %4.4s", "OK"); + CloseHandle(h2); + } + + CloseHandle(h1); +} + +int main(int argc, char **argv) +{ + int i, j, k, l; + + printf("\t\t\t\t\t\t\tSecond Open\n"); + printf("%22.22s G_RE G_RE G_RE G_WR G_WR G_WR G_RW G_RW G_RW\n", ""); + printf("%22.22s S_RE S_WR S_RW S_RE S_WR S_RW S_RE S_WR S_RW", "First open --v "); + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + for (k = 0; k < 3; k++) { + for (l = 0; l < 3; l++) { + lockfiles(i, j, k, l); + } + } + } + } + + return(0); +} + + + +Code output +----------- + + Second Open + G_RE G_RE G_RE G_WR G_WR G_WR G_RW G_RW G_RW + First open --v S_RE S_WR S_RW S_RE S_WR S_RW S_RE S_WR S_RW + G_READ + SHARE_READ OK OK + G_READ + SHARE_WRITE OK OK + G_READ +SHARE_READ|SHARE_WRITE OK OK OK OK OK OK + G_WRITE + SHARE_READ OK OK + G_WRITE + SHARE_WRITE OK OK + G_WRITE +SHARE_READ|SHARE_WRITE OK OK OK OK OK OK + G_READ|G_WRITE + SHARE_READ OK + G_READ|G_WRITE + SHARE_WRITE OK + G_READ|G_WRITE +SHARE_READ|SHARE_WRITE OK OK OK + |