2011-09-20 9 views
6

私は、変更ジャーナルレコードを照会してリストするプログラムを作成しました。変更ジャーナルを返し:NtCreateFile()を使用してfileIndexで開くときに助けが必要

1)fileindex.highとfileindex.lowのfilereferencenumber(組み合わせ) 2)parentfilereferencenumber(それがディレクトリである以外は上記と同じ) 3)szReasonが変更レコードに表示される(理由) 4)ファイル名とファイル長。

変更ジャーナルに記載されているこのファイルのパスを探したいとします。私が見た実装のほとんどは、すべてのファイル参照番号を追跡し、比較するためにクエリを実行するか、FindNextFile()関数を使用してボリューム全体を走査します。

私は、ファイルの参照番号だけを使ってファイルハンドルを開くことができるとの議論に出くわしました。 http://www.tech-archive.net/Archive/Windows/microsoft.public.windows.file_system/2004-11/0244.html

MSDNの記事は、誰かが正しい方向に私を指すと行うために正確に何を教えてもらえます?私たちは、内部APIのhttp://msdn.microsoft.com/en-us/library/bb432380%28v=vs.85%29.aspx

を呼び出す前に、ライブラリをロードする必要がある、と言いますかNtCreateFile()を使用するにはどうすればよいですか?

または、filereferencenumberだけを使用してファイルパスにアクセスする方法はありますか?ここで

+1

これは、StackOverflowがどのように動作するはずではありません。将来の人々が答えを見つけることができるように、質問は残っています。 –

+0

申し訳ありません@ザンLynxは、少しの絶望でした、私は質問を掲載しました。そして、私は誰もが答えに謝っているので、私も下にそれを投稿しました。 – roymustang86

答えて

5

私が使用するコードです:あなたはfileindex.highとfilereferencenumberのfileindex.low一部を与えたら 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); 
} 

あなたが見ることができるように、それはあなたにそのファイルへのハンドルを提供します。 psapiのgetFileMapping関数を使って完全なパスを取得しました。好奇心をそそる人のための情報:http://msdn.microsoft.com/en-us/library/aa366789.aspx

+1

プロのヒント: 'ULONG iosb [2]'は32ビットのみで動作します。実際の[IO_STATUS_BLOCK](https://msdn.microsoft.com/en-us/library/windows/hardware/ff550671)を使用しない場合は、おそらく 'ULONG_PTR iosb [2];'が良いでしょう。 –

関連する問題