2012-12-21 34 views
6

Tôi đang cố ngăn chặn DLL của bên thứ ba trong quá trình đọc tệp tôi đã mở và tôi đã tìm thấy nó là ... tốt, không thể.Tại sao CreateFile của Windows (<no share access>) lại nói dối tôi?

Không có vấn đề gì tôi làm, bất kể cờ chia sẻ tôi chỉ định, cuộc gọi của họ luôn luôn dường như thành công!

Dưới đây là ảnh chụp màn hình từ Process Monitor - các CreateFile cuộc gọi đầu tiên là của tôi, và phần còn lại là của họ:

Screenshot

như thế nào này thậm chí có thể? Tại sao Chế độ Chia sẻ : Không có " nói dối tôi và làm cách nào tôi có thể ngăn chặn điều này?


Mã này dưới đây là một ví dụ mà tái tạo các vấn đề:

#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

Điều đáng nói là tôi không biết làm cách nào để đặt mức ưu tiên I/O của tệp thành "rất thấp" ngay từ đầu. Không phải mọi tệp đều có ưu tiên "bình thường" cho đến khi nó được thay đổi? – Mehrdad

+0

Vui lòng hiển thị mã của bạn mở tệp. –

+0

@RemyLebeau: Xem cập nhật. – Mehrdad

Trả lời

1

Chia sẻ phương thức được thực thi cho thực sự đọc và ghi dữ liệu của tập tin. Các thuộc tính (như kích thước tệp, dấu thời gian, v.v.) không được bao gồm trong các quy tắc chia sẻ và không có cách nào để ngăn chặn truy cập của chúng thiếu các ACL.

Tốt nhất bạn có thể mở tệp để truy cập R/W/D và không chỉ định SHARE_READ | WRITE | DELETE.

Lạ, nhưng đúng.

+0

Tôi đã không cố gắng để ngăn chặn việc đọc các thuộc tính mặc dù ... Tôi đã cố gắng để ngăn chặn việc đọc dữ liệu. – Mehrdad

+0

Điều gì MJZ có nghĩa là bạn phải mở tệp để đọc/ghi dữ liệu tệp để chỉ định quyền chia sẻ cho lần mở tiếp theo để đọc/ghi dữ liệu tệp. Nếu bạn mở tệp để chỉ đọc thuộc tính, bạn không thể chia sẻ quyền truy cập cho các lần mở để đọc/ghi dữ liệu tệp. –

Các vấn đề liên quan