CreateFile - Share Access
-
Hi,
nachdem ich eine Datei mittels
HANDLE hfile = CreateFile(path, FILE_READ_DATA | FILE_EXECUTE, 0x00, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
mit EXCLUSIVE-Rechten geöffnet habe (3. Parameter 0x00), sollte die Datei von keinem anderen Prozess zum Lesen oder Schreiben geöffnet werden können:
msdn:
0x00000000
Prevents other processes from opening a file or device if they request delete, read, or write access.
Jedoch kann ich von einem anderen Prozess mittels:
file = CreateFile(path, FILE_READ_DATA, FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
trotzdem lesend zugreifen.
-
Im ersten CreateFIle kannst Du FILE_EXECUTE mal weglassen...
Bist Du sicher, dass die Datei noch offen ist?
-
FILE_EXECUTE is für was anderes drin ;).
Das Handle schließ ich definitiv noch nicht (warte auf user input bevor das handle geschlossen wird)
-
Und was soll FILE_EXECUTE hier für einen Sinn machen?
Selbst wenn Du davon Teile später in den Speicher lädst und ausführst.
-
Ok ich hab FILE_EXECUTE raus, ich kann trotzdem lesend auf die Datei zugreifen.
Solang ich nicht CloseHandle() auf das Filehandle gerufen habe, sollten andere Prozesse eigtl. am Lesen der Datei gehindert werden oder?
-
Keine Ahnung was Du machst. Das geht nicht...
Du hast absolute Pfade genommen
nicht dass Du Dich hier um mehrere Dateien drehst... oder evtl. durch die Virtualisierung heringelegt wirst...
-
das programm das exclusive rechte will:
HANDLE file = CreateFile(L"C:\\Windows\\System32\\notepad.exe", FILE_READ_DATA, 0x00, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); int a = 0; if(file == INVALID_HANDLE_VALUE){ printf("could not open file\n"); return 1; } printf("stop waiting... press key\n"); getchar(); CloseHandle(file); return 0;
das programm, dass gestartet wird bevor user input in dem obigen programm kommt
HANDLE file = CreateFile(L"C:\\Windows\\System32\\notepad.exe", FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(file == INVALID_HANDLE_VALUE){ printf("could not open file\n"); goto end; return 1; } printf("file opened\n"); byte buff[3]; DWORD readbytes; bool ret = ReadFile(file, buff, 2, &readbytes, NULL); buff[2] = '\0'; if(ret){ printf("%s\n", (char*)&buff); } end: system("PAUSE"); return 0;
-
denk dir die return 1; oben weg
-
Und beide Programme sind 32bit bzw. 64bit? D.h. von selben Typ?
-
ja selbes os, selbes visual studio, selbe plattform