| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- 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
|