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_POINT
GetFinalPathNameByHandle()
FILE_FLAG_OPEN_REPARSE_POINT