2012-12-21 14 views
6

Ich versuche zu verhindern, dass eine DLL von Drittanbietern in meinem Prozess eine Datei liest, die ich geöffnet habe, und ich habe festgestellt, dass es ... nun, unmöglich ist.Warum liegt Windows CreateFile (<no share access>) für mich?

Egal was ich mache, egal welche Flags ich angeben, ihr Ruf immer scheint erfolgreich zu sein!

Hier ist der Screenshot von Process Monitor - der erste CreateFile Anruf ist mein, und der Rest sind ihnen:

Screenshot

Wie ist das überhaupt möglich? Warum ist die "Share-Modus: Keine" mir liegen, und wie kann ich das verhindern?


Dieser Code unten ist ein Beispiel, das das Problem reproduziert:

#include <stdio.h> 
#include <Windows.h> 

int main() 
{ 
    LPCTSTR file = TEXT("C:\\Test1234.xml"); 
    HANDLE hFile1 = 
     CreateFile(file, FILE_READ_ATTRIBUTES, 0, NULL, OPEN_ALWAYS, 0, NULL); 
    HANDLE hFile2 = 
     CreateFile(file, FILE_READ_DATA, 0, NULL, OPEN_ALWAYS, 0, NULL); 
    DWORD n; 
    BYTE buf[1]; 
    printf("%d\n", ReadFile(hFile2, buf, sizeof(buf), &n, NULL)); 
    CloseHandle(hFile1); 
    CloseHandle(hFile2); 
    DeleteFile(file); 
} 
+0

Es ist auch erwähnenswert Ich habe keine Ahnung, wie sie die I/O-Priorität der Datei gleich zu Beginn auf "sehr niedrig" setzen. Hat nicht jede Datei "normale" Priorität, bis sie geändert wird? – Mehrdad

+0

Bitte zeigen Sie Ihren Code, der die Datei öffnet. –

+0

@RemyLebeau: Siehe Update. – Mehrdad

Antwort

1

Teilen Modi erzwungen für tatsächlich das Lesen und Schreiben der Daten der Datei. Attribute (wie Dateigröße, Zeitstempel usw.) fallen nicht unter die Freigaberegeln und es gibt keine Möglichkeit, ihren Zugriff auf ACLs zu verhindern.

Das Beste, was Sie tun können, ist die Datei für R/W/D-Zugriff öffnen und nicht SHARE_READ | WRITE | DELETE angeben.

Seltsam, aber wahr.

+0

Ich habe nicht versucht, das Lesen von Attributen zu verhindern, obwohl ... Ich habe versucht, das Lesen von Daten zu verhindern. – Mehrdad

+0

MJZ bedeutet, dass Sie die Datei zum Lesen/Schreiben der Dateidaten öffnen müssen, um Freigabeberechtigungen für nachfolgende Öffnen anzugeben, die die Dateidaten lesen/schreiben. Wenn Sie die Datei nur zum Lesen von Attributen öffnen, können Sie keinen Zugriff für Öffnen freigeben, die Dateidaten lesen/schreiben. –