2017-06-08 10 views
0

Windows 10 x64 - 通常のディレクトリトラバーサル、コピー、読み取り、ファイルの削除は、DOS、git bash、およびエクスプローラで動作します。Windows IFS:自身のファイルシステムVS notepad.exe

notepad.exeのファイルを読むことができません!

ファイルシステムのドライブE:に「a.file.txt」という名前のテキストファイルがあり、「notepad.exe E:\ a.file」を使ってメモ帳で読み込もうとすると、 txt "エラー: "%1は有効なWin32アプリケーションではありません "。 しかし、 "コピーE:\ a.file.txt C:\ a.file.txt; notepad.exe C:\ a.file.txt"はうまくいきます。 wordpad.exeも正常に動作します。

私はをすべて印刷していますので、 IRPは私のところに来ています。間違っている可能性のある範囲はあまりありません。特に、notepad.exeを実行すると、たった数件のクエリしか実行されません。 CLEANUPCLOSEをスキップしました。返すのはSTATUS_SUCCESSInformation=0です。ただ、それぞれボリューム名とファイル名を切り捨て、

IRP_MJ_CREATE: FileObject FFFFC686327AAB20 name '\' flags 0x0 
dispatcher: exit: 0x0 OK Information 0x1 
query_directory_FileFullDirectoryInformation: starting Search pattern 'a.file.txt' type 3 Index 0, Restart 0, Single 1 
comparing names 'a.file.txt' == 'a.file.txt' 
dispatcher: exit: 0x0 OK Information 0x78 
IRP_MJ_CREATE: FileObject FFFFC68632887080 name '\a.file.txt' flags 0x0 
dispatcher: exit: 0x0 OK Information 0x1 
fsDispatcher: enter: major 10: minor 0: IRP_MJ_QUERY_VOLUME_INFORMATION 
query_volume_information: FileFsVolumeInformation 
dispatcher: exit: 0x80000005 Overflow Information 0x18 
fsDispatcher: enter: major 5: minor 0: IRP_MJ_QUERY_INFORMATION 
query_information: FileAllInformation 
    file_basic_information 
    file_standard_information 
    file_position_information 
    * query_information: FileNameInformation 
    file_name_information: remaining space 8 str.len 20 struct size 8 
* file_name_information: partial name of "a" 
dispatcher: exit: 0x80000005 Overflow Information 0x68 
IRP_MJ_CREATE: FileObject FFFFC68631BD6BB0 name '\a.file.txt' flags 0x0 
dispatcher: exit: 0x0 OK Information 0x1 
fsDispatcher: enter: major 5: minor 0: IRP_MJ_QUERY_INFORMATION 
* query_information: FileNetworkOpenInformation 
dispatcher: exit: 0x0 OK Information 0x38 
fsDispatcher: enter: major 18: minor 0: IRP_MJ_CLEANUP 
dispatcher: exit: 0x0 OK Information 0x0 
fsDispatcher: enter: major 2: minor 0: IRP_MJ_CLOSE 
dispatcher: exit: 0x0 OK Information 0x0 
IRP_MJ_CREATE: FileObject FFFFC68631AD39D0 name '\' flags 0x0 
dispatcher: exit: 0x0 OK Information 0x1 
fsDispatcher: enter: major 5: minor 0: IRP_MJ_QUERY_INFORMATION 
query_information: FileNameInformation 
* file_name_information: name of \ 
dispatcher: exit: 0x0 OK Information 0xa 
fsDispatcher: enter: major 10: minor 0: IRP_MJ_QUERY_VOLUME_INFORMATION 
* query_volume_information: FileFsVolumeInformation 
dispatcher: exit: 0x0 OK Information 0x20 
fsDispatcher: enter: major 10: minor 0: IRP_MJ_QUERY_VOLUME_INFORMATION 
query_volume_information: FileFsAttributeInformation 
dispatcher: exit: 0x0 OK Information 0x18 
fsDispatcher: enter: major 5: minor 0: IRP_MJ_QUERY_INFORMATION fsDeviceObject 
query_information: FileBasicInformation 
dispatcher: exit: 0x0 OK Information 0x28 

は今、私はFileFsVolumeInformationFileAllInformationOVERFLOWを返すに正しいだと考えているが、私はまだ、すべての情報を入力します。

私が返すものは、AttributesFILE_ATTRIBUTE_DIRECTORYまたはFILE_ATTRIBUTE_NORMALに設定します。 FileBasic/FileAllとDirectoryListingにあります。これが間違っていた場合、bashは文字デバイスとしてすべてを表示するので、通常のファイルやディレクトリと同様に設定されていることがわかります。

もし私がnotepad.exeをEにコピーすると、「このアプリケーションはこのPCで実行できません」またはbash「Exec format error」で実行できません。つまり、私が間違ったファイルタイプを返すかのようです。しかしそれはそれが呼び出す3つの関数であり、FileAttributesだけが関連しています(FileStandardのDirectoryブール値)。

今度はOVERFLOWロジックを数回書き直しましたが、すべてが合っていなくても名前に合うのに必要な合計長さをfileNameLengthに設定するのが正しいと思いますが、情報フィールドは返された合計サイズ(入力サイズより大きくない)?

notepad.exeはどのような犠牲を払う必要がありますか?

+0

Sysinternals Process Monitorを使用して、Cドライブ上のファイルを開くときのメモ帳の動作と、ボリューム上のファイルを開くときのメモ帳の動作を比較します。うまくいけば、異なる動作をしている特定の操作を識別できます。その操作は、問題の原因を突き止め、自分のコードから再現できるようにする必要があります。 –

+0

確かに別の角度や目のセットが必要です。ファイルをクリックしてIRP_MAJOR関数を選択し、結果を表示するユーティリティを選択して、ntfsと自分のファイルシステムを簡単に比較できるようにしたいと思いませんか?それは非常に便利だろう。 – lundman

+0

私が望むものに近いhttp://www.zezula.net/en/fstools/filetest.htmlがあるようです。 Notepad.exeの違いはfastio(オプションであると思われますが、おそらくそれではありません)または(IRP_MJ_READを呼び出すはずですが多分それはそうではありません)ページングIOのようです。 – lundman

答えて

1

したがって、notepad.exeはメモリマップファイルを使用してファイルを読み込み、mmapファイルがファイルシステムで機能しないという点で注目に値します。 zezula.netのTestFileを使用して、動作していないことに気付きました。 mmapを有効にするにはFileObject->SectionObjectPointer = &vp->SectionObjectPointersIRP_MJ_CREATEに割り当てる必要がありました。ほとんどの場合、これはFcbFileObject->fscontextのように)に格納され、ちょうどSECTION_OBJECT_POINTERS SectionObjectPointers;と定義されています。

mmapページをにフラッシュする場合は、fastfatサンプルソースごとに注意が必要です。

また、少なくともPreAcquireForSectionSynchronizationコールバックを定義してセクションのロックを処理する設定呼び出しFsRtlRegisterFileSystemFilterCallbacks()も関連しています。また、fastfatソースにもあります。

関連する問題