2011-09-20 22 views
6

Tôi đã viết một chương trình truy vấn các bản ghi nhật ký thay đổi và liệt kê chúng. Tạp chí thay đổi trả:Cần trợ giúp bằng cách sử dụng NtCreateFile() để mở bởi fileIndex

1) filereferencenumber (sự kết hợp của fileindex.high và fileindex.low) 2) parentfilereferencenumber (tương tự như trên ngoại trừ nó là cho thư mục) 3) szReason (Lý do nó xuất hiện trong các bản ghi thay đổi) 4) Tên tệp và Filelength.

Tôi muốn tìm đường dẫn của tệp này được liệt kê trong nhật ký thay đổi. Hầu hết các triển khai tôi đã thấy theo dõi tất cả các filereferencenumber và truy vấn nó để so sánh, hoặc chúng sử dụng các hàm FindNextFile() ot đi qua toàn bộ khối lượng.

Tôi bắt gặp một cuộc thảo luận nơi họ nói, họ có thể mở một tệp xử lý bằng cách sử dụng chỉ filereferencenumber. http://www.tech-archive.net/Archive/Windows/microsoft.public.windows.file_system/2004-11/0244.html

Bài viết MSDN nói, chúng ta phải tải một thư viện trước khi gọi API nội bộ của http://msdn.microsoft.com/en-us/library/bb432380%28v=vs.85%29.aspx

Ai đó có thể chỉ cho tôi đi đúng hướng và cho tôi biết chính xác phải làm gì? Làm thế nào để sử dụng NtCreateFile()?

Hoặc, có cách nào để truy cập đường dẫn tệp bằng chỉ sử dụng filereferencenumber không?

+1

Đó không chính xác là cách StackOverflow được cho là hoạt động. Câu hỏi vẫn còn để mọi người trong tương lai có thể tìm thấy câu trả lời. –

+0

Xin lỗi @Zan Lynx, hơi tuyệt vọng và tôi đã đăng câu hỏi. Và, vì tôi nợ mọi người một câu trả lời, tôi cũng đã đăng nó dưới đây. – roymustang86

Trả lời

5

Đây là mã tôi đã sử dụng: http://www.ragestorm.net/blogs/?cat=7

#include windows.h 
typedef ULONG (__stdcall *pNtCreateFile)(
    PHANDLE FileHandle, 
    ULONG DesiredAccess, 
    PVOID ObjectAttributes, 
    PVOID IoStatusBlock, 
    PLARGE_INTEGER AllocationSize, 
    ULONG FileAttributes, 
    ULONG ShareAccess, 
    ULONG CreateDisposition, 
    ULONG CreateOptions, 
    PVOID EaBuffer, 
    ULONG EaLength 
); 

typedef ULONG (__stdcall *pNtReadFile)(
    IN HANDLE FileHandle, 
    IN HANDLE Event OPTIONAL, 
    IN PVOID ApcRoutine OPTIONAL, 
    IN PVOID ApcContext OPTIONAL, 
    OUT PVOID IoStatusBlock, 
    OUT PVOID Buffer, 
    IN ULONG Length, 
    IN PLARGE_INTEGER ByteOffset OPTIONAL, 
    IN PULONG Key OPTIONAL ); 

typedef struct _UNICODE_STRING { 
    USHORT Length, MaximumLength; 
    PWCH Buffer; 
} UNICODE_STRING, *PUNICODE_STRING; 

typedef struct _OBJECT_ATTRIBUTES { 
ULONG Length; 
HANDLE RootDirectory; 
PUNICODE_STRING ObjectName; 
ULONG Attributes; 
PVOID SecurityDescriptor;  // Points to type SECURITY_DESCRIPTOR 
PVOID SecurityQualityOfService; // Points to type SECURITY_QUALITY_OF_SERVICE 
} OBJECT_ATTRIBUTES; 

#define InitializeObjectAttributes(p, n, a, r, s) { \ 
(p)->Length = sizeof(OBJECT_ATTRIBUTES);   \ 
(p)->RootDirectory = r;        \ 
(p)->Attributes = a;        \ 
(p)->ObjectName = n;        \ 
(p)->SecurityDescriptor = s;      \ 
(p)->SecurityQualityOfService = NULL;    \ 
} 

#define OBJ_CASE_INSENSITIVE 0x00000040L 
#define FILE_NON_DIRECTORY_FILE 0×00000040 
#define FILE_OPEN_BY_FILE_ID 0×00002000 
#define FILE_OPEN 0×00000001 

int main(int argc, char* argv[]) 
{ 
    HANDLE d = CreateFile(L"\\\\.\\c:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 ); 
    BY_HANDLE_FILE_INFORMATION i; 
    HANDLE f = CreateFile(L"c:\\bla.bla", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
    ULONG bla; 
    WriteFile(f, "helloworld", 11, &bla, NULL); 
    printf("%x, %d\n", f, GetLastError()); 
    GetFileInformationByHandle(f, &i); 
    printf("id:%08x-%08x\n", i.nFileIndexHigh, i.nFileIndexLow); 
    CloseHandle(f); 

    pNtCreateFile NtCreatefile = (pNtCreateFile)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtCreateFile"); 
    pNtReadFile NtReadFile = (pNtReadFile)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtReadFile"); 

    ULONG fid[2] = {i.nFileIndexLow, i.nFileIndexHigh}; 
    UNICODE_STRING fidstr = {8, 8, (PWSTR) fid}; 

    OBJECT_ATTRIBUTES oa = {0}; 
    InitializeObjectAttributes (&oa, &fidstr, OBJ_CASE_INSENSITIVE, d, NULL); 

    ULONG iosb[2]; 
    ULONG status = NtCreatefile(&f, GENERIC_ALL, &oa, iosb, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN, FILE_OPEN_BY_FILE_ID | FILE_NON_DIRECTORY_FILE, NULL, 0); 
    printf("status: %X, handle: %x\n", status, f); 
    UCHAR buf[11] = {0}; 
    LONG Off[2] = {0}; 
    status = NtReadFile(f, NULL, NULL, NULL, (PVOID)&iosb, (PVOID)buf, sizeof(buf), (PLARGE_INTEGER)&Off, NULL); 
    printf("status: %X, bytes: %d\n", status, iosb[1]); 
    printf("buf: %s\n", buf); 
    CloseHandle(f); 
    CloseHandle(d); 
} 

Như bạn thấy, một khi bạn cung cấp cho các fileindex.high và fileindex.low phần của filereferencenumber, nó mang lại cho bạn một xử lý cho tập tin đó. Và tôi đã sử dụng hàm getFileMapping từ psapi, để có được đường dẫn đầy đủ. Thông tin cho những người tò mò: http://msdn.microsoft.com/en-us/library/aa366789.aspx

+1

Mẹo chuyên nghiệp: 'ULONG iosb [2]' chỉ hoạt động với 32 bit. Nếu bạn không sử dụng [IO_STATUS_BLOCK] thực tế (https://msdn.microsoft.com/en-us/library/windows/hardware/ff550671), thì có lẽ 'ULONG_PTR iosb [2];' sẽ tốt hơn . –

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