6

プロセス内のサードパーティの DLL が、開いたファイルを読み取れないようにしようとしていますが、それは...まあ、不可能であることがわかりました。

私が何をしても、どの共有フラグを指定しても、彼らの呼び出しは常に成功しているようです!

これは Process Monitor のスクリーンショットです。最初のCreateFile呼び出しは私のもので、残りは彼らのものです。

スクリーンショット

これはどのように可能ですか?「共有モード: なし」と表示されるのはなぜですか? また、これを防ぐにはどうすればよいですか?


以下のコードは、問題を再現する例です。

#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);
}
4

1 に答える 1

1

ファイルの DATA を実際に読み書きするために共有モードが適用されます。属性 (ファイル サイズ、タイムスタンプなど) は共有ルールの対象外であり、ACL 以外のアクセスを防ぐ方法はありません。

最善の方法は、ファイルを R/W/D アクセス用に開き、SHARE_READ|WRITE|DELETE を指定しないことです。

奇妙ですが、本当です。

于 2012-12-22T05:12:50.110 に答える