Source file src/internal/syscall/windows/types_windows.go

     1  // Copyright 2024 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  	"internal/runtime/syscall/windows"
     9  	"syscall"
    10  	"unsafe"
    11  )
    12  
    13  // Socket related.
    14  const (
    15  	TCP_KEEPIDLE  = 0x03
    16  	TCP_KEEPCNT   = 0x10
    17  	TCP_KEEPINTVL = 0x11
    18  
    19  	SIO_UDP_NETRESET = syscall.IOC_IN | syscall.IOC_VENDOR | 15
    20  )
    21  
    22  const (
    23  	FILE_READ_DATA        = 0x00000001
    24  	FILE_READ_ATTRIBUTES  = 0x00000080
    25  	FILE_READ_EA          = 0x00000008
    26  	FILE_WRITE_DATA       = 0x00000002
    27  	FILE_WRITE_ATTRIBUTES = 0x00000100
    28  	FILE_WRITE_EA         = 0x00000010
    29  	FILE_APPEND_DATA      = 0x00000004
    30  	FILE_EXECUTE          = 0x00000020
    31  
    32  	FILE_GENERIC_READ    = STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE
    33  	FILE_GENERIC_WRITE   = STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE
    34  	FILE_GENERIC_EXECUTE = STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE
    35  
    36  	FILE_LIST_DIRECTORY = 0x00000001
    37  	FILE_TRAVERSE       = 0x00000020
    38  
    39  	FILE_SHARE_READ                      = 0x00000001
    40  	FILE_SHARE_WRITE                     = 0x00000002
    41  	FILE_SHARE_DELETE                    = 0x00000004
    42  	FILE_ATTRIBUTE_READONLY              = 0x00000001
    43  	FILE_ATTRIBUTE_HIDDEN                = 0x00000002
    44  	FILE_ATTRIBUTE_SYSTEM                = 0x00000004
    45  	FILE_ATTRIBUTE_DIRECTORY             = 0x00000010
    46  	FILE_ATTRIBUTE_ARCHIVE               = 0x00000020
    47  	FILE_ATTRIBUTE_DEVICE                = 0x00000040
    48  	FILE_ATTRIBUTE_NORMAL                = 0x00000080
    49  	FILE_ATTRIBUTE_TEMPORARY             = 0x00000100
    50  	FILE_ATTRIBUTE_SPARSE_FILE           = 0x00000200
    51  	FILE_ATTRIBUTE_REPARSE_POINT         = 0x00000400
    52  	FILE_ATTRIBUTE_COMPRESSED            = 0x00000800
    53  	FILE_ATTRIBUTE_OFFLINE               = 0x00001000
    54  	FILE_ATTRIBUTE_NOT_CONTENT_INDEXED   = 0x00002000
    55  	FILE_ATTRIBUTE_ENCRYPTED             = 0x00004000
    56  	FILE_ATTRIBUTE_INTEGRITY_STREAM      = 0x00008000
    57  	FILE_ATTRIBUTE_VIRTUAL               = 0x00010000
    58  	FILE_ATTRIBUTE_NO_SCRUB_DATA         = 0x00020000
    59  	FILE_ATTRIBUTE_RECALL_ON_OPEN        = 0x00040000
    60  	FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = 0x00400000
    61  
    62  	INVALID_FILE_ATTRIBUTES = 0xffffffff
    63  )
    64  
    65  // https://learn.microsoft.com/en-us/windows/win32/secauthz/access-mask
    66  type ACCESS_MASK uint32
    67  
    68  // Constants for type ACCESS_MASK
    69  const (
    70  	DELETE                   = 0x00010000
    71  	READ_CONTROL             = 0x00020000
    72  	WRITE_DAC                = 0x00040000
    73  	WRITE_OWNER              = 0x00080000
    74  	SYNCHRONIZE              = 0x00100000
    75  	STANDARD_RIGHTS_REQUIRED = 0x000F0000
    76  	STANDARD_RIGHTS_READ     = READ_CONTROL
    77  	STANDARD_RIGHTS_WRITE    = READ_CONTROL
    78  	STANDARD_RIGHTS_EXECUTE  = READ_CONTROL
    79  	STANDARD_RIGHTS_ALL      = 0x001F0000
    80  	SPECIFIC_RIGHTS_ALL      = 0x0000FFFF
    81  	ACCESS_SYSTEM_SECURITY   = 0x01000000
    82  	MAXIMUM_ALLOWED          = 0x02000000
    83  	GENERIC_READ             = 0x80000000
    84  	GENERIC_WRITE            = 0x40000000
    85  	GENERIC_EXECUTE          = 0x20000000
    86  	GENERIC_ALL              = 0x10000000
    87  )
    88  
    89  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_acl
    90  type ACL struct {
    91  	AclRevision byte
    92  	Sbz1        byte
    93  	AclSize     uint16
    94  	AceCount    uint16
    95  	Sbz2        uint16
    96  }
    97  
    98  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_io_status_block
    99  type IO_STATUS_BLOCK struct {
   100  	Status      NTStatus
   101  	Information uintptr
   102  }
   103  
   104  // https://learn.microsoft.com/en-us/windows/win32/api/ntdef/ns-ntdef-_object_attributes
   105  type OBJECT_ATTRIBUTES struct {
   106  	Length             uint32
   107  	RootDirectory      syscall.Handle
   108  	ObjectName         *NTUnicodeString
   109  	Attributes         uint32
   110  	SecurityDescriptor *SECURITY_DESCRIPTOR
   111  	SecurityQoS        *SECURITY_QUALITY_OF_SERVICE
   112  }
   113  
   114  // init sets o's RootDirectory, ObjectName, and Length.
   115  func (o *OBJECT_ATTRIBUTES) init(root syscall.Handle, name string) error {
   116  	if name == "." {
   117  		name = ""
   118  	}
   119  	objectName, err := NewNTUnicodeString(name)
   120  	if err != nil {
   121  		return err
   122  	}
   123  	o.ObjectName = objectName
   124  	if root != syscall.InvalidHandle {
   125  		o.RootDirectory = root
   126  	}
   127  	o.Length = uint32(unsafe.Sizeof(*o))
   128  	return nil
   129  }
   130  
   131  // Values for the Attributes member of OBJECT_ATTRIBUTES.
   132  const (
   133  	OBJ_INHERIT                       = 0x00000002
   134  	OBJ_PERMANENT                     = 0x00000010
   135  	OBJ_EXCLUSIVE                     = 0x00000020
   136  	OBJ_CASE_INSENSITIVE              = 0x00000040
   137  	OBJ_OPENIF                        = 0x00000080
   138  	OBJ_OPENLINK                      = 0x00000100
   139  	OBJ_KERNEL_HANDLE                 = 0x00000200
   140  	OBJ_FORCE_ACCESS_CHECK            = 0x00000400
   141  	OBJ_IGNORE_IMPERSONATED_DEVICEMAP = 0x00000800
   142  	OBJ_DONT_REPARSE                  = 0x00001000
   143  	OBJ_VALID_ATTRIBUTES              = 0x00001FF2
   144  )
   145  
   146  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_security_descriptor
   147  type SECURITY_DESCRIPTOR struct {
   148  	revision byte
   149  	sbz1     byte
   150  	control  SECURITY_DESCRIPTOR_CONTROL
   151  	owner    *syscall.SID
   152  	group    *syscall.SID
   153  	sacl     *ACL
   154  	dacl     *ACL
   155  }
   156  
   157  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ifs/security-descriptor-control
   158  type SECURITY_DESCRIPTOR_CONTROL uint16
   159  
   160  // https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-security_quality_of_service
   161  type SECURITY_QUALITY_OF_SERVICE struct {
   162  	Length              uint32
   163  	ImpersonationLevel  uint32 // type SECURITY_IMPERSONATION_LEVEL
   164  	ContextTrackingMode byte   // type SECURITY_CONTEXT_TRACKING_MODE
   165  	EffectiveOnly       byte
   166  }
   167  
   168  // File flags for [os.OpenFile]. The O_ prefix is used to indicate
   169  // that these flags are specific to the OpenFile function.
   170  const (
   171  	O_FILE_FLAG_OPEN_NO_RECALL     = 0x00100000
   172  	O_FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
   173  	O_FILE_FLAG_SESSION_AWARE      = 0x00800000
   174  	O_FILE_FLAG_POSIX_SEMANTICS    = 0x01000000
   175  	O_FILE_FLAG_BACKUP_SEMANTICS   = 0x02000000
   176  	O_FILE_FLAG_DELETE_ON_CLOSE    = 0x04000000
   177  	O_FILE_FLAG_SEQUENTIAL_SCAN    = 0x08000000
   178  	O_FILE_FLAG_RANDOM_ACCESS      = 0x10000000
   179  	O_FILE_FLAG_NO_BUFFERING       = 0x20000000
   180  	O_FILE_FLAG_OVERLAPPED         = 0x40000000
   181  	O_FILE_FLAG_WRITE_THROUGH      = 0x80000000
   182  )
   183  
   184  const (
   185  	// CreateDisposition flags for NtCreateFile and NtCreateNamedPipeFile.
   186  	FILE_SUPERSEDE           = 0x00000000
   187  	FILE_OPEN                = 0x00000001
   188  	FILE_CREATE              = 0x00000002
   189  	FILE_OPEN_IF             = 0x00000003
   190  	FILE_OVERWRITE           = 0x00000004
   191  	FILE_OVERWRITE_IF        = 0x00000005
   192  	FILE_MAXIMUM_DISPOSITION = 0x00000005
   193  
   194  	// CreateOptions flags for NtCreateFile and NtCreateNamedPipeFile.
   195  	FILE_DIRECTORY_FILE            = 0x00000001
   196  	FILE_WRITE_THROUGH             = 0x00000002
   197  	FILE_SEQUENTIAL_ONLY           = 0x00000004
   198  	FILE_NO_INTERMEDIATE_BUFFERING = 0x00000008
   199  	FILE_SYNCHRONOUS_IO_ALERT      = 0x00000010
   200  	FILE_SYNCHRONOUS_IO_NONALERT   = 0x00000020
   201  	FILE_NON_DIRECTORY_FILE        = 0x00000040
   202  	FILE_CREATE_TREE_CONNECTION    = 0x00000080
   203  	FILE_COMPLETE_IF_OPLOCKED      = 0x00000100
   204  	FILE_NO_EA_KNOWLEDGE           = 0x00000200
   205  	FILE_OPEN_REMOTE_INSTANCE      = 0x00000400
   206  	FILE_RANDOM_ACCESS             = 0x00000800
   207  	FILE_DELETE_ON_CLOSE           = 0x00001000
   208  	FILE_OPEN_BY_FILE_ID           = 0x00002000
   209  	FILE_OPEN_FOR_BACKUP_INTENT    = 0x00004000
   210  	FILE_NO_COMPRESSION            = 0x00008000
   211  	FILE_OPEN_REQUIRING_OPLOCK     = 0x00010000
   212  	FILE_DISALLOW_EXCLUSIVE        = 0x00020000
   213  	FILE_SESSION_AWARE             = 0x00040000
   214  	FILE_RESERVE_OPFILTER          = 0x00100000
   215  	FILE_OPEN_REPARSE_POINT        = 0x00200000
   216  	FILE_OPEN_NO_RECALL            = 0x00400000
   217  	FILE_OPEN_FOR_FREE_SPACE_QUERY = 0x00800000
   218  )
   219  
   220  // https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-file_disposition_info
   221  type FILE_DISPOSITION_INFO struct {
   222  	DeleteFile bool
   223  }
   224  
   225  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_disposition_information
   226  type FILE_DISPOSITION_INFORMATION struct {
   227  	DeleteFile bool
   228  }
   229  
   230  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_disposition_information_ex
   231  type FILE_DISPOSITION_INFORMATION_EX struct {
   232  	Flags uint32
   233  }
   234  
   235  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/ns-ntddk-_file_disposition_information_ex
   236  const (
   237  	FILE_DISPOSITION_DO_NOT_DELETE             = 0x00000000
   238  	FILE_DISPOSITION_DELETE                    = 0x00000001
   239  	FILE_DISPOSITION_POSIX_SEMANTICS           = 0x00000002
   240  	FILE_DISPOSITION_FORCE_IMAGE_SECTION_CHECK = 0x00000004
   241  	FILE_DISPOSITION_ON_CLOSE                  = 0x00000008
   242  	FILE_DISPOSITION_IGNORE_READONLY_ATTRIBUTE = 0x00000010
   243  )
   244  
   245  // Flags for FILE_RENAME_INFORMATION_EX.
   246  const (
   247  	FILE_RENAME_REPLACE_IF_EXISTS = 0x00000001
   248  	FILE_RENAME_POSIX_SEMANTICS   = 0x00000002
   249  )
   250  
   251  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_rename_information
   252  type FILE_RENAME_INFORMATION struct {
   253  	ReplaceIfExists bool
   254  	RootDirectory   syscall.Handle
   255  	FileNameLength  uint32
   256  	FileName        [syscall.MAX_PATH]uint16
   257  }
   258  
   259  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_rename_information
   260  type FILE_RENAME_INFORMATION_EX struct {
   261  	Flags          uint32
   262  	RootDirectory  syscall.Handle
   263  	FileNameLength uint32
   264  	FileName       [syscall.MAX_PATH]uint16
   265  }
   266  
   267  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_link_information
   268  type FILE_LINK_INFORMATION struct {
   269  	ReplaceIfExists bool
   270  	RootDirectory   syscall.Handle
   271  	FileNameLength  uint32
   272  	FileName        [syscall.MAX_PATH]uint16
   273  }
   274  
   275  const FileReplaceCompletionInformation = 61
   276  
   277  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/ns-ntifs-_file_completion_information
   278  type FILE_COMPLETION_INFORMATION struct {
   279  	Port syscall.Handle
   280  	Key  uintptr
   281  }
   282  
   283  // https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexa
   284  // https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/ns-wdm-_osversioninfoexw
   285  const VER_NT_WORKSTATION = 0x0000001
   286  
   287  type MemoryBasicInformation = windows.MemoryBasicInformation
   288  
   289  type Context = windows.Context
   290  
   291  const FileFlagsMask = 0xFFF00000
   292  
   293  const ValidFileFlagsMask = O_FILE_FLAG_OPEN_REPARSE_POINT |
   294  	O_FILE_FLAG_BACKUP_SEMANTICS |
   295  	O_FILE_FLAG_OVERLAPPED |
   296  	O_FILE_FLAG_OPEN_NO_RECALL |
   297  	O_FILE_FLAG_SESSION_AWARE |
   298  	O_FILE_FLAG_POSIX_SEMANTICS |
   299  	O_FILE_FLAG_DELETE_ON_CLOSE |
   300  	O_FILE_FLAG_SEQUENTIAL_SCAN |
   301  	O_FILE_FLAG_NO_BUFFERING |
   302  	O_FILE_FLAG_RANDOM_ACCESS |
   303  	O_FILE_FLAG_WRITE_THROUGH
   304  
   305  // https://msdn.microsoft.com/en-us/library/windows/desktop/aa379636.aspx
   306  type TRUSTEE struct {
   307  	MultipleTrustee          *TRUSTEE
   308  	MultipleTrusteeOperation uint32
   309  	TrusteeForm              uint32
   310  	TrusteeType              uint32
   311  	Name                     uintptr
   312  }
   313  
   314  // https://msdn.microsoft.com/en-us/library/windows/desktop/aa379638.aspx
   315  const (
   316  	TRUSTEE_IS_SID              = 0x0
   317  	TRUSTEE_IS_NAME             = 0x1
   318  	TRUSTEE_BAD_FORM            = 0x2
   319  	TRUSTEE_IS_OBJECTS_AND_SID  = 0x3
   320  	TRUSTEE_IS_OBJECTS_AND_NAME = 0x4
   321  )
   322  
   323  // https://msdn.microsoft.com/en-us/library/windows/desktop/aa446627.aspx
   324  type EXPLICIT_ACCESS struct {
   325  	AccessPermissions uint32
   326  	AccessMode        uint32
   327  	Inheritance       uint32
   328  	Trustee           TRUSTEE
   329  }
   330  
   331  // https://msdn.microsoft.com/en-us/library/windows/desktop/aa374899.aspx
   332  const (
   333  	NOT_USED_ACCESS   = 0x0
   334  	GRANT_ACCESS      = 0x1
   335  	SET_ACCESS        = 0x2
   336  	DENY_ACCESS       = 0x3
   337  	REVOKE_ACCESS     = 0x4
   338  	SET_AUDIT_SUCCESS = 0x5
   339  	SET_AUDIT_FAILURE = 0x6
   340  )
   341  
   342  // https://msdn.microsoft.com/en-us/library/windows/desktop/aa446627.aspx
   343  const (
   344  	NO_INHERITANCE                     = 0x0
   345  	SUB_OBJECTS_ONLY_INHERIT           = 0x1
   346  	SUB_CONTAINERS_ONLY_INHERIT        = 0x2
   347  	SUB_CONTAINERS_AND_OBJECTS_INHERIT = 0x3
   348  	INHERIT_NO_PROPAGATE               = 0x4
   349  	INHERIT_ONLY                       = 0x8
   350  )
   351  
   352  // https://msdn.microsoft.com/en-us/library/windows/desktop/aa379593.aspx
   353  const (
   354  	SE_UNKNOWN_OBJECT_TYPE     = 0x0
   355  	SE_FILE_OBJECT             = 0x1
   356  	SE_SERVICE                 = 0x2
   357  	SE_PRINTER                 = 0x3
   358  	SE_REGISTRY_KEY            = 0x4
   359  	SE_LMSHARE                 = 0x5
   360  	SE_KERNEL_OBJECT           = 0x6
   361  	SE_WINDOW_OBJECT           = 0x7
   362  	SE_DS_OBJECT               = 0x8
   363  	SE_DS_OBJECT_ALL           = 0x9
   364  	SE_PROVIDER_DEFINED_OBJECT = 0xa
   365  	SE_WMIGUID_OBJECT          = 0xb
   366  	SE_REGISTRY_WOW64_32KEY    = 0xc
   367  	SE_REGISTRY_WOW64_64KEY    = 0xd
   368  )
   369  
   370  // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/23e75ca3-98fd-4396-84e5-86cd9d40d343
   371  const (
   372  	OWNER_SECURITY_INFORMATION               = 0x00000001
   373  	GROUP_SECURITY_INFORMATION               = 0x00000002
   374  	DACL_SECURITY_INFORMATION                = 0x00000004
   375  	SACL_SECURITY_INFORMATION                = 0x00000008
   376  	LABEL_SECURITY_INFORMATION               = 0x00000010
   377  	UNPROTECTED_SACL_SECURITY_INFORMATION    = 0x10000000
   378  	UNPROTECTED_DACL_SECURITY_INFORMATION    = 0x20000000
   379  	PROTECTED_SACL_SECURITY_INFORMATION      = 0x40000000
   380  	PROTECTED_DACL_SECURITY_INFORMATION      = 0x80000000
   381  	ATTRIBUTE_SECURITY_INFORMATION           = 0x00000020
   382  	SCOPE_SECURITY_INFORMATION               = 0x00000040
   383  	PROCESS_TRUST_LABEL_SECURITY_INFORMATION = 0x00000080
   384  	BACKUP_SECURITY_INFORMATION              = 0x00010000
   385  )
   386  

View as plain text