Beispiel #1
0
        /// <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();
            }));
        }
Beispiel #2
0
 public static extern NTSTATUS NtQuerySymbolicLinkObject(
     SafeSymbolicLinkObjectHandle LinkHandle,
     ref UNICODE_STRING LinkTarget,
     out uint ReturnedLength);
Beispiel #3
0
 unsafe public static extern NTSTATUS NtOpenSymbolicLinkObject(
     out SafeSymbolicLinkObjectHandle LinkHandle,
     ACCESS_MASK DesiredAccess,
     ref OBJECT_ATTRIBUTES ObjectAttributes);