windows_kernel32.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. //go:build windows
  2. package yu_sys
  3. import (
  4. _ "unsafe"
  5. )
  6. //go:cgo_import_dynamic LoadLibraryW LoadLibraryW "kernel32.dll"
  7. //go:linkname LoadLibraryW LoadLibraryW
  8. var LoadLibraryW Address
  9. //go:cgo_import_dynamic MultiByteToWideChar MultiByteToWideChar "kernel32.dll"
  10. //go:linkname MultiByteToWideChar MultiByteToWideChar
  11. var MultiByteToWideChar Address
  12. //go:cgo_import_dynamic WideCharToMultiByte WideCharToMultiByte "kernel32.dll"
  13. //go:linkname WideCharToMultiByte WideCharToMultiByte
  14. var WideCharToMultiByte Address
  15. //go:cgo_import_dynamic GetProcAddress GetProcAddress "kernel32.dll"
  16. //go:linkname GetProcAddress GetProcAddress
  17. var GetProcAddress Address
  18. //go:cgo_import_dynamic GlobalAlloc GlobalAlloc "kernel32.dll"
  19. //go:linkname GlobalAlloc GlobalAlloc
  20. var GlobalAlloc Address
  21. //go:cgo_import_dynamic GlobalFree GlobalFree "kernel32.dll"
  22. //go:linkname GlobalFree GlobalFree
  23. var GlobalFree Address
  24. //go:cgo_import_dynamic GlobalLock GlobalLock "kernel32.dll"
  25. //go:linkname GlobalLock GlobalLock
  26. var GlobalLock Address
  27. //go:cgo_import_dynamic GlobalSize GlobalSize "kernel32.dll"
  28. //go:linkname GlobalSize GlobalSize
  29. var GlobalSize Address
  30. //go:cgo_import_dynamic GlobalUnlock GlobalUnlock "kernel32.dll"
  31. //go:linkname GlobalUnlock GlobalUnlock
  32. var GlobalUnlock Address
  33. const (
  34. // GHND 组合了 GMEM_MOVEABLE 和 GMEM_ZEROINIT
  35. GHND = 0x0042
  36. // GMEM_FIXED 分配固定内存。返回值是一个指针。
  37. GMEM_FIXED = 0x0000
  38. // GMEM_MOVEABLE 分配可移动的内存。内存块在物理内存中从不移动,但它们可以在默认堆中移动。
  39. // 返回值是内存对象的句柄。要将句柄转换为指针,使用 GlobalLock 函数。
  40. // 该值不能与 GMEM_FIXED 组合。
  41. GMEM_MOVEABLE = 0x0002
  42. // GMEM_ZEROINIT 将内存内容初始化为零。
  43. GMEM_ZEROINIT = 0x0040
  44. // GPTR 组合了 GMEM_FIXED 和 GMEM_ZEROINIT
  45. GPTR = 0x0040
  46. )
  47. //go:cgo_import_dynamic GetFileAttributesW GetFileAttributesW "kernel32.dll"
  48. //go:linkname GetFileAttributesW GetFileAttributesW
  49. var GetFileAttributesW Address
  50. //go:cgo_import_dynamic CreateFileW CreateFileW "kernel32.dll"
  51. //go:linkname CreateFileW CreateFileW
  52. var CreateFileW Address
  53. //go:cgo_import_dynamic CloseHandle CloseHandle "kernel32.dll"
  54. //go:linkname CloseHandle CloseHandle
  55. var CloseHandle Address
  56. //go:cgo_import_dynamic GetFileSizeEx GetFileSizeEx "kernel32.dll"
  57. //go:linkname GetFileSizeEx GetFileSizeEx
  58. var GetFileSizeEx Address
  59. //go:cgo_import_dynamic ReadFile ReadFile "kernel32.dll"
  60. //go:linkname ReadFile ReadFile
  61. var ReadFile Address
  62. //go:cgo_import_dynamic WriteFile WriteFile "kernel32.dll"
  63. //go:linkname WriteFile WriteFile
  64. var WriteFile Address
  65. //go:cgo_import_dynamic SetFilePointerEx SetFilePointerEx "kernel32.dll"
  66. //go:linkname SetFilePointerEx SetFilePointerEx
  67. var SetFilePointerEx Address
  68. //go:cgo_import_dynamic SetEndOfFile SetEndOfFile "kernel32.dll"
  69. //go:linkname SetEndOfFile SetEndOfFile
  70. var SetEndOfFile Address
  71. //go:cgo_import_dynamic FindFirstFileW FindFirstFileW "kernel32.dll"
  72. //go:linkname FindFirstFileW FindFirstFileW
  73. var FindFirstFileW Address
  74. //go:cgo_import_dynamic FindNextFileW FindNextFileW "kernel32.dll"
  75. //go:linkname FindNextFileW FindNextFileW
  76. var FindNextFileW Address
  77. //go:cgo_import_dynamic FindClose FindClose "kernel32.dll"
  78. //go:linkname FindClose FindClose
  79. var FindClose Address
  80. const (
  81. // 摘自:https://learn.microsoft.com/zh-cn/windows/win32/fileio/file-attribute-constants
  82. FILE_ATTRIBUTE_READONLY = 1 // (0x00000001) 只读文件。 应用程序可以读取文件,但不能写入或删除该文件。 在目录上不遵循此属性。 有关详细信息,请参阅 无法在 Windows Server 2003、Windows XP、Windows Vista 或 Windows 7 中查看或更改文件夹的只读或系统属性。
  83. FILE_ATTRIBUTE_HIDDEN = 2 // (0x00000002) 文件或目录处于隐藏状态。 它不包括在普通目录列表中。
  84. FILE_ATTRIBUTE_SYSTEM = 4 // (0x00000004) 操作系统使用其中的一部分或独占使用的文件或目录。
  85. FILE_ATTRIBUTE_DIRECTORY = 16 // (0x00000010) 标识目录的句柄。
  86. FILE_ATTRIBUTE_ARCHIVE = 32 // (0x00000020) 作为存档文件或目录的文件或目录。 应用程序通常使用此属性来标记要备份或删除的文件。
  87. FILE_ATTRIBUTE_DEVICE = 64 // (0x00000040) 此值保留供系统使用。
  88. FILE_ATTRIBUTE_NORMAL = 128 // (0x00000080) 未设置其他属性的文件。 此属性仅在单独使用时才有效。
  89. FILE_ATTRIBUTE_TEMPORARY = 256 // (0x00000100) 用于临时存储的文件。 如果有足够的缓存内存可用,文件系统会避免将数据写回到大容量存储,因为通常情况下,应用程序在句柄关闭后会删除临时文件。 在这种情况下,系统可以完全避免写入数据。 否则,在句柄关闭后写入数据。
  90. FILE_ATTRIBUTE_SPARSE_FILE = 512 // (0x00000200) 是稀疏文件的文件。
  91. FILE_ATTRIBUTE_REPARSE_POINT = 1024 // (0x00000400) 具有关联的重新分析点的文件或目录,或作为符号链接的文件。
  92. FILE_ATTRIBUTE_COMPRESSED = 2048 // (0x00000800) 压缩的文件或目录。 对于文件,将压缩该文件中的所有数据。 对于目录,压缩是新建文件和子目录的默认设置。
  93. FILE_ATTRIBUTE_OFFLINE = 4096 // (0x00001000) 文件的数据不会立即可用。 此属性指示文件数据以物理方式移动到脱机存储。 此属性由远程存储(分层存储管理软件)使用。 应用程序不应随意更改此属性。
  94. FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192 // (0x00002000) 内容索引服务不会为文件或目录编制索引。
  95. FILE_ATTRIBUTE_ENCRYPTED = 16384 // (0x00004000) 加密的文件或目录。 对于文件,文件中的所有数据流都已加密。 对于目录,加密是新创建的文件和子目录的默认加密。
  96. FILE_ATTRIBUTE_INTEGRITY_STREAM = 32768 // (0x00008000) 目录或用户数据流配置了完整性 (仅在 ReFS 卷) 上受支持。 它不包括在普通目录列表中。 如果文件已重命名,完整性设置将一直保留。 如果复制了某个文件,则如果源文件或目标目录设置了完整性,则目标文件将具有完整性设置。Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:在Windows Server 2012之前,不支持此标志。
  97. FILE_ATTRIBUTE_VIRTUAL = 65536 // (0x00010000) 此值保留供系统使用。
  98. FILE_ATTRIBUTE_NO_SCRUB_DATA = 131072 // (0x00020000) 后台数据完整性扫描程序不读取的用户数据流 (AKA 清理器) 。 在目录上设置时,它仅提供继承。 此标志仅在 存储空间 和 ReFS 卷上受支持。 它不包括在普通目录列表中。Windows Server 2008 R2、Windows 7、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:在Windows 8和Windows Server 2012之前,不支持此标志。
  99. FILE_ATTRIBUTE_EA = 262144 // (0x00040000) 具有扩展属性的文件或目录。重要: 此常量仅供内部使用。
  100. FILE_ATTRIBUTE_PINNED = 524288 // (0x00080000) 此属性指示用户意图,即即使未主动访问文件或目录,也应在本地保持完全存在。 此属性用于分层存储管理软件。
  101. FILE_ATTRIBUTE_UNPINNED = 1048576 // (0x00100000) 此属性指示,除非主动访问文件或目录,否则不应在本地完全存在。 此属性用于分层存储管理软件。
  102. FILE_ATTRIBUTE_RECALL_ON_OPEN = 262144 // (0x00040000) 此属性仅出现在目录枚举类 (FILE_DIRECTORY_INFORMATION、FILE_BOTH_DIR_INFORMATION等) 中。 设置此属性时,这意味着文件或目录在本地系统上没有物理表示形式;项是虚拟的。 打开该项目的成本将比平常要高,例如,它会导致至少从远程存储中提取其中一部分。
  103. FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = 4194304 // (0x00400000) 如果设置了此属性,则意味着文件或目录在本地未完全存在。 对于表示并非所有数据都位于本地存储 (的文件,例如,它可能稀疏,某些数据仍位于远程存储) 中。 对于目录,这意味着某些目录内容正在从另一个位置虚拟化。 读取文件/枚举目录的成本将比平常要高,例如,这会导致至少从远程存储中提取一些文件/目录内容。 只有内核模式调用方可以设置此位。文件系统微型筛选器低于 180000 – 189999高度范围 (FSFilter HSM 加载顺序组) 不得对设置了此属性的文件发出目标缓存读取或写入。 这可能会导致缓存污染和潜在的文件损坏。 有关详细信息,请参阅 处理占位符。
  104. )
  105. const (
  106. // 摘自:https://learn.microsoft.com/zh-cn/windows/win32/secauthz/generic-access-rights
  107. GENERIC_ALL = 0x10000000 // 所有可能的访问权限
  108. GENERIC_EXECUTE = 0x20000000 // 执行访问权限
  109. GENERIC_WRITE = 0x40000000 // 写入权限
  110. GENERIC_READ uintptr = 0x80000000 // 读取权限
  111. )
  112. const (
  113. // 摘自:https://learn.microsoft.com/zh-cn/windows/win32/fileio/file-access-rights-constants
  114. FILE_APPEND_DATA = 0x00000004 // 对于文件对象,是将数据追加到文件的权限。 (对于本地文件,如果未指定此标志,写入操作将不会覆盖现有数据 FILE_WRITE_DATA。) 对于目录对象,创建子目录 (的权限 FILE_ADD_SUBDIRECTORY) 。
  115. )
  116. const (
  117. // 摘自:https://learn.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-createfilew
  118. FILE_SHARE_NO = 0x00000000 // 如果文件或设备请求删除、读取或写入访问权限,则阻止后续打开操作。
  119. FILE_SHARE_DELETE = 0x00000004 // 启用文件或设备上的后续打开操作以请求删除访问权限。否则,如果进程请求删除访问权限,则任何进程都无法打开该文件或设备。如果未指定此标志,但已打开文件或设备进行删除访问,则函数将失败。注意 删除访问权限允许删除和重命名操作。
  120. FILE_SHARE_READ = 0x00000001 // 启用文件或设备上的后续打开操作以请求读取访问权限。否则,如果进程请求读取访问权限,则任何进程都无法打开该文件或设备。如果未指定此标志,但已打开文件或设备进行读取访问,则函数将失败。
  121. FILE_SHARE_WRITE = 0x00000002 // 启用文件或设备上的后续打开操作以请求写入访问权限。否则,如果进程请求写入访问权限,则任何进程都无法打开该文件或设备。如果未指定此标志,但已打开文件或设备进行写入访问,或者具有具有写入访问权限的文件映射,则函数将失败。
  122. )
  123. const (
  124. // 摘自:https://learn.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-createfilew
  125. CREATE_NEW = 1 // 仅当文件尚不存在时才创建一个新文件。如果指定的文件存在,则函数将失败,最后一个错误代码设置为 ERROR_FILE_EXISTS (80) 。如果指定的文件不存在,并且是可写位置的有效路径,则会创建一个新文件。
  126. CREATE_ALWAYS = 2 // 始终创建新文件。如果指定的文件存在且可写,则函数将覆盖文件,函数成功,最后错误代码设置为 ERROR_ALREADY_EXISTS (183) 。如果指定的文件不存在并且是有效路径,则创建新文件,函数成功,最后错误代码设置为零。有关详细信息,请参阅本主题的“备注”部分。
  127. OPEN_EXISTING = 3 // 仅当文件或设备存在时才打开它。如果指定的文件或设备不存在,则 函数将失败,最后一个错误代码设置为 ERROR_FILE_NOT_FOUND (2) 。有关设备的详细信息,请参阅备注部分。
  128. OPEN_ALWAYS = 4 // 始终打开文件。如果指定的文件存在,则函数成功,最后错误代码设置为 ERROR_ALREADY_EXISTS (183) 。如果指定的文件不存在,并且是可写位置的有效路径,则函数将创建一个文件,并将最后一个错误代码设置为零。
  129. TRUNCATE_EXISTING = 5 // 打开一个文件并截断它,使其大小为零字节(仅当它存在时)。如果指定的文件不存在,则函数将失败,最后一个错误代码设置为 ERROR_FILE_NOT_FOUND (2) 。调用进程必须打开文件,并将 GENERIC_WRITE 位设置为 dwDesiredAccess 参数的一部分。
  130. )
  131. const (
  132. // 摘自:https://learn.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-createfilew
  133. FILE_FLAG_OPEN_NO_RECALL = 0x00100000 // 文件数据已请求,但应继续位于远程存储中。 不应将其传输回本地存储。 此标志供远程存储系统使用。
  134. FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000 // 不会进行正常的 重分析点 处理; CreateFile 将尝试打开重新分析点。 打开文件时,无论控制重分析点的筛选器是否正常运行,都返回文件句柄。此标志不能与 CREATE_ALWAYS 标志一起使用。如果文件不是重分析点,则忽略此标志。有关详细信息,请参见“备注”部分。
  135. FILE_FLAG_SESSION_AWARE = 0x00800000 // 正在使用会话感知打开文件或设备。 如果未指定此标志,则会话 0 中运行的进程无法打开每个会话设备 (,例如使用 RemoteFX USB 重定向) 的设备。 此标志对不在会话 0 中的调用方不起作用。 此标志仅在 Windows 的服务器版本上受支持。Windows Server 2008 R2 和 Windows Server 2008: 在Windows Server 2012之前,不支持此标志。
  136. FILE_FLAG_POSIX_SEMANTICS = 0x01000000 // 将根据 POSIX 规则进行访问。 这包括允许多个具有名称的文件(仅在大小写上不同)用于支持该命名的文件系统。 使用此选项时请小心,因为为 MS-DOS 或 16 位 Windows 编写的应用程序可能无法访问使用此标志创建的文件。
  137. FILE_FLAG_BACKUP_SEMANTICS = 0x02000000 // 正在为备份或还原操作打开或创建文件。 当进程具有 SE_BACKUP_NAME 和 SE_RESTORE_NAME 权限时,系统将确保调用进程替代文件安全检查。 有关详细信息,请参阅 更改令牌中的特权。必须设置此标志才能获取目录的句柄。 目录句柄可以传递给某些函数,而不是文件句柄。 有关详细信息,请参见“备注”部分。
  138. FILE_FLAG_DELETE_ON_CLOSE = 0x04000000 // 文件在其所有句柄都关闭后立即被删除,其中包括指定的句柄和任何其他打开或重复的句柄。如果存在文件的现有打开句柄,则调用会失败,除非它们都以 FILE_SHARE_DELETE 共享模式打开。针对文件的后续打开请求将失败,除非指定 FILE_SHARE_DELETE 共享模式。
  139. FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000 // 访问旨在从头到尾按顺序进行。 系统可将此选项用作优化文件缓存的提示。如果读取隐藏 (即将使用反向扫描) ,则不应使用此标志。如果文件系统不支持缓存的 I/O 和 FILE_FLAG_NO_BUFFERING 则此标志不起作用。有关详细信息,请参阅本主题的 缓存行为 部分。
  140. FILE_FLAG_RANDOM_ACCESS = 0x10000000 // 访问应是随机的。 系统可将此选项用作优化文件缓存的提示。如果文件系统不支持缓存的 I/O 且 FILE_FLAG_NO_BUFFERING 则此标志无效。有关详细信息,请参阅本主题的 缓存行为 部分。
  141. FILE_FLAG_NO_BUFFERING = 0x20000000 // 正在打开文件或设备,没有系统缓存用于数据读取和写入。 此标志不会影响硬盘缓存或内存映射文件。使用 FILE_FLAG_NO_BUFFERING 标志成功处理使用 CreateFile 打开的文件有严格的要求,有关详细信息,请参阅文件缓冲。
  142. FILE_FLAG_OVERLAPPED = 0x40000000 // 正在为异步 I/O 打开或创建文件或设备。在此句柄上完成后续 I/O 操作时, OVERLAPPED 结构中指定的事件将设置为信号状态。如果指定了此标志,则文件可用于同时读取和写入操作。如果未指定此标志,则 I/O 操作将序列化,即使对读取和写入函数的调用指定 了 OVERLAPPED 结构也是如此。有关使用此标志创建的文件句柄时的注意事项的信息,请参阅本主题的 同步和异步 I/O 句柄 部分。
  143. FILE_FLAG_WRITE_THROUGH uintptr = 0x80000000 // 写入操作不会经过任何中间缓存,它们将直接转到磁盘。有关其他信息,请参阅本主题的 缓存行为 部分。
  144. )
  145. const (
  146. // 摘自:https://learn.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-setfilepointerex
  147. FILE_BEGIN = 0 // 起始点为零或文件的开头。 如果指定了此标志,则 liDistanceToMove 参数将解释为无符号值。
  148. FILE_CURRENT = 1 // 起点是文件指针的当前值。
  149. FILE_END = 2 // 起点是当前文件结束位置。
  150. )
  151. type FindData struct {
  152. FileAttributes uint32
  153. CreationTime Filetime
  154. LastAccessTime Filetime
  155. LastWriteTime Filetime
  156. FileSizeHigh uint32
  157. FileSizeLow uint32
  158. Reserved0 uint32
  159. Reserved1 uint32
  160. FileName [520]byte // 256*2 + 8
  161. AlternateFileName [30]byte // 14*2 + 2
  162. }
  163. type Filetime struct {
  164. LowDateTime uint32
  165. HighDateTime uint32
  166. }