14

Windows 6 (Vista および Server 2008) は、 CreateSymbolicLink関数を使用して作成できる適切なシンボリック リンクをサポートしています。しかし、シンボリック リンクを調べてリンクのターゲットのパスを取得するための対応する関数はないようです。

シンボリック リンクは再解析ポイントの実装であるため、再解析ポイント関数を使用してターゲット パスを取得できることがわかりました。しかし、再解析ポイントを使用するために必要なヘッダー ファイルは、Windows Driver Kitに付属しているようです。このキットを VS2008 でセットアップするのは簡単ではないようです。

リンクのターゲットを取得するために見逃した素敵な単純な関数はありますか、それとも、この情報にアクセスするためのコードを記述するためだけに Windows ドライバー開発環境をセットアップする必要があるのでしょうか?

編集: Adam Mitz が GetFinalPathNameByHandle の提案を思いつきました。この関数は、ローカルのシンボリック リンクにはうまく機能しますが、(UNC パス経由の) リモート リンクの解決には機能しないようです。

EDIT 2:Adamのリクエストで、私が試したことの詳細を以下に示します:

最初はFSCTL_GET_REPARSE_POINT/DeviceIoControlルートをたどりましたが、REPARSE_DATA_BUFFER構造が得られます。この構造を定義するヘッダーは、Windows Driver Kit 内にのみ存在するようです。

GetFinalPathNameByHandle()リンクがローカル ディスク (C:\...\linkなど) に存在する場合は正常に動作します。不思議なことに、ターゲット ファイルが存在するかどうかに関係なく、フラグが指定されてCreateFileW()いるかどうかに関係なく、リンクへのハンドルを取得してターゲットを取得できることがわかりました。FILE_FLAG_OPEN_REPARSE_POINT

とが ( ) を介してリモート リンクを調査するために使用されるとCreateFileW()、事態は解明され始めます。が指定されている場合、ターゲット パスではなく、常にリンク パスを返します。が指定されていない場合、ターゲット パスが返されますが、ターゲットが存在し、リンクと同じマシン上にある場合のみです。リンクが別のマシンを指している場合、ネットワーク権限エラーが発生します。リンクが存在しないローカル ファイルを指している場合、ファイルが見つからないというエラーが発生します。GetFinalPathNameByHandle()\\?\UNC\....FILE_FLAG_OPEN_REPARSE_POINTGetFinalPathNameByHandle()FILE_FLAG_OPEN_REPARSE_POINT

4

1 に答える 1

12

GetFinalPathNameByHandle

最終パスは、パスが完全に解決されたときに返されるパスです。たとえば、「D:\ yourdir」を指す「C:\ tmp \ mydir」という名前のシンボリックリンクの場合、最終的なファイルシステムパスは「D:\yourdir」になります。

于 2008-10-21T11:36:14.983 に答える