Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
kardolus
GitHub Repository: kardolus/chatgpt-cli
Path: blob/main/vendor/golang.org/x/sys/windows/syscall_windows.go
2880 views
1
// Copyright 2009 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
// Windows system calls.
6
7
package windows
8
9
import (
10
errorspkg "errors"
11
"fmt"
12
"runtime"
13
"sync"
14
"syscall"
15
"time"
16
"unicode/utf16"
17
"unsafe"
18
)
19
20
type (
21
Handle uintptr
22
HWND uintptr
23
)
24
25
const (
26
InvalidHandle = ^Handle(0)
27
InvalidHWND = ^HWND(0)
28
29
// Flags for DefineDosDevice.
30
DDD_EXACT_MATCH_ON_REMOVE = 0x00000004
31
DDD_NO_BROADCAST_SYSTEM = 0x00000008
32
DDD_RAW_TARGET_PATH = 0x00000001
33
DDD_REMOVE_DEFINITION = 0x00000002
34
35
// Return values for GetDriveType.
36
DRIVE_UNKNOWN = 0
37
DRIVE_NO_ROOT_DIR = 1
38
DRIVE_REMOVABLE = 2
39
DRIVE_FIXED = 3
40
DRIVE_REMOTE = 4
41
DRIVE_CDROM = 5
42
DRIVE_RAMDISK = 6
43
44
// File system flags from GetVolumeInformation and GetVolumeInformationByHandle.
45
FILE_CASE_SENSITIVE_SEARCH = 0x00000001
46
FILE_CASE_PRESERVED_NAMES = 0x00000002
47
FILE_FILE_COMPRESSION = 0x00000010
48
FILE_DAX_VOLUME = 0x20000000
49
FILE_NAMED_STREAMS = 0x00040000
50
FILE_PERSISTENT_ACLS = 0x00000008
51
FILE_READ_ONLY_VOLUME = 0x00080000
52
FILE_SEQUENTIAL_WRITE_ONCE = 0x00100000
53
FILE_SUPPORTS_ENCRYPTION = 0x00020000
54
FILE_SUPPORTS_EXTENDED_ATTRIBUTES = 0x00800000
55
FILE_SUPPORTS_HARD_LINKS = 0x00400000
56
FILE_SUPPORTS_OBJECT_IDS = 0x00010000
57
FILE_SUPPORTS_OPEN_BY_FILE_ID = 0x01000000
58
FILE_SUPPORTS_REPARSE_POINTS = 0x00000080
59
FILE_SUPPORTS_SPARSE_FILES = 0x00000040
60
FILE_SUPPORTS_TRANSACTIONS = 0x00200000
61
FILE_SUPPORTS_USN_JOURNAL = 0x02000000
62
FILE_UNICODE_ON_DISK = 0x00000004
63
FILE_VOLUME_IS_COMPRESSED = 0x00008000
64
FILE_VOLUME_QUOTAS = 0x00000020
65
66
// Flags for LockFileEx.
67
LOCKFILE_FAIL_IMMEDIATELY = 0x00000001
68
LOCKFILE_EXCLUSIVE_LOCK = 0x00000002
69
70
// Return value of SleepEx and other APC functions
71
WAIT_IO_COMPLETION = 0x000000C0
72
)
73
74
// StringToUTF16 is deprecated. Use UTF16FromString instead.
75
// If s contains a NUL byte this function panics instead of
76
// returning an error.
77
func StringToUTF16(s string) []uint16 {
78
a, err := UTF16FromString(s)
79
if err != nil {
80
panic("windows: string with NUL passed to StringToUTF16")
81
}
82
return a
83
}
84
85
// UTF16FromString returns the UTF-16 encoding of the UTF-8 string
86
// s, with a terminating NUL added. If s contains a NUL byte at any
87
// location, it returns (nil, syscall.EINVAL).
88
func UTF16FromString(s string) ([]uint16, error) {
89
return syscall.UTF16FromString(s)
90
}
91
92
// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
93
// with a terminating NUL and any bytes after the NUL removed.
94
func UTF16ToString(s []uint16) string {
95
return syscall.UTF16ToString(s)
96
}
97
98
// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
99
// If s contains a NUL byte this function panics instead of
100
// returning an error.
101
func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] }
102
103
// UTF16PtrFromString returns pointer to the UTF-16 encoding of
104
// the UTF-8 string s, with a terminating NUL added. If s
105
// contains a NUL byte at any location, it returns (nil, syscall.EINVAL).
106
func UTF16PtrFromString(s string) (*uint16, error) {
107
a, err := UTF16FromString(s)
108
if err != nil {
109
return nil, err
110
}
111
return &a[0], nil
112
}
113
114
// UTF16PtrToString takes a pointer to a UTF-16 sequence and returns the corresponding UTF-8 encoded string.
115
// If the pointer is nil, it returns the empty string. It assumes that the UTF-16 sequence is terminated
116
// at a zero word; if the zero word is not present, the program may crash.
117
func UTF16PtrToString(p *uint16) string {
118
if p == nil {
119
return ""
120
}
121
if *p == 0 {
122
return ""
123
}
124
125
// Find NUL terminator.
126
n := 0
127
for ptr := unsafe.Pointer(p); *(*uint16)(ptr) != 0; n++ {
128
ptr = unsafe.Pointer(uintptr(ptr) + unsafe.Sizeof(*p))
129
}
130
return UTF16ToString(unsafe.Slice(p, n))
131
}
132
133
func Getpagesize() int { return 4096 }
134
135
// NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention.
136
// This is useful when interoperating with Windows code requiring callbacks.
137
// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr.
138
func NewCallback(fn interface{}) uintptr {
139
return syscall.NewCallback(fn)
140
}
141
142
// NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention.
143
// This is useful when interoperating with Windows code requiring callbacks.
144
// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr.
145
func NewCallbackCDecl(fn interface{}) uintptr {
146
return syscall.NewCallbackCDecl(fn)
147
}
148
149
// windows api calls
150
151
//sys GetLastError() (lasterr error)
152
//sys LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW
153
//sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW
154
//sys FreeLibrary(handle Handle) (err error)
155
//sys GetProcAddress(module Handle, procname string) (proc uintptr, err error)
156
//sys GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) = kernel32.GetModuleFileNameW
157
//sys GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) = kernel32.GetModuleHandleExW
158
//sys SetDefaultDllDirectories(directoryFlags uint32) (err error)
159
//sys AddDllDirectory(path *uint16) (cookie uintptr, err error) = kernel32.AddDllDirectory
160
//sys RemoveDllDirectory(cookie uintptr) (err error) = kernel32.RemoveDllDirectory
161
//sys SetDllDirectory(path string) (err error) = kernel32.SetDllDirectoryW
162
//sys GetVersion() (ver uint32, err error)
163
//sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW
164
//sys ExitProcess(exitcode uint32)
165
//sys IsWow64Process(handle Handle, isWow64 *bool) (err error) = IsWow64Process
166
//sys IsWow64Process2(handle Handle, processMachine *uint16, nativeMachine *uint16) (err error) = IsWow64Process2?
167
//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile Handle) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW
168
//sys CreateNamedPipe(name *uint16, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *SecurityAttributes) (handle Handle, err error) [failretval==InvalidHandle] = CreateNamedPipeW
169
//sys ConnectNamedPipe(pipe Handle, overlapped *Overlapped) (err error)
170
//sys DisconnectNamedPipe(pipe Handle) (err error)
171
//sys GetNamedPipeClientProcessId(pipe Handle, clientProcessID *uint32) (err error)
172
//sys GetNamedPipeServerProcessId(pipe Handle, serverProcessID *uint32) (err error)
173
//sys GetNamedPipeInfo(pipe Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error)
174
//sys GetNamedPipeHandleState(pipe Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW
175
//sys SetNamedPipeHandleState(pipe Handle, state *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32) (err error) = SetNamedPipeHandleState
176
//sys readFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = ReadFile
177
//sys writeFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) = WriteFile
178
//sys GetOverlappedResult(handle Handle, overlapped *Overlapped, done *uint32, wait bool) (err error)
179
//sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff]
180
//sys CloseHandle(handle Handle) (err error)
181
//sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle]
182
//sys SetStdHandle(stdhandle uint32, handle Handle) (err error)
183
//sys findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW
184
//sys findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW
185
//sys FindClose(handle Handle) (err error)
186
//sys GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error)
187
//sys GetFileInformationByHandleEx(handle Handle, class uint32, outBuffer *byte, outBufferLen uint32) (err error)
188
//sys SetFileInformationByHandle(handle Handle, class uint32, inBuffer *byte, inBufferLen uint32) (err error)
189
//sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW
190
//sys SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW
191
//sys CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW
192
//sys RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW
193
//sys DeleteFile(path *uint16) (err error) = DeleteFileW
194
//sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW
195
//sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW
196
//sys LockFileEx(file Handle, flags uint32, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error)
197
//sys UnlockFileEx(file Handle, reserved uint32, bytesLow uint32, bytesHigh uint32, overlapped *Overlapped) (err error)
198
//sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW
199
//sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW
200
//sys SetEndOfFile(handle Handle) (err error)
201
//sys SetFileValidData(handle Handle, validDataLength int64) (err error)
202
//sys GetSystemTimeAsFileTime(time *Filetime)
203
//sys GetSystemTimePreciseAsFileTime(time *Filetime)
204
//sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff]
205
//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uintptr, threadcnt uint32) (handle Handle, err error)
206
//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uintptr, overlapped **Overlapped, timeout uint32) (err error)
207
//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uintptr, overlapped *Overlapped) (err error)
208
//sys CancelIo(s Handle) (err error)
209
//sys CancelIoEx(s Handle, o *Overlapped) (err error)
210
//sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW
211
//sys CreateProcessAsUser(token Token, appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = advapi32.CreateProcessAsUserW
212
//sys initializeProcThreadAttributeList(attrlist *ProcThreadAttributeList, attrcount uint32, flags uint32, size *uintptr) (err error) = InitializeProcThreadAttributeList
213
//sys deleteProcThreadAttributeList(attrlist *ProcThreadAttributeList) = DeleteProcThreadAttributeList
214
//sys updateProcThreadAttribute(attrlist *ProcThreadAttributeList, flags uint32, attr uintptr, value unsafe.Pointer, size uintptr, prevvalue unsafe.Pointer, returnedsize *uintptr) (err error) = UpdateProcThreadAttribute
215
//sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error)
216
//sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW
217
//sys GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) = user32.GetWindowThreadProcessId
218
//sys LoadKeyboardLayout(name *uint16, flags uint32) (hkl Handle, err error) [failretval==0] = user32.LoadKeyboardLayoutW
219
//sys UnloadKeyboardLayout(hkl Handle) (err error) = user32.UnloadKeyboardLayout
220
//sys GetKeyboardLayout(tid uint32) (hkl Handle) = user32.GetKeyboardLayout
221
//sys ToUnicodeEx(vkey uint32, scancode uint32, keystate *byte, pwszBuff *uint16, cchBuff int32, flags uint32, hkl Handle) (ret int32) = user32.ToUnicodeEx
222
//sys GetShellWindow() (shellWindow HWND) = user32.GetShellWindow
223
//sys MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW
224
//sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx
225
//sys shGetKnownFolderPath(id *KNOWNFOLDERID, flags uint32, token Token, path **uint16) (ret error) = shell32.SHGetKnownFolderPath
226
//sys TerminateProcess(handle Handle, exitcode uint32) (err error)
227
//sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error)
228
//sys getStartupInfo(startupInfo *StartupInfo) = GetStartupInfoW
229
//sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error)
230
//sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error)
231
//sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff]
232
//sys waitForMultipleObjects(count uint32, handles uintptr, waitAll bool, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff] = WaitForMultipleObjects
233
//sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW
234
//sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error)
235
//sys GetFileType(filehandle Handle) (n uint32, err error)
236
//sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW
237
//sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext
238
//sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom
239
//sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW
240
//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW
241
//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW
242
//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW
243
//sys ExpandEnvironmentStrings(src *uint16, dst *uint16, size uint32) (n uint32, err error) = kernel32.ExpandEnvironmentStringsW
244
//sys CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) = userenv.CreateEnvironmentBlock
245
//sys DestroyEnvironmentBlock(block *uint16) (err error) = userenv.DestroyEnvironmentBlock
246
//sys getTickCount64() (ms uint64) = kernel32.GetTickCount64
247
//sys GetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error)
248
//sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error)
249
//sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW
250
//sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW
251
//sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW
252
//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW
253
//sys commandLineToArgv(cmd *uint16, argc *int32) (argv **uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW
254
//sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0]
255
//sys LocalAlloc(flags uint32, length uint32) (ptr uintptr, err error)
256
//sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error)
257
//sys FlushFileBuffers(handle Handle) (err error)
258
//sys GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW
259
//sys GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW
260
//sys GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW
261
//sys GetFinalPathNameByHandle(file Handle, filePath *uint16, filePathSize uint32, flags uint32) (n uint32, err error) = kernel32.GetFinalPathNameByHandleW
262
//sys CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateFileMappingW
263
//sys MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error)
264
//sys UnmapViewOfFile(addr uintptr) (err error)
265
//sys FlushViewOfFile(addr uintptr, length uintptr) (err error)
266
//sys VirtualLock(addr uintptr, length uintptr) (err error)
267
//sys VirtualUnlock(addr uintptr, length uintptr) (err error)
268
//sys VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc
269
//sys VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree
270
//sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect
271
//sys VirtualProtectEx(process Handle, address uintptr, size uintptr, newProtect uint32, oldProtect *uint32) (err error) = kernel32.VirtualProtectEx
272
//sys VirtualQuery(address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQuery
273
//sys VirtualQueryEx(process Handle, address uintptr, buffer *MemoryBasicInformation, length uintptr) (err error) = kernel32.VirtualQueryEx
274
//sys ReadProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesRead *uintptr) (err error) = kernel32.ReadProcessMemory
275
//sys WriteProcessMemory(process Handle, baseAddress uintptr, buffer *byte, size uintptr, numberOfBytesWritten *uintptr) (err error) = kernel32.WriteProcessMemory
276
//sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile
277
//sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW
278
//sys FindFirstChangeNotification(path string, watchSubtree bool, notifyFilter uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.FindFirstChangeNotificationW
279
//sys FindNextChangeNotification(handle Handle) (err error)
280
//sys FindCloseChangeNotification(handle Handle) (err error)
281
//sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW
282
//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) = crypt32.CertOpenStore
283
//sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore
284
//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore
285
//sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore
286
//sys CertDeleteCertificateFromStore(certContext *CertContext) (err error) = crypt32.CertDeleteCertificateFromStore
287
//sys CertDuplicateCertificateContext(certContext *CertContext) (dupContext *CertContext) = crypt32.CertDuplicateCertificateContext
288
//sys PFXImportCertStore(pfx *CryptDataBlob, password *uint16, flags uint32) (store Handle, err error) = crypt32.PFXImportCertStore
289
//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain
290
//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain
291
//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext
292
//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext
293
//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy
294
//sys CertGetNameString(certContext *CertContext, nameType uint32, flags uint32, typePara unsafe.Pointer, name *uint16, size uint32) (chars uint32) = crypt32.CertGetNameStringW
295
//sys CertFindExtension(objId *byte, countExtensions uint32, extensions *CertExtension) (ret *CertExtension) = crypt32.CertFindExtension
296
//sys CertFindCertificateInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevCertContext *CertContext) (cert *CertContext, err error) [failretval==nil] = crypt32.CertFindCertificateInStore
297
//sys CertFindChainInStore(store Handle, certEncodingType uint32, findFlags uint32, findType uint32, findPara unsafe.Pointer, prevChainContext *CertChainContext) (certchain *CertChainContext, err error) [failretval==nil] = crypt32.CertFindChainInStore
298
//sys CryptAcquireCertificatePrivateKey(cert *CertContext, flags uint32, parameters unsafe.Pointer, cryptProvOrNCryptKey *Handle, keySpec *uint32, callerFreeProvOrNCryptKey *bool) (err error) = crypt32.CryptAcquireCertificatePrivateKey
299
//sys CryptQueryObject(objectType uint32, object unsafe.Pointer, expectedContentTypeFlags uint32, expectedFormatTypeFlags uint32, flags uint32, msgAndCertEncodingType *uint32, contentType *uint32, formatType *uint32, certStore *Handle, msg *Handle, context *unsafe.Pointer) (err error) = crypt32.CryptQueryObject
300
//sys CryptDecodeObject(encodingType uint32, structType *byte, encodedBytes *byte, lenEncodedBytes uint32, flags uint32, decoded unsafe.Pointer, decodedLen *uint32) (err error) = crypt32.CryptDecodeObject
301
//sys CryptProtectData(dataIn *DataBlob, name *uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptProtectData
302
//sys CryptUnprotectData(dataIn *DataBlob, name **uint16, optionalEntropy *DataBlob, reserved uintptr, promptStruct *CryptProtectPromptStruct, flags uint32, dataOut *DataBlob) (err error) = crypt32.CryptUnprotectData
303
//sys WinVerifyTrustEx(hwnd HWND, actionId *GUID, data *WinTrustData) (ret error) = wintrust.WinVerifyTrustEx
304
//sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW
305
//sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey
306
//sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW
307
//sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW
308
//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW
309
//sys RegNotifyChangeKeyValue(key Handle, watchSubtree bool, notifyFilter uint32, event Handle, asynchronous bool) (regerrno error) = advapi32.RegNotifyChangeKeyValue
310
//sys GetCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId
311
//sys ProcessIdToSessionId(pid uint32, sessionid *uint32) (err error) = kernel32.ProcessIdToSessionId
312
//sys ClosePseudoConsole(console Handle) = kernel32.ClosePseudoConsole
313
//sys createPseudoConsole(size uint32, in Handle, out Handle, flags uint32, pconsole *Handle) (hr error) = kernel32.CreatePseudoConsole
314
//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode
315
//sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode
316
//sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo
317
//sys setConsoleCursorPosition(console Handle, position uint32) (err error) = kernel32.SetConsoleCursorPosition
318
//sys GetConsoleCP() (cp uint32, err error) = kernel32.GetConsoleCP
319
//sys GetConsoleOutputCP() (cp uint32, err error) = kernel32.GetConsoleOutputCP
320
//sys SetConsoleCP(cp uint32) (err error) = kernel32.SetConsoleCP
321
//sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP
322
//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
323
//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
324
//sys GetNumberOfConsoleInputEvents(console Handle, numevents *uint32) (err error) = kernel32.GetNumberOfConsoleInputEvents
325
//sys FlushConsoleInputBuffer(console Handle) (err error) = kernel32.FlushConsoleInputBuffer
326
//sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole
327
//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
328
//sys Module32First(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32FirstW
329
//sys Module32Next(snapshot Handle, moduleEntry *ModuleEntry32) (err error) = kernel32.Module32NextW
330
//sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW
331
//sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW
332
//sys Thread32First(snapshot Handle, threadEntry *ThreadEntry32) (err error)
333
//sys Thread32Next(snapshot Handle, threadEntry *ThreadEntry32) (err error)
334
//sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error)
335
// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
336
//sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW
337
//sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW
338
//sys GetCurrentThreadId() (id uint32)
339
//sys CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateEventW
340
//sys CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateEventExW
341
//sys OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW
342
//sys SetEvent(event Handle) (err error) = kernel32.SetEvent
343
//sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent
344
//sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent
345
//sys CreateMutex(mutexAttrs *SecurityAttributes, initialOwner bool, name *uint16) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateMutexW
346
//sys CreateMutexEx(mutexAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) [failretval == 0 || e1 == ERROR_ALREADY_EXISTS] = kernel32.CreateMutexExW
347
//sys OpenMutex(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenMutexW
348
//sys ReleaseMutex(mutex Handle) (err error) = kernel32.ReleaseMutex
349
//sys SleepEx(milliseconds uint32, alertable bool) (ret uint32) = kernel32.SleepEx
350
//sys CreateJobObject(jobAttr *SecurityAttributes, name *uint16) (handle Handle, err error) = kernel32.CreateJobObjectW
351
//sys AssignProcessToJobObject(job Handle, process Handle) (err error) = kernel32.AssignProcessToJobObject
352
//sys TerminateJobObject(job Handle, exitCode uint32) (err error) = kernel32.TerminateJobObject
353
//sys SetErrorMode(mode uint32) (ret uint32) = kernel32.SetErrorMode
354
//sys ResumeThread(thread Handle) (ret uint32, err error) [failretval==0xffffffff] = kernel32.ResumeThread
355
//sys SetPriorityClass(process Handle, priorityClass uint32) (err error) = kernel32.SetPriorityClass
356
//sys GetPriorityClass(process Handle) (ret uint32, err error) = kernel32.GetPriorityClass
357
//sys QueryInformationJobObject(job Handle, JobObjectInformationClass int32, JobObjectInformation uintptr, JobObjectInformationLength uint32, retlen *uint32) (err error) = kernel32.QueryInformationJobObject
358
//sys SetInformationJobObject(job Handle, JobObjectInformationClass uint32, JobObjectInformation uintptr, JobObjectInformationLength uint32) (ret int, err error)
359
//sys GenerateConsoleCtrlEvent(ctrlEvent uint32, processGroupID uint32) (err error)
360
//sys GetProcessId(process Handle) (id uint32, err error)
361
//sys QueryFullProcessImageName(proc Handle, flags uint32, exeName *uint16, size *uint32) (err error) = kernel32.QueryFullProcessImageNameW
362
//sys OpenThread(desiredAccess uint32, inheritHandle bool, threadId uint32) (handle Handle, err error)
363
//sys SetProcessPriorityBoost(process Handle, disable bool) (err error) = kernel32.SetProcessPriorityBoost
364
//sys GetProcessWorkingSetSizeEx(hProcess Handle, lpMinimumWorkingSetSize *uintptr, lpMaximumWorkingSetSize *uintptr, flags *uint32)
365
//sys SetProcessWorkingSetSizeEx(hProcess Handle, dwMinimumWorkingSetSize uintptr, dwMaximumWorkingSetSize uintptr, flags uint32) (err error)
366
//sys ClearCommBreak(handle Handle) (err error)
367
//sys ClearCommError(handle Handle, lpErrors *uint32, lpStat *ComStat) (err error)
368
//sys EscapeCommFunction(handle Handle, dwFunc uint32) (err error)
369
//sys GetCommState(handle Handle, lpDCB *DCB) (err error)
370
//sys GetCommModemStatus(handle Handle, lpModemStat *uint32) (err error)
371
//sys GetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error)
372
//sys PurgeComm(handle Handle, dwFlags uint32) (err error)
373
//sys SetCommBreak(handle Handle) (err error)
374
//sys SetCommMask(handle Handle, dwEvtMask uint32) (err error)
375
//sys SetCommState(handle Handle, lpDCB *DCB) (err error)
376
//sys SetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error)
377
//sys SetupComm(handle Handle, dwInQueue uint32, dwOutQueue uint32) (err error)
378
//sys WaitCommEvent(handle Handle, lpEvtMask *uint32, lpOverlapped *Overlapped) (err error)
379
//sys GetActiveProcessorCount(groupNumber uint16) (ret uint32)
380
//sys GetMaximumProcessorCount(groupNumber uint16) (ret uint32)
381
//sys EnumWindows(enumFunc uintptr, param unsafe.Pointer) (err error) = user32.EnumWindows
382
//sys EnumChildWindows(hwnd HWND, enumFunc uintptr, param unsafe.Pointer) = user32.EnumChildWindows
383
//sys GetClassName(hwnd HWND, className *uint16, maxCount int32) (copied int32, err error) = user32.GetClassNameW
384
//sys GetDesktopWindow() (hwnd HWND) = user32.GetDesktopWindow
385
//sys GetForegroundWindow() (hwnd HWND) = user32.GetForegroundWindow
386
//sys IsWindow(hwnd HWND) (isWindow bool) = user32.IsWindow
387
//sys IsWindowUnicode(hwnd HWND) (isUnicode bool) = user32.IsWindowUnicode
388
//sys IsWindowVisible(hwnd HWND) (isVisible bool) = user32.IsWindowVisible
389
//sys GetGUIThreadInfo(thread uint32, info *GUIThreadInfo) (err error) = user32.GetGUIThreadInfo
390
//sys GetLargePageMinimum() (size uintptr)
391
392
// Volume Management Functions
393
//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW
394
//sys DeleteVolumeMountPoint(volumeMountPoint *uint16) (err error) = DeleteVolumeMountPointW
395
//sys FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeW
396
//sys FindFirstVolumeMountPoint(rootPathName *uint16, volumeMountPoint *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeMountPointW
397
//sys FindNextVolume(findVolume Handle, volumeName *uint16, bufferLength uint32) (err error) = FindNextVolumeW
398
//sys FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW
399
//sys FindVolumeClose(findVolume Handle) (err error)
400
//sys FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error)
401
//sys GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailableToCaller *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = GetDiskFreeSpaceExW
402
//sys GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW
403
//sys GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0]
404
//sys GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW
405
//sys GetVolumeInformation(rootPathName *uint16, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationW
406
//sys GetVolumeInformationByHandle(file Handle, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationByHandleW
407
//sys GetVolumeNameForVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16, bufferlength uint32) (err error) = GetVolumeNameForVolumeMountPointW
408
//sys GetVolumePathName(fileName *uint16, volumePathName *uint16, bufferLength uint32) (err error) = GetVolumePathNameW
409
//sys GetVolumePathNamesForVolumeName(volumeName *uint16, volumePathNames *uint16, bufferLength uint32, returnLength *uint32) (err error) = GetVolumePathNamesForVolumeNameW
410
//sys QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW
411
//sys SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW
412
//sys SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW
413
//sys InitiateSystemShutdownEx(machineName *uint16, message *uint16, timeout uint32, forceAppsClosed bool, rebootAfterShutdown bool, reason uint32) (err error) = advapi32.InitiateSystemShutdownExW
414
//sys SetProcessShutdownParameters(level uint32, flags uint32) (err error) = kernel32.SetProcessShutdownParameters
415
//sys GetProcessShutdownParameters(level *uint32, flags *uint32) (err error) = kernel32.GetProcessShutdownParameters
416
//sys clsidFromString(lpsz *uint16, pclsid *GUID) (ret error) = ole32.CLSIDFromString
417
//sys stringFromGUID2(rguid *GUID, lpsz *uint16, cchMax int32) (chars int32) = ole32.StringFromGUID2
418
//sys coCreateGuid(pguid *GUID) (ret error) = ole32.CoCreateGuid
419
//sys CoTaskMemFree(address unsafe.Pointer) = ole32.CoTaskMemFree
420
//sys CoInitializeEx(reserved uintptr, coInit uint32) (ret error) = ole32.CoInitializeEx
421
//sys CoUninitialize() = ole32.CoUninitialize
422
//sys CoGetObject(name *uint16, bindOpts *BIND_OPTS3, guid *GUID, functionTable **uintptr) (ret error) = ole32.CoGetObject
423
//sys getProcessPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetProcessPreferredUILanguages
424
//sys getThreadPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetThreadPreferredUILanguages
425
//sys getUserPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetUserPreferredUILanguages
426
//sys getSystemPreferredUILanguages(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) (err error) = kernel32.GetSystemPreferredUILanguages
427
//sys findResource(module Handle, name uintptr, resType uintptr) (resInfo Handle, err error) = kernel32.FindResourceW
428
//sys SizeofResource(module Handle, resInfo Handle) (size uint32, err error) = kernel32.SizeofResource
429
//sys LoadResource(module Handle, resInfo Handle) (resData Handle, err error) = kernel32.LoadResource
430
//sys LockResource(resData Handle) (addr uintptr, err error) = kernel32.LockResource
431
432
// Version APIs
433
//sys GetFileVersionInfoSize(filename string, zeroHandle *Handle) (bufSize uint32, err error) = version.GetFileVersionInfoSizeW
434
//sys GetFileVersionInfo(filename string, handle uint32, bufSize uint32, buffer unsafe.Pointer) (err error) = version.GetFileVersionInfoW
435
//sys VerQueryValue(block unsafe.Pointer, subBlock string, pointerToBufferPointer unsafe.Pointer, bufSize *uint32) (err error) = version.VerQueryValueW
436
437
// Process Status API (PSAPI)
438
//sys enumProcesses(processIds *uint32, nSize uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses
439
//sys EnumProcessModules(process Handle, module *Handle, cb uint32, cbNeeded *uint32) (err error) = psapi.EnumProcessModules
440
//sys EnumProcessModulesEx(process Handle, module *Handle, cb uint32, cbNeeded *uint32, filterFlag uint32) (err error) = psapi.EnumProcessModulesEx
441
//sys GetModuleInformation(process Handle, module Handle, modinfo *ModuleInfo, cb uint32) (err error) = psapi.GetModuleInformation
442
//sys GetModuleFileNameEx(process Handle, module Handle, filename *uint16, size uint32) (err error) = psapi.GetModuleFileNameExW
443
//sys GetModuleBaseName(process Handle, module Handle, baseName *uint16, size uint32) (err error) = psapi.GetModuleBaseNameW
444
//sys QueryWorkingSetEx(process Handle, pv uintptr, cb uint32) (err error) = psapi.QueryWorkingSetEx
445
446
// NT Native APIs
447
//sys rtlNtStatusToDosErrorNoTeb(ntstatus NTStatus) (ret syscall.Errno) = ntdll.RtlNtStatusToDosErrorNoTeb
448
//sys rtlGetVersion(info *OsVersionInfoEx) (ntstatus error) = ntdll.RtlGetVersion
449
//sys rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) = ntdll.RtlGetNtVersionNumbers
450
//sys RtlGetCurrentPeb() (peb *PEB) = ntdll.RtlGetCurrentPeb
451
//sys RtlInitUnicodeString(destinationString *NTUnicodeString, sourceString *uint16) = ntdll.RtlInitUnicodeString
452
//sys RtlInitString(destinationString *NTString, sourceString *byte) = ntdll.RtlInitString
453
//sys NtCreateFile(handle *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, allocationSize *int64, attributes uint32, share uint32, disposition uint32, options uint32, eabuffer uintptr, ealength uint32) (ntstatus error) = ntdll.NtCreateFile
454
//sys NtCreateNamedPipeFile(pipe *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (ntstatus error) = ntdll.NtCreateNamedPipeFile
455
//sys NtSetInformationFile(handle Handle, iosb *IO_STATUS_BLOCK, inBuffer *byte, inBufferLen uint32, class uint32) (ntstatus error) = ntdll.NtSetInformationFile
456
//sys RtlDosPathNameToNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToNtPathName_U_WithStatus
457
//sys RtlDosPathNameToRelativeNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToRelativeNtPathName_U_WithStatus
458
//sys RtlDefaultNpAcl(acl **ACL) (ntstatus error) = ntdll.RtlDefaultNpAcl
459
//sys NtQueryInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQueryInformationProcess
460
//sys NtSetInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32) (ntstatus error) = ntdll.NtSetInformationProcess
461
//sys NtQuerySystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQuerySystemInformation
462
//sys NtSetSystemInformation(sysInfoClass int32, sysInfo unsafe.Pointer, sysInfoLen uint32) (ntstatus error) = ntdll.NtSetSystemInformation
463
//sys RtlAddFunctionTable(functionTable *RUNTIME_FUNCTION, entryCount uint32, baseAddress uintptr) (ret bool) = ntdll.RtlAddFunctionTable
464
//sys RtlDeleteFunctionTable(functionTable *RUNTIME_FUNCTION) (ret bool) = ntdll.RtlDeleteFunctionTable
465
466
// Desktop Window Manager API (Dwmapi)
467
//sys DwmGetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmGetWindowAttribute
468
//sys DwmSetWindowAttribute(hwnd HWND, attribute uint32, value unsafe.Pointer, size uint32) (ret error) = dwmapi.DwmSetWindowAttribute
469
470
// Windows Multimedia API
471
//sys TimeBeginPeriod (period uint32) (err error) [failretval != 0] = winmm.timeBeginPeriod
472
//sys TimeEndPeriod (period uint32) (err error) [failretval != 0] = winmm.timeEndPeriod
473
474
// syscall interface implementation for other packages
475
476
// GetCurrentProcess returns the handle for the current process.
477
// It is a pseudo handle that does not need to be closed.
478
// The returned error is always nil.
479
//
480
// Deprecated: use CurrentProcess for the same Handle without the nil
481
// error.
482
func GetCurrentProcess() (Handle, error) {
483
return CurrentProcess(), nil
484
}
485
486
// CurrentProcess returns the handle for the current process.
487
// It is a pseudo handle that does not need to be closed.
488
func CurrentProcess() Handle { return Handle(^uintptr(1 - 1)) }
489
490
// GetCurrentThread returns the handle for the current thread.
491
// It is a pseudo handle that does not need to be closed.
492
// The returned error is always nil.
493
//
494
// Deprecated: use CurrentThread for the same Handle without the nil
495
// error.
496
func GetCurrentThread() (Handle, error) {
497
return CurrentThread(), nil
498
}
499
500
// CurrentThread returns the handle for the current thread.
501
// It is a pseudo handle that does not need to be closed.
502
func CurrentThread() Handle { return Handle(^uintptr(2 - 1)) }
503
504
// GetProcAddressByOrdinal retrieves the address of the exported
505
// function from module by ordinal.
506
func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) {
507
r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0)
508
proc = uintptr(r0)
509
if proc == 0 {
510
err = errnoErr(e1)
511
}
512
return
513
}
514
515
func Exit(code int) { ExitProcess(uint32(code)) }
516
517
func makeInheritSa() *SecurityAttributes {
518
var sa SecurityAttributes
519
sa.Length = uint32(unsafe.Sizeof(sa))
520
sa.InheritHandle = 1
521
return &sa
522
}
523
524
func Open(path string, mode int, perm uint32) (fd Handle, err error) {
525
if len(path) == 0 {
526
return InvalidHandle, ERROR_FILE_NOT_FOUND
527
}
528
pathp, err := UTF16PtrFromString(path)
529
if err != nil {
530
return InvalidHandle, err
531
}
532
var access uint32
533
switch mode & (O_RDONLY | O_WRONLY | O_RDWR) {
534
case O_RDONLY:
535
access = GENERIC_READ
536
case O_WRONLY:
537
access = GENERIC_WRITE
538
case O_RDWR:
539
access = GENERIC_READ | GENERIC_WRITE
540
}
541
if mode&O_CREAT != 0 {
542
access |= GENERIC_WRITE
543
}
544
if mode&O_APPEND != 0 {
545
access &^= GENERIC_WRITE
546
access |= FILE_APPEND_DATA
547
}
548
sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
549
var sa *SecurityAttributes
550
if mode&O_CLOEXEC == 0 {
551
sa = makeInheritSa()
552
}
553
var createmode uint32
554
switch {
555
case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL):
556
createmode = CREATE_NEW
557
case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC):
558
createmode = CREATE_ALWAYS
559
case mode&O_CREAT == O_CREAT:
560
createmode = OPEN_ALWAYS
561
case mode&O_TRUNC == O_TRUNC:
562
createmode = TRUNCATE_EXISTING
563
default:
564
createmode = OPEN_EXISTING
565
}
566
var attrs uint32 = FILE_ATTRIBUTE_NORMAL
567
if perm&S_IWRITE == 0 {
568
attrs = FILE_ATTRIBUTE_READONLY
569
}
570
h, e := CreateFile(pathp, access, sharemode, sa, createmode, attrs, 0)
571
return h, e
572
}
573
574
func Read(fd Handle, p []byte) (n int, err error) {
575
var done uint32
576
e := ReadFile(fd, p, &done, nil)
577
if e != nil {
578
if e == ERROR_BROKEN_PIPE {
579
// NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin
580
return 0, nil
581
}
582
return 0, e
583
}
584
return int(done), nil
585
}
586
587
func Write(fd Handle, p []byte) (n int, err error) {
588
if raceenabled {
589
raceReleaseMerge(unsafe.Pointer(&ioSync))
590
}
591
var done uint32
592
e := WriteFile(fd, p, &done, nil)
593
if e != nil {
594
return 0, e
595
}
596
return int(done), nil
597
}
598
599
func ReadFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error {
600
err := readFile(fd, p, done, overlapped)
601
if raceenabled {
602
if *done > 0 {
603
raceWriteRange(unsafe.Pointer(&p[0]), int(*done))
604
}
605
raceAcquire(unsafe.Pointer(&ioSync))
606
}
607
return err
608
}
609
610
func WriteFile(fd Handle, p []byte, done *uint32, overlapped *Overlapped) error {
611
if raceenabled {
612
raceReleaseMerge(unsafe.Pointer(&ioSync))
613
}
614
err := writeFile(fd, p, done, overlapped)
615
if raceenabled && *done > 0 {
616
raceReadRange(unsafe.Pointer(&p[0]), int(*done))
617
}
618
return err
619
}
620
621
var ioSync int64
622
623
func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) {
624
var w uint32
625
switch whence {
626
case 0:
627
w = FILE_BEGIN
628
case 1:
629
w = FILE_CURRENT
630
case 2:
631
w = FILE_END
632
}
633
hi := int32(offset >> 32)
634
lo := int32(offset)
635
// use GetFileType to check pipe, pipe can't do seek
636
ft, _ := GetFileType(fd)
637
if ft == FILE_TYPE_PIPE {
638
return 0, syscall.EPIPE
639
}
640
rlo, e := SetFilePointer(fd, lo, &hi, w)
641
if e != nil {
642
return 0, e
643
}
644
return int64(hi)<<32 + int64(rlo), nil
645
}
646
647
func Close(fd Handle) (err error) {
648
return CloseHandle(fd)
649
}
650
651
var (
652
Stdin = getStdHandle(STD_INPUT_HANDLE)
653
Stdout = getStdHandle(STD_OUTPUT_HANDLE)
654
Stderr = getStdHandle(STD_ERROR_HANDLE)
655
)
656
657
func getStdHandle(stdhandle uint32) (fd Handle) {
658
r, _ := GetStdHandle(stdhandle)
659
return r
660
}
661
662
const ImplementsGetwd = true
663
664
func Getwd() (wd string, err error) {
665
b := make([]uint16, 300)
666
n, e := GetCurrentDirectory(uint32(len(b)), &b[0])
667
if e != nil {
668
return "", e
669
}
670
return string(utf16.Decode(b[0:n])), nil
671
}
672
673
func Chdir(path string) (err error) {
674
pathp, err := UTF16PtrFromString(path)
675
if err != nil {
676
return err
677
}
678
return SetCurrentDirectory(pathp)
679
}
680
681
func Mkdir(path string, mode uint32) (err error) {
682
pathp, err := UTF16PtrFromString(path)
683
if err != nil {
684
return err
685
}
686
return CreateDirectory(pathp, nil)
687
}
688
689
func Rmdir(path string) (err error) {
690
pathp, err := UTF16PtrFromString(path)
691
if err != nil {
692
return err
693
}
694
return RemoveDirectory(pathp)
695
}
696
697
func Unlink(path string) (err error) {
698
pathp, err := UTF16PtrFromString(path)
699
if err != nil {
700
return err
701
}
702
return DeleteFile(pathp)
703
}
704
705
func Rename(oldpath, newpath string) (err error) {
706
from, err := UTF16PtrFromString(oldpath)
707
if err != nil {
708
return err
709
}
710
to, err := UTF16PtrFromString(newpath)
711
if err != nil {
712
return err
713
}
714
return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)
715
}
716
717
func ComputerName() (name string, err error) {
718
var n uint32 = MAX_COMPUTERNAME_LENGTH + 1
719
b := make([]uint16, n)
720
e := GetComputerName(&b[0], &n)
721
if e != nil {
722
return "", e
723
}
724
return string(utf16.Decode(b[0:n])), nil
725
}
726
727
func DurationSinceBoot() time.Duration {
728
return time.Duration(getTickCount64()) * time.Millisecond
729
}
730
731
func Ftruncate(fd Handle, length int64) (err error) {
732
type _FILE_END_OF_FILE_INFO struct {
733
EndOfFile int64
734
}
735
var info _FILE_END_OF_FILE_INFO
736
info.EndOfFile = length
737
return SetFileInformationByHandle(fd, FileEndOfFileInfo, (*byte)(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info)))
738
}
739
740
func Gettimeofday(tv *Timeval) (err error) {
741
var ft Filetime
742
GetSystemTimeAsFileTime(&ft)
743
*tv = NsecToTimeval(ft.Nanoseconds())
744
return nil
745
}
746
747
func Pipe(p []Handle) (err error) {
748
if len(p) != 2 {
749
return syscall.EINVAL
750
}
751
var r, w Handle
752
e := CreatePipe(&r, &w, makeInheritSa(), 0)
753
if e != nil {
754
return e
755
}
756
p[0] = r
757
p[1] = w
758
return nil
759
}
760
761
func Utimes(path string, tv []Timeval) (err error) {
762
if len(tv) != 2 {
763
return syscall.EINVAL
764
}
765
pathp, e := UTF16PtrFromString(path)
766
if e != nil {
767
return e
768
}
769
h, e := CreateFile(pathp,
770
FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
771
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
772
if e != nil {
773
return e
774
}
775
defer CloseHandle(h)
776
a := NsecToFiletime(tv[0].Nanoseconds())
777
w := NsecToFiletime(tv[1].Nanoseconds())
778
return SetFileTime(h, nil, &a, &w)
779
}
780
781
func UtimesNano(path string, ts []Timespec) (err error) {
782
if len(ts) != 2 {
783
return syscall.EINVAL
784
}
785
pathp, e := UTF16PtrFromString(path)
786
if e != nil {
787
return e
788
}
789
h, e := CreateFile(pathp,
790
FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
791
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
792
if e != nil {
793
return e
794
}
795
defer CloseHandle(h)
796
a := NsecToFiletime(TimespecToNsec(ts[0]))
797
w := NsecToFiletime(TimespecToNsec(ts[1]))
798
return SetFileTime(h, nil, &a, &w)
799
}
800
801
func Fsync(fd Handle) (err error) {
802
return FlushFileBuffers(fd)
803
}
804
805
func Chmod(path string, mode uint32) (err error) {
806
p, e := UTF16PtrFromString(path)
807
if e != nil {
808
return e
809
}
810
attrs, e := GetFileAttributes(p)
811
if e != nil {
812
return e
813
}
814
if mode&S_IWRITE != 0 {
815
attrs &^= FILE_ATTRIBUTE_READONLY
816
} else {
817
attrs |= FILE_ATTRIBUTE_READONLY
818
}
819
return SetFileAttributes(p, attrs)
820
}
821
822
func LoadGetSystemTimePreciseAsFileTime() error {
823
return procGetSystemTimePreciseAsFileTime.Find()
824
}
825
826
func LoadCancelIoEx() error {
827
return procCancelIoEx.Find()
828
}
829
830
func LoadSetFileCompletionNotificationModes() error {
831
return procSetFileCompletionNotificationModes.Find()
832
}
833
834
func WaitForMultipleObjects(handles []Handle, waitAll bool, waitMilliseconds uint32) (event uint32, err error) {
835
// Every other win32 array API takes arguments as "pointer, count", except for this function. So we
836
// can't declare it as a usual [] type, because mksyscall will use the opposite order. We therefore
837
// trivially stub this ourselves.
838
839
var handlePtr *Handle
840
if len(handles) > 0 {
841
handlePtr = &handles[0]
842
}
843
return waitForMultipleObjects(uint32(len(handles)), uintptr(unsafe.Pointer(handlePtr)), waitAll, waitMilliseconds)
844
}
845
846
// net api calls
847
848
const socket_error = uintptr(^uint32(0))
849
850
//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
851
//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
852
//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
853
//sys WSALookupServiceBegin(querySet *WSAQUERYSET, flags uint32, handle *Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceBeginW
854
//sys WSALookupServiceNext(handle Handle, flags uint32, size *int32, querySet *WSAQUERYSET) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceNextW
855
//sys WSALookupServiceEnd(handle Handle) (err error) [failretval==socket_error] = ws2_32.WSALookupServiceEnd
856
//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
857
//sys sendto(s Handle, buf []byte, flags int32, to unsafe.Pointer, tolen int32) (err error) [failretval==socket_error] = ws2_32.sendto
858
//sys recvfrom(s Handle, buf []byte, flags int32, from *RawSockaddrAny, fromlen *int32) (n int32, err error) [failretval==-1] = ws2_32.recvfrom
859
//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt
860
//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt
861
//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind
862
//sys connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect
863
//sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname
864
//sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername
865
//sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen
866
//sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown
867
//sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket
868
//sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx
869
//sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs
870
//sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv
871
//sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend
872
//sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom
873
//sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo
874
//sys WSASocket(af int32, typ int32, protocol int32, protoInfo *WSAProtocolInfo, group uint32, flags uint32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.WSASocketW
875
//sys WSADuplicateSocket(s Handle, processID uint32, info *WSAProtocolInfo) (err error) [failretval!=0] = ws2_32.WSADuplicateSocketW
876
//sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname
877
//sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname
878
//sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs
879
//sys GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname
880
//sys DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W
881
//sys DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree
882
//sys DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W
883
//sys GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW
884
//sys FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW
885
//sys GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry
886
//sys GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo
887
//sys SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes
888
//sys WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW
889
//sys WSAGetOverlappedResult(h Handle, o *Overlapped, bytes *uint32, wait bool, flags *uint32) (err error) = ws2_32.WSAGetOverlappedResult
890
//sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses
891
//sys GetACP() (acp uint32) = kernel32.GetACP
892
//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
893
//sys getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx
894
//sys GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) = iphlpapi.GetIfEntry2Ex
895
//sys GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) = iphlpapi.GetUnicastIpAddressEntry
896
//sys NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyIpInterfaceChange
897
//sys NotifyUnicastIpAddressChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyUnicastIpAddressChange
898
//sys CancelMibChangeNotify2(notificationHandle Handle) (errcode error) = iphlpapi.CancelMibChangeNotify2
899
900
// For testing: clients can set this flag to force
901
// creation of IPv6 sockets to return EAFNOSUPPORT.
902
var SocketDisableIPv6 bool
903
904
type RawSockaddrInet4 struct {
905
Family uint16
906
Port uint16
907
Addr [4]byte /* in_addr */
908
Zero [8]uint8
909
}
910
911
type RawSockaddrInet6 struct {
912
Family uint16
913
Port uint16
914
Flowinfo uint32
915
Addr [16]byte /* in6_addr */
916
Scope_id uint32
917
}
918
919
type RawSockaddr struct {
920
Family uint16
921
Data [14]int8
922
}
923
924
type RawSockaddrAny struct {
925
Addr RawSockaddr
926
Pad [100]int8
927
}
928
929
type Sockaddr interface {
930
sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs
931
}
932
933
type SockaddrInet4 struct {
934
Port int
935
Addr [4]byte
936
raw RawSockaddrInet4
937
}
938
939
func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) {
940
if sa.Port < 0 || sa.Port > 0xFFFF {
941
return nil, 0, syscall.EINVAL
942
}
943
sa.raw.Family = AF_INET
944
p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
945
p[0] = byte(sa.Port >> 8)
946
p[1] = byte(sa.Port)
947
sa.raw.Addr = sa.Addr
948
return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
949
}
950
951
type SockaddrInet6 struct {
952
Port int
953
ZoneId uint32
954
Addr [16]byte
955
raw RawSockaddrInet6
956
}
957
958
func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) {
959
if sa.Port < 0 || sa.Port > 0xFFFF {
960
return nil, 0, syscall.EINVAL
961
}
962
sa.raw.Family = AF_INET6
963
p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
964
p[0] = byte(sa.Port >> 8)
965
p[1] = byte(sa.Port)
966
sa.raw.Scope_id = sa.ZoneId
967
sa.raw.Addr = sa.Addr
968
return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
969
}
970
971
type RawSockaddrUnix struct {
972
Family uint16
973
Path [UNIX_PATH_MAX]int8
974
}
975
976
type SockaddrUnix struct {
977
Name string
978
raw RawSockaddrUnix
979
}
980
981
func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) {
982
name := sa.Name
983
n := len(name)
984
if n > len(sa.raw.Path) {
985
return nil, 0, syscall.EINVAL
986
}
987
if n == len(sa.raw.Path) && name[0] != '@' {
988
return nil, 0, syscall.EINVAL
989
}
990
sa.raw.Family = AF_UNIX
991
for i := 0; i < n; i++ {
992
sa.raw.Path[i] = int8(name[i])
993
}
994
// length is family (uint16), name, NUL.
995
sl := int32(2)
996
if n > 0 {
997
sl += int32(n) + 1
998
}
999
if sa.raw.Path[0] == '@' || (sa.raw.Path[0] == 0 && sl > 3) {
1000
// Check sl > 3 so we don't change unnamed socket behavior.
1001
sa.raw.Path[0] = 0
1002
// Don't count trailing NUL for abstract address.
1003
sl--
1004
}
1005
1006
return unsafe.Pointer(&sa.raw), sl, nil
1007
}
1008
1009
type RawSockaddrBth struct {
1010
AddressFamily [2]byte
1011
BtAddr [8]byte
1012
ServiceClassId [16]byte
1013
Port [4]byte
1014
}
1015
1016
type SockaddrBth struct {
1017
BtAddr uint64
1018
ServiceClassId GUID
1019
Port uint32
1020
1021
raw RawSockaddrBth
1022
}
1023
1024
func (sa *SockaddrBth) sockaddr() (unsafe.Pointer, int32, error) {
1025
family := AF_BTH
1026
sa.raw = RawSockaddrBth{
1027
AddressFamily: *(*[2]byte)(unsafe.Pointer(&family)),
1028
BtAddr: *(*[8]byte)(unsafe.Pointer(&sa.BtAddr)),
1029
Port: *(*[4]byte)(unsafe.Pointer(&sa.Port)),
1030
ServiceClassId: *(*[16]byte)(unsafe.Pointer(&sa.ServiceClassId)),
1031
}
1032
return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
1033
}
1034
1035
func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) {
1036
switch rsa.Addr.Family {
1037
case AF_UNIX:
1038
pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
1039
sa := new(SockaddrUnix)
1040
if pp.Path[0] == 0 {
1041
// "Abstract" Unix domain socket.
1042
// Rewrite leading NUL as @ for textual display.
1043
// (This is the standard convention.)
1044
// Not friendly to overwrite in place,
1045
// but the callers below don't care.
1046
pp.Path[0] = '@'
1047
}
1048
1049
// Assume path ends at NUL.
1050
// This is not technically the Linux semantics for
1051
// abstract Unix domain sockets--they are supposed
1052
// to be uninterpreted fixed-size binary blobs--but
1053
// everyone uses this convention.
1054
n := 0
1055
for n < len(pp.Path) && pp.Path[n] != 0 {
1056
n++
1057
}
1058
sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
1059
return sa, nil
1060
1061
case AF_INET:
1062
pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
1063
sa := new(SockaddrInet4)
1064
p := (*[2]byte)(unsafe.Pointer(&pp.Port))
1065
sa.Port = int(p[0])<<8 + int(p[1])
1066
sa.Addr = pp.Addr
1067
return sa, nil
1068
1069
case AF_INET6:
1070
pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
1071
sa := new(SockaddrInet6)
1072
p := (*[2]byte)(unsafe.Pointer(&pp.Port))
1073
sa.Port = int(p[0])<<8 + int(p[1])
1074
sa.ZoneId = pp.Scope_id
1075
sa.Addr = pp.Addr
1076
return sa, nil
1077
}
1078
return nil, syscall.EAFNOSUPPORT
1079
}
1080
1081
func Socket(domain, typ, proto int) (fd Handle, err error) {
1082
if domain == AF_INET6 && SocketDisableIPv6 {
1083
return InvalidHandle, syscall.EAFNOSUPPORT
1084
}
1085
return socket(int32(domain), int32(typ), int32(proto))
1086
}
1087
1088
func SetsockoptInt(fd Handle, level, opt int, value int) (err error) {
1089
v := int32(value)
1090
return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v)))
1091
}
1092
1093
func Bind(fd Handle, sa Sockaddr) (err error) {
1094
ptr, n, err := sa.sockaddr()
1095
if err != nil {
1096
return err
1097
}
1098
return bind(fd, ptr, n)
1099
}
1100
1101
func Connect(fd Handle, sa Sockaddr) (err error) {
1102
ptr, n, err := sa.sockaddr()
1103
if err != nil {
1104
return err
1105
}
1106
return connect(fd, ptr, n)
1107
}
1108
1109
func GetBestInterfaceEx(sa Sockaddr, pdwBestIfIndex *uint32) (err error) {
1110
ptr, _, err := sa.sockaddr()
1111
if err != nil {
1112
return err
1113
}
1114
return getBestInterfaceEx(ptr, pdwBestIfIndex)
1115
}
1116
1117
func Getsockname(fd Handle) (sa Sockaddr, err error) {
1118
var rsa RawSockaddrAny
1119
l := int32(unsafe.Sizeof(rsa))
1120
if err = getsockname(fd, &rsa, &l); err != nil {
1121
return
1122
}
1123
return rsa.Sockaddr()
1124
}
1125
1126
func Getpeername(fd Handle) (sa Sockaddr, err error) {
1127
var rsa RawSockaddrAny
1128
l := int32(unsafe.Sizeof(rsa))
1129
if err = getpeername(fd, &rsa, &l); err != nil {
1130
return
1131
}
1132
return rsa.Sockaddr()
1133
}
1134
1135
func Listen(s Handle, n int) (err error) {
1136
return listen(s, int32(n))
1137
}
1138
1139
func Shutdown(fd Handle, how int) (err error) {
1140
return shutdown(fd, int32(how))
1141
}
1142
1143
func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) {
1144
var rsa unsafe.Pointer
1145
var l int32
1146
if to != nil {
1147
rsa, l, err = to.sockaddr()
1148
if err != nil {
1149
return err
1150
}
1151
}
1152
return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine)
1153
}
1154
1155
func LoadGetAddrInfo() error {
1156
return procGetAddrInfoW.Find()
1157
}
1158
1159
var connectExFunc struct {
1160
once sync.Once
1161
addr uintptr
1162
err error
1163
}
1164
1165
func LoadConnectEx() error {
1166
connectExFunc.once.Do(func() {
1167
var s Handle
1168
s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
1169
if connectExFunc.err != nil {
1170
return
1171
}
1172
defer CloseHandle(s)
1173
var n uint32
1174
connectExFunc.err = WSAIoctl(s,
1175
SIO_GET_EXTENSION_FUNCTION_POINTER,
1176
(*byte)(unsafe.Pointer(&WSAID_CONNECTEX)),
1177
uint32(unsafe.Sizeof(WSAID_CONNECTEX)),
1178
(*byte)(unsafe.Pointer(&connectExFunc.addr)),
1179
uint32(unsafe.Sizeof(connectExFunc.addr)),
1180
&n, nil, 0)
1181
})
1182
return connectExFunc.err
1183
}
1184
1185
func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) {
1186
r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0)
1187
if r1 == 0 {
1188
if e1 != 0 {
1189
err = error(e1)
1190
} else {
1191
err = syscall.EINVAL
1192
}
1193
}
1194
return
1195
}
1196
1197
func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error {
1198
err := LoadConnectEx()
1199
if err != nil {
1200
return errorspkg.New("failed to find ConnectEx: " + err.Error())
1201
}
1202
ptr, n, err := sa.sockaddr()
1203
if err != nil {
1204
return err
1205
}
1206
return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
1207
}
1208
1209
var sendRecvMsgFunc struct {
1210
once sync.Once
1211
sendAddr uintptr
1212
recvAddr uintptr
1213
err error
1214
}
1215
1216
func loadWSASendRecvMsg() error {
1217
sendRecvMsgFunc.once.Do(func() {
1218
var s Handle
1219
s, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
1220
if sendRecvMsgFunc.err != nil {
1221
return
1222
}
1223
defer CloseHandle(s)
1224
var n uint32
1225
sendRecvMsgFunc.err = WSAIoctl(s,
1226
SIO_GET_EXTENSION_FUNCTION_POINTER,
1227
(*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)),
1228
uint32(unsafe.Sizeof(WSAID_WSARECVMSG)),
1229
(*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)),
1230
uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)),
1231
&n, nil, 0)
1232
if sendRecvMsgFunc.err != nil {
1233
return
1234
}
1235
sendRecvMsgFunc.err = WSAIoctl(s,
1236
SIO_GET_EXTENSION_FUNCTION_POINTER,
1237
(*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)),
1238
uint32(unsafe.Sizeof(WSAID_WSASENDMSG)),
1239
(*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)),
1240
uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)),
1241
&n, nil, 0)
1242
})
1243
return sendRecvMsgFunc.err
1244
}
1245
1246
func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error {
1247
err := loadWSASendRecvMsg()
1248
if err != nil {
1249
return err
1250
}
1251
r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
1252
if r1 == socket_error {
1253
err = errnoErr(e1)
1254
}
1255
return err
1256
}
1257
1258
func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error {
1259
err := loadWSASendRecvMsg()
1260
if err != nil {
1261
return err
1262
}
1263
r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0)
1264
if r1 == socket_error {
1265
err = errnoErr(e1)
1266
}
1267
return err
1268
}
1269
1270
// Invented structures to support what package os expects.
1271
type Rusage struct {
1272
CreationTime Filetime
1273
ExitTime Filetime
1274
KernelTime Filetime
1275
UserTime Filetime
1276
}
1277
1278
type WaitStatus struct {
1279
ExitCode uint32
1280
}
1281
1282
func (w WaitStatus) Exited() bool { return true }
1283
1284
func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) }
1285
1286
func (w WaitStatus) Signal() Signal { return -1 }
1287
1288
func (w WaitStatus) CoreDump() bool { return false }
1289
1290
func (w WaitStatus) Stopped() bool { return false }
1291
1292
func (w WaitStatus) Continued() bool { return false }
1293
1294
func (w WaitStatus) StopSignal() Signal { return -1 }
1295
1296
func (w WaitStatus) Signaled() bool { return false }
1297
1298
func (w WaitStatus) TrapCause() int { return -1 }
1299
1300
// Timespec is an invented structure on Windows, but here for
1301
// consistency with the corresponding package for other operating systems.
1302
type Timespec struct {
1303
Sec int64
1304
Nsec int64
1305
}
1306
1307
func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
1308
1309
func NsecToTimespec(nsec int64) (ts Timespec) {
1310
ts.Sec = nsec / 1e9
1311
ts.Nsec = nsec % 1e9
1312
return
1313
}
1314
1315
// TODO(brainman): fix all needed for net
1316
1317
func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS }
1318
1319
func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) {
1320
var rsa RawSockaddrAny
1321
l := int32(unsafe.Sizeof(rsa))
1322
n32, err := recvfrom(fd, p, int32(flags), &rsa, &l)
1323
n = int(n32)
1324
if err != nil {
1325
return
1326
}
1327
from, err = rsa.Sockaddr()
1328
return
1329
}
1330
1331
func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) {
1332
ptr, l, err := to.sockaddr()
1333
if err != nil {
1334
return err
1335
}
1336
return sendto(fd, p, int32(flags), ptr, l)
1337
}
1338
1339
func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS }
1340
1341
// The Linger struct is wrong but we only noticed after Go 1.
1342
// sysLinger is the real system call structure.
1343
1344
// BUG(brainman): The definition of Linger is not appropriate for direct use
1345
// with Setsockopt and Getsockopt.
1346
// Use SetsockoptLinger instead.
1347
1348
type Linger struct {
1349
Onoff int32
1350
Linger int32
1351
}
1352
1353
type sysLinger struct {
1354
Onoff uint16
1355
Linger uint16
1356
}
1357
1358
type IPMreq struct {
1359
Multiaddr [4]byte /* in_addr */
1360
Interface [4]byte /* in_addr */
1361
}
1362
1363
type IPv6Mreq struct {
1364
Multiaddr [16]byte /* in6_addr */
1365
Interface uint32
1366
}
1367
1368
func GetsockoptInt(fd Handle, level, opt int) (int, error) {
1369
v := int32(0)
1370
l := int32(unsafe.Sizeof(v))
1371
err := Getsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), &l)
1372
return int(v), err
1373
}
1374
1375
func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) {
1376
sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)}
1377
return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys)))
1378
}
1379
1380
func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) {
1381
return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4)
1382
}
1383
1384
func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) {
1385
return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
1386
}
1387
1388
func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) {
1389
return syscall.EWINDOWS
1390
}
1391
1392
func EnumProcesses(processIds []uint32, bytesReturned *uint32) error {
1393
// EnumProcesses syscall expects the size parameter to be in bytes, but the code generated with mksyscall uses
1394
// the length of the processIds slice instead. Hence, this wrapper function is added to fix the discrepancy.
1395
var p *uint32
1396
if len(processIds) > 0 {
1397
p = &processIds[0]
1398
}
1399
size := uint32(len(processIds) * 4)
1400
return enumProcesses(p, size, bytesReturned)
1401
}
1402
1403
func Getpid() (pid int) { return int(GetCurrentProcessId()) }
1404
1405
func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) {
1406
// NOTE(rsc): The Win32finddata struct is wrong for the system call:
1407
// the two paths are each one uint16 short. Use the correct struct,
1408
// a win32finddata1, and then copy the results out.
1409
// There is no loss of expressivity here, because the final
1410
// uint16, if it is used, is supposed to be a NUL, and Go doesn't need that.
1411
// For Go 1.1, we might avoid the allocation of win32finddata1 here
1412
// by adding a final Bug [2]uint16 field to the struct and then
1413
// adjusting the fields in the result directly.
1414
var data1 win32finddata1
1415
handle, err = findFirstFile1(name, &data1)
1416
if err == nil {
1417
copyFindData(data, &data1)
1418
}
1419
return
1420
}
1421
1422
func FindNextFile(handle Handle, data *Win32finddata) (err error) {
1423
var data1 win32finddata1
1424
err = findNextFile1(handle, &data1)
1425
if err == nil {
1426
copyFindData(data, &data1)
1427
}
1428
return
1429
}
1430
1431
func getProcessEntry(pid int) (*ProcessEntry32, error) {
1432
snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
1433
if err != nil {
1434
return nil, err
1435
}
1436
defer CloseHandle(snapshot)
1437
var procEntry ProcessEntry32
1438
procEntry.Size = uint32(unsafe.Sizeof(procEntry))
1439
if err = Process32First(snapshot, &procEntry); err != nil {
1440
return nil, err
1441
}
1442
for {
1443
if procEntry.ProcessID == uint32(pid) {
1444
return &procEntry, nil
1445
}
1446
err = Process32Next(snapshot, &procEntry)
1447
if err != nil {
1448
return nil, err
1449
}
1450
}
1451
}
1452
1453
func Getppid() (ppid int) {
1454
pe, err := getProcessEntry(Getpid())
1455
if err != nil {
1456
return -1
1457
}
1458
return int(pe.ParentProcessID)
1459
}
1460
1461
// TODO(brainman): fix all needed for os
1462
func Fchdir(fd Handle) (err error) { return syscall.EWINDOWS }
1463
func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS }
1464
func Symlink(path, link string) (err error) { return syscall.EWINDOWS }
1465
1466
func Fchmod(fd Handle, mode uint32) (err error) { return syscall.EWINDOWS }
1467
func Chown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }
1468
func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }
1469
func Fchown(fd Handle, uid int, gid int) (err error) { return syscall.EWINDOWS }
1470
1471
func Getuid() (uid int) { return -1 }
1472
func Geteuid() (euid int) { return -1 }
1473
func Getgid() (gid int) { return -1 }
1474
func Getegid() (egid int) { return -1 }
1475
func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS }
1476
1477
type Signal int
1478
1479
func (s Signal) Signal() {}
1480
1481
func (s Signal) String() string {
1482
if 0 <= s && int(s) < len(signals) {
1483
str := signals[s]
1484
if str != "" {
1485
return str
1486
}
1487
}
1488
return "signal " + itoa(int(s))
1489
}
1490
1491
func LoadCreateSymbolicLink() error {
1492
return procCreateSymbolicLinkW.Find()
1493
}
1494
1495
// Readlink returns the destination of the named symbolic link.
1496
func Readlink(path string, buf []byte) (n int, err error) {
1497
fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING,
1498
FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0)
1499
if err != nil {
1500
return -1, err
1501
}
1502
defer CloseHandle(fd)
1503
1504
rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE)
1505
var bytesReturned uint32
1506
err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil)
1507
if err != nil {
1508
return -1, err
1509
}
1510
1511
rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0]))
1512
var s string
1513
switch rdb.ReparseTag {
1514
case IO_REPARSE_TAG_SYMLINK:
1515
data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
1516
p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
1517
s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
1518
case IO_REPARSE_TAG_MOUNT_POINT:
1519
data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
1520
p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
1521
s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
1522
default:
1523
// the path is not a symlink or junction but another type of reparse
1524
// point
1525
return -1, syscall.ENOENT
1526
}
1527
n = copy(buf, []byte(s))
1528
1529
return n, nil
1530
}
1531
1532
// GUIDFromString parses a string in the form of
1533
// "{XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" into a GUID.
1534
func GUIDFromString(str string) (GUID, error) {
1535
guid := GUID{}
1536
str16, err := syscall.UTF16PtrFromString(str)
1537
if err != nil {
1538
return guid, err
1539
}
1540
err = clsidFromString(str16, &guid)
1541
if err != nil {
1542
return guid, err
1543
}
1544
return guid, nil
1545
}
1546
1547
// GenerateGUID creates a new random GUID.
1548
func GenerateGUID() (GUID, error) {
1549
guid := GUID{}
1550
err := coCreateGuid(&guid)
1551
if err != nil {
1552
return guid, err
1553
}
1554
return guid, nil
1555
}
1556
1557
// String returns the canonical string form of the GUID,
1558
// in the form of "{XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}".
1559
func (guid GUID) String() string {
1560
var str [100]uint16
1561
chars := stringFromGUID2(&guid, &str[0], int32(len(str)))
1562
if chars <= 1 {
1563
return ""
1564
}
1565
return string(utf16.Decode(str[:chars-1]))
1566
}
1567
1568
// KnownFolderPath returns a well-known folder path for the current user, specified by one of
1569
// the FOLDERID_ constants, and chosen and optionally created based on a KF_ flag.
1570
func KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, error) {
1571
return Token(0).KnownFolderPath(folderID, flags)
1572
}
1573
1574
// KnownFolderPath returns a well-known folder path for the user token, specified by one of
1575
// the FOLDERID_ constants, and chosen and optionally created based on a KF_ flag.
1576
func (t Token) KnownFolderPath(folderID *KNOWNFOLDERID, flags uint32) (string, error) {
1577
var p *uint16
1578
err := shGetKnownFolderPath(folderID, flags, t, &p)
1579
if err != nil {
1580
return "", err
1581
}
1582
defer CoTaskMemFree(unsafe.Pointer(p))
1583
return UTF16PtrToString(p), nil
1584
}
1585
1586
// RtlGetVersion returns the version of the underlying operating system, ignoring
1587
// manifest semantics but is affected by the application compatibility layer.
1588
func RtlGetVersion() *OsVersionInfoEx {
1589
info := &OsVersionInfoEx{}
1590
info.osVersionInfoSize = uint32(unsafe.Sizeof(*info))
1591
// According to documentation, this function always succeeds.
1592
// The function doesn't even check the validity of the
1593
// osVersionInfoSize member. Disassembling ntdll.dll indicates
1594
// that the documentation is indeed correct about that.
1595
_ = rtlGetVersion(info)
1596
return info
1597
}
1598
1599
// RtlGetNtVersionNumbers returns the version of the underlying operating system,
1600
// ignoring manifest semantics and the application compatibility layer.
1601
func RtlGetNtVersionNumbers() (majorVersion, minorVersion, buildNumber uint32) {
1602
rtlGetNtVersionNumbers(&majorVersion, &minorVersion, &buildNumber)
1603
buildNumber &= 0xffff
1604
return
1605
}
1606
1607
// GetProcessPreferredUILanguages retrieves the process preferred UI languages.
1608
func GetProcessPreferredUILanguages(flags uint32) ([]string, error) {
1609
return getUILanguages(flags, getProcessPreferredUILanguages)
1610
}
1611
1612
// GetThreadPreferredUILanguages retrieves the thread preferred UI languages for the current thread.
1613
func GetThreadPreferredUILanguages(flags uint32) ([]string, error) {
1614
return getUILanguages(flags, getThreadPreferredUILanguages)
1615
}
1616
1617
// GetUserPreferredUILanguages retrieves information about the user preferred UI languages.
1618
func GetUserPreferredUILanguages(flags uint32) ([]string, error) {
1619
return getUILanguages(flags, getUserPreferredUILanguages)
1620
}
1621
1622
// GetSystemPreferredUILanguages retrieves the system preferred UI languages.
1623
func GetSystemPreferredUILanguages(flags uint32) ([]string, error) {
1624
return getUILanguages(flags, getSystemPreferredUILanguages)
1625
}
1626
1627
func getUILanguages(flags uint32, f func(flags uint32, numLanguages *uint32, buf *uint16, bufSize *uint32) error) ([]string, error) {
1628
size := uint32(128)
1629
for {
1630
var numLanguages uint32
1631
buf := make([]uint16, size)
1632
err := f(flags, &numLanguages, &buf[0], &size)
1633
if err == ERROR_INSUFFICIENT_BUFFER {
1634
continue
1635
}
1636
if err != nil {
1637
return nil, err
1638
}
1639
buf = buf[:size]
1640
if numLanguages == 0 || len(buf) == 0 { // GetProcessPreferredUILanguages may return numLanguages==0 with "\0\0"
1641
return []string{}, nil
1642
}
1643
if buf[len(buf)-1] == 0 {
1644
buf = buf[:len(buf)-1] // remove terminating null
1645
}
1646
languages := make([]string, 0, numLanguages)
1647
from := 0
1648
for i, c := range buf {
1649
if c == 0 {
1650
languages = append(languages, string(utf16.Decode(buf[from:i])))
1651
from = i + 1
1652
}
1653
}
1654
return languages, nil
1655
}
1656
}
1657
1658
func SetConsoleCursorPosition(console Handle, position Coord) error {
1659
return setConsoleCursorPosition(console, *((*uint32)(unsafe.Pointer(&position))))
1660
}
1661
1662
func GetStartupInfo(startupInfo *StartupInfo) error {
1663
getStartupInfo(startupInfo)
1664
return nil
1665
}
1666
1667
func (s NTStatus) Errno() syscall.Errno {
1668
return rtlNtStatusToDosErrorNoTeb(s)
1669
}
1670
1671
func langID(pri, sub uint16) uint32 { return uint32(sub)<<10 | uint32(pri) }
1672
1673
func (s NTStatus) Error() string {
1674
b := make([]uint16, 300)
1675
n, err := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_FROM_HMODULE|FORMAT_MESSAGE_ARGUMENT_ARRAY, modntdll.Handle(), uint32(s), langID(LANG_ENGLISH, SUBLANG_ENGLISH_US), b, nil)
1676
if err != nil {
1677
return fmt.Sprintf("NTSTATUS 0x%08x", uint32(s))
1678
}
1679
// trim terminating \r and \n
1680
for ; n > 0 && (b[n-1] == '\n' || b[n-1] == '\r'); n-- {
1681
}
1682
return string(utf16.Decode(b[:n]))
1683
}
1684
1685
// NewNTUnicodeString returns a new NTUnicodeString structure for use with native
1686
// NT APIs that work over the NTUnicodeString type. Note that most Windows APIs
1687
// do not use NTUnicodeString, and instead UTF16PtrFromString should be used for
1688
// the more common *uint16 string type.
1689
func NewNTUnicodeString(s string) (*NTUnicodeString, error) {
1690
s16, err := UTF16FromString(s)
1691
if err != nil {
1692
return nil, err
1693
}
1694
n := uint16(len(s16) * 2)
1695
return &NTUnicodeString{
1696
Length: n - 2, // subtract 2 bytes for the NULL terminator
1697
MaximumLength: n,
1698
Buffer: &s16[0],
1699
}, nil
1700
}
1701
1702
// Slice returns a uint16 slice that aliases the data in the NTUnicodeString.
1703
func (s *NTUnicodeString) Slice() []uint16 {
1704
// Note: this rounds the length down, if it happens
1705
// to (incorrectly) be odd. Probably safer than rounding up.
1706
return unsafe.Slice(s.Buffer, s.MaximumLength/2)[:s.Length/2]
1707
}
1708
1709
func (s *NTUnicodeString) String() string {
1710
return UTF16ToString(s.Slice())
1711
}
1712
1713
// NewNTString returns a new NTString structure for use with native
1714
// NT APIs that work over the NTString type. Note that most Windows APIs
1715
// do not use NTString, and instead UTF16PtrFromString should be used for
1716
// the more common *uint16 string type.
1717
func NewNTString(s string) (*NTString, error) {
1718
var nts NTString
1719
s8, err := BytePtrFromString(s)
1720
if err != nil {
1721
return nil, err
1722
}
1723
RtlInitString(&nts, s8)
1724
return &nts, nil
1725
}
1726
1727
// Slice returns a byte slice that aliases the data in the NTString.
1728
func (s *NTString) Slice() []byte {
1729
slice := unsafe.Slice(s.Buffer, s.MaximumLength)
1730
return slice[:s.Length]
1731
}
1732
1733
func (s *NTString) String() string {
1734
return ByteSliceToString(s.Slice())
1735
}
1736
1737
// FindResource resolves a resource of the given name and resource type.
1738
func FindResource(module Handle, name, resType ResourceIDOrString) (Handle, error) {
1739
var namePtr, resTypePtr uintptr
1740
var name16, resType16 *uint16
1741
var err error
1742
resolvePtr := func(i interface{}, keep **uint16) (uintptr, error) {
1743
switch v := i.(type) {
1744
case string:
1745
*keep, err = UTF16PtrFromString(v)
1746
if err != nil {
1747
return 0, err
1748
}
1749
return uintptr(unsafe.Pointer(*keep)), nil
1750
case ResourceID:
1751
return uintptr(v), nil
1752
}
1753
return 0, errorspkg.New("parameter must be a ResourceID or a string")
1754
}
1755
namePtr, err = resolvePtr(name, &name16)
1756
if err != nil {
1757
return 0, err
1758
}
1759
resTypePtr, err = resolvePtr(resType, &resType16)
1760
if err != nil {
1761
return 0, err
1762
}
1763
resInfo, err := findResource(module, namePtr, resTypePtr)
1764
runtime.KeepAlive(name16)
1765
runtime.KeepAlive(resType16)
1766
return resInfo, err
1767
}
1768
1769
func LoadResourceData(module, resInfo Handle) (data []byte, err error) {
1770
size, err := SizeofResource(module, resInfo)
1771
if err != nil {
1772
return
1773
}
1774
resData, err := LoadResource(module, resInfo)
1775
if err != nil {
1776
return
1777
}
1778
ptr, err := LockResource(resData)
1779
if err != nil {
1780
return
1781
}
1782
data = unsafe.Slice((*byte)(unsafe.Pointer(ptr)), size)
1783
return
1784
}
1785
1786
// PSAPI_WORKING_SET_EX_BLOCK contains extended working set information for a page.
1787
type PSAPI_WORKING_SET_EX_BLOCK uint64
1788
1789
// Valid returns the validity of this page.
1790
// If this bit is 1, the subsequent members are valid; otherwise they should be ignored.
1791
func (b PSAPI_WORKING_SET_EX_BLOCK) Valid() bool {
1792
return (b & 1) == 1
1793
}
1794
1795
// ShareCount is the number of processes that share this page. The maximum value of this member is 7.
1796
func (b PSAPI_WORKING_SET_EX_BLOCK) ShareCount() uint64 {
1797
return b.intField(1, 3)
1798
}
1799
1800
// Win32Protection is the memory protection attributes of the page. For a list of values, see
1801
// https://docs.microsoft.com/en-us/windows/win32/memory/memory-protection-constants
1802
func (b PSAPI_WORKING_SET_EX_BLOCK) Win32Protection() uint64 {
1803
return b.intField(4, 11)
1804
}
1805
1806
// Shared returns the shared status of this page.
1807
// If this bit is 1, the page can be shared.
1808
func (b PSAPI_WORKING_SET_EX_BLOCK) Shared() bool {
1809
return (b & (1 << 15)) == 1
1810
}
1811
1812
// Node is the NUMA node. The maximum value of this member is 63.
1813
func (b PSAPI_WORKING_SET_EX_BLOCK) Node() uint64 {
1814
return b.intField(16, 6)
1815
}
1816
1817
// Locked returns the locked status of this page.
1818
// If this bit is 1, the virtual page is locked in physical memory.
1819
func (b PSAPI_WORKING_SET_EX_BLOCK) Locked() bool {
1820
return (b & (1 << 22)) == 1
1821
}
1822
1823
// LargePage returns the large page status of this page.
1824
// If this bit is 1, the page is a large page.
1825
func (b PSAPI_WORKING_SET_EX_BLOCK) LargePage() bool {
1826
return (b & (1 << 23)) == 1
1827
}
1828
1829
// Bad returns the bad status of this page.
1830
// If this bit is 1, the page is has been reported as bad.
1831
func (b PSAPI_WORKING_SET_EX_BLOCK) Bad() bool {
1832
return (b & (1 << 31)) == 1
1833
}
1834
1835
// intField extracts an integer field in the PSAPI_WORKING_SET_EX_BLOCK union.
1836
func (b PSAPI_WORKING_SET_EX_BLOCK) intField(start, length int) uint64 {
1837
var mask PSAPI_WORKING_SET_EX_BLOCK
1838
for pos := start; pos < start+length; pos++ {
1839
mask |= (1 << pos)
1840
}
1841
1842
masked := b & mask
1843
return uint64(masked >> start)
1844
}
1845
1846
// PSAPI_WORKING_SET_EX_INFORMATION contains extended working set information for a process.
1847
type PSAPI_WORKING_SET_EX_INFORMATION struct {
1848
// The virtual address.
1849
VirtualAddress Pointer
1850
// A PSAPI_WORKING_SET_EX_BLOCK union that indicates the attributes of the page at VirtualAddress.
1851
VirtualAttributes PSAPI_WORKING_SET_EX_BLOCK
1852
}
1853
1854
// CreatePseudoConsole creates a windows pseudo console.
1855
func CreatePseudoConsole(size Coord, in Handle, out Handle, flags uint32, pconsole *Handle) error {
1856
// We need this wrapper to manually cast Coord to uint32. The autogenerated wrappers only
1857
// accept arguments that can be casted to uintptr, and Coord can't.
1858
return createPseudoConsole(*((*uint32)(unsafe.Pointer(&size))), in, out, flags, pconsole)
1859
}
1860
1861
// ResizePseudoConsole resizes the internal buffers of the pseudo console to the width and height specified in `size`.
1862
func ResizePseudoConsole(pconsole Handle, size Coord) error {
1863
// We need this wrapper to manually cast Coord to uint32. The autogenerated wrappers only
1864
// accept arguments that can be casted to uintptr, and Coord can't.
1865
return resizePseudoConsole(pconsole, *((*uint32)(unsafe.Pointer(&size))))
1866
}
1867
1868
// DCB constants. See https://learn.microsoft.com/en-us/windows/win32/api/winbase/ns-winbase-dcb.
1869
const (
1870
CBR_110 = 110
1871
CBR_300 = 300
1872
CBR_600 = 600
1873
CBR_1200 = 1200
1874
CBR_2400 = 2400
1875
CBR_4800 = 4800
1876
CBR_9600 = 9600
1877
CBR_14400 = 14400
1878
CBR_19200 = 19200
1879
CBR_38400 = 38400
1880
CBR_57600 = 57600
1881
CBR_115200 = 115200
1882
CBR_128000 = 128000
1883
CBR_256000 = 256000
1884
1885
DTR_CONTROL_DISABLE = 0x00000000
1886
DTR_CONTROL_ENABLE = 0x00000010
1887
DTR_CONTROL_HANDSHAKE = 0x00000020
1888
1889
RTS_CONTROL_DISABLE = 0x00000000
1890
RTS_CONTROL_ENABLE = 0x00001000
1891
RTS_CONTROL_HANDSHAKE = 0x00002000
1892
RTS_CONTROL_TOGGLE = 0x00003000
1893
1894
NOPARITY = 0
1895
ODDPARITY = 1
1896
EVENPARITY = 2
1897
MARKPARITY = 3
1898
SPACEPARITY = 4
1899
1900
ONESTOPBIT = 0
1901
ONE5STOPBITS = 1
1902
TWOSTOPBITS = 2
1903
)
1904
1905
// EscapeCommFunction constants. See https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-escapecommfunction.
1906
const (
1907
SETXOFF = 1
1908
SETXON = 2
1909
SETRTS = 3
1910
CLRRTS = 4
1911
SETDTR = 5
1912
CLRDTR = 6
1913
SETBREAK = 8
1914
CLRBREAK = 9
1915
)
1916
1917
// PurgeComm constants. See https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-purgecomm.
1918
const (
1919
PURGE_TXABORT = 0x0001
1920
PURGE_RXABORT = 0x0002
1921
PURGE_TXCLEAR = 0x0004
1922
PURGE_RXCLEAR = 0x0008
1923
)
1924
1925
// SetCommMask constants. See https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setcommmask.
1926
const (
1927
EV_RXCHAR = 0x0001
1928
EV_RXFLAG = 0x0002
1929
EV_TXEMPTY = 0x0004
1930
EV_CTS = 0x0008
1931
EV_DSR = 0x0010
1932
EV_RLSD = 0x0020
1933
EV_BREAK = 0x0040
1934
EV_ERR = 0x0080
1935
EV_RING = 0x0100
1936
)
1937
1938