2

Windows XP 以降と互換性のある Windows API 関数を使用して、ジャンクションまたはシンボリック リンクのターゲットを見つけようとしています。私はCreateFile、再解析ポイントへのハンドルを取得するために使用してからDeviceIoControlFSCTL_GET_REPARSE_POINTフラグを使用して再解析データをREPARSE_DATA_BUFFER. 次に、バッファー内のオフセットと長さを使用して、文字列SubstituteNamePrintName文字列を抽出します。

Windows 8 ではPrintName、正常なパス (つまりc:\filename.ext) が得られますが、XP では のPrintNameセクションのREPARSE_DATA_BUFFER長さが常に 0 のようで、空の文字列が残ります。

を使用するSubsituteNameと両方で機能するように見えますが、常に\??\ファイルパスの先頭に接頭辞 (つまり\??\c:\filename.ext) が付きます。(補足として、接頭辞もfsutil reparsepoint query示しています)。\??\

MSDN のドキュメントの多くを読みましたが、このプレフィックスの説明が見つかりません。接頭辞がSubstituteName必ず必ず . Microsoft のすべての再解析ポイントに"\??\"プレフィックスが表示されるかどうかと、その理由を知りたいです。SubstituteName

4

2 に答える 2

0

Windowsカーネルには「DOSデバイス名前空間」があります。\DosDevices\これは基本的に、開くことができるものCreateFileがすべて存在する場所です。(QueryDosDeviceこれは、その名前空間のすべてのメンバーを提供する関数です。)

これは非常に一般的に使用されるパスであるため、\??\その名前空間にもリダイレクトされます。したがって、カーネルにとって、パスC:\Windowsは無効です。実際には、のように記述する必要があります\??\C:\Windows。これがこの表記法の由来です。

于 2013-01-15T04:03:10.767 に答える
0

\??\プレフィックスは、パスが解析されていないことを意味します。すべての名前で保証されているわけではないため、名前ごとにプレフィックスを探し、存在する場合はスキップする必要があります。

更新:実際にそれが表すものを正確に説明している決定的なドキュメントは見つかりませんでしたが、実際の接頭辞\??\について言及しているリンクがいくつかあります。\??\

http://www.flexhex.com/docs/articles/hard-links.phtml

szTarget 文字列には、「\??\C:\Some Dir\」のように、「解析されていない」プレフィックス「\??\」を前に付け、バックスラッシュ文字で終了するパスを含める必要があることに注意してください。

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/908b3927-1ee9-4e03-9922-b4fd49fc51a6

http://mjunction.googlecode.com/svn-history/r5/trunk/MJunction/MJunction/JunctionPoint.cs

このプレフィックスは、パスが仮想ファイル システムで解釈されないパスとして扱われることを NTFS に示します。

Private Const NonInterpretedPathPrefix As String = "\??\"

于 2013-01-15T03:49:32.483 に答える