You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			174 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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
 | |
| 
 |