/// <summary> /// Get the symbolic link's target path. /// </summary> public static string GetSymbolicLinkTarget(SafeSymbolicLinkObjectHandle linkHandle) { return(BufferHelper.CachedInvoke((StringBuffer buffer) => { UNICODE_STRING target = new UNICODE_STRING(buffer); uint returnedLength; NTSTATUS status; while ((status = Direct.NtQuerySymbolicLinkObject(linkHandle, ref target, out returnedLength)) == NTSTATUS.STATUS_BUFFER_TOO_SMALL) { buffer.EnsureByteCapacity(returnedLength); target.UpdateFromStringBuffer(buffer); } if (status != NTSTATUS.STATUS_SUCCESS) { throw ErrorHelper.GetIoExceptionForNTStatus(status); } buffer.Length = (uint)(target.Length / sizeof(char)); return buffer.ToString(); })); }
public static extern NTSTATUS NtQuerySymbolicLinkObject( SafeSymbolicLinkObjectHandle LinkHandle, ref UNICODE_STRING LinkTarget, out uint ReturnedLength);
unsafe public static extern NTSTATUS NtOpenSymbolicLinkObject( out SafeSymbolicLinkObjectHandle LinkHandle, ACCESS_MASK DesiredAccess, ref OBJECT_ATTRIBUTES ObjectAttributes);