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を実行すると、たった数件のクエリしか実行されません。 CLEANUP
とCLOSE
をスキップしました。返すのはSTATUS_SUCCESS
とInformation=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
は今、私はFileFsVolumeInformation
とFileAllInformation
でOVERFLOW
を返すに正しいだと考えているが、私はまだ、すべての情報を入力します。
私が返すものは、Attributes
をFILE_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はどのような犠牲を払う必要がありますか?
Sysinternals Process Monitorを使用して、Cドライブ上のファイルを開くときのメモ帳の動作と、ボリューム上のファイルを開くときのメモ帳の動作を比較します。うまくいけば、異なる動作をしている特定の操作を識別できます。その操作は、問題の原因を突き止め、自分のコードから再現できるようにする必要があります。 –
確かに別の角度や目のセットが必要です。ファイルをクリックしてIRP_MAJOR関数を選択し、結果を表示するユーティリティを選択して、ntfsと自分のファイルシステムを簡単に比較できるようにしたいと思いませんか?それは非常に便利だろう。 – lundman
私が望むものに近いhttp://www.zezula.net/en/fstools/filetest.htmlがあるようです。 Notepad.exeの違いはfastio(オプションであると思われますが、おそらくそれではありません)または(IRP_MJ_READを呼び出すはずですが多分それはそうではありません)ページングIOのようです。 – lundman