Source file src/internal/syscall/windows/reparse_windows.go
1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package windows 6 7 import ( 8 "syscall" 9 "unsafe" 10 ) 11 12 const ( 13 FSCTL_SET_REPARSE_POINT = 0x000900A4 14 IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003 15 16 SYMLINK_FLAG_RELATIVE = 1 17 ) 18 19 // These structures are described 20 // in https://msdn.microsoft.com/en-us/library/cc232007.aspx 21 // and https://msdn.microsoft.com/en-us/library/cc232006.aspx. 22 23 type REPARSE_DATA_BUFFER struct { 24 ReparseTag uint32 25 ReparseDataLength uint16 26 Reserved uint16 27 DUMMYUNIONNAME byte 28 } 29 30 // REPARSE_DATA_BUFFER_HEADER is a common part of REPARSE_DATA_BUFFER structure. 31 type REPARSE_DATA_BUFFER_HEADER struct { 32 ReparseTag uint32 33 // The size, in bytes, of the reparse data that follows 34 // the common portion of the REPARSE_DATA_BUFFER element. 35 // This value is the length of the data starting at the 36 // SubstituteNameOffset field. 37 ReparseDataLength uint16 38 Reserved uint16 39 } 40 41 type SymbolicLinkReparseBuffer struct { 42 // The integer that contains the offset, in bytes, 43 // of the substitute name string in the PathBuffer array, 44 // computed as an offset from byte 0 of PathBuffer. Note that 45 // this offset must be divided by 2 to get the array index. 46 SubstituteNameOffset uint16 47 // The integer that contains the length, in bytes, of the 48 // substitute name string. If this string is null-terminated, 49 // SubstituteNameLength does not include the Unicode null character. 50 SubstituteNameLength uint16 51 // PrintNameOffset is similar to SubstituteNameOffset. 52 PrintNameOffset uint16 53 // PrintNameLength is similar to SubstituteNameLength. 54 PrintNameLength uint16 55 // Flags specifies whether the substitute name is a full path name or 56 // a path name relative to the directory containing the symbolic link. 57 Flags uint32 58 PathBuffer [1]uint16 59 } 60 61 // Path returns path stored in rb. 62 func (rb *SymbolicLinkReparseBuffer) Path() string { 63 n1 := rb.SubstituteNameOffset / 2 64 n2 := (rb.SubstituteNameOffset + rb.SubstituteNameLength) / 2 65 return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0]))[n1:n2:n2]) 66 } 67 68 type MountPointReparseBuffer struct { 69 // The integer that contains the offset, in bytes, 70 // of the substitute name string in the PathBuffer array, 71 // computed as an offset from byte 0 of PathBuffer. Note that 72 // this offset must be divided by 2 to get the array index. 73 SubstituteNameOffset uint16 74 // The integer that contains the length, in bytes, of the 75 // substitute name string. If this string is null-terminated, 76 // SubstituteNameLength does not include the Unicode null character. 77 SubstituteNameLength uint16 78 // PrintNameOffset is similar to SubstituteNameOffset. 79 PrintNameOffset uint16 80 // PrintNameLength is similar to SubstituteNameLength. 81 PrintNameLength uint16 82 PathBuffer [1]uint16 83 } 84 85 // Path returns path stored in rb. 86 func (rb *MountPointReparseBuffer) Path() string { 87 n1 := rb.SubstituteNameOffset / 2 88 n2 := (rb.SubstituteNameOffset + rb.SubstituteNameLength) / 2 89 return syscall.UTF16ToString((*[0xffff]uint16)(unsafe.Pointer(&rb.PathBuffer[0]))[n1:n2:n2]) 90 } 91