libc_windows.go (155091B)
1 // Copyright 2020 The Libc Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package libc // import "modernc.org/libc" 6 7 import ( 8 "errors" 9 "fmt" 10 "math" 11 "os" 12 "os/exec" 13 "os/user" 14 "path/filepath" 15 "strings" 16 "sync" 17 "sync/atomic" 18 "syscall" 19 gotime "time" 20 "unicode" 21 "unicode/utf16" 22 "unsafe" 23 24 "modernc.org/libc/errno" 25 "modernc.org/libc/fcntl" 26 "modernc.org/libc/limits" 27 "modernc.org/libc/stdio" 28 "modernc.org/libc/sys/stat" 29 "modernc.org/libc/sys/types" 30 "modernc.org/libc/time" 31 "modernc.org/libc/unistd" 32 ) 33 34 // Keep these outside of the var block otherwise go generate will miss them. 35 var X__imp__environ = EnvironP() 36 var X__imp__wenviron = uintptr(unsafe.Pointer(&wenviron)) 37 var X_imp___environ = EnvironP() 38 var X_iob [stdio.X_IOB_ENTRIES]stdio.FILE 39 40 var Xtimezone long // extern long timezone; 41 42 var ( 43 iobMap = map[uintptr]int32{} // &_iob[fd] -> fd 44 wenvValid bool 45 wenviron uintptr // &winEnviron[0] 46 winEnviron = []uintptr{0} 47 ) 48 49 func init() { 50 for i := range X_iob { 51 iobMap[uintptr(unsafe.Pointer(&X_iob[i]))] = int32(i) 52 } 53 } 54 55 func winGetObject(stream uintptr) interface{} { 56 if fd, ok := iobMap[stream]; ok { 57 f, _ := fdToFile(fd) 58 return f 59 } 60 61 return getObject(stream) 62 } 63 64 type ( 65 long = int32 66 ulong = uint32 67 ) 68 69 var ( 70 modkernel32 = syscall.NewLazyDLL("kernel32.dll") 71 //-- 72 procAreFileApisANSI = modkernel32.NewProc("AreFileApisANSI") 73 procCopyFileW = modkernel32.NewProc("CopyFileW") 74 procCreateEventA = modkernel32.NewProc("CreateEventA") 75 procCreateEventW = modkernel32.NewProc("CreateEventW") 76 procCreateFileA = modkernel32.NewProc("CreateFileA") 77 procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW") 78 procCreateFileW = modkernel32.NewProc("CreateFileW") 79 procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW") 80 procCreatePipe = modkernel32.NewProc("CreatePipe") 81 procCreateProcessA = modkernel32.NewProc("CreateProcessA") 82 procCreateProcessW = modkernel32.NewProc("CreateProcessW") 83 procCreateThread = modkernel32.NewProc("CreateThread") 84 procDeleteCriticalSection = modkernel32.NewProc("DeleteCriticalSection") 85 procDeviceIoControl = modkernel32.NewProc("DeviceIoControl") 86 procDuplicateHandle = modkernel32.NewProc("DuplicateHandle") 87 procEnterCriticalSection = modkernel32.NewProc("EnterCriticalSection") 88 procFindClose = modkernel32.NewProc("FindClose") 89 procFindFirstFileExW = modkernel32.NewProc("FindFirstFileExW") 90 procFindFirstFileW = modkernel32.NewProc("FindFirstFileW") 91 procFindNextFileW = modkernel32.NewProc("FindNextFileW") 92 procFormatMessageW = modkernel32.NewProc("FormatMessageW") 93 procGetACP = modkernel32.NewProc("GetACP") 94 procGetCommState = modkernel32.NewProc("GetCommState") 95 procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") 96 procGetConsoleCP = modkernel32.NewProc("GetConsoleCP") 97 procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") 98 procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess") 99 procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") 100 procGetCurrentThread = modkernel32.NewProc("GetCurrentThread") 101 procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId") 102 procGetEnvironmentVariableA = modkernel32.NewProc("GetEnvironmentVariableA") 103 procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW") 104 procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess") 105 procGetExitCodeThread = modkernel32.NewProc("GetExitCodeThread") 106 procGetFileAttributesA = modkernel32.NewProc("GetFileAttributesA") 107 procGetFileAttributesExA = modkernel32.NewProc("GetFileAttributesExA") 108 procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW") 109 procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle") 110 procGetFileSize = modkernel32.NewProc("GetFileSize") 111 procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW") 112 procGetLastError = modkernel32.NewProc("GetLastError") 113 procGetLogicalDriveStringsA = modkernel32.NewProc("GetLogicalDriveStringsA") 114 procGetModuleFileNameW = modkernel32.NewProc("GetModuleFileNameW") 115 procGetModuleHandleA = modkernel32.NewProc("GetModuleHandleA") 116 procGetModuleHandleW = modkernel32.NewProc("GetModuleHandleW") 117 procGetPrivateProfileStringA = modkernel32.NewProc("GetPrivateProfileStringA") 118 procGetProcAddress = modkernel32.NewProc("GetProcAddress") 119 procGetProcessHeap = modkernel32.NewProc("GetProcessHeap") 120 procGetSystemInfo = modkernel32.NewProc("GetSystemInfo") 121 procGetSystemTime = modkernel32.NewProc("GetSystemTime") 122 procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime") 123 procGetTempFileNameW = modkernel32.NewProc("GetTempFileNameW") 124 procGetTickCount = modkernel32.NewProc("GetTickCount") 125 procGetVersionExA = modkernel32.NewProc("GetVersionExA") 126 procGetVersionExW = modkernel32.NewProc("GetVersionExW") 127 procGetVolumeInformationA = modkernel32.NewProc("GetVolumeInformationA") 128 procGetVolumeInformationW = modkernel32.NewProc("GetVolumeInformationW") 129 procHeapAlloc = modkernel32.NewProc("HeapAlloc") 130 procHeapFree = modkernel32.NewProc("HeapFree") 131 procInitializeCriticalSection = modkernel32.NewProc("InitializeCriticalSection") 132 procLeaveCriticalSection = modkernel32.NewProc("LeaveCriticalSection") 133 procLockFile = modkernel32.NewProc("LockFile") 134 procLockFileEx = modkernel32.NewProc("LockFileEx") 135 procLstrlenW = modkernel32.NewProc("lstrlenW") 136 procMapViewOfFile = modkernel32.NewProc("MapViewOfFile") 137 procMoveFileW = modkernel32.NewProc("MoveFileW") 138 procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar") 139 procOpenEventA = modkernel32.NewProc("OpenEventA") 140 procPeekConsoleInputW = modkernel32.NewProc("PeekConsoleInputW") 141 procPeekNamedPipe = modkernel32.NewProc("PeekNamedPipe") 142 procQueryPerformanceCounter = modkernel32.NewProc("QueryPerformanceCounter") 143 procQueryPerformanceFrequency = modkernel32.NewProc("QueryPerformanceFrequency") 144 procReadConsoleW = modkernel32.NewProc("ReadConsoleW") 145 procReadFile = modkernel32.NewProc("ReadFile") 146 procResetEvent = modkernel32.NewProc("ResetEvent") 147 procSearchPathW = modkernel32.NewProc("SearchPathW") 148 procSetConsoleCtrlHandler = modkernel32.NewProc("SetConsoleCtrlHandler") 149 procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") 150 procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute") 151 procSetEvent = modkernel32.NewProc("SetEvent") 152 procSetFilePointer = modkernel32.NewProc("SetFilePointer") 153 procSleepEx = modkernel32.NewProc("SleepEx") 154 procSystemTimeToFileTime = modkernel32.NewProc("SystemTimeToFileTime") 155 procTerminateThread = modkernel32.NewProc("TerminateThread") 156 procUnlockFile = modkernel32.NewProc("UnlockFile") 157 procUnlockFileEx = modkernel32.NewProc("UnlockFileEx") 158 procWaitForSingleObjectEx = modkernel32.NewProc("WaitForSingleObjectEx") 159 procWideCharToMultiByte = modkernel32.NewProc("WideCharToMultiByte") 160 procWriteConsoleA = modkernel32.NewProc("WriteConsoleA") 161 procWriteConsoleW = modkernel32.NewProc("WriteConsoleW") 162 procWriteFile = modkernel32.NewProc("WriteFile") 163 164 // procSetConsoleCP = modkernel32.NewProc("SetConsoleCP") 165 // procSetThreadPriority = modkernel32.NewProc("SetThreadPriority") 166 //-- 167 168 modadvapi = syscall.NewLazyDLL("advapi32.dll") 169 //-- 170 procAccessCheck = modadvapi.NewProc("AccessCheck") 171 procGetAclInformation = modadvapi.NewProc("GetAclInformation") 172 procGetFileSecurityA = modadvapi.NewProc("GetFileSecurityA") 173 procGetFileSecurityW = modadvapi.NewProc("GetFileSecurityW") 174 procGetSecurityDescriptorDacl = modadvapi.NewProc("GetSecurityDescriptorDacl") 175 procGetSecurityDescriptorOwner = modadvapi.NewProc("GetSecurityDescriptorOwner") 176 procGetSidIdentifierAuthority = modadvapi.NewProc("GetSidIdentifierAuthority") 177 procGetSidLengthRequired = modadvapi.NewProc("GetSidLengthRequired") 178 procGetSidSubAuthority = modadvapi.NewProc("GetSidSubAuthority") 179 procImpersonateSelf = modadvapi.NewProc("ImpersonateSelf") 180 procInitializeSid = modadvapi.NewProc("InitializeSid") 181 procOpenThreadToken = modadvapi.NewProc("OpenThreadToken") 182 procRevertToSelf = modadvapi.NewProc("RevertToSelf") 183 //-- 184 185 modws2_32 = syscall.NewLazyDLL("ws2_32.dll") 186 //-- 187 procWSAStartup = modws2_32.NewProc("WSAStartup") 188 //-- 189 190 moduser32 = syscall.NewLazyDLL("user32.dll") 191 //-- 192 procCreateWindowExW = moduser32.NewProc("CreateWindowExW") 193 procMsgWaitForMultipleObjectsEx = moduser32.NewProc("MsgWaitForMultipleObjectsEx") 194 procPeekMessageW = moduser32.NewProc("PeekMessageW") 195 procRegisterClassW = moduser32.NewProc("RegisterClassW") 196 procUnregisterClassW = moduser32.NewProc("UnregisterClassW") 197 procWaitForInputIdle = moduser32.NewProc("WaitForInputIdle") 198 //-- 199 200 netapi = syscall.NewLazyDLL("netapi32.dll") 201 procNetGetDCName = netapi.NewProc("NetGetDCName") 202 procNetUserGetInfo = netapi.NewProc("NetUserGetInfo") 203 204 userenvapi = syscall.NewLazyDLL("userenv.dll") 205 procGetProfilesDirectoryW = userenvapi.NewProc("GetProfilesDirectoryW") 206 ) 207 208 var ( 209 threadCallback uintptr 210 ) 211 212 func init() { 213 isWindows = true 214 threadCallback = syscall.NewCallback(ThreadProc) 215 } 216 217 // --------------------------------- 218 // Windows filehandle-to-fd mapping 219 // so the lib-c interface contract looks 220 // like normal fds being passed around 221 // but we're mapping them back and forth to 222 // native windows file handles (syscall.Handle) 223 // 224 225 var EBADF = errors.New("EBADF") 226 227 var w_nextFd int32 = 42 228 var w_fdLock sync.Mutex 229 var w_fd_to_file = map[int32]*file{} 230 231 type file struct { 232 _fd int32 233 hadErr bool 234 t uintptr 235 syscall.Handle 236 } 237 238 func addFile(hdl syscall.Handle, fd int32) uintptr { 239 var f = file{_fd: fd, Handle: hdl} 240 w_fdLock.Lock() 241 defer w_fdLock.Unlock() 242 w_fd_to_file[fd] = &f 243 f.t = addObject(&f) 244 return f.t 245 } 246 247 func remFile(f *file) { 248 removeObject(f.t) 249 w_fdLock.Lock() 250 defer w_fdLock.Unlock() 251 delete(w_fd_to_file, f._fd) 252 } 253 254 func fdToFile(fd int32) (*file, bool) { 255 w_fdLock.Lock() 256 defer w_fdLock.Unlock() 257 f, ok := w_fd_to_file[fd] 258 return f, ok 259 } 260 261 // Wrap the windows handle up tied to a unique fd 262 func wrapFdHandle(hdl syscall.Handle) (uintptr, int32) { 263 newFd := atomic.AddInt32(&w_nextFd, 1) 264 return addFile(hdl, newFd), newFd 265 } 266 267 func (f *file) err() bool { 268 return f.hadErr 269 } 270 271 func (f *file) setErr() { 272 f.hadErr = true 273 } 274 275 // ----------------------------------- 276 // On windows we have to fetch these 277 // 278 // stdout, stdin, sterr 279 // 280 // Using the windows specific GetStdHandle 281 // they're mapped to the standard fds (0,1,2) 282 // Note: it's possible they don't exist 283 // if the app has been built for a GUI only 284 // target in windows. If that's the case 285 // panic seems like the only reasonable option 286 // ------------------------------ 287 288 func newFile(t *TLS, fd int32) uintptr { 289 290 if fd == unistd.STDIN_FILENO { 291 h, err := syscall.GetStdHandle(syscall.STD_INPUT_HANDLE) 292 if err != nil { 293 panic("no console") 294 } 295 return addFile(h, fd) 296 } 297 if fd == unistd.STDOUT_FILENO { 298 h, err := syscall.GetStdHandle(syscall.STD_OUTPUT_HANDLE) 299 if err != nil { 300 panic("no console") 301 } 302 return addFile(h, fd) 303 } 304 if fd == unistd.STDERR_FILENO { 305 h, err := syscall.GetStdHandle(syscall.STD_ERROR_HANDLE) 306 if err != nil { 307 panic("no console") 308 } 309 return addFile(h, fd) 310 } 311 312 // should not get here -- unless newFile 313 // is being used from somewhere we don't know about 314 // to originate fds. 315 316 panic("unknown fd source") 317 return 0 318 } 319 320 func (f *file) close(t *TLS) int32 { 321 remFile(f) 322 err := syscall.Close(f.Handle) 323 if err != nil { 324 return (-1) // EOF 325 } 326 return 0 327 } 328 329 func fwrite(fd int32, b []byte) (int, error) { 330 if fd == unistd.STDOUT_FILENO { 331 return write(b) 332 } 333 334 f, ok := fdToFile(fd) 335 if !ok { 336 return -1, EBADF 337 } 338 339 if dmesgs { 340 dmesg("%v: fd %v: %s", origin(1), fd, b) 341 } 342 return syscall.Write(f.Handle, b) 343 } 344 345 // int fprintf(FILE *stream, const char *format, ...); 346 func Xfprintf(t *TLS, stream, format, args uintptr) int32 { 347 f, ok := winGetObject(stream).(*file) 348 if !ok { 349 t.setErrno(errno.EBADF) 350 return -1 351 } 352 353 n, _ := fwrite(f._fd, printf(format, args)) 354 return int32(n) 355 } 356 357 // int usleep(useconds_t usec); 358 func Xusleep(t *TLS, usec types.Useconds_t) int32 { 359 gotime.Sleep(gotime.Microsecond * gotime.Duration(usec)) 360 return 0 361 } 362 363 // int getrusage(int who, struct rusage *usage); 364 func Xgetrusage(t *TLS, who int32, usage uintptr) int32 { 365 panic(todo("")) 366 // if _, _, err := unix.Syscall(unix.SYS_GETRUSAGE, uintptr(who), usage, 0); err != 0 { 367 // t.setErrno(err) 368 // return -1 369 // } 370 371 // return 0 372 } 373 374 // int lstat(const char *pathname, struct stat *statbuf); 375 func Xlstat(t *TLS, pathname, statbuf uintptr) int32 { 376 return Xlstat64(t, pathname, statbuf) 377 } 378 379 // int stat(const char *pathname, struct stat *statbuf); 380 func Xstat(t *TLS, pathname, statbuf uintptr) int32 { 381 return Xstat64(t, pathname, statbuf) 382 } 383 384 // int chdir(const char *path); 385 func Xchdir(t *TLS, path uintptr) int32 { 386 err := syscall.Chdir(GoString(path)) 387 if err != nil { 388 t.setErrno(err) 389 return -1 390 } 391 392 if dmesgs { 393 dmesg("%v: %q: ok", origin(1), GoString(path)) 394 } 395 return 0 396 } 397 398 var localtime time.Tm 399 400 // struct tm *localtime(const time_t *timep); 401 func Xlocaltime(_ *TLS, timep uintptr) uintptr { 402 loc := getLocalLocation() 403 ut := *(*time.Time_t)(unsafe.Pointer(timep)) 404 t := gotime.Unix(int64(ut), 0).In(loc) 405 localtime.Ftm_sec = int32(t.Second()) 406 localtime.Ftm_min = int32(t.Minute()) 407 localtime.Ftm_hour = int32(t.Hour()) 408 localtime.Ftm_mday = int32(t.Day()) 409 localtime.Ftm_mon = int32(t.Month() - 1) 410 localtime.Ftm_year = int32(t.Year() - 1900) 411 localtime.Ftm_wday = int32(t.Weekday()) 412 localtime.Ftm_yday = int32(t.YearDay()) 413 localtime.Ftm_isdst = Bool32(isTimeDST(t)) 414 return uintptr(unsafe.Pointer(&localtime)) 415 } 416 417 // struct tm *localtime(const time_t *timep); 418 func X_localtime64(_ *TLS, timep uintptr) uintptr { 419 return Xlocaltime(nil, timep) 420 } 421 422 // struct tm *localtime_r(const time_t *timep, struct tm *result); 423 func Xlocaltime_r(_ *TLS, timep, result uintptr) uintptr { 424 panic(todo("")) 425 // loc := getLocalLocation() 426 // ut := *(*unix.Time_t)(unsafe.Pointer(timep)) 427 // t := gotime.Unix(int64(ut), 0).In(loc) 428 // (*time.Tm)(unsafe.Pointer(result)).Ftm_sec = int32(t.Second()) 429 // (*time.Tm)(unsafe.Pointer(result)).Ftm_min = int32(t.Minute()) 430 // (*time.Tm)(unsafe.Pointer(result)).Ftm_hour = int32(t.Hour()) 431 // (*time.Tm)(unsafe.Pointer(result)).Ftm_mday = int32(t.Day()) 432 // (*time.Tm)(unsafe.Pointer(result)).Ftm_mon = int32(t.Month() - 1) 433 // (*time.Tm)(unsafe.Pointer(result)).Ftm_year = int32(t.Year() - 1900) 434 // (*time.Tm)(unsafe.Pointer(result)).Ftm_wday = int32(t.Weekday()) 435 // (*time.Tm)(unsafe.Pointer(result)).Ftm_yday = int32(t.YearDay()) 436 // (*time.Tm)(unsafe.Pointer(result)).Ftm_isdst = Bool32(isTimeDST(t)) 437 // return result 438 } 439 440 // int _wopen( 441 // 442 // const wchar_t *filename, 443 // int oflag [, 444 // int pmode] 445 // 446 // ); 447 func X_wopen(t *TLS, pathname uintptr, flags int32, args uintptr) int32 { 448 var mode types.Mode_t 449 if args != 0 { 450 mode = *(*types.Mode_t)(unsafe.Pointer(args)) 451 } 452 s := goWideString(pathname) 453 h, err := syscall.Open(GoString(pathname), int(flags), uint32(mode)) 454 if err != nil { 455 if dmesgs { 456 dmesg("%v: %q %#x: %v", origin(1), s, flags, err) 457 } 458 459 t.setErrno(err) 460 return 0 461 } 462 463 _, n := wrapFdHandle(h) 464 if dmesgs { 465 dmesg("%v: %q flags %#x mode %#o: fd %v", origin(1), s, flags, mode, n) 466 } 467 return n 468 } 469 470 // int open(const char *pathname, int flags, ...); 471 func Xopen(t *TLS, pathname uintptr, flags int32, args uintptr) int32 { 472 return Xopen64(t, pathname, flags, args) 473 } 474 475 // int open(const char *pathname, int flags, ...); 476 func Xopen64(t *TLS, pathname uintptr, flags int32, cmode uintptr) int32 { 477 478 var mode types.Mode_t 479 if cmode != 0 { 480 mode = (types.Mode_t)(VaUint32(&cmode)) 481 } 482 // fdcwd := fcntl.AT_FDCWD 483 h, err := syscall.Open(GoString(pathname), int(flags), uint32(mode)) 484 if err != nil { 485 486 if dmesgs { 487 dmesg("%v: %q %#x: %v", origin(1), GoString(pathname), flags, err) 488 } 489 490 t.setErrno(err) 491 return -1 492 } 493 494 _, n := wrapFdHandle(h) 495 if dmesgs { 496 dmesg("%v: %q flags %#x mode %#o: fd %v", origin(1), GoString(pathname), flags, mode, n) 497 } 498 return n 499 } 500 501 // off_t lseek(int fd, off_t offset, int whence); 502 func Xlseek(t *TLS, fd int32, offset types.Off_t, whence int32) types.Off_t { 503 return types.Off_t(Xlseek64(t, fd, offset, whence)) 504 } 505 506 func whenceStr(whence int32) string { 507 switch whence { 508 case syscall.FILE_CURRENT: 509 return "SEEK_CUR" 510 case syscall.FILE_END: 511 return "SEEK_END" 512 case syscall.FILE_BEGIN: 513 return "SEEK_SET" 514 default: 515 return fmt.Sprintf("whence(%d)", whence) 516 } 517 } 518 519 var fsyncStatbuf stat.Stat 520 521 // int fsync(int fd); 522 func Xfsync(t *TLS, fd int32) int32 { 523 524 f, ok := fdToFile(fd) 525 if !ok { 526 t.setErrno(errno.EBADF) 527 return -1 528 } 529 err := syscall.FlushFileBuffers(f.Handle) 530 if err != nil { 531 t.setErrno(err) 532 return -1 533 } 534 535 if dmesgs { 536 dmesg("%v: %d: ok", origin(1), fd) 537 } 538 return 0 539 } 540 541 // long sysconf(int name); 542 func Xsysconf(t *TLS, name int32) long { 543 panic(todo("")) 544 // switch name { 545 // case unistd.X_SC_PAGESIZE: 546 // return long(unix.Getpagesize()) 547 // } 548 549 // panic(todo("")) 550 } 551 552 // int close(int fd); 553 func Xclose(t *TLS, fd int32) int32 { 554 555 f, ok := fdToFile(fd) 556 if !ok { 557 t.setErrno(errno.EBADF) 558 return -1 559 } 560 561 err := syscall.Close(f.Handle) 562 if err != nil { 563 t.setErrno(err) 564 return -1 565 } 566 567 if dmesgs { 568 dmesg("%v: %d: ok", origin(1), fd) 569 } 570 return 0 571 } 572 573 // char *getcwd(char *buf, size_t size); 574 func Xgetcwd(t *TLS, buf uintptr, size types.Size_t) uintptr { 575 576 b := make([]uint16, size) 577 n, err := syscall.GetCurrentDirectory(uint32(len(b)), &b[0]) 578 if err != nil { 579 t.setErrno(err) 580 return 0 581 } 582 // to bytes 583 var wd = []byte(string(utf16.Decode(b[0:n]))) 584 if types.Size_t(len(wd)) > size { 585 t.setErrno(errno.ERANGE) 586 return 0 587 } 588 589 copy((*RawMem)(unsafe.Pointer(buf))[:], wd) 590 (*RawMem)(unsafe.Pointer(buf))[len(wd)] = 0 591 592 if dmesgs { 593 dmesg("%v: %q: ok", origin(1), GoString(buf)) 594 } 595 return buf 596 } 597 598 // int fstat(int fd, struct stat *statbuf); 599 func Xfstat(t *TLS, fd int32, statbuf uintptr) int32 { 600 return Xfstat64(t, fd, statbuf) 601 } 602 603 // int ftruncate(int fd, off_t length); 604 func Xftruncate(t *TLS, fd int32, length types.Off_t) int32 { 605 return Xftruncate64(t, fd, length) 606 } 607 608 // int fcntl(int fd, int cmd, ... /* arg */ ); 609 func Xfcntl(t *TLS, fd, cmd int32, args uintptr) int32 { 610 return Xfcntl64(t, fd, cmd, args) 611 } 612 613 // int _read( // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/read?view=msvc-160 614 // 615 // int const fd, 616 // void * const buffer, 617 // unsigned const buffer_size 618 // 619 // ); 620 func Xread(t *TLS, fd int32, buf uintptr, count uint32) int32 { 621 f, ok := fdToFile(fd) 622 if !ok { 623 t.setErrno(errno.EBADF) 624 return -1 625 } 626 627 var obuf = ((*RawMem)(unsafe.Pointer(buf)))[:count] 628 n, err := syscall.Read(f.Handle, obuf) 629 if err != nil { 630 t.setErrno(err) 631 return -1 632 } 633 634 if dmesgs { 635 // dmesg("%v: %d %#x: %#x\n%s", origin(1), fd, count, n, hex.Dump(GoBytes(buf, int(n)))) 636 dmesg("%v: %d %#x: %#x", origin(1), fd, count, n) 637 } 638 return int32(n) 639 } 640 641 // int _write( // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/write?view=msvc-160 642 // 643 // int fd, 644 // const void *buffer, 645 // unsigned int count 646 // 647 // ); 648 func Xwrite(t *TLS, fd int32, buf uintptr, count uint32) int32 { 649 f, ok := fdToFile(fd) 650 if !ok { 651 t.setErrno(errno.EBADF) 652 return -1 653 } 654 655 var obuf = ((*RawMem)(unsafe.Pointer(buf)))[:count] 656 n, err := syscall.Write(f.Handle, obuf) 657 if err != nil { 658 if dmesgs { 659 dmesg("%v: fd %v, count %#x: %v", origin(1), fd, count, err) 660 } 661 t.setErrno(err) 662 return -1 663 } 664 665 if dmesgs { 666 // dmesg("%v: %d %#x: %#x\n%s", origin(1), fd, count, n, hex.Dump(GoBytes(buf, int(n)))) 667 dmesg("%v: %d %#x: %#x", origin(1), fd, count, n) 668 } 669 return int32(n) 670 } 671 672 // int fchmod(int fd, mode_t mode); 673 func Xfchmod(t *TLS, fd int32, mode types.Mode_t) int32 { 674 panic(todo("")) 675 // if _, _, err := unix.Syscall(unix.SYS_FCHMOD, uintptr(fd), uintptr(mode), 0); err != 0 { 676 // t.setErrno(err) 677 // return -1 678 // } 679 680 // if dmesgs { 681 // dmesg("%v: %d %#o: ok", origin(1), fd, mode) 682 // } 683 // return 0 684 } 685 686 // // int fchown(int fd, uid_t owner, gid_t group); 687 // func Xfchown(t *TLS, fd int32, owner types.Uid_t, group types.Gid_t) int32 { 688 // if _, _, err := unix.Syscall(unix.SYS_FCHOWN, uintptr(fd), uintptr(owner), uintptr(group)); err != 0 { 689 // t.setErrno(err) 690 // return -1 691 // } 692 // 693 // return 0 694 // } 695 696 // // uid_t geteuid(void); 697 // func Xgeteuid(t *TLS) types.Uid_t { 698 // n, _, _ := unix.Syscall(unix.SYS_GETEUID, 0, 0, 0) 699 // return types.Uid_t(n) 700 // } 701 702 // int munmap(void *addr, size_t length); 703 func Xmunmap(t *TLS, addr uintptr, length types.Size_t) int32 { 704 panic(todo("")) 705 // if _, _, err := unix.Syscall(unix.SYS_MUNMAP, addr, uintptr(length), 0); err != 0 { 706 // t.setErrno(err) 707 // return -1 708 // } 709 710 // return 0 711 } 712 713 // int gettimeofday(struct timeval *tv, struct timezone *tz); 714 func Xgettimeofday(t *TLS, tv, tz uintptr) int32 { 715 panic(todo("")) 716 // if tz != 0 { 717 // panic(todo("")) 718 // } 719 720 // var tvs unix.Timeval 721 // err := unix.Gettimeofday(&tvs) 722 // if err != nil { 723 // t.setErrno(err) 724 // return -1 725 // } 726 727 // *(*unix.Timeval)(unsafe.Pointer(tv)) = tvs 728 // return 0 729 } 730 731 // int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); 732 func Xgetsockopt(t *TLS, _ ...interface{}) int32 { 733 panic(todo("")) 734 // if _, _, err := unix.Syscall6(unix.SYS_GETSOCKOPT, uintptr(sockfd), uintptr(level), uintptr(optname), optval, optlen, 0); err != 0 { 735 // t.setErrno(err) 736 // return -1 737 // } 738 739 // return 0 740 } 741 742 // // int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); 743 func Xsetsockopt(t *TLS, _ ...interface{}) int32 { 744 panic(todo("")) 745 } 746 747 // int ioctl(int fd, unsigned long request, ...); 748 func Xioctl(t *TLS, fd int32, request ulong, va uintptr) int32 { 749 panic(todo("")) 750 // var argp uintptr 751 // if va != 0 { 752 // argp = VaUintptr(&va) 753 // } 754 // n, _, err := unix.Syscall(unix.SYS_IOCTL, uintptr(fd), uintptr(request), argp) 755 // if err != 0 { 756 // t.setErrno(err) 757 // return -1 758 // } 759 760 // return int32(n) 761 } 762 763 // int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 764 func Xselect(t *TLS, nfds int32, readfds, writefds, exceptfds, timeout uintptr) int32 { 765 panic(todo("")) 766 // n, err := unix.Select( 767 // int(nfds), 768 // (*unix.FdSet)(unsafe.Pointer(readfds)), 769 // (*unix.FdSet)(unsafe.Pointer(writefds)), 770 // (*unix.FdSet)(unsafe.Pointer(exceptfds)), 771 // (*unix.Timeval)(unsafe.Pointer(timeout)), 772 // ) 773 // if err != nil { 774 // t.setErrno(err) 775 // return -1 776 // } 777 778 // return int32(n) 779 } 780 781 // int mkfifo(const char *pathname, mode_t mode); 782 func Xmkfifo(t *TLS, pathname uintptr, mode types.Mode_t) int32 { 783 panic(todo("")) 784 // if err := unix.Mkfifo(GoString(pathname), mode); err != nil { 785 // t.setErrno(err) 786 // return -1 787 // } 788 // 789 // return 0 790 } 791 792 // mode_t umask(mode_t mask); 793 func Xumask(t *TLS, mask types.Mode_t) types.Mode_t { 794 panic(todo("")) 795 // n, _, _ := unix.Syscall(unix.SYS_UMASK, uintptr(mask), 0, 0) 796 // return types.Mode_t(n) 797 } 798 799 // int execvp(const char *file, char *const argv[]); 800 func Xexecvp(t *TLS, file, argv uintptr) int32 { 801 panic(todo("")) 802 // if _, _, err := unix.Syscall(unix.SYS_EXECVE, file, argv, Environ()); err != 0 { 803 // t.setErrno(err) 804 // return -1 805 // } 806 // 807 // return 0 808 } 809 810 // pid_t waitpid(pid_t pid, int *wstatus, int options); 811 func Xwaitpid(t *TLS, pid types.Pid_t, wstatus uintptr, optname int32) types.Pid_t { 812 panic(todo("")) 813 // n, _, err := unix.Syscall6(unix.SYS_WAIT4, uintptr(pid), wstatus, uintptr(optname), 0, 0, 0) 814 // if err != 0 { 815 // t.setErrno(err) 816 // return -1 817 // } 818 // 819 // return types.Pid_t(n) 820 } 821 822 // int uname(struct utsname *buf); 823 func Xuname(t *TLS, buf uintptr) int32 { 824 panic(todo("")) 825 // if _, _, err := unix.Syscall(unix.SYS_UNAME, buf, 0, 0); err != 0 { 826 // t.setErrno(err) 827 // return -1 828 // } 829 // 830 // return 0 831 } 832 833 // int getrlimit(int resource, struct rlimit *rlim); 834 func Xgetrlimit(t *TLS, resource int32, rlim uintptr) int32 { 835 return Xgetrlimit64(t, resource, rlim) 836 } 837 838 // int setrlimit(int resource, const struct rlimit *rlim); 839 func Xsetrlimit(t *TLS, resource int32, rlim uintptr) int32 { 840 return Xsetrlimit64(t, resource, rlim) 841 } 842 843 // int setrlimit(int resource, const struct rlimit *rlim); 844 func Xsetrlimit64(t *TLS, resource int32, rlim uintptr) int32 { 845 panic(todo("")) 846 // if _, _, err := unix.Syscall(unix.SYS_SETRLIMIT, uintptr(resource), uintptr(rlim), 0); err != 0 { 847 // t.setErrno(err) 848 // return -1 849 // } 850 // 851 // return 0 852 } 853 854 // // uid_t getuid(void); 855 // func Xgetuid(t *TLS) types.Uid_t { 856 // return types.Uid_t(os.Getuid()) 857 // } 858 859 // pid_t getpid(void); 860 func Xgetpid(t *TLS) int32 { 861 return int32(os.Getpid()) 862 } 863 864 // int system(const char *command); 865 func Xsystem(t *TLS, command uintptr) int32 { 866 s := GoString(command) 867 if command == 0 { 868 panic(todo("")) 869 } 870 871 cmd := exec.Command("sh", "-c", s) 872 cmd.Stdout = os.Stdout 873 cmd.Stderr = os.Stderr 874 err := cmd.Run() 875 if err != nil { 876 ps := err.(*exec.ExitError) 877 return int32(ps.ExitCode()) 878 } 879 880 return 0 881 } 882 883 // var staticGetpwuid pwd.Passwd 884 // 885 // func init() { 886 // atExit = append(atExit, func() { closePasswd(&staticGetpwuid) }) 887 // } 888 // 889 // func closePasswd(p *pwd.Passwd) { 890 // Xfree(nil, p.Fpw_name) 891 // Xfree(nil, p.Fpw_passwd) 892 // Xfree(nil, p.Fpw_gecos) 893 // Xfree(nil, p.Fpw_dir) 894 // Xfree(nil, p.Fpw_shell) 895 // *p = pwd.Passwd{} 896 // } 897 898 // struct passwd *getpwuid(uid_t uid); 899 func Xgetpwuid(t *TLS, uid uint32) uintptr { 900 panic(todo("")) 901 // f, err := os.Open("/etc/passwd") 902 // if err != nil { 903 // panic(todo("", err)) 904 // } 905 // 906 // defer f.Close() 907 // 908 // sid := strconv.Itoa(int(uid)) 909 // sc := bufio.NewScanner(f) 910 // for sc.Scan() { 911 // // eg. "root:x:0:0:root:/root:/bin/bash" 912 // a := strings.Split(sc.Text(), ":") 913 // if len(a) < 7 { 914 // panic(todo("")) 915 // } 916 // 917 // if a[2] == sid { 918 // uid, err := strconv.Atoi(a[2]) 919 // if err != nil { 920 // panic(todo("")) 921 // } 922 // 923 // gid, err := strconv.Atoi(a[3]) 924 // if err != nil { 925 // panic(todo("")) 926 // } 927 // 928 // closePasswd(&staticGetpwuid) 929 // gecos := a[4] 930 // if strings.Contains(gecos, ",") { 931 // a := strings.Split(gecos, ",") 932 // gecos = a[0] 933 // } 934 // initPasswd(t, &staticGetpwuid, a[0], a[1], uint32(uid), uint32(gid), gecos, a[5], a[6]) 935 // return uintptr(unsafe.Pointer(&staticGetpwuid)) 936 // } 937 // } 938 // 939 // if sc.Err() != nil { 940 // panic(todo("")) 941 // } 942 // 943 // return 0 944 } 945 946 // func initPasswd(t *TLS, p *pwd.Passwd, name, pwd string, uid, gid uint32, gecos, dir, shell string) { 947 // p.Fpw_name = cString(t, name) 948 // p.Fpw_passwd = cString(t, pwd) 949 // p.Fpw_uid = uid 950 // p.Fpw_gid = gid 951 // p.Fpw_gecos = cString(t, gecos) 952 // p.Fpw_dir = cString(t, dir) 953 // p.Fpw_shell = cString(t, shell) 954 // } 955 956 // int setvbuf(FILE *stream, char *buf, int mode, size_t size); 957 func Xsetvbuf(t *TLS, stream, buf uintptr, mode int32, size types.Size_t) int32 { 958 return 0 //TODO 959 } 960 961 // int raise(int sig); 962 func Xraise(t *TLS, sig int32) int32 { 963 panic(todo("")) 964 } 965 966 // int backtrace(void **buffer, int size); 967 func Xbacktrace(t *TLS, buf uintptr, size int32) int32 { 968 panic(todo("")) 969 } 970 971 // void backtrace_symbols_fd(void *const *buffer, int size, int fd); 972 func Xbacktrace_symbols_fd(t *TLS, buffer uintptr, size, fd int32) { 973 panic(todo("")) 974 } 975 976 // int fileno(FILE *stream); 977 func Xfileno(t *TLS, stream uintptr) int32 { 978 if stream == 0 { 979 t.setErrno(errno.EBADF) 980 return -1 981 } 982 983 f, ok := winGetObject(stream).(*file) 984 if !ok { 985 t.setErrno(errno.EBADF) 986 return -1 987 } 988 return f._fd 989 } 990 991 // var staticGetpwnam pwd.Passwd 992 // 993 // func init() { 994 // atExit = append(atExit, func() { closePasswd(&staticGetpwnam) }) 995 // } 996 // 997 // // struct passwd *getpwnam(const char *name); 998 // func Xgetpwnam(t *TLS, name uintptr) uintptr { 999 // f, err := os.Open("/etc/passwd") 1000 // if err != nil { 1001 // panic(todo("", err)) 1002 // } 1003 // 1004 // defer f.Close() 1005 // 1006 // sname := GoString(name) 1007 // sc := bufio.NewScanner(f) 1008 // for sc.Scan() { 1009 // // eg. "root:x:0:0:root:/root:/bin/bash" 1010 // a := strings.Split(sc.Text(), ":") 1011 // if len(a) < 7 { 1012 // panic(todo("")) 1013 // } 1014 // 1015 // if a[0] == sname { 1016 // uid, err := strconv.Atoi(a[2]) 1017 // if err != nil { 1018 // panic(todo("")) 1019 // } 1020 // 1021 // gid, err := strconv.Atoi(a[3]) 1022 // if err != nil { 1023 // panic(todo("")) 1024 // } 1025 // 1026 // closePasswd(&staticGetpwnam) 1027 // gecos := a[4] 1028 // if strings.Contains(gecos, ",") { 1029 // a := strings.Split(gecos, ",") 1030 // gecos = a[0] 1031 // } 1032 // initPasswd(t, &staticGetpwnam, a[0], a[1], uint32(uid), uint32(gid), gecos, a[5], a[6]) 1033 // return uintptr(unsafe.Pointer(&staticGetpwnam)) 1034 // } 1035 // } 1036 // 1037 // if sc.Err() != nil { 1038 // panic(todo("")) 1039 // } 1040 // 1041 // return 0 1042 // } 1043 // 1044 // var staticGetgrnam grp.Group 1045 // 1046 // func init() { 1047 // atExit = append(atExit, func() { closeGroup(&staticGetgrnam) }) 1048 // } 1049 // 1050 // // struct group *getgrnam(const char *name); 1051 // func Xgetgrnam(t *TLS, name uintptr) uintptr { 1052 // f, err := os.Open("/etc/group") 1053 // if err != nil { 1054 // panic(todo("")) 1055 // } 1056 // 1057 // defer f.Close() 1058 // 1059 // sname := GoString(name) 1060 // sc := bufio.NewScanner(f) 1061 // for sc.Scan() { 1062 // // eg. "root:x:0:" 1063 // a := strings.Split(sc.Text(), ":") 1064 // if len(a) < 4 { 1065 // panic(todo("")) 1066 // } 1067 // 1068 // if a[0] == sname { 1069 // closeGroup(&staticGetgrnam) 1070 // gid, err := strconv.Atoi(a[2]) 1071 // if err != nil { 1072 // panic(todo("")) 1073 // } 1074 // 1075 // var names []string 1076 // if a[3] != "" { 1077 // names = strings.Split(a[3], ",") 1078 // } 1079 // initGroup(t, &staticGetgrnam, a[0], a[1], uint32(gid), names) 1080 // return uintptr(unsafe.Pointer(&staticGetgrnam)) 1081 // } 1082 // } 1083 // 1084 // if sc.Err() != nil { 1085 // panic(todo("")) 1086 // } 1087 // 1088 // return 0 1089 // } 1090 // 1091 // func closeGroup(p *grp.Group) { 1092 // Xfree(nil, p.Fgr_name) 1093 // Xfree(nil, p.Fgr_passwd) 1094 // if p.Fgr_mem != 0 { 1095 // panic(todo("")) 1096 // } 1097 // 1098 // *p = grp.Group{} 1099 // } 1100 // 1101 // func initGroup(t *TLS, p *grp.Group, name, pwd string, gid uint32, names []string) { 1102 // p.Fgr_name = cString(t, name) 1103 // p.Fgr_passwd = cString(t, pwd) 1104 // p.Fgr_gid = gid 1105 // p.Fgr_mem = 0 1106 // if len(names) != 0 { 1107 // panic(todo("%q %q %v %q %v", name, pwd, gid, names, len(names))) 1108 // } 1109 // } 1110 // 1111 // func init() { 1112 // atExit = append(atExit, func() { closeGroup(&staticGetgrgid) }) 1113 // } 1114 // 1115 // var staticGetgrgid grp.Group 1116 // 1117 // // struct group *getgrgid(gid_t gid); 1118 // func Xgetgrgid(t *TLS, gid uint32) uintptr { 1119 // f, err := os.Open("/etc/group") 1120 // if err != nil { 1121 // panic(todo("")) 1122 // } 1123 // 1124 // defer f.Close() 1125 // 1126 // sid := strconv.Itoa(int(gid)) 1127 // sc := bufio.NewScanner(f) 1128 // for sc.Scan() { 1129 // // eg. "root:x:0:" 1130 // a := strings.Split(sc.Text(), ":") 1131 // if len(a) < 4 { 1132 // panic(todo("")) 1133 // } 1134 // 1135 // if a[2] == sid { 1136 // closeGroup(&staticGetgrgid) 1137 // var names []string 1138 // if a[3] != "" { 1139 // names = strings.Split(a[3], ",") 1140 // } 1141 // initGroup(t, &staticGetgrgid, a[0], a[1], gid, names) 1142 // return uintptr(unsafe.Pointer(&staticGetgrgid)) 1143 // } 1144 // } 1145 // 1146 // if sc.Err() != nil { 1147 // panic(todo("")) 1148 // } 1149 // 1150 // return 0 1151 // } 1152 1153 // int mkstemps(char *template, int suffixlen); 1154 func Xmkstemps(t *TLS, template uintptr, suffixlen int32) int32 { 1155 return Xmkstemps64(t, template, suffixlen) 1156 } 1157 1158 // int mkstemps(char *template, int suffixlen); 1159 func Xmkstemps64(t *TLS, template uintptr, suffixlen int32) int32 { 1160 panic(todo("")) 1161 // len := uintptr(Xstrlen(t, template)) 1162 // x := template + uintptr(len-6) - uintptr(suffixlen) 1163 // for i := uintptr(0); i < 6; i++ { 1164 // if *(*byte)(unsafe.Pointer(x + i)) != 'X' { 1165 // t.setErrno(errno.EINVAL) 1166 // return -1 1167 // } 1168 // } 1169 // 1170 // fd, err := tempFile(template, x) 1171 // if err != 0 { 1172 // t.setErrno(err) 1173 // return -1 1174 // } 1175 // 1176 // return int32(fd) 1177 } 1178 1179 // int mkstemp(char *template); 1180 func Xmkstemp64(t *TLS, template uintptr) int32 { 1181 return Xmkstemps64(t, template, 0) 1182 } 1183 1184 // func newFtsent(t *TLS, info int, path string, stat *unix.Stat_t, err syscall.Errno) (r *fts.FTSENT) { 1185 // var statp uintptr 1186 // if stat != nil { 1187 // statp = Xmalloc(t, types.Size_t(unsafe.Sizeof(unix.Stat_t{}))) 1188 // if statp == 0 { 1189 // panic("OOM") 1190 // } 1191 // 1192 // *(*unix.Stat_t)(unsafe.Pointer(statp)) = *stat 1193 // } 1194 // csp := CString(path) 1195 // if csp == 0 { 1196 // panic("OOM") 1197 // } 1198 // 1199 // return &fts.FTSENT{ 1200 // Ffts_info: uint16(info), 1201 // Ffts_path: csp, 1202 // Ffts_pathlen: uint16(len(path)), 1203 // Ffts_statp: statp, 1204 // Ffts_errno: int32(err), 1205 // } 1206 // } 1207 // 1208 // func newCFtsent(t *TLS, info int, path string, stat *unix.Stat_t, err syscall.Errno) uintptr { 1209 // p := Xcalloc(t, types.Size_t(unsafe.Sizeof(fts.FTSENT{}))) 1210 // if p == 0 { 1211 // panic("OOM") 1212 // } 1213 // 1214 // *(*fts.FTSENT)(unsafe.Pointer(p)) = *newFtsent(t, info, path, stat, err) 1215 // return p 1216 // } 1217 // 1218 // func ftsentClose(t *TLS, p uintptr) { 1219 // Xfree(t, (*fts.FTSENT)(unsafe.Pointer(p)).Ffts_path) 1220 // Xfree(t, (*fts.FTSENT)(unsafe.Pointer(p)).Ffts_statp) 1221 // } 1222 1223 type ftstream struct { 1224 s []uintptr 1225 x int 1226 } 1227 1228 // func (f *ftstream) close(t *TLS) { 1229 // for _, p := range f.s { 1230 // ftsentClose(t, p) 1231 // Xfree(t, p) 1232 // } 1233 // *f = ftstream{} 1234 // } 1235 // 1236 // // FTS *fts_open(char * const *path_argv, int options, int (*compar)(const FTSENT **, const FTSENT **)); 1237 // func Xfts_open(t *TLS, path_argv uintptr, options int32, compar uintptr) uintptr { 1238 // return Xfts64_open(t, path_argv, options, compar) 1239 // } 1240 1241 // FTS *fts_open(char * const *path_argv, int options, int (*compar)(const FTSENT **, const FTSENT **)); 1242 func Xfts64_open(t *TLS, path_argv uintptr, options int32, compar uintptr) uintptr { 1243 panic(todo("")) 1244 // f := &ftstream{} 1245 // 1246 // var walk func(string) 1247 // walk = func(path string) { 1248 // var fi os.FileInfo 1249 // var err error 1250 // switch { 1251 // case options&fts.FTS_LOGICAL != 0: 1252 // fi, err = os.Stat(path) 1253 // case options&fts.FTS_PHYSICAL != 0: 1254 // fi, err = os.Lstat(path) 1255 // default: 1256 // panic(todo("")) 1257 // } 1258 // 1259 // if err != nil { 1260 // panic(todo("")) 1261 // } 1262 // 1263 // var statp *unix.Stat_t 1264 // if options&fts.FTS_NOSTAT == 0 { 1265 // var stat unix.Stat_t 1266 // switch { 1267 // case options&fts.FTS_LOGICAL != 0: 1268 // if err := unix.Stat(path, &stat); err != nil { 1269 // panic(todo("")) 1270 // } 1271 // case options&fts.FTS_PHYSICAL != 0: 1272 // if err := unix.Lstat(path, &stat); err != nil { 1273 // panic(todo("")) 1274 // } 1275 // default: 1276 // panic(todo("")) 1277 // } 1278 // 1279 // statp = &stat 1280 // } 1281 // 1282 // out: 1283 // switch { 1284 // case fi.IsDir(): 1285 // f.s = append(f.s, newCFtsent(t, fts.FTS_D, path, statp, 0)) 1286 // g, err := os.Open(path) 1287 // switch x := err.(type) { 1288 // case nil: 1289 // // ok 1290 // case *os.PathError: 1291 // f.s = append(f.s, newCFtsent(t, fts.FTS_DNR, path, statp, errno.EACCES)) 1292 // break out 1293 // default: 1294 // panic(todo("%q: %v %T", path, x, x)) 1295 // } 1296 // 1297 // names, err := g.Readdirnames(-1) 1298 // g.Close() 1299 // if err != nil { 1300 // panic(todo("")) 1301 // } 1302 // 1303 // for _, name := range names { 1304 // walk(path + "/" + name) 1305 // if f == nil { 1306 // break out 1307 // } 1308 // } 1309 // 1310 // f.s = append(f.s, newCFtsent(t, fts.FTS_DP, path, statp, 0)) 1311 // default: 1312 // info := fts.FTS_F 1313 // if fi.Mode()&os.ModeSymlink != 0 { 1314 // info = fts.FTS_SL 1315 // } 1316 // switch { 1317 // case statp != nil: 1318 // f.s = append(f.s, newCFtsent(t, info, path, statp, 0)) 1319 // case options&fts.FTS_NOSTAT != 0: 1320 // f.s = append(f.s, newCFtsent(t, fts.FTS_NSOK, path, nil, 0)) 1321 // default: 1322 // panic(todo("")) 1323 // } 1324 // } 1325 // } 1326 // 1327 // for { 1328 // p := *(*uintptr)(unsafe.Pointer(path_argv)) 1329 // if p == 0 { 1330 // if f == nil { 1331 // return 0 1332 // } 1333 // 1334 // if compar != 0 { 1335 // panic(todo("")) 1336 // } 1337 // 1338 // return addObject(f) 1339 // } 1340 // 1341 // walk(GoString(p)) 1342 // path_argv += unsafe.Sizeof(uintptr(0)) 1343 // } 1344 } 1345 1346 // FTSENT *fts_read(FTS *ftsp); 1347 func Xfts_read(t *TLS, ftsp uintptr) uintptr { 1348 return Xfts64_read(t, ftsp) 1349 } 1350 1351 // FTSENT *fts_read(FTS *ftsp); 1352 func Xfts64_read(t *TLS, ftsp uintptr) uintptr { 1353 panic(todo("")) 1354 // f := winGetObject(ftsp).(*ftstream) 1355 // if f.x == len(f.s) { 1356 // t.setErrno(0) 1357 // return 0 1358 // } 1359 // 1360 // r := f.s[f.x] 1361 // if e := (*fts.FTSENT)(unsafe.Pointer(r)).Ffts_errno; e != 0 { 1362 // t.setErrno(e) 1363 // } 1364 // f.x++ 1365 // return r 1366 } 1367 1368 // int fts_close(FTS *ftsp); 1369 func Xfts_close(t *TLS, ftsp uintptr) int32 { 1370 return Xfts64_close(t, ftsp) 1371 } 1372 1373 // int fts_close(FTS *ftsp); 1374 func Xfts64_close(t *TLS, ftsp uintptr) int32 { 1375 panic(todo("")) 1376 // winGetObject(ftsp).(*ftstream).close(t) 1377 // removeObject(ftsp) 1378 // return 0 1379 } 1380 1381 // void tzset (void); 1382 func Xtzset(t *TLS) { 1383 //TODO 1384 } 1385 1386 var strerrorBuf [256]byte 1387 1388 // char *strerror(int errnum); 1389 func Xstrerror(t *TLS, errnum int32) uintptr { 1390 copy((*RawMem)(unsafe.Pointer(&strerrorBuf[0]))[:len(strerrorBuf):len(strerrorBuf)], fmt.Sprintf("errno %d\x00", errnum)) 1391 return uintptr(unsafe.Pointer(&strerrorBuf[0])) 1392 } 1393 1394 // void *dlopen(const char *filename, int flags); 1395 func Xdlopen(t *TLS, filename uintptr, flags int32) uintptr { 1396 panic(todo("")) 1397 } 1398 1399 // char *dlerror(void); 1400 func Xdlerror(t *TLS) uintptr { 1401 panic(todo("")) 1402 } 1403 1404 // int dlclose(void *handle); 1405 func Xdlclose(t *TLS, handle uintptr) int32 { 1406 panic(todo("")) 1407 } 1408 1409 // void *dlsym(void *handle, const char *symbol); 1410 func Xdlsym(t *TLS, handle, symbol uintptr) uintptr { 1411 panic(todo("")) 1412 } 1413 1414 // void perror(const char *s); 1415 func Xperror(t *TLS, s uintptr) { 1416 panic(todo("")) 1417 } 1418 1419 // int pclose(FILE *stream); 1420 func Xpclose(t *TLS, stream uintptr) int32 { 1421 panic(todo("")) 1422 } 1423 1424 var gai_strerrorBuf [100]byte 1425 1426 // const char *gai_strerror(int errcode); 1427 func Xgai_strerror(t *TLS, errcode int32) uintptr { 1428 copy(gai_strerrorBuf[:], fmt.Sprintf("gai error %d\x00", errcode)) 1429 return uintptr(unsafe.Pointer(&gai_strerrorBuf)) 1430 } 1431 1432 // int tcgetattr(int fd, struct termios *termios_p); 1433 func Xtcgetattr(t *TLS, fd int32, termios_p uintptr) int32 { 1434 panic(todo("")) 1435 } 1436 1437 // int tcsetattr(int fd, int optional_actions, const struct termios *termios_p); 1438 func Xtcsetattr(t *TLS, fd, optional_actions int32, termios_p uintptr) int32 { 1439 panic(todo("")) 1440 } 1441 1442 // // speed_t cfgetospeed(const struct termios *termios_p); 1443 // func Xcfgetospeed(t *TLS, termios_p uintptr) termios.Speed_t { 1444 // panic(todo("")) 1445 // } 1446 1447 // int cfsetospeed(struct termios *termios_p, speed_t speed); 1448 func Xcfsetospeed(t *TLS, termios_p uintptr, speed uint32) int32 { 1449 panic(todo("")) 1450 } 1451 1452 // int cfsetispeed(struct termios *termios_p, speed_t speed); 1453 func Xcfsetispeed(t *TLS, termios_p uintptr, speed uint32) int32 { 1454 panic(todo("")) 1455 } 1456 1457 // pid_t fork(void); 1458 func Xfork(t *TLS) int32 { 1459 t.setErrno(errno.ENOSYS) 1460 return -1 1461 } 1462 1463 // char *setlocale(int category, const char *locale); 1464 func Xsetlocale(t *TLS, category int32, locale uintptr) uintptr { 1465 return 0 //TODO 1466 } 1467 1468 // // char *nl_langinfo(nl_item item); 1469 // func Xnl_langinfo(t *TLS, item langinfo.Nl_item) uintptr { 1470 // panic(todo("")) 1471 // } 1472 1473 // FILE *popen(const char *command, const char *type); 1474 func Xpopen(t *TLS, command, type1 uintptr) uintptr { 1475 panic(todo("")) 1476 } 1477 1478 // char *realpath(const char *path, char *resolved_path); 1479 func Xrealpath(t *TLS, path, resolved_path uintptr) uintptr { 1480 s, err := filepath.EvalSymlinks(GoString(path)) 1481 if err != nil { 1482 if os.IsNotExist(err) { 1483 if dmesgs { 1484 dmesg("%v: %q: %v", origin(1), GoString(path), err) 1485 } 1486 t.setErrno(errno.ENOENT) 1487 return 0 1488 } 1489 1490 panic(todo("", err)) 1491 } 1492 1493 if resolved_path == 0 { 1494 panic(todo("")) 1495 } 1496 1497 if len(s) >= limits.PATH_MAX { 1498 s = s[:limits.PATH_MAX-1] 1499 } 1500 1501 copy((*RawMem)(unsafe.Pointer(resolved_path))[:len(s):len(s)], s) 1502 (*RawMem)(unsafe.Pointer(resolved_path))[len(s)] = 0 1503 return resolved_path 1504 } 1505 1506 // struct tm *gmtime_r(const time_t *timep, struct tm *result); 1507 func Xgmtime_r(t *TLS, timep, result uintptr) uintptr { 1508 panic(todo("")) 1509 } 1510 1511 // // char *inet_ntoa(struct in_addr in); 1512 // func Xinet_ntoa(t *TLS, in1 in.In_addr) uintptr { 1513 // panic(todo("")) 1514 // } 1515 1516 // func X__ccgo_in6addr_anyp(t *TLS) uintptr { 1517 // return uintptr(unsafe.Pointer(&in6_addr_any)) 1518 // } 1519 1520 func Xabort(t *TLS) { 1521 panic(todo("")) 1522 // if dmesgs { 1523 // dmesg("%v:\n%s", origin(1), debug.Stack()) 1524 // } 1525 // p := Xmalloc(t, types.Size_t(unsafe.Sizeof(signal.Sigaction{}))) 1526 // if p == 0 { 1527 // panic("OOM") 1528 // } 1529 // 1530 // *(*signal.Sigaction)(unsafe.Pointer(p)) = signal.Sigaction{ 1531 // F__sigaction_handler: struct{ Fsa_handler signal.X__sighandler_t }{Fsa_handler: signal.SIG_DFL}, 1532 // } 1533 // Xsigaction(t, signal.SIGABRT, p, 0) 1534 // Xfree(t, p) 1535 // unix.Kill(unix.Getpid(), syscall.Signal(signal.SIGABRT)) 1536 // panic(todo("unrechable")) 1537 } 1538 1539 // int fflush(FILE *stream); 1540 func Xfflush(t *TLS, stream uintptr) int32 { 1541 f, ok := winGetObject(stream).(*file) 1542 if !ok { 1543 t.setErrno(errno.EBADF) 1544 return -1 1545 } 1546 err := syscall.FlushFileBuffers(f.Handle) 1547 if err != nil { 1548 t.setErrno(err) 1549 return -1 1550 } 1551 return 0 1552 } 1553 1554 // size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 1555 func Xfread(t *TLS, ptr uintptr, size, nmemb types.Size_t, stream uintptr) types.Size_t { 1556 f, ok := winGetObject(stream).(*file) 1557 if !ok { 1558 t.setErrno(errno.EBADF) 1559 return 0 1560 } 1561 1562 var sz = size * nmemb 1563 var obuf = ((*RawMem)(unsafe.Pointer(ptr)))[:sz] 1564 n, err := syscall.Read(f.Handle, obuf) 1565 if err != nil { 1566 f.setErr() 1567 return 0 1568 } 1569 1570 if dmesgs { 1571 // dmesg("%v: %d %#x x %#x: %#x\n%s", origin(1), file(stream).fd(), size, nmemb, types.Size_t(m)/size, hex.Dump(GoBytes(ptr, int(m)))) 1572 dmesg("%v: %d %#x x %#x: %#x\n%s", origin(1), f._fd, size, nmemb, types.Size_t(n)/size) 1573 } 1574 1575 return types.Size_t(n) / size 1576 1577 } 1578 1579 // size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); 1580 func Xfwrite(t *TLS, ptr uintptr, size, nmemb types.Size_t, stream uintptr) types.Size_t { 1581 if ptr == 0 || size == 0 { 1582 return 0 1583 } 1584 1585 f, ok := winGetObject(stream).(*file) 1586 if !ok { 1587 t.setErrno(errno.EBADF) 1588 return 0 1589 } 1590 1591 var sz = size * nmemb 1592 var obuf = ((*RawMem)(unsafe.Pointer(ptr)))[:sz] 1593 n, err := syscall.Write(f.Handle, obuf) 1594 if err != nil { 1595 f.setErr() 1596 return 0 1597 } 1598 1599 if dmesgs { 1600 // // dmesg("%v: %d %#x x %#x: %#x\n%s", origin(1), file(stream).fd(), size, nmemb, types.Size_t(m)/size, hex.Dump(GoBytes(ptr, int(m)))) 1601 dmesg("%v: %d %#x x %#x: %#x\n%s", origin(1), f._fd, size, nmemb, types.Size_t(n)/size) 1602 } 1603 return types.Size_t(n) / size 1604 } 1605 1606 // int fclose(FILE *stream); 1607 func Xfclose(t *TLS, stream uintptr) int32 { 1608 f, ok := winGetObject(stream).(*file) 1609 if !ok { 1610 t.setErrno(errno.EBADF) 1611 return -1 1612 } 1613 return f.close(t) 1614 } 1615 1616 // int fputc(int c, FILE *stream); 1617 func Xfputc(t *TLS, c int32, stream uintptr) int32 { 1618 f, ok := winGetObject(stream).(*file) 1619 if !ok { 1620 t.setErrno(errno.EBADF) 1621 return -1 1622 } 1623 if _, err := fwrite(f._fd, []byte{byte(c)}); err != nil { 1624 return -1 1625 } 1626 return int32(byte(c)) 1627 } 1628 1629 // int fseek(FILE *stream, long offset, int whence); 1630 func Xfseek(t *TLS, stream uintptr, offset long, whence int32) int32 { 1631 f, ok := winGetObject(stream).(*file) 1632 if !ok { 1633 t.setErrno(errno.EBADF) 1634 return -1 1635 } 1636 if n := Xlseek(t, f._fd, types.Off_t(offset), whence); n < 0 { 1637 if dmesgs { 1638 dmesg("%v: fd %v, off %#x, whence %v: %v", origin(1), f._fd, offset, whenceStr(whence), n) 1639 } 1640 f.setErr() 1641 return -1 1642 } 1643 1644 if dmesgs { 1645 dmesg("%v: fd %v, off %#x, whence %v: ok", origin(1), f._fd, offset, whenceStr(whence)) 1646 } 1647 return 0 1648 } 1649 1650 // long ftell(FILE *stream); 1651 func Xftell(t *TLS, stream uintptr) long { 1652 f, ok := winGetObject(stream).(*file) 1653 if !ok { 1654 t.setErrno(errno.EBADF) 1655 return -1 1656 } 1657 1658 n := Xlseek(t, f._fd, 0, syscall.FILE_CURRENT) 1659 if n < 0 { 1660 f.setErr() 1661 return -1 1662 } 1663 1664 if dmesgs { 1665 dmesg("%v: fd %v, n %#x: ok %#x", origin(1), f._fd, n, long(n)) 1666 } 1667 return long(n) 1668 } 1669 1670 // int ferror(FILE *stream); 1671 func Xferror(t *TLS, stream uintptr) int32 { 1672 f, ok := winGetObject(stream).(*file) 1673 if !ok { 1674 t.setErrno(errno.EBADF) 1675 return -1 1676 } 1677 1678 return Bool32(f.err()) 1679 } 1680 1681 // int getc(FILE *stream); 1682 func Xfgetc(t *TLS, stream uintptr) int32 { 1683 f, ok := winGetObject(stream).(*file) 1684 if !ok { 1685 t.setErrno(errno.EBADF) 1686 return stdio.EOF 1687 } 1688 1689 var buf [1]byte 1690 if n, _ := syscall.Read(f.Handle, buf[:]); n != 0 { 1691 return int32(buf[0]) 1692 } 1693 1694 return stdio.EOF 1695 } 1696 1697 // int ungetc(int c, FILE *stream); 1698 func Xungetc(t *TLS, c int32, stream uintptr) int32 { 1699 panic(todo("")) 1700 } 1701 1702 // int fscanf(FILE *stream, const char *format, ...); 1703 func Xfscanf(t *TLS, stream, format, va uintptr) int32 { 1704 panic(todo("")) 1705 } 1706 1707 // int fputs(const char *s, FILE *stream); 1708 func Xfputs(t *TLS, s, stream uintptr) int32 { 1709 f, ok := winGetObject(stream).(*file) 1710 if !ok { 1711 t.setErrno(errno.EBADF) 1712 return -1 1713 } 1714 gS := GoString(s) 1715 if _, err := fwrite(f._fd, []byte(gS)); err != nil { 1716 return -1 1717 } 1718 return 0 1719 } 1720 1721 // var getservbynameStaticResult netdb.Servent 1722 // 1723 // // struct servent *getservbyname(const char *name, const char *proto); 1724 // func Xgetservbyname(t *TLS, name, proto uintptr) uintptr { 1725 // var protoent *gonetdb.Protoent 1726 // if proto != 0 { 1727 // protoent = gonetdb.GetProtoByName(GoString(proto)) 1728 // } 1729 // servent := gonetdb.GetServByName(GoString(name), protoent) 1730 // if servent == nil { 1731 // if dmesgs { 1732 // dmesg("%q %q: nil (protoent %+v)", GoString(name), GoString(proto), protoent) 1733 // } 1734 // return 0 1735 // } 1736 // 1737 // Xfree(t, (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_name) 1738 // if v := (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_aliases; v != 0 { 1739 // for { 1740 // p := *(*uintptr)(unsafe.Pointer(v)) 1741 // if p == 0 { 1742 // break 1743 // } 1744 // 1745 // Xfree(t, p) 1746 // v += unsafe.Sizeof(uintptr(0)) 1747 // } 1748 // Xfree(t, v) 1749 // } 1750 // Xfree(t, (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_proto) 1751 // cname, err := CString(servent.Name) 1752 // if err != nil { 1753 // getservbynameStaticResult = netdb.Servent{} 1754 // return 0 1755 // } 1756 // 1757 // var protoname uintptr 1758 // if protoent != nil { 1759 // if protoname, err = CString(protoent.Name); err != nil { 1760 // Xfree(t, cname) 1761 // getservbynameStaticResult = netdb.Servent{} 1762 // return 0 1763 // } 1764 // } 1765 // var a []uintptr 1766 // for _, v := range servent.Aliases { 1767 // cs, err := CString(v) 1768 // if err != nil { 1769 // for _, v := range a { 1770 // Xfree(t, v) 1771 // } 1772 // return 0 1773 // } 1774 // 1775 // a = append(a, cs) 1776 // } 1777 // v := Xcalloc(t, types.Size_t(len(a)+1), types.Size_t(unsafe.Sizeof(uintptr(0)))) 1778 // if v == 0 { 1779 // Xfree(t, cname) 1780 // Xfree(t, protoname) 1781 // for _, v := range a { 1782 // Xfree(t, v) 1783 // } 1784 // getservbynameStaticResult = netdb.Servent{} 1785 // return 0 1786 // } 1787 // for _, p := range a { 1788 // *(*uintptr)(unsafe.Pointer(v)) = p 1789 // v += unsafe.Sizeof(uintptr(0)) 1790 // } 1791 // 1792 // getservbynameStaticResult = netdb.Servent{ 1793 // Fs_name: cname, 1794 // Fs_aliases: v, 1795 // Fs_port: int32(servent.Port), 1796 // Fs_proto: protoname, 1797 // } 1798 // return uintptr(unsafe.Pointer(&getservbynameStaticResult)) 1799 // } 1800 1801 // func Xreaddir64(t *TLS, dir uintptr) uintptr { 1802 // return Xreaddir(t, dir) 1803 // } 1804 1805 // func fcntlCmdStr(cmd int32) string { 1806 // switch cmd { 1807 // case fcntl.F_GETOWN: 1808 // return "F_GETOWN" 1809 // case fcntl.F_SETLK: 1810 // return "F_SETLK" 1811 // case fcntl.F_GETLK: 1812 // return "F_GETLK" 1813 // case fcntl.F_SETFD: 1814 // return "F_SETFD" 1815 // case fcntl.F_GETFD: 1816 // return "F_GETFD" 1817 // default: 1818 // return fmt.Sprintf("cmd(%d)", cmd) 1819 // } 1820 // } 1821 1822 // _CRTIMP extern int *__cdecl _errno(void); // /usr/share/mingw-w64/include/errno.h:17: 1823 func X_errno(t *TLS) uintptr { 1824 return t.errnop 1825 } 1826 1827 // int vfscanf(FILE * restrict stream, const char * restrict format, va_list arg); 1828 func X__ms_vfscanf(t *TLS, stream, format, ap uintptr) int32 { 1829 panic(todo("")) 1830 } 1831 1832 // int vsscanf(const char *str, const char *format, va_list ap); 1833 func X__ms_vsscanf(t *TLS, str, format, ap uintptr) int32 { 1834 panic(todo("")) 1835 } 1836 1837 // int vscanf(const char *format, va_list ap); 1838 func X__ms_vscanf(t *TLS, format, ap uintptr) int32 { 1839 panic(todo("")) 1840 } 1841 1842 // int vsnprintf(char *str, size_t size, const char *format, va_list ap); 1843 func X__ms_vsnprintf(t *TLS, str uintptr, size types.Size_t, format, ap uintptr) int32 { 1844 return Xvsnprintf(t, str, size, format, ap) 1845 } 1846 1847 // int vfwscanf(FILE *stream, const wchar_t *format, va_list argptr;); 1848 func X__ms_vfwscanf(t *TLS, stream uintptr, format, ap uintptr) int32 { 1849 panic(todo("")) 1850 } 1851 1852 // int vwscanf(const wchar_t * restrict format, va_list arg); 1853 func X__ms_vwscanf(t *TLS, format, ap uintptr) int32 { 1854 panic(todo("")) 1855 } 1856 1857 // int _vsnwprintf(wchar_t *buffer, size_t count, const wchar_t *format, va_list argptr); 1858 func X_vsnwprintf(t *TLS, buffer uintptr, count types.Size_t, format, ap uintptr) int32 { 1859 panic(todo("")) 1860 } 1861 1862 // int vswscanf(const wchar_t *buffer, const wchar_t *format, va_list arglist); 1863 func X__ms_vswscanf(t *TLS, stream uintptr, format, ap uintptr) int32 { 1864 panic(todo("")) 1865 } 1866 1867 // __acrt_iob_func 1868 func X__acrt_iob_func(t *TLS, fd uint32) uintptr { 1869 1870 f, ok := fdToFile(int32(fd)) 1871 if !ok { 1872 t.setErrno(EBADF) 1873 return 0 1874 } 1875 return f.t 1876 } 1877 1878 // BOOL SetEvent( 1879 // 1880 // HANDLE hEvent 1881 // 1882 // ); 1883 func XSetEvent(t *TLS, hEvent uintptr) int32 { 1884 r0, _, err := syscall.Syscall(procSetEvent.Addr(), 1, hEvent, 0, 0) 1885 if r0 == 0 { 1886 t.setErrno(err) 1887 } 1888 return int32(r0) 1889 } 1890 1891 // int _stricmp( 1892 // 1893 // const char *string1, 1894 // const char *string2 1895 // 1896 // ); 1897 func X_stricmp(t *TLS, string1, string2 uintptr) int32 { 1898 var s1 = strings.ToLower(GoString(string1)) 1899 var s2 = strings.ToLower(GoString(string2)) 1900 return int32(strings.Compare(s1, s2)) 1901 } 1902 1903 // BOOL HeapFree( 1904 // 1905 // HANDLE hHeap, 1906 // DWORD dwFlags, 1907 // _Frees_ptr_opt_ LPVOID lpMem 1908 // 1909 // ); 1910 func XHeapFree(t *TLS, hHeap uintptr, dwFlags uint32, lpMem uintptr) int32 { 1911 r0, _, err := syscall.Syscall(procHeapFree.Addr(), 3, hHeap, uintptr(dwFlags), lpMem) 1912 if err != 0 { 1913 t.setErrno(err) 1914 } 1915 return int32(r0) 1916 } 1917 1918 // HANDLE GetProcessHeap(); 1919 func XGetProcessHeap(t *TLS) uintptr { 1920 r0, _, err := syscall.Syscall(procGetProcessHeap.Addr(), 0, 0, 0, 0) 1921 if r0 == 0 { 1922 t.setErrno(err) 1923 } 1924 return r0 1925 } 1926 1927 // LPVOID HeapAlloc( 1928 // 1929 // HANDLE hHeap, 1930 // DWORD dwFlags, 1931 // SIZE_T dwBytes 1932 // 1933 // ); 1934 func XHeapAlloc(t *TLS, hHeap uintptr, dwFlags uint32, dwBytes types.Size_t) uintptr { 1935 r0, _, err := syscall.Syscall(procHeapAlloc.Addr(), 3, hHeap, uintptr(dwFlags), uintptr(dwBytes)) 1936 if r0 == 0 { 1937 t.setErrno(err) 1938 } 1939 return r0 1940 } 1941 1942 // WCHAR * gai_strerrorW( 1943 // 1944 // int ecode 1945 // 1946 // ); 1947 func Xgai_strerrorW(t *TLS, _ ...interface{}) uintptr { 1948 panic(todo("")) 1949 } 1950 1951 // servent * getservbyname( 1952 // 1953 // const char *name, 1954 // const char *proto 1955 // 1956 // ); 1957 func Xgetservbyname(t *TLS, _ ...interface{}) uintptr { 1958 panic(todo("")) 1959 } 1960 1961 // INT WSAAPI getaddrinfo( 1962 // 1963 // PCSTR pNodeName, 1964 // PCSTR pServiceName, 1965 // const ADDRINFOA *pHints, 1966 // PADDRINFOA *ppResult 1967 // 1968 // ); 1969 func XWspiapiGetAddrInfo(t *TLS, _ ...interface{}) int32 { 1970 panic(todo("")) 1971 } 1972 1973 // int wcscmp( 1974 // 1975 // const wchar_t *string1, 1976 // const wchar_t *string2 1977 // 1978 // ); 1979 func Xwcscmp(t *TLS, string1, string2 uintptr) int32 { 1980 var s1 = goWideString(string1) 1981 var s2 = goWideString(string2) 1982 return int32(strings.Compare(s1, s2)) 1983 } 1984 1985 // BOOL IsDebuggerPresent(); 1986 func XIsDebuggerPresent(t *TLS) int32 { 1987 panic(todo("")) 1988 } 1989 1990 func XExitProcess(t *TLS, _ ...interface{}) int32 { 1991 panic(todo("")) 1992 } 1993 1994 // BOOL GetVersionExW( 1995 // 1996 // LPOSVERSIONINFOW lpVersionInformation 1997 // 1998 // ); 1999 func XGetVersionExW(t *TLS, lpVersionInformation uintptr) int32 { 2000 r0, _, err := syscall.Syscall(procGetVersionExW.Addr(), 1, lpVersionInformation, 0, 0) 2001 if r0 == 0 { 2002 t.setErrno(err) 2003 } 2004 return int32(r0) 2005 } 2006 2007 // BOOL GetVolumeNameForVolumeMountPointW( 2008 // 2009 // LPCWSTR lpszVolumeMountPoint, 2010 // LPWSTR lpszVolumeName, 2011 // DWORD cchBufferLength 2012 // 2013 // ); 2014 func XGetVolumeNameForVolumeMountPointW(t *TLS, _ ...interface{}) int32 { 2015 panic(todo("")) 2016 } 2017 2018 // size_t wcslen( 2019 // 2020 // const wchar_t *str 2021 // 2022 // ); 2023 func Xwcslen(t *TLS, str uintptr) types.Size_t { 2024 r0, _, _ := syscall.Syscall(procLstrlenW.Addr(), 1, str, 0, 0) 2025 return types.Size_t(r0) 2026 } 2027 2028 // HANDLE WINAPI GetStdHandle( 2029 // 2030 // _In_ DWORD nStdHandle 2031 // 2032 // ); 2033 func XGetStdHandle(t *TLS, nStdHandle uint32) uintptr { 2034 h, err := syscall.GetStdHandle(int(nStdHandle)) 2035 if err != nil { 2036 panic("no console") 2037 } 2038 return uintptr(h) 2039 } 2040 2041 // BOOL CloseHandle( 2042 // 2043 // HANDLE hObject 2044 // 2045 // ); 2046 func XCloseHandle(t *TLS, hObject uintptr) int32 { 2047 r := syscall.CloseHandle(syscall.Handle(hObject)) 2048 if r != nil { 2049 return errno.EINVAL 2050 } 2051 return 1 2052 } 2053 2054 // DWORD GetLastError(); 2055 func XGetLastError(t *TLS) uint32 { 2056 var rv = *(*int32)(unsafe.Pointer(t.errnop)) 2057 return uint32(rv) 2058 2059 //r1, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0) 2060 //return uint32(r1) 2061 } 2062 2063 // DWORD SetFilePointer( 2064 // 2065 // HANDLE hFile, 2066 // LONG lDistanceToMove, 2067 // PLONG lpDistanceToMoveHigh, 2068 // DWORD dwMoveMethod 2069 // 2070 // ); 2071 func XSetFilePointer(t *TLS, hFile uintptr, lDistanceToMove long, lpDistanceToMoveHigh uintptr, dwMoveMethod uint32) uint32 { 2072 r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, hFile, uintptr(lDistanceToMove), lpDistanceToMoveHigh, uintptr(dwMoveMethod), 0, 0) 2073 var uOff = uint32(r0) 2074 if uOff == 0xffffffff { 2075 if e1 != 0 { 2076 t.setErrno(e1) 2077 } else { 2078 t.setErrno(errno.EINVAL) 2079 } 2080 } 2081 return uint32(r0) 2082 } 2083 2084 // BOOL SetEndOfFile( 2085 // 2086 // HANDLE hFile 2087 // 2088 // ); 2089 func XSetEndOfFile(t *TLS, hFile uintptr) int32 { 2090 err := syscall.SetEndOfFile(syscall.Handle(hFile)) 2091 if err != nil { 2092 t.setErrno(err) 2093 return 0 2094 } 2095 return 1 2096 } 2097 2098 // BOOL ReadFile( 2099 // 2100 // HANDLE hFile, 2101 // LPVOID lpBuffer, 2102 // DWORD nNumberOfBytesToRead, 2103 // LPDWORD lpNumberOfBytesRead, 2104 // LPOVERLAPPED lpOverlapped 2105 // 2106 // ); 2107 func XReadFile(t *TLS, hFile, lpBuffer uintptr, nNumberOfBytesToRead uint32, lpNumberOfBytesRead, lpOverlapped uintptr) int32 { 2108 r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, 2109 hFile, lpBuffer, uintptr(nNumberOfBytesToRead), uintptr(lpNumberOfBytesRead), uintptr(lpOverlapped), 0) 2110 if r1 == 0 { 2111 if e1 != 0 { 2112 t.setErrno(e1) 2113 } else { 2114 t.setErrno(errno.EINVAL) 2115 } 2116 return 0 2117 } 2118 return int32(r1) 2119 } 2120 2121 // BOOL WriteFile( 2122 // 2123 // HANDLE hFile, 2124 // LPCVOID lpBuffer, 2125 // DWORD nNumberOfBytesToWrite, 2126 // LPDWORD lpNumberOfBytesWritten, 2127 // LPOVERLAPPED lpOverlapped 2128 // 2129 // ); 2130 func XWriteFile(t *TLS, hFile, lpBuffer uintptr, nNumberOfBytesToWrite uint32, lpNumberOfBytesWritten, lpOverlapped uintptr) int32 { 2131 r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, 2132 hFile, lpBuffer, uintptr(nNumberOfBytesToWrite), lpNumberOfBytesWritten, lpOverlapped, 0) 2133 if r1 == 0 { 2134 if e1 != 0 { 2135 t.setErrno(e1) 2136 } else { 2137 t.setErrno(errno.EINVAL) 2138 } 2139 return 0 2140 } 2141 return int32(r1) 2142 } 2143 2144 // DWORD GetFileAttributesW( 2145 // 2146 // LPCWSTR lpFileName 2147 // 2148 // ); 2149 func XGetFileAttributesW(t *TLS, lpFileName uintptr) uint32 { 2150 attrs, err := syscall.GetFileAttributes((*uint16)(unsafe.Pointer(lpFileName))) 2151 if attrs == syscall.INVALID_FILE_ATTRIBUTES { 2152 if err != nil { 2153 t.setErrno(err) 2154 } else { 2155 t.setErrno(errno.EINVAL) 2156 } 2157 } 2158 return attrs 2159 } 2160 2161 // HANDLE CreateFileW( 2162 // 2163 // LPCWSTR lpFileName, 2164 // DWORD dwDesiredAccess, 2165 // DWORD dwShareMode, 2166 // LPSECURITY_ATTRIBUTES lpSecurityAttributes, 2167 // DWORD dwCreationDisposition, 2168 // DWORD dwFlagsAndAttributes, 2169 // HANDLE hTemplateFile 2170 // 2171 // ); 2172 func XCreateFileW(t *TLS, lpFileName uintptr, dwDesiredAccess, dwShareMode uint32, lpSecurityAttributes uintptr, dwCreationDisposition, dwFlagsAndAttributes uint32, hTemplateFile uintptr) uintptr { 2173 2174 r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, lpFileName, uintptr(dwDesiredAccess), uintptr(dwShareMode), lpSecurityAttributes, 2175 uintptr(dwCreationDisposition), uintptr(dwFlagsAndAttributes), hTemplateFile, 0, 0) 2176 h := syscall.Handle(r0) 2177 if h == syscall.InvalidHandle { 2178 if e1 != 0 { 2179 t.setErrno(e1) 2180 } else { 2181 t.setErrno(errno.EINVAL) 2182 } 2183 return r0 2184 } 2185 return uintptr(h) 2186 } 2187 2188 // BOOL DuplicateHandle( 2189 // 2190 // HANDLE hSourceProcessHandle, 2191 // HANDLE hSourceHandle, 2192 // HANDLE hTargetProcessHandle, 2193 // LPHANDLE lpTargetHandle, 2194 // DWORD dwDesiredAccess, 2195 // BOOL bInheritHandle, 2196 // DWORD dwOptions 2197 // 2198 // ); 2199 func XDuplicateHandle(t *TLS, hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, lpTargetHandle uintptr, dwDesiredAccess uint32, bInheritHandle int32, dwOptions uint32) int32 { 2200 r0, _, err := syscall.Syscall9(procDuplicateHandle.Addr(), 7, hSourceProcessHandle, hSourceHandle, hTargetProcessHandle, 2201 lpTargetHandle, uintptr(dwDesiredAccess), uintptr(bInheritHandle), uintptr(dwOptions), 0, 0) 2202 if r0 == 0 { 2203 t.setErrno(err) 2204 } 2205 return int32(r0) 2206 } 2207 2208 // HANDLE GetCurrentProcess(); 2209 func XGetCurrentProcess(t *TLS) uintptr { 2210 r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0) 2211 if r0 == 0 { 2212 if e1 != 0 { 2213 t.setErrno(e1) 2214 } else { 2215 t.setErrno(errno.EINVAL) 2216 } 2217 } 2218 return r0 2219 } 2220 2221 // BOOL FlushFileBuffers( 2222 // 2223 // HANDLE hFile 2224 // 2225 // ); 2226 func XFlushFileBuffers(t *TLS, hFile uintptr) int32 { 2227 err := syscall.FlushFileBuffers(syscall.Handle(hFile)) 2228 if err != nil { 2229 t.setErrno(err) 2230 return -1 2231 } 2232 return 1 2233 2234 } 2235 2236 // DWORD GetFileType( 2237 // 2238 // HANDLE hFile 2239 // 2240 // ); 2241 func XGetFileType(t *TLS, hFile uintptr) uint32 { 2242 n, err := syscall.GetFileType(syscall.Handle(hFile)) 2243 if err != nil { 2244 t.setErrno(err) 2245 } 2246 return n 2247 } 2248 2249 // BOOL WINAPI GetConsoleMode( 2250 // 2251 // _In_ HANDLE hConsoleHandle, 2252 // _Out_ LPDWORD lpMode 2253 // 2254 // ); 2255 func XGetConsoleMode(t *TLS, hConsoleHandle, lpMode uintptr) int32 { 2256 err := syscall.GetConsoleMode(syscall.Handle(hConsoleHandle), (*uint32)(unsafe.Pointer(lpMode))) 2257 if err != nil { 2258 t.setErrno(err) 2259 return 0 2260 } 2261 return 1 2262 } 2263 2264 // BOOL GetCommState( 2265 // 2266 // HANDLE hFile, 2267 // LPDCB lpDCB 2268 // 2269 // ); 2270 func XGetCommState(t *TLS, hFile, lpDCB uintptr) int32 { 2271 r1, _, err := syscall.Syscall(procGetCommState.Addr(), 2, hFile, lpDCB, 0) 2272 if r1 == 0 { 2273 t.setErrno(err) 2274 return 0 2275 } 2276 return int32(r1) 2277 } 2278 2279 // int _wcsnicmp( 2280 // 2281 // const wchar_t *string1, 2282 // const wchar_t *string2, 2283 // size_t count 2284 // 2285 // ); 2286 func X_wcsnicmp(t *TLS, string1, string2 uintptr, count types.Size_t) int32 { 2287 2288 var s1 = strings.ToLower(goWideString(string1)) 2289 var l1 = len(s1) 2290 var s2 = strings.ToLower(goWideString(string2)) 2291 var l2 = len(s2) 2292 2293 // shorter is lesser 2294 if l1 < l2 { 2295 return -1 2296 } 2297 if l2 > l1 { 2298 return 1 2299 } 2300 2301 // compare at most count 2302 var cmpLen = count 2303 if types.Size_t(l1) < cmpLen { 2304 cmpLen = types.Size_t(l1) 2305 } 2306 return int32(strings.Compare(s1[:cmpLen], s2[:cmpLen])) 2307 } 2308 2309 // BOOL WINAPI ReadConsole( 2310 // 2311 // _In_ HANDLE hConsoleInput, 2312 // _Out_ LPVOID lpBuffer, 2313 // _In_ DWORD nNumberOfCharsToRead, 2314 // _Out_ LPDWORD lpNumberOfCharsRead, 2315 // _In_opt_ LPVOID pInputControl 2316 // 2317 // ); 2318 func XReadConsoleW(t *TLS, hConsoleInput, lpBuffer uintptr, nNumberOfCharsToRead uint32, lpNumberOfCharsRead, pInputControl uintptr) int32 { 2319 2320 rv, _, err := syscall.Syscall6(procReadConsoleW.Addr(), 5, hConsoleInput, 2321 lpBuffer, uintptr(nNumberOfCharsToRead), lpNumberOfCharsRead, pInputControl, 0) 2322 if rv == 0 { 2323 t.setErrno(err) 2324 } 2325 2326 return int32(rv) 2327 } 2328 2329 // BOOL WINAPI WriteConsoleW( 2330 // 2331 // _In_ HANDLE hConsoleOutput, 2332 // _In_ const VOID *lpBuffer, 2333 // _In_ DWORD nNumberOfCharsToWrite, 2334 // _Out_opt_ LPDWORD lpNumberOfCharsWritten, 2335 // _Reserved_ LPVOID lpReserved 2336 // 2337 // ); 2338 func XWriteConsoleW(t *TLS, hConsoleOutput, lpBuffer uintptr, nNumberOfCharsToWrite uint32, lpNumberOfCharsWritten, lpReserved uintptr) int32 { 2339 rv, _, err := syscall.Syscall6(procWriteConsoleW.Addr(), 5, hConsoleOutput, 2340 lpBuffer, uintptr(nNumberOfCharsToWrite), lpNumberOfCharsWritten, lpReserved, 0) 2341 if rv == 0 { 2342 t.setErrno(err) 2343 } 2344 return int32(rv) 2345 } 2346 2347 // DWORD WaitForSingleObject( 2348 // 2349 // HANDLE hHandle, 2350 // DWORD dwMilliseconds 2351 // 2352 // ); 2353 func XWaitForSingleObject(t *TLS, hHandle uintptr, dwMilliseconds uint32) uint32 { 2354 rv, err := syscall.WaitForSingleObject(syscall.Handle(hHandle), dwMilliseconds) 2355 if err != nil { 2356 t.setErrno(err) 2357 } 2358 return rv 2359 } 2360 2361 // BOOL ResetEvent( 2362 // 2363 // HANDLE hEvent 2364 // 2365 // ); 2366 func XResetEvent(t *TLS, hEvent uintptr) int32 { 2367 rv, _, err := syscall.Syscall(procResetEvent.Addr(), 1, hEvent, 0, 0) 2368 if rv == 0 { 2369 t.setErrno(err) 2370 } 2371 return int32(rv) 2372 } 2373 2374 // BOOL WINAPI PeekConsoleInput( 2375 // 2376 // _In_ HANDLE hConsoleInput, 2377 // _Out_ PINPUT_RECORD lpBuffer, 2378 // _In_ DWORD nLength, 2379 // _Out_ LPDWORD lpNumberOfEventsRead 2380 // 2381 // ); 2382 func XPeekConsoleInputW(t *TLS, hConsoleInput, lpBuffer uintptr, nLength uint32, lpNumberOfEventsRead uintptr) int32 { 2383 r0, _, err := syscall.Syscall6(procPeekConsoleInputW.Addr(), 4, hConsoleInput, lpBuffer, uintptr(nLength), lpNumberOfEventsRead, 0, 0) 2384 if r0 == 0 { 2385 t.setErrno(err) 2386 } 2387 return int32(r0) 2388 } 2389 2390 // int WINAPIV wsprintfA( 2391 // 2392 // LPSTR , 2393 // LPCSTR , 2394 // ... 2395 // 2396 // ); 2397 func XwsprintfA(t *TLS, buf, format, args uintptr) int32 { 2398 return Xsprintf(t, buf, format, args) 2399 } 2400 2401 // UINT WINAPI GetConsoleCP(void); 2402 func XGetConsoleCP(t *TLS) uint32 { 2403 r0, _, err := syscall.Syscall(procGetConsoleCP.Addr(), 0, 0, 0, 0) 2404 if r0 == 0 { 2405 t.setErrno(err) 2406 } 2407 return uint32(r0) 2408 } 2409 2410 // UINT WINAPI SetConsoleCP(UNIT); 2411 //func setConsoleCP(cp uint32) uint32 { 2412 // 2413 // r0, _, _ := syscall.Syscall(procSetConsoleCP.Addr(), 1, uintptr(cp), 0, 0) 2414 // if r0 == 0 { 2415 // panic("setcp failed") 2416 // } 2417 // return uint32(r0) 2418 //} 2419 2420 // HANDLE CreateEventW( 2421 // 2422 // LPSECURITY_ATTRIBUTES lpEventAttributes, 2423 // BOOL bManualReset, 2424 // BOOL bInitialState, 2425 // LPCWSTR lpName 2426 // 2427 // ); 2428 func XCreateEventW(t *TLS, lpEventAttributes uintptr, bManualReset, bInitialState int32, lpName uintptr) uintptr { 2429 r0, _, err := syscall.Syscall6(procCreateEventW.Addr(), 4, lpEventAttributes, uintptr(bManualReset), 2430 uintptr(bInitialState), lpName, 0, 0) 2431 if r0 == 0 { 2432 t.setErrno(err) 2433 } 2434 return r0 2435 } 2436 2437 type ThreadAdapter struct { 2438 token uintptr 2439 tls *TLS 2440 param uintptr 2441 threadFunc func(*TLS, uintptr) uint32 2442 } 2443 2444 func (ta *ThreadAdapter) run() uintptr { 2445 r := ta.threadFunc(ta.tls, ta.param) 2446 ta.tls.Close() 2447 removeObject(ta.token) 2448 return uintptr(r) 2449 } 2450 2451 func ThreadProc(p uintptr) uintptr { 2452 adp, ok := winGetObject(p).(*ThreadAdapter) 2453 if !ok { 2454 panic("invalid thread") 2455 } 2456 return adp.run() 2457 } 2458 2459 // HANDLE CreateThread( 2460 // 2461 // LPSECURITY_ATTRIBUTES lpThreadAttributes, 2462 // SIZE_T dwStackSize, 2463 // LPTHREAD_START_ROUTINE lpStartAddress, 2464 // __drv_aliasesMem LPVOID lpParameter, 2465 // DWORD dwCreationFlags, 2466 // LPDWORD lpThreadId 2467 // 2468 // ); 2469 func XCreateThread(t *TLS, lpThreadAttributes uintptr, dwStackSize types.Size_t, lpStartAddress, lpParameter uintptr, dwCreationFlags uint32, lpThreadId uintptr) uintptr { 2470 f := (*struct{ f func(*TLS, uintptr) uint32 })(unsafe.Pointer(&struct{ uintptr }{lpStartAddress})).f 2471 var tAdp = ThreadAdapter{threadFunc: f, tls: NewTLS(), param: lpParameter} 2472 tAdp.token = addObject(&tAdp) 2473 2474 r0, _, err := syscall.Syscall6(procCreateThread.Addr(), 6, lpThreadAttributes, uintptr(dwStackSize), 2475 threadCallback, tAdp.token, uintptr(dwCreationFlags), lpThreadId) 2476 if r0 == 0 { 2477 t.setErrno(err) 2478 } 2479 return r0 2480 } 2481 2482 // BOOL SetThreadPriority( 2483 // 2484 // HANDLE hThread, 2485 // int nPriority 2486 // 2487 // ); 2488 func XSetThreadPriority(t *TLS, hThread uintptr, nPriority int32) int32 { 2489 2490 //r0, _, err := syscall.Syscall(procSetThreadPriority.Addr(), 2, hThread, uintptr(nPriority), 0) 2491 //if r0 == 0 { 2492 // t.setErrno(err) 2493 //} 2494 //return int32(r0) 2495 return 1 2496 } 2497 2498 // BOOL WINAPI SetConsoleMode( 2499 // 2500 // _In_ HANDLE hConsoleHandle, 2501 // _In_ DWORD dwMode 2502 // 2503 // ); 2504 func XSetConsoleMode(t *TLS, hConsoleHandle uintptr, dwMode uint32) int32 { 2505 rv, _, err := syscall.Syscall(procSetConsoleMode.Addr(), 2, hConsoleHandle, uintptr(dwMode), 0) 2506 if rv == 0 { 2507 t.setErrno(err) 2508 } 2509 return int32(rv) 2510 } 2511 2512 func XPurgeComm(t *TLS, _ ...interface{}) int32 { 2513 panic(todo("")) 2514 } 2515 2516 func XClearCommError(t *TLS, _ ...interface{}) int32 { 2517 panic(todo("")) 2518 } 2519 2520 // void DeleteCriticalSection( 2521 // 2522 // LPCRITICAL_SECTION lpCriticalSection 2523 // 2524 // ); 2525 func XDeleteCriticalSection(t *TLS, lpCriticalSection uintptr) { 2526 syscall.Syscall(procDeleteCriticalSection.Addr(), 1, lpCriticalSection, 0, 0) 2527 } 2528 2529 // void EnterCriticalSection( 2530 // 2531 // LPCRITICAL_SECTION lpCriticalSection 2532 // 2533 // ); 2534 func XEnterCriticalSection(t *TLS, lpCriticalSection uintptr) { 2535 syscall.Syscall(procEnterCriticalSection.Addr(), 1, lpCriticalSection, 0, 0) 2536 } 2537 2538 // void LeaveCriticalSection( 2539 // 2540 // LPCRITICAL_SECTION lpCriticalSection 2541 // 2542 // ); 2543 func XLeaveCriticalSection(t *TLS, lpCriticalSection uintptr) { 2544 syscall.Syscall(procLeaveCriticalSection.Addr(), 1, lpCriticalSection, 0, 0) 2545 } 2546 2547 func XGetOverlappedResult(t *TLS, _ ...interface{}) int32 { 2548 panic(todo("")) 2549 } 2550 2551 func XSetupComm(t *TLS, _ ...interface{}) int32 { 2552 panic(todo("")) 2553 } 2554 2555 func XSetCommTimeouts(t *TLS, _ ...interface{}) int32 { 2556 panic(todo("")) 2557 } 2558 2559 // void InitializeCriticalSection( 2560 // 2561 // LPCRITICAL_SECTION lpCriticalSection 2562 // 2563 // ); 2564 func XInitializeCriticalSection(t *TLS, lpCriticalSection uintptr) { 2565 // InitializeCriticalSection always succeeds, even in low memory situations. 2566 syscall.Syscall(procInitializeCriticalSection.Addr(), 1, lpCriticalSection, 0, 0) 2567 } 2568 2569 func XBuildCommDCBW(t *TLS, _ ...interface{}) int32 { 2570 panic(todo("")) 2571 } 2572 2573 func XSetCommState(t *TLS, _ ...interface{}) int32 { 2574 panic(todo("")) 2575 } 2576 2577 func X_strnicmp(t *TLS, _ ...interface{}) int32 { 2578 panic(todo("")) 2579 } 2580 2581 func XEscapeCommFunction(t *TLS, _ ...interface{}) int32 { 2582 panic(todo("")) 2583 } 2584 2585 func XGetCommModemStatus(t *TLS, _ ...interface{}) int32 { 2586 panic(todo("")) 2587 } 2588 2589 // BOOL MoveFileW( 2590 // 2591 // LPCWSTR lpExistingFileName, 2592 // LPCWSTR lpNewFileName 2593 // 2594 // ); 2595 func XMoveFileW(t *TLS, lpExistingFileName, lpNewFileName uintptr) int32 { 2596 r0, _, err := syscall.Syscall(procMoveFileW.Addr(), 2, lpExistingFileName, lpNewFileName, 0) 2597 if err != 0 { 2598 t.setErrno(err) 2599 } 2600 return int32(r0) 2601 } 2602 2603 // DWORD GetFullPathNameW( 2604 // 2605 // LPCWSTR lpFileName, 2606 // DWORD nBufferLength, 2607 // LPWSTR lpBuffer, 2608 // LPWSTR *lpFilePart 2609 // 2610 // ); 2611 func XGetFullPathNameW(t *TLS, lpFileName uintptr, nBufferLength uint32, lpBuffer, lpFilePart uintptr) uint32 { 2612 r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, lpFileName, uintptr(nBufferLength), uintptr(lpBuffer), uintptr(lpFilePart), 0, 0) 2613 n := uint32(r0) 2614 if n == 0 { 2615 if e1 != 0 { 2616 t.setErrno(e1) 2617 } else { 2618 t.setErrno(errno.EINVAL) 2619 } 2620 } 2621 return n 2622 } 2623 2624 // LPWSTR CharLowerW( 2625 // 2626 // LPWSTR lpsz 2627 // 2628 // ); 2629 func XCharLowerW(t *TLS, lpsz uintptr) uintptr { 2630 panic(todo("")) 2631 } 2632 2633 // BOOL CreateDirectoryW( 2634 // 2635 // LPCWSTR lpPathName, 2636 // LPSECURITY_ATTRIBUTES lpSecurityAttributes 2637 // 2638 // ); 2639 func XCreateDirectoryW(t *TLS, lpPathName, lpSecurityAttributes uintptr) int32 { 2640 err := syscall.CreateDirectory((*uint16)(unsafe.Pointer(lpPathName)), 2641 (*syscall.SecurityAttributes)(unsafe.Pointer(lpSecurityAttributes))) 2642 if err != nil { 2643 t.setErrno(err) 2644 return 0 2645 } 2646 return 1 2647 } 2648 2649 // BOOL SetFileAttributesW( 2650 // 2651 // LPCWSTR lpFileName, 2652 // DWORD dwFileAttributes 2653 // 2654 // ); 2655 func XSetFileAttributesW(t *TLS, lpFileName uintptr, dwFileAttributes uint32) int32 { 2656 err := syscall.SetFileAttributes((*uint16)(unsafe.Pointer(lpFileName)), dwFileAttributes) 2657 if err != nil { 2658 t.setErrno(err) 2659 return 0 2660 } 2661 return 1 2662 } 2663 2664 // UINT GetTempFileNameW( 2665 // 2666 // LPCWSTR lpPathName, 2667 // LPCWSTR lpPrefixString, 2668 // UINT uUnique, 2669 // LPWSTR lpTempFileName 2670 // 2671 // ); 2672 func XGetTempFileNameW(t *TLS, lpPathName, lpPrefixString uintptr, uUnique uint32, lpTempFileName uintptr) uint32 { 2673 r0, _, e1 := syscall.Syscall6(procGetTempFileNameW.Addr(), 4, lpPathName, lpPrefixString, uintptr(uUnique), lpTempFileName, 0, 0) 2674 if r0 == 0 { 2675 t.setErrno(e1) 2676 } 2677 return uint32(r0) 2678 } 2679 2680 // BOOL CopyFileW( 2681 // 2682 // LPCWSTR lpExistingFileName, 2683 // LPCWSTR lpNewFileName, 2684 // BOOL bFailIfExists 2685 // 2686 // ); 2687 func XCopyFileW(t *TLS, lpExistingFileName, lpNewFileName uintptr, bFailIfExists int32) int32 { 2688 r0, _, e1 := syscall.Syscall(procCopyFileW.Addr(), 3, lpExistingFileName, lpNewFileName, uintptr(bFailIfExists)) 2689 if r0 == 0 { 2690 t.setErrno(e1) 2691 } 2692 return int32(r0) 2693 } 2694 2695 // BOOL DeleteFileW( 2696 // 2697 // LPCWSTR lpFileName 2698 // 2699 // ); 2700 func XDeleteFileW(t *TLS, lpFileName uintptr) int32 { 2701 err := syscall.DeleteFile((*uint16)(unsafe.Pointer(lpFileName))) 2702 if err != nil { 2703 t.setErrno(err) 2704 return 0 2705 } 2706 return 1 2707 } 2708 2709 // BOOL RemoveDirectoryW( 2710 // 2711 // LPCWSTR lpPathName 2712 // 2713 // ); 2714 func XRemoveDirectoryW(t *TLS, lpPathName uintptr) int32 { 2715 err := syscall.RemoveDirectory((*uint16)(unsafe.Pointer(lpPathName))) 2716 if err != nil { 2717 t.setErrno(err) 2718 return 0 2719 } 2720 return 1 2721 } 2722 2723 // HANDLE FindFirstFileW(LPCWSTR lpFileName, LPWIN32_FIND_DATAW lpFindFileData); 2724 func XFindFirstFileW(t *TLS, lpFileName, lpFindFileData uintptr) uintptr { 2725 r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, lpFileName, lpFindFileData, 0) 2726 handle := syscall.Handle(r0) 2727 if handle == syscall.InvalidHandle { 2728 if e1 != 0 { 2729 t.setErrno(e1) 2730 } else { 2731 t.setErrno(errno.EINVAL) 2732 } 2733 } 2734 return r0 2735 } 2736 2737 // HANDLE FindFirstFileExW( 2738 // 2739 // LPCWSTR lpFileName, 2740 // FINDEX_INFO_LEVELS fInfoLevelId, 2741 // LPVOID lpFindFileData, 2742 // FINDEX_SEARCH_OPS fSearchOp, 2743 // LPVOID lpSearchFilter, 2744 // DWORD dwAdditionalFlags 2745 // 2746 // ); 2747 func XFindFirstFileExW(t *TLS, lpFileName uintptr, fInfoLevelId int32, lpFindFileData uintptr, fSearchOp int32, lpSearchFilter uintptr, dwAdditionalFlags uint32) uintptr { 2748 r0, _, e1 := syscall.Syscall6(procFindFirstFileExW.Addr(), 6, lpFileName, uintptr(fInfoLevelId), lpFindFileData, uintptr(fSearchOp), lpSearchFilter, uintptr(dwAdditionalFlags)) 2749 handle := syscall.Handle(r0) 2750 if handle == syscall.InvalidHandle { 2751 if e1 != 0 { 2752 t.setErrno(e1) 2753 } else { 2754 t.setErrno(errno.EINVAL) 2755 } 2756 } 2757 return r0 2758 } 2759 2760 // BOOL FindClose(HANDLE hFindFile); 2761 func XFindClose(t *TLS, hFindFile uintptr) int32 { 2762 r0, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, hFindFile, 0, 0) 2763 if r0 == 0 { 2764 if e1 != 0 { 2765 t.setErrno(e1) 2766 } else { 2767 t.setErrno(errno.EINVAL) 2768 } 2769 } 2770 return int32(r0) 2771 } 2772 2773 // BOOL FindNextFileW( 2774 // 2775 // HANDLE hFindFile, 2776 // LPWIN32_FIND_DATAW lpFindFileData 2777 // 2778 // ); 2779 func XFindNextFileW(t *TLS, hFindFile, lpFindFileData uintptr) int32 { 2780 r0, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, hFindFile, lpFindFileData, 0) 2781 if r0 == 0 { 2782 if e1 != 0 { 2783 t.setErrno(e1) 2784 } else { 2785 t.setErrno(errno.EINVAL) 2786 } 2787 } 2788 return int32(r0) 2789 } 2790 2791 // DWORD GetLogicalDriveStringsA( 2792 // 2793 // DWORD nBufferLength, 2794 // LPSTR lpBuffer 2795 // 2796 // ); 2797 func XGetLogicalDriveStringsA(t *TLS, nBufferLength uint32, lpBuffer uintptr) uint32 { 2798 r0, _, err := syscall.Syscall(procGetLogicalDriveStringsA.Addr(), 2, uintptr(nBufferLength), lpBuffer, 0) 2799 if err != 0 { 2800 t.setErrno(err) 2801 } 2802 return uint32(r0) 2803 } 2804 2805 // BOOL GetVolumeInformationA( 2806 // 2807 // LPCSTR lpRootPathName, 2808 // LPSTR lpVolumeNameBuffer, 2809 // DWORD nVolumeNameSize, 2810 // LPDWORD lpVolumeSerialNumber, 2811 // LPDWORD lpMaximumComponentLength, 2812 // LPDWORD lpFileSystemFlags, 2813 // LPSTR lpFileSystemNameBuffer, 2814 // DWORD nFileSystemNameSize 2815 // 2816 // ); 2817 func XGetVolumeInformationA(t *TLS, lpRootPathName, lpVolumeNameBuffer uintptr, nVolumeNameSize uint32, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer uintptr, nFileSystemNameSize uint32) int32 { 2818 r0, _, err := syscall.Syscall9(procGetVolumeInformationA.Addr(), 8, 2819 lpRootPathName, 2820 lpVolumeNameBuffer, 2821 uintptr(nVolumeNameSize), 2822 lpVolumeSerialNumber, 2823 lpMaximumComponentLength, 2824 lpFileSystemFlags, 2825 lpFileSystemNameBuffer, 2826 uintptr(nFileSystemNameSize), 2827 0, 2828 ) 2829 if err != 0 { 2830 t.setErrno(err) 2831 } 2832 return int32(r0) 2833 } 2834 2835 // BOOL CreateHardLinkW( 2836 // 2837 // LPCWSTR lpFileName, 2838 // LPCWSTR lpExistingFileName, 2839 // LPSECURITY_ATTRIBUTES lpSecurityAttributes 2840 // 2841 // ); 2842 func XCreateHardLinkW(t *TLS, lpFileName, lpExistingFileName, lpSecurityAttributes uintptr) int32 { 2843 r0, _, err := syscall.Syscall(procCreateHardLinkW.Addr(), 1, lpFileName, lpExistingFileName, lpSecurityAttributes) 2844 if err != 0 { 2845 t.setErrno(err) 2846 } 2847 return int32(r0) 2848 } 2849 2850 // BOOL DeviceIoControl( 2851 // 2852 // HANDLE hDevice, 2853 // DWORD dwIoControlCode, 2854 // LPVOID lpInBuffer, 2855 // DWORD nInBufferSize, 2856 // LPVOID lpOutBuffer, 2857 // DWORD nOutBufferSize, 2858 // LPDWORD lpBytesReturned, 2859 // LPOVERLAPPED lpOverlapped 2860 // 2861 // ); 2862 func XDeviceIoControl(t *TLS, hDevice uintptr, dwIoControlCode uint32, lpInBuffer uintptr, nInBufferSize uint32, lpOutBuffer uintptr, nOutBufferSize uint32, lpBytesReturned, lpOverlapped uintptr) int32 { 2863 r0, _, err := syscall.Syscall9(procDeviceIoControl.Addr(), 8, hDevice, uintptr(dwIoControlCode), lpInBuffer, 2864 uintptr(nInBufferSize), lpOutBuffer, uintptr(nOutBufferSize), lpBytesReturned, lpOverlapped, 0) 2865 if r0 == 0 { 2866 t.setErrno(err) 2867 } 2868 return int32(r0) 2869 } 2870 2871 // int wcsncmp( 2872 // 2873 // const wchar_t *string1, 2874 // const wchar_t *string2, 2875 // size_t count 2876 // 2877 // ); 2878 func Xwcsncmp(t *TLS, string1, string2 uintptr, count types.Size_t) int32 { 2879 var s1 = goWideString(string1) 2880 var l1 = len(s1) 2881 var s2 = goWideString(string2) 2882 var l2 = len(s2) 2883 2884 // shorter is lesser 2885 if l1 < l2 { 2886 return -1 2887 } 2888 if l2 > l1 { 2889 return 1 2890 } 2891 2892 // compare at most count 2893 var cmpLen = count 2894 if types.Size_t(l1) < cmpLen { 2895 cmpLen = types.Size_t(l1) 2896 } 2897 return int32(strings.Compare(s1[:cmpLen], s2[:cmpLen])) 2898 } 2899 2900 // int MultiByteToWideChar( 2901 // 2902 // UINT CodePage, 2903 // DWORD dwFlags, 2904 // _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr, 2905 // int cbMultiByte, 2906 // LPWSTR lpWideCharStr, 2907 // int cchWideChar 2908 // 2909 // ); 2910 func XMultiByteToWideChar(t *TLS, CodePage uint32, dwFlags uint32, lpMultiByteStr uintptr, cbMultiByte int32, lpWideCharStr uintptr, cchWideChar int32) int32 { 2911 r1, _, _ := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, 2912 uintptr(CodePage), uintptr(dwFlags), uintptr(lpMultiByteStr), 2913 uintptr(cbMultiByte), uintptr(lpWideCharStr), uintptr(cchWideChar)) 2914 return (int32(r1)) 2915 } 2916 2917 // void OutputDebugStringW( 2918 // 2919 // LPCWSTR lpOutputString 2920 // 2921 // ); 2922 func XOutputDebugStringW(t *TLS, lpOutputString uintptr) { 2923 panic(todo("")) 2924 } 2925 2926 func XMessageBeep(t *TLS, _ ...interface{}) int32 { 2927 panic(todo("")) 2928 } 2929 2930 //==== 2931 2932 // long _InterlockedCompareExchange( 2933 // 2934 // long volatile * Destination, 2935 // long Exchange, 2936 // long Comparand 2937 // 2938 // ); 2939 func X_InterlockedCompareExchange(t *TLS, Destination uintptr, Exchange, Comparand long) long { 2940 2941 // The function returns the initial value of the Destination parameter. 2942 var v = *(*int32)(unsafe.Pointer(Destination)) 2943 _ = atomic.CompareAndSwapInt32((*int32)(unsafe.Pointer(Destination)), Comparand, Exchange) 2944 return long(v) 2945 } 2946 2947 // int rename(const char *oldpath, const char *newpath); 2948 func Xrename(t *TLS, oldpath, newpath uintptr) int32 { 2949 panic(todo("")) 2950 } 2951 2952 // BOOL AreFileApisANSI(); 2953 func XAreFileApisANSI(t *TLS) int32 { 2954 2955 r0, _, _ := syscall.Syscall(procAreFileApisANSI.Addr(), 0, 0, 0, 0) 2956 return int32(r0) 2957 } 2958 2959 // HANDLE CreateFileA( 2960 // 2961 // LPCSTR lpFileName, 2962 // DWORD dwDesiredAccess, 2963 // DWORD dwShareMode, 2964 // LPSECURITY_ATTRIBUTES lpSecurityAttributes, 2965 // DWORD dwCreationDisposition, 2966 // DWORD dwFlagsAndAttributes, 2967 // HANDLE hTemplateFile 2968 // 2969 // ); 2970 func XCreateFileA(t *TLS, lpFileName uintptr, dwDesiredAccess, dwShareMode uint32, 2971 lpSecurityAttributes uintptr, dwCreationDisposition, dwFlagsAndAttributes uint32, hTemplateFile uintptr) uintptr { 2972 2973 r0, _, e1 := syscall.Syscall9(procCreateFileA.Addr(), 7, lpFileName, uintptr(dwDesiredAccess), uintptr(dwShareMode), lpSecurityAttributes, 2974 uintptr(dwCreationDisposition), uintptr(dwFlagsAndAttributes), hTemplateFile, 0, 0) 2975 h := syscall.Handle(r0) 2976 if h == syscall.InvalidHandle { 2977 if e1 != 0 { 2978 t.setErrno(e1) 2979 } else { 2980 t.setErrno(errno.EINVAL) 2981 } 2982 return r0 2983 } 2984 return uintptr(h) 2985 2986 } 2987 2988 // HANDLE CreateFileMappingA( 2989 // 2990 // HANDLE hFile, 2991 // LPSECURITY_ATTRIBUTES lpFileMappingAttributes, 2992 // DWORD flProtect, 2993 // DWORD dwMaximumSizeHigh, 2994 // DWORD dwMaximumSizeLow, 2995 // LPCSTR lpName 2996 // 2997 // ); 2998 func XCreateFileMappingA(t *TLS, hFile, lpFileMappingAttributes uintptr, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow uint32, lpName uintptr) uintptr { 2999 panic(todo("")) 3000 } 3001 3002 // HANDLE CreateFileMappingW( 3003 // 3004 // HANDLE hFile, 3005 // LPSECURITY_ATTRIBUTES lpFileMappingAttributes, 3006 // DWORD flProtect, 3007 // DWORD dwMaximumSizeHigh, 3008 // DWORD dwMaximumSizeLow, 3009 // LPCWSTR lpName 3010 // 3011 // ); 3012 func XCreateFileMappingW(t *TLS, hFile, lpFileMappingAttributes uintptr, flProtect, dwMaximumSizeHigh, dwMaximumSizeLow uint32, lpName uintptr) uintptr { 3013 h, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, hFile, lpFileMappingAttributes, uintptr(flProtect), 3014 uintptr(dwMaximumSizeHigh), uintptr(dwMaximumSizeLow), lpName) 3015 if h == 0 { 3016 if e1 != 0 { 3017 t.setErrno(e1) 3018 } else { 3019 t.setErrno(errno.EINVAL) 3020 } 3021 } 3022 return h 3023 } 3024 3025 // HANDLE CreateMutexW( 3026 // 3027 // LPSECURITY_ATTRIBUTES lpMutexAttributes, 3028 // BOOL bInitialOwner, 3029 // LPCWSTR lpName 3030 // 3031 // ); 3032 func XCreateMutexW(t *TLS, lpMutexAttributes uintptr, bInitialOwner int32, lpName uintptr) uintptr { 3033 panic(todo("")) 3034 } 3035 3036 // BOOL DeleteFileA( 3037 // 3038 // LPCSTR lpFileName 3039 // 3040 // ); 3041 func XDeleteFileA(t *TLS, lpFileName uintptr) int32 { 3042 panic(todo("")) 3043 } 3044 3045 // DWORD FormatMessageA( 3046 // 3047 // DWORD dwFlags, 3048 // LPCVOID lpSource, 3049 // DWORD dwMessageId, 3050 // DWORD dwLanguageId, 3051 // LPSTR lpBuffer, 3052 // DWORD nSize, 3053 // va_list *Arguments 3054 // 3055 // ); 3056 func XFormatMessageA(t *TLS, dwFlagsAndAttributes uint32, lpSource uintptr, dwMessageId, dwLanguageId uint32, lpBuffer uintptr, nSize uint32, Arguments uintptr) uint32 { 3057 panic(todo("")) 3058 } 3059 3060 // DWORD FormatMessageW( 3061 // 3062 // DWORD dwFlags, 3063 // LPCVOID lpSource, 3064 // DWORD dwMessageId, 3065 // DWORD dwLanguageId, 3066 // LPWSTR lpBuffer, 3067 // DWORD nSize, 3068 // va_list *Arguments 3069 // 3070 // ); 3071 func XFormatMessageW(t *TLS, dwFlags uint32, lpSource uintptr, dwMessageId, dwLanguageId uint32, lpBuffer uintptr, nSize uint32, Arguments uintptr) uint32 { 3072 r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, 3073 uintptr(dwFlags), lpSource, uintptr(dwMessageId), uintptr(dwLanguageId), 3074 lpBuffer, uintptr(nSize), Arguments, 0, 0) 3075 n := uint32(r0) 3076 if n == 0 { 3077 if e1 != 0 { 3078 t.setErrno(e1) 3079 } else { 3080 t.setErrno(errno.EINVAL) 3081 } 3082 } 3083 return n 3084 } 3085 3086 // BOOL FreeLibrary(HMODULE hLibModule); 3087 func XFreeLibrary(t *TLS, hLibModule uintptr) int32 { 3088 panic(todo("")) 3089 } 3090 3091 // DWORD GetCurrentProcessId(); 3092 func XGetCurrentProcessId(t *TLS) uint32 { 3093 r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0) 3094 pid := uint32(r0) 3095 return pid 3096 } 3097 3098 // BOOL GetDiskFreeSpaceA( 3099 // 3100 // LPCSTR lpRootPathName, 3101 // LPDWORD lpSectorsPerCluster, 3102 // LPDWORD lpBytesPerSector, 3103 // LPDWORD lpNumberOfFreeClusters, 3104 // LPDWORD lpTotalNumberOfClusters 3105 // 3106 // ); 3107 func XGetDiskFreeSpaceA(t *TLS, lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters uintptr) int32 { 3108 panic(todo("")) 3109 } 3110 3111 // BOOL GetDiskFreeSpaceW( 3112 // 3113 // LPCWSTR lpRootPathName, 3114 // LPDWORD lpSectorsPerCluster, 3115 // LPDWORD lpBytesPerSector, 3116 // LPDWORD lpNumberOfFreeClusters, 3117 // LPDWORD lpTotalNumberOfClusters 3118 // 3119 // ); 3120 func XGetDiskFreeSpaceW(t *TLS, lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters uintptr) int32 { 3121 panic(todo("")) 3122 } 3123 3124 // DWORD GetFileAttributesA( 3125 // 3126 // LPCSTR lpFileName 3127 // 3128 // ); 3129 func XGetFileAttributesA(t *TLS, lpFileName uintptr) uint32 { 3130 r0, _, err := syscall.Syscall(procGetFileAttributesA.Addr(), 1, lpFileName, 0, 0) 3131 if err != 0 { 3132 t.setErrno(err) 3133 } 3134 return uint32(r0) 3135 } 3136 3137 // BOOL GetFileAttributesExW( 3138 // 3139 // LPCWSTR lpFileName, 3140 // GET_FILEEX_INFO_LEVELS fInfoLevelId, 3141 // LPVOID lpFileInformation 3142 // 3143 // ); 3144 func XGetFileAttributesExW(t *TLS, lpFileName uintptr, fInfoLevelId uint32, lpFileInformation uintptr) int32 { 3145 r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, lpFileName, uintptr(fInfoLevelId), lpFileInformation) 3146 if r1 == 0 { 3147 if e1 != 0 { 3148 t.setErrno(e1) 3149 } else { 3150 t.setErrno(errno.EINVAL) 3151 } 3152 return 0 3153 } 3154 return int32(r1) 3155 } 3156 3157 // DWORD GetFileSize( 3158 // 3159 // HANDLE hFile, 3160 // LPDWORD lpFileSizeHigh 3161 // 3162 // ); 3163 func XGetFileSize(t *TLS, hFile, lpFileSizeHigh uintptr) uint32 { 3164 r1, _, e1 := syscall.Syscall(procGetFileSize.Addr(), 2, hFile, lpFileSizeHigh, 0) 3165 if r1 == math.MaxUint32 { 3166 if lpFileSizeHigh == 0 { 3167 // If the function fails and lpFileSizeHigh is NULL, the return value is INVALID_FILE_SIZE. 3168 // Note that if the return value is INVALID_FILE_SIZE (0xffffffff), 3169 // an application must call GetLastError to determine whether the function has succeeded or failed. 3170 t.setErrno(e1) 3171 return math.MaxUint32 3172 } else { 3173 // If the function fails and lpFileSizeHigh is non-NULL, the return value is INVALID_FILE_SIZE 3174 // and GetLastError will return a value other than NO_ERROR. 3175 t.setErrno(e1) 3176 return math.MaxUint32 3177 } 3178 } 3179 return uint32(r1) 3180 } 3181 3182 // DWORD GetFullPathNameA( 3183 // 3184 // LPCSTR lpFileName, 3185 // DWORD nBufferLength, 3186 // LPSTR lpBuffer, 3187 // LPSTR *lpFilePart 3188 // 3189 // ); 3190 func XGetFullPathNameA(t *TLS, lpFileName uintptr, nBufferLength uint32, lpBuffer, lpFilePart uintptr) uint32 { 3191 panic(todo("")) 3192 } 3193 3194 // FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName); 3195 func XGetProcAddress(t *TLS, hModule, lpProcName uintptr) uintptr { 3196 3197 return 0 3198 3199 //panic(todo(GoString(lpProcName))) 3200 // 3201 //r0, _, err := syscall.Syscall(procGetProcAddress.Addr(), 2, hModule, lpProcName, 0) 3202 //if r0 == 0 { 3203 // t.setErrno(err) 3204 //} 3205 //return r0 3206 } 3207 3208 // NTSYSAPI NTSTATUS RtlGetVersion( // ntdll.dll 3209 // 3210 // PRTL_OSVERSIONINFOW lpVersionInformation 3211 // 3212 // ); 3213 func XRtlGetVersion(t *TLS, lpVersionInformation uintptr) uintptr { 3214 panic(todo("")) 3215 } 3216 3217 // void GetSystemInfo( 3218 // 3219 // LPSYSTEM_INFO lpSystemInfo 3220 // 3221 // ); 3222 func XGetSystemInfo(t *TLS, lpSystemInfo uintptr) { 3223 syscall.Syscall(procGetSystemInfo.Addr(), 1, lpSystemInfo, 0, 0) 3224 } 3225 3226 // void GetSystemTime(LPSYSTEMTIME lpSystemTime); 3227 func XGetSystemTime(t *TLS, lpSystemTime uintptr) { 3228 syscall.Syscall(procGetSystemTime.Addr(), 1, lpSystemTime, 0, 0) 3229 } 3230 3231 // void GetSystemTimeAsFileTime( 3232 // 3233 // LPFILETIME lpSystemTimeAsFileTime 3234 // 3235 // ); 3236 func XGetSystemTimeAsFileTime(t *TLS, lpSystemTimeAsFileTime uintptr) { 3237 syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, lpSystemTimeAsFileTime, 0, 0) 3238 } 3239 3240 // DWORD GetTempPathA( 3241 // 3242 // DWORD nBufferLength, 3243 // LPSTR lpBuffer 3244 // 3245 // ); 3246 func XGetTempPathA(t *TLS, nBufferLength uint32, lpBuffer uintptr) uint32 { 3247 panic(todo("")) 3248 } 3249 3250 // DWORD GetTempPathW( 3251 // 3252 // DWORD nBufferLength, 3253 // LPWSTR lpBuffer 3254 // 3255 // ); 3256 func XGetTempPathW(t *TLS, nBufferLength uint32, lpBuffer uintptr) uint32 { 3257 rv, err := syscall.GetTempPath(nBufferLength, (*uint16)(unsafe.Pointer(lpBuffer))) 3258 if err != nil { 3259 t.setErrno(err) 3260 } 3261 return rv 3262 } 3263 3264 // DWORD GetTickCount(); 3265 func XGetTickCount(t *TLS) uint32 { 3266 r0, _, _ := syscall.Syscall(procGetTickCount.Addr(), 0, 0, 0, 0) 3267 return uint32(r0) 3268 } 3269 3270 // BOOL GetVersionExA( 3271 // 3272 // LPOSVERSIONINFOA lpVersionInformation 3273 // 3274 // ); 3275 func XGetVersionExA(t *TLS, lpVersionInformation uintptr) int32 { 3276 r0, _, err := syscall.Syscall(procGetVersionExA.Addr(), 1, lpVersionInformation, 0, 0) 3277 if r0 == 0 { 3278 t.setErrno(err) 3279 } 3280 return int32(r0) 3281 } 3282 3283 // HANDLE HeapCreate( 3284 // 3285 // DWORD flOptions, 3286 // SIZE_T dwInitialSize, 3287 // SIZE_T dwMaximumSize 3288 // 3289 // ); 3290 func XHeapCreate(t *TLS, flOptions uint32, dwInitialSize, dwMaximumSize types.Size_t) uintptr { 3291 panic(todo("")) 3292 } 3293 3294 // BOOL HeapDestroy( 3295 // 3296 // HANDLE hHeap 3297 // 3298 // ); 3299 func XHeapDestroy(t *TLS, hHeap uintptr) int32 { 3300 panic(todo("")) 3301 } 3302 3303 // LPVOID HeapReAlloc( 3304 // 3305 // HANDLE hHeap, 3306 // DWORD dwFlags, 3307 // _Frees_ptr_opt_ LPVOID lpMem, 3308 // SIZE_T dwBytes 3309 // 3310 // ); 3311 func XHeapReAlloc(t *TLS, hHeap uintptr, dwFlags uint32, lpMem uintptr, dwBytes types.Size_t) uintptr { 3312 panic(todo("")) 3313 } 3314 3315 // SIZE_T HeapSize( 3316 // 3317 // HANDLE hHeap, 3318 // DWORD dwFlags, 3319 // LPCVOID lpMem 3320 // 3321 // ); 3322 func XHeapSize(t *TLS, hHeap uintptr, dwFlags uint32, lpMem uintptr) types.Size_t { 3323 panic(todo("")) 3324 } 3325 3326 // BOOL HeapValidate( 3327 // 3328 // HANDLE hHeap, 3329 // DWORD dwFlags, 3330 // LPCVOID lpMem 3331 // 3332 // ); 3333 func XHeapValidate(t *TLS, hHeap uintptr, dwFlags uint32, lpMem uintptr) int32 { 3334 panic(todo("")) 3335 } 3336 3337 // SIZE_T HeapCompact( 3338 // 3339 // HANDLE hHeap, 3340 // DWORD dwFlags 3341 // 3342 // ); 3343 func XHeapCompact(t *TLS, hHeap uintptr, dwFlags uint32) types.Size_t { 3344 panic(todo("")) 3345 } 3346 3347 // HMODULE LoadLibraryA(LPCSTR lpLibFileName); 3348 func XLoadLibraryA(t *TLS, lpLibFileName uintptr) uintptr { 3349 panic(todo("")) 3350 } 3351 3352 // HMODULE LoadLibraryW( 3353 // 3354 // LPCWSTR lpLibFileName 3355 // 3356 // ); 3357 func XLoadLibraryW(t *TLS, lpLibFileName uintptr) uintptr { 3358 panic(todo("")) 3359 } 3360 3361 // HLOCAL LocalFree( 3362 // 3363 // HLOCAL hMem 3364 // 3365 // ); 3366 func XLocalFree(t *TLS, hMem uintptr) uintptr { 3367 h, err := syscall.LocalFree(syscall.Handle(hMem)) 3368 if h != 0 { 3369 if err != nil { 3370 t.setErrno(err) 3371 } else { 3372 t.setErrno(errno.EINVAL) 3373 } 3374 return uintptr(h) 3375 } 3376 return 0 3377 } 3378 3379 // BOOL LockFile( 3380 // 3381 // HANDLE hFile, 3382 // DWORD dwFileOffsetLow, 3383 // DWORD dwFileOffsetHigh, 3384 // DWORD nNumberOfBytesToLockLow, 3385 // DWORD nNumberOfBytesToLockHigh 3386 // 3387 // ); 3388 func XLockFile(t *TLS, hFile uintptr, dwFileOffsetLow, dwFileOffsetHigh, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh uint32) int32 { 3389 3390 r1, _, e1 := syscall.Syscall6(procLockFile.Addr(), 5, 3391 hFile, uintptr(dwFileOffsetLow), uintptr(dwFileOffsetHigh), uintptr(nNumberOfBytesToLockLow), uintptr(nNumberOfBytesToLockHigh), 0) 3392 if r1 == 0 { 3393 if e1 != 0 { 3394 t.setErrno(e1) 3395 } else { 3396 t.setErrno(errno.EINVAL) 3397 } 3398 return 0 3399 } 3400 return int32(r1) 3401 3402 } 3403 3404 // BOOL LockFileEx( 3405 // 3406 // HANDLE hFile, 3407 // DWORD dwFlags, 3408 // DWORD dwReserved, 3409 // DWORD nNumberOfBytesToLockLow, 3410 // DWORD nNumberOfBytesToLockHigh, 3411 // LPOVERLAPPED lpOverlapped 3412 // 3413 // ); 3414 func XLockFileEx(t *TLS, hFile uintptr, dwFlags, dwReserved, nNumberOfBytesToLockLow, nNumberOfBytesToLockHigh uint32, lpOverlapped uintptr) int32 { 3415 r1, _, e1 := syscall.Syscall6(procLockFileEx.Addr(), 6, 3416 hFile, uintptr(dwFlags), uintptr(dwReserved), uintptr(nNumberOfBytesToLockLow), uintptr(nNumberOfBytesToLockHigh), lpOverlapped) 3417 if r1 == 0 { 3418 if e1 != 0 { 3419 t.setErrno(e1) 3420 } else { 3421 t.setErrno(errno.EINVAL) 3422 } 3423 return 0 3424 } 3425 return int32(r1) 3426 } 3427 3428 // LPVOID MapViewOfFile( 3429 // 3430 // HANDLE hFileMappingObject, 3431 // DWORD dwDesiredAccess, 3432 // DWORD dwFileOffsetHigh, 3433 // DWORD dwFileOffsetLow, 3434 // SIZE_T dwNumberOfBytesToMap 3435 // 3436 // ); 3437 func XMapViewOfFile(t *TLS, hFileMappingObject uintptr, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow uint32, dwNumberOfBytesToMap types.Size_t) uintptr { 3438 h, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, hFileMappingObject, uintptr(dwDesiredAccess), 3439 uintptr(dwFileOffsetHigh), uintptr(dwFileOffsetLow), uintptr(dwNumberOfBytesToMap), 0) 3440 if h == 0 { 3441 if e1 != 0 { 3442 t.setErrno(e1) 3443 } else { 3444 t.setErrno(errno.EINVAL) 3445 } 3446 } 3447 return h 3448 } 3449 3450 // BOOL QueryPerformanceCounter( 3451 // 3452 // LARGE_INTEGER *lpPerformanceCount 3453 // 3454 // ); 3455 func XQueryPerformanceCounter(t *TLS, lpPerformanceCount uintptr) int32 { 3456 r0, _, _ := syscall.Syscall(procQueryPerformanceCounter.Addr(), 1, lpPerformanceCount, 0, 0) 3457 return int32(r0) 3458 } 3459 3460 // void Sleep( 3461 // 3462 // DWORD dwMilliseconds 3463 // 3464 // ); 3465 func XSleep(t *TLS, dwMilliseconds uint32) { 3466 gotime.Sleep(gotime.Duration(dwMilliseconds) * gotime.Millisecond) 3467 } 3468 3469 // BOOL SystemTimeToFileTime(const SYSTEMTIME *lpSystemTime, LPFILETIME lpFileTime); 3470 func XSystemTimeToFileTime(t *TLS, lpSystemTime, lpFileTime uintptr) int32 { 3471 r0, _, _ := syscall.Syscall(procSystemTimeToFileTime.Addr(), 2, lpSystemTime, lpFileTime, 0) 3472 return int32(r0) 3473 } 3474 3475 // BOOL UnlockFile( 3476 // 3477 // HANDLE hFile, 3478 // DWORD dwFileOffsetLow, 3479 // DWORD dwFileOffsetHigh, 3480 // DWORD nNumberOfBytesToUnlockLow, 3481 // DWORD nNumberOfBytesToUnlockHigh 3482 // 3483 // ); 3484 func XUnlockFile(t *TLS, hFile uintptr, dwFileOffsetLow, dwFileOffsetHigh, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh uint32) int32 { 3485 r1, _, e1 := syscall.Syscall6(procUnlockFile.Addr(), 5, 3486 hFile, uintptr(dwFileOffsetLow), uintptr(dwFileOffsetHigh), uintptr(nNumberOfBytesToUnlockLow), uintptr(nNumberOfBytesToUnlockHigh), 0) 3487 if r1 == 0 { 3488 if e1 != 0 { 3489 t.setErrno(e1) 3490 } else { 3491 t.setErrno(errno.EINVAL) 3492 } 3493 return 0 3494 } 3495 return int32(r1) 3496 } 3497 3498 // BOOL UnlockFileEx( 3499 // 3500 // HANDLE hFile, 3501 // DWORD dwReserved, 3502 // DWORD nNumberOfBytesToUnlockLow, 3503 // DWORD nNumberOfBytesToUnlockHigh, 3504 // LPOVERLAPPED lpOverlapped 3505 // 3506 // ); 3507 func XUnlockFileEx(t *TLS, hFile uintptr, dwReserved, nNumberOfBytesToUnlockLow, nNumberOfBytesToUnlockHigh uint32, lpOverlapped uintptr) int32 { 3508 r1, _, e1 := syscall.Syscall6(procUnlockFileEx.Addr(), 5, 3509 hFile, uintptr(dwReserved), uintptr(nNumberOfBytesToUnlockLow), uintptr(nNumberOfBytesToUnlockHigh), lpOverlapped, 0) 3510 if r1 == 0 { 3511 if e1 != 0 { 3512 t.setErrno(e1) 3513 } else { 3514 t.setErrno(errno.EINVAL) 3515 } 3516 return 0 3517 } 3518 return int32(r1) 3519 } 3520 3521 // BOOL UnmapViewOfFile( 3522 // 3523 // LPCVOID lpBaseAddress 3524 // 3525 // ); 3526 func XUnmapViewOfFile(t *TLS, lpBaseAddress uintptr) int32 { 3527 err := syscall.UnmapViewOfFile(lpBaseAddress) 3528 if err != nil { 3529 t.setErrno(err) 3530 return 0 3531 } 3532 return 1 3533 } 3534 3535 // int WideCharToMultiByte( 3536 // 3537 // UINT CodePage, 3538 // DWORD dwFlags, 3539 // _In_NLS_string_(cchWideChar)LPCWCH lpWideCharStr, 3540 // int cchWideChar, 3541 // LPSTR lpMultiByteStr, 3542 // int cbMultiByte, 3543 // LPCCH lpDefaultChar, 3544 // LPBOOL lpUsedDefaultChar 3545 // 3546 // ); 3547 func XWideCharToMultiByte(t *TLS, CodePage uint32, dwFlags uint32, lpWideCharStr uintptr, cchWideChar int32, lpMultiByteStr uintptr, cbMultiByte int32, lpDefaultChar, lpUsedDefaultChar uintptr) int32 { 3548 r1, _, _ := syscall.Syscall9(procWideCharToMultiByte.Addr(), 8, 3549 uintptr(CodePage), uintptr(dwFlags), lpWideCharStr, 3550 uintptr(cchWideChar), lpMultiByteStr, uintptr(cbMultiByte), 3551 lpDefaultChar, lpUsedDefaultChar, 0) 3552 return (int32(r1)) 3553 } 3554 3555 // void OutputDebugStringA( 3556 // 3557 // LPCSTR lpOutputString 3558 // 3559 // ) 3560 func XOutputDebugStringA(t *TLS, lpOutputString uintptr) { 3561 panic(todo("")) 3562 } 3563 3564 // BOOL FlushViewOfFile( 3565 // 3566 // LPCVOID lpBaseAddress, 3567 // SIZE_T dwNumberOfBytesToFlush 3568 // 3569 // ); 3570 func XFlushViewOfFile(t *TLS, lpBaseAddress uintptr, dwNumberOfBytesToFlush types.Size_t) int32 { 3571 err := syscall.FlushViewOfFile(lpBaseAddress, uintptr(dwNumberOfBytesToFlush)) 3572 if err != nil { 3573 t.setErrno(err) 3574 return 0 3575 } 3576 return 1 3577 } 3578 3579 type _ino_t = uint16 /* types.h:43:24 */ 3580 type _dev_t = uint32 /* types.h:51:22 */ 3581 type _stat64 = struct { 3582 Fst_dev _dev_t 3583 Fst_ino _ino_t 3584 Fst_mode uint16 3585 Fst_nlink int16 3586 Fst_uid int16 3587 Fst_gid int16 3588 _ [2]byte 3589 Fst_rdev _dev_t 3590 _ [4]byte 3591 Fst_size int64 3592 Fst_atime int64 3593 Fst_mtime int64 3594 Fst_ctime int64 3595 } /* _mingw_stat64.h:83:3 */ 3596 3597 var ( 3598 Windows_Tick int64 = 10000000 3599 SecToUnixEpoch int64 = 11644473600 3600 ) 3601 3602 func WindowsTickToUnixSeconds(windowsTicks int64) int64 { 3603 return (windowsTicks/Windows_Tick - SecToUnixEpoch) 3604 } 3605 3606 // int _stat64(const char *path, struct __stat64 *buffer); 3607 func X_stat64(t *TLS, path, buffer uintptr) int32 { 3608 3609 var fa syscall.Win32FileAttributeData 3610 r1, _, e1 := syscall.Syscall(procGetFileAttributesExA.Addr(), 3, path, syscall.GetFileExInfoStandard, (uintptr)(unsafe.Pointer(&fa))) 3611 if r1 == 0 { 3612 if e1 != 0 { 3613 t.setErrno(e1) 3614 } else { 3615 t.setErrno(errno.EINVAL) 3616 } 3617 return -1 3618 } 3619 3620 var bStat64 = (*_stat64)(unsafe.Pointer(buffer)) 3621 var accessTime = int64(fa.LastAccessTime.HighDateTime)<<32 + int64(fa.LastAccessTime.LowDateTime) 3622 bStat64.Fst_atime = WindowsTickToUnixSeconds(accessTime) 3623 var modTime = int64(fa.LastWriteTime.HighDateTime)<<32 + int64(fa.LastWriteTime.LowDateTime) 3624 bStat64.Fst_mtime = WindowsTickToUnixSeconds(modTime) 3625 var crTime = int64(fa.CreationTime.HighDateTime)<<32 + int64(fa.CreationTime.LowDateTime) 3626 bStat64.Fst_ctime = WindowsTickToUnixSeconds(crTime) 3627 var fSz = int64(fa.FileSizeHigh)<<32 + int64(fa.FileSizeLow) 3628 bStat64.Fst_size = fSz 3629 bStat64.Fst_mode = WindowsAttrbiutesToStat(fa.FileAttributes) 3630 3631 return 0 3632 } 3633 3634 func WindowsAttrbiutesToStat(fa uint32) uint16 { 3635 var src_mode = fa & 0xff 3636 var st_mode uint16 3637 if (src_mode & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 { 3638 st_mode = syscall.S_IFDIR 3639 } else { 3640 st_mode = syscall.S_IFREG 3641 } 3642 3643 if src_mode&syscall.FILE_ATTRIBUTE_READONLY != 0 { 3644 st_mode = st_mode | syscall.S_IRUSR 3645 } else { 3646 st_mode = st_mode | syscall.S_IRUSR | syscall.S_IWUSR 3647 } 3648 // fill group fields 3649 st_mode = st_mode | (st_mode&0x700)>>3 3650 st_mode = st_mode | (st_mode&0x700)>>6 3651 return st_mode 3652 } 3653 3654 // int _chsize( 3655 // 3656 // int fd, 3657 // long size 3658 // 3659 // ); 3660 func X_chsize(t *TLS, fd int32, size long) int32 { 3661 3662 f, ok := fdToFile(fd) 3663 if !ok { 3664 t.setErrno(EBADF) 3665 return -1 3666 } 3667 3668 err := syscall.Ftruncate(f.Handle, int64(size)) 3669 if err != nil { 3670 t.setErrno(err) 3671 return -1 3672 } 3673 3674 return 0 3675 } 3676 3677 // int _snprintf(char *str, size_t size, const char *format, ...); 3678 func X_snprintf(t *TLS, str uintptr, size types.Size_t, format, args uintptr) int32 { 3679 return Xsnprintf(t, str, size, format, args) 3680 } 3681 3682 const wErr_ERROR_INSUFFICIENT_BUFFER = 122 3683 3684 func win32FindDataToFileInfo(t *TLS, fdata *stat.X_finddata64i32_t, wfd *syscall.Win32finddata) int32 { 3685 // t64 = 64-bit time value 3686 var accessTime = int64(wfd.LastAccessTime.HighDateTime)<<32 + int64(wfd.LastAccessTime.LowDateTime) 3687 fdata.Ftime_access = WindowsTickToUnixSeconds(accessTime) 3688 var modTime = int64(wfd.LastWriteTime.HighDateTime)<<32 + int64(wfd.LastWriteTime.LowDateTime) 3689 fdata.Ftime_write = WindowsTickToUnixSeconds(modTime) 3690 var crTime = int64(wfd.CreationTime.HighDateTime)<<32 + int64(wfd.CreationTime.LowDateTime) 3691 fdata.Ftime_create = WindowsTickToUnixSeconds(crTime) 3692 // i32 = 32-bit size 3693 fdata.Fsize = wfd.FileSizeLow 3694 fdata.Fattrib = wfd.FileAttributes 3695 3696 var cp = XGetConsoleCP(t) 3697 var wcFn = (uintptr)(unsafe.Pointer(&wfd.FileName[0])) 3698 var mbcsFn = (uintptr)(unsafe.Pointer(&fdata.Fname[0])) 3699 rv := XWideCharToMultiByte(t, cp, 0, wcFn, -1, mbcsFn, 260, 0, 0) 3700 if rv == wErr_ERROR_INSUFFICIENT_BUFFER { 3701 t.setErrno(errno.ENOMEM) 3702 return -1 3703 } 3704 return 0 3705 } 3706 3707 // intptr_t _findfirst64i32( 3708 // 3709 // const char *filespec, 3710 // struct _finddata64i32_t *fileinfo 3711 // 3712 // ); 3713 func X_findfirst64i32(t *TLS, filespec, fileinfo uintptr) types.Intptr_t { 3714 3715 // Note: this is the 'narrow' character findfirst -- expects output 3716 // as mbcs -- conversion below -- via ToFileInfo 3717 3718 var gsFileSpec = GoString(filespec) 3719 namep, err := syscall.UTF16PtrFromString(gsFileSpec) 3720 if err != nil { 3721 t.setErrno(err) 3722 return types.Intptr_t(-1) 3723 } 3724 3725 var fdata = (*stat.X_finddata64i32_t)(unsafe.Pointer(fileinfo)) 3726 var wfd syscall.Win32finddata 3727 h, err := syscall.FindFirstFile((*uint16)(unsafe.Pointer(namep)), &wfd) 3728 if err != nil { 3729 t.setErrno(err) 3730 return types.Intptr_t(-1) 3731 } 3732 rv := win32FindDataToFileInfo(t, fdata, &wfd) 3733 if rv != 0 { 3734 if h != 0 { 3735 syscall.FindClose(h) 3736 } 3737 return types.Intptr_t(-1) 3738 } 3739 return types.Intptr_t(h) 3740 } 3741 3742 // int _findnext64i32( 3743 // 3744 // intptr_t handle, 3745 // struct _finddata64i32_t *fileinfo 3746 // 3747 // ); 3748 func X_findnext64i32(t *TLS, handle types.Intptr_t, fileinfo uintptr) int32 { 3749 3750 var fdata = (*stat.X_finddata64i32_t)(unsafe.Pointer(fileinfo)) 3751 var wfd syscall.Win32finddata 3752 3753 err := syscall.FindNextFile(syscall.Handle(handle), &wfd) 3754 if err != nil { 3755 t.setErrno(err) 3756 return -1 3757 } 3758 3759 rv := win32FindDataToFileInfo(t, fdata, &wfd) 3760 if rv != 0 { 3761 return -1 3762 } 3763 return 0 3764 } 3765 3766 // int _findclose( 3767 // 3768 // intptr_t handle 3769 // 3770 // ); 3771 func X_findclose(t *TLS, handle types.Intptr_t) int32 { 3772 3773 err := syscall.FindClose(syscall.Handle(handle)) 3774 if err != nil { 3775 t.setErrno(err) 3776 return -1 3777 } 3778 return 0 3779 } 3780 3781 // DWORD GetEnvironmentVariableA( 3782 // 3783 // LPCSTR lpName, 3784 // LPSTR lpBuffer, 3785 // DWORD nSize 3786 // 3787 // ); 3788 func XGetEnvironmentVariableA(t *TLS, lpName, lpBuffer uintptr, nSize uint32) uint32 { 3789 r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableA.Addr(), 3, lpName, lpBuffer, uintptr(nSize)) 3790 n := uint32(r0) 3791 if n == 0 { 3792 if e1 != 0 { 3793 t.setErrno(e1) 3794 } else { 3795 t.setErrno(errno.EINVAL) 3796 } 3797 } 3798 return n 3799 } 3800 3801 // int _fstat64( 3802 // 3803 // int fd, 3804 // struct __stat64 *buffer 3805 // 3806 // ); 3807 func X_fstat64(t *TLS, fd int32, buffer uintptr) int32 { 3808 3809 f, ok := fdToFile(fd) 3810 if !ok { 3811 t.setErrno(EBADF) 3812 return -1 3813 } 3814 3815 var d syscall.ByHandleFileInformation 3816 err := syscall.GetFileInformationByHandle(f.Handle, &d) 3817 if err != nil { 3818 t.setErrno(EBADF) 3819 return -1 3820 } 3821 3822 var bStat64 = (*_stat64)(unsafe.Pointer(buffer)) 3823 var accessTime = int64(d.LastAccessTime.HighDateTime)<<32 + int64(d.LastAccessTime.LowDateTime) 3824 bStat64.Fst_atime = WindowsTickToUnixSeconds(accessTime) 3825 var modTime = int64(d.LastWriteTime.HighDateTime)<<32 + int64(d.LastWriteTime.LowDateTime) 3826 bStat64.Fst_mtime = WindowsTickToUnixSeconds(modTime) 3827 var crTime = int64(d.CreationTime.HighDateTime)<<32 + int64(d.CreationTime.LowDateTime) 3828 bStat64.Fst_ctime = WindowsTickToUnixSeconds(crTime) 3829 var fSz = int64(d.FileSizeHigh)<<32 + int64(d.FileSizeLow) 3830 bStat64.Fst_size = fSz 3831 bStat64.Fst_mode = WindowsAttrbiutesToStat(d.FileAttributes) 3832 3833 return 0 3834 } 3835 3836 // HANDLE CreateEventA( 3837 // 3838 // LPSECURITY_ATTRIBUTES lpEventAttributes, 3839 // BOOL bManualReset, 3840 // BOOL bInitialState, 3841 // LPCSTR lpName 3842 // 3843 // ); 3844 func XCreateEventA(t *TLS, lpEventAttributes uintptr, bManualReset, bInitialState int32, lpName uintptr) uintptr { 3845 r0, _, err := syscall.Syscall6(procCreateEventA.Addr(), 4, lpEventAttributes, uintptr(bManualReset), 3846 uintptr(bInitialState), lpName, 0, 0) 3847 if r0 == 0 { 3848 t.setErrno(err) 3849 } 3850 return r0 3851 } 3852 3853 // BOOL WINAPI CancelSynchronousIo( 3854 // 3855 // _In_ HANDLE hThread 3856 // 3857 // ); 3858 func XCancelSynchronousIo(t *TLS, hThread uintptr) int32 { 3859 panic(todo("")) 3860 } 3861 3862 func X_endthreadex(t *TLS, _ ...interface{}) { 3863 // NOOP 3864 } 3865 3866 // The calling convention for beginthread is cdecl -- but in this 3867 // case we're just intercepting it and sending it through CreateThread which expects stdcall 3868 // and gets that via the go callback. This is safe because the thread is calling into go 3869 // not a cdecl function which would expect the stack setup of cdecl. 3870 func X_beginthread(t *TLS, procAddr uintptr, stack_sz uint32, args uintptr) int32 { 3871 f := (*struct{ f func(*TLS, uintptr) uint32 })(unsafe.Pointer(&struct{ uintptr }{procAddr})).f 3872 var tAdp = ThreadAdapter{threadFunc: f, tls: NewTLS(), param: args} 3873 tAdp.token = addObject(&tAdp) 3874 3875 r0, _, err := syscall.Syscall6(procCreateThread.Addr(), 6, 0, uintptr(stack_sz), 3876 threadCallback, tAdp.token, 0, 0) 3877 if r0 == 0 { 3878 t.setErrno(err) 3879 } 3880 return int32(r0) 3881 } 3882 3883 // uintptr_t _beginthreadex( // NATIVE CODE 3884 // 3885 // void *security, 3886 // unsigned stack_size, 3887 // unsigned ( __stdcall *start_address )( void * ), 3888 // void *arglist, 3889 // unsigned initflag, 3890 // unsigned *thrdaddr 3891 // 3892 // ); 3893 func X_beginthreadex(t *TLS, _ uintptr, stack_sz uint32, procAddr uintptr, args uintptr, initf uint32, thAddr uintptr) int32 { 3894 f := (*struct{ f func(*TLS, uintptr) uint32 })(unsafe.Pointer(&struct{ uintptr }{procAddr})).f 3895 var tAdp = ThreadAdapter{threadFunc: f, tls: NewTLS(), param: args} 3896 tAdp.token = addObject(&tAdp) 3897 3898 r0, _, err := syscall.Syscall6(procCreateThread.Addr(), 6, 0, uintptr(stack_sz), 3899 threadCallback, tAdp.token, uintptr(initf), thAddr) 3900 if r0 == 0 { 3901 t.setErrno(err) 3902 } 3903 return int32(r0) 3904 } 3905 3906 // DWORD GetCurrentThreadId(); 3907 func XGetCurrentThreadId(t *TLS) uint32 { 3908 r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0) 3909 return uint32(r0) 3910 //return uint32(t.ID) 3911 } 3912 3913 // BOOL GetExitCodeThread( 3914 // 3915 // HANDLE hThread, 3916 // LPDWORD lpExitCode 3917 // 3918 // ); 3919 func XGetExitCodeThread(t *TLS, hThread, lpExitCode uintptr) int32 { 3920 r0, _, _ := syscall.Syscall(procGetExitCodeThread.Addr(), 2, hThread, lpExitCode, 0) 3921 return int32(r0) 3922 } 3923 3924 // DWORD WaitForSingleObjectEx( 3925 // 3926 // HANDLE hHandle, 3927 // DWORD dwMilliseconds, 3928 // BOOL bAlertable 3929 // 3930 // ); 3931 func XWaitForSingleObjectEx(t *TLS, hHandle uintptr, dwMilliseconds uint32, bAlertable int32) uint32 { 3932 rv, _, _ := syscall.Syscall(procWaitForSingleObjectEx.Addr(), 3, hHandle, uintptr(dwMilliseconds), uintptr(bAlertable)) 3933 return uint32(rv) 3934 } 3935 3936 // DWORD MsgWaitForMultipleObjectsEx( 3937 // 3938 // DWORD nCount, 3939 // const HANDLE *pHandles, 3940 // DWORD dwMilliseconds, 3941 // DWORD dwWakeMask, 3942 // DWORD dwFlags 3943 // 3944 // ); 3945 func XMsgWaitForMultipleObjectsEx(t *TLS, nCount uint32, pHandles uintptr, dwMilliseconds, dwWakeMask, dwFlags uint32) uint32 { 3946 r0, _, err := syscall.Syscall6(procMsgWaitForMultipleObjectsEx.Addr(), 5, 3947 uintptr(nCount), 3948 pHandles, 3949 uintptr(dwMilliseconds), 3950 uintptr(dwWakeMask), 3951 uintptr(dwFlags), 3952 0, 3953 ) 3954 if err != 0 { 3955 t.setErrno(err) 3956 } 3957 return uint32(r0) 3958 } 3959 3960 func XMessageBoxW(t *TLS, _ ...interface{}) int32 { 3961 panic(todo("")) 3962 } 3963 3964 // DWORD GetModuleFileNameW( 3965 // 3966 // HMODULE hModule, 3967 // LPWSTR lpFileName, 3968 // DWORD nSize 3969 // 3970 // ); 3971 func XGetModuleFileNameW(t *TLS, hModule, lpFileName uintptr, nSize uint32) uint32 { 3972 r0, _, err := syscall.Syscall(procGetModuleFileNameW.Addr(), 3, hModule, lpFileName, uintptr(nSize)) 3973 if r0 == 0 { 3974 t.setErrno(err) 3975 } 3976 return uint32(r0) 3977 } 3978 3979 // NET_API_STATUS NET_API_FUNCTION NetGetDCName( 3980 // 3981 // LPCWSTR ServerName, 3982 // LPCWSTR DomainName, 3983 // LPBYTE *Buffer 3984 // 3985 // ); 3986 func XNetGetDCName(t *TLS, ServerName, DomainName, Buffer uintptr) int32 { 3987 r0, _, err := syscall.Syscall(procNetGetDCName.Addr(), 3, ServerName, DomainName, Buffer) 3988 if err != 0 { 3989 t.setErrno(err) 3990 } 3991 return int32(r0) 3992 } 3993 3994 // NET_API_STATUS NET_API_FUNCTION NetUserGetInfo( 3995 // 3996 // LPCWSTR servername, 3997 // LPCWSTR username, 3998 // DWORD level, 3999 // LPBYTE *bufptr 4000 // 4001 // ); 4002 func XNetUserGetInfo(t *TLS, servername, username uintptr, level uint32, bufptr uintptr) uint32 { 4003 r0, _, err := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, 4004 servername, 4005 username, 4006 uintptr(level), 4007 bufptr, 4008 0, 4009 0, 4010 ) 4011 if err != 0 { 4012 t.setErrno(err) 4013 } 4014 return uint32(r0) 4015 } 4016 4017 func XlstrlenW(t *TLS, _ ...interface{}) int32 { 4018 panic(todo("")) 4019 } 4020 4021 // USERENVAPI BOOL GetProfilesDirectoryW( 4022 // 4023 // [out] LPWSTR lpProfileDir, 4024 // [in, out] LPDWORD lpcchSize 4025 // 4026 // ); 4027 func XGetProfilesDirectoryW(t *TLS, lpProfileDir, lpcchSize uintptr) int32 { 4028 r0, _, err := syscall.Syscall(procGetProfilesDirectoryW.Addr(), 2, lpProfileDir, lpcchSize, 0) 4029 if err != 0 { 4030 t.setErrno(err) 4031 } 4032 return int32(r0) 4033 } 4034 4035 func XNetApiBufferFree(t *TLS, _ ...interface{}) int32 { 4036 panic(todo("")) 4037 } 4038 4039 // DWORD GetPrivateProfileStringA( 4040 // 4041 // LPCSTR lpAppName, 4042 // LPCSTR lpKeyName, 4043 // LPCSTR lpDefault, 4044 // LPSTR lpReturnedString, 4045 // DWORD nSize, 4046 // LPCSTR lpFileName 4047 // 4048 // ); 4049 func XGetPrivateProfileStringA(t *TLS, lpAppName, lpKeyName, lpDefault, lpReturnedString uintptr, nSize uint32, lpFileName uintptr) uint32 { 4050 r0, _, err := syscall.Syscall6(procGetPrivateProfileStringA.Addr(), 4, 4051 lpAppName, 4052 lpKeyName, 4053 lpDefault, 4054 lpReturnedString, 4055 uintptr(nSize), 4056 lpFileName, 4057 ) 4058 if err != 0 { 4059 t.setErrno(0x02) 4060 } 4061 return uint32(r0) 4062 } 4063 4064 func XGetWindowsDirectoryA(t *TLS, _ ...interface{}) int32 { 4065 panic(todo("")) 4066 } 4067 4068 // BOOL GetFileSecurityW( 4069 // 4070 // LPCSTR lpFileName, 4071 // SECURITY_INFORMATION RequestedInformation, 4072 // PSECURITY_DESCRIPTOR pSecurityDescriptor, 4073 // DWORD nLength, 4074 // LPDWORD lpnLengthNeeded 4075 // 4076 // ); 4077 func XGetFileSecurityW(t *TLS, lpFileName uintptr, RequestedInformation uint32, pSecurityDescriptor uintptr, nLength uint32, lpnLengthNeeded uintptr) int32 { 4078 r0, _, err := syscall.Syscall6(procGetFileSecurityW.Addr(), 5, lpFileName, uintptr(RequestedInformation), pSecurityDescriptor, uintptr(nLength), lpnLengthNeeded, 0) 4079 if err != 0 { 4080 t.setErrno(err) 4081 } 4082 return int32(r0) 4083 } 4084 4085 // BOOL GetSecurityDescriptorOwner( 4086 // 4087 // PSECURITY_DESCRIPTOR pSecurityDescriptor, 4088 // PSID *pOwner, 4089 // LPBOOL lpbOwnerDefaulted 4090 // 4091 // ); 4092 func XGetSecurityDescriptorOwner(t *TLS, pSecurityDescriptor, pOwner, lpbOwnerDefaulted uintptr) int32 { 4093 r0, _, err := syscall.Syscall(procGetSecurityDescriptorOwner.Addr(), 3, pSecurityDescriptor, pOwner, lpbOwnerDefaulted) 4094 if err != 0 { 4095 t.setErrno(err) 4096 } 4097 return int32(r0) 4098 4099 } 4100 4101 // PSID_IDENTIFIER_AUTHORITY GetSidIdentifierAuthority( 4102 // 4103 // PSID pSid 4104 // 4105 // ); 4106 func XGetSidIdentifierAuthority(t *TLS, pSid uintptr) uintptr { 4107 r0, _, err := syscall.Syscall(procGetSidIdentifierAuthority.Addr(), 1, pSid, 0, 0) 4108 if err != 0 { 4109 t.setErrno(err) 4110 } 4111 return r0 4112 } 4113 4114 // BOOL ImpersonateSelf( 4115 // 4116 // SECURITY_IMPERSONATION_LEVEL ImpersonationLevel 4117 // 4118 // ); 4119 func XImpersonateSelf(t *TLS, ImpersonationLevel int32) int32 { 4120 r0, _, err := syscall.Syscall(procImpersonateSelf.Addr(), 1, uintptr(ImpersonationLevel), 0, 0) 4121 if err != 0 { 4122 t.setErrno(err) 4123 } 4124 return int32(r0) 4125 } 4126 4127 // BOOL OpenThreadToken( 4128 // 4129 // HANDLE ThreadHandle, 4130 // DWORD DesiredAccess, 4131 // BOOL OpenAsSelf, 4132 // PHANDLE TokenHandle 4133 // 4134 // ); 4135 func XOpenThreadToken(t *TLS, ThreadHandle uintptr, DesiredAccess uint32, OpenAsSelf int32, TokenHandle uintptr) int32 { 4136 r0, _, err := syscall.Syscall6(procOpenThreadToken.Addr(), 4, ThreadHandle, uintptr(DesiredAccess), uintptr(OpenAsSelf), TokenHandle, 0, 0) 4137 if err != 0 { 4138 t.setErrno(err) 4139 } 4140 return int32(r0) 4141 } 4142 4143 // HANDLE GetCurrentThread(); 4144 func XGetCurrentThread(t *TLS) uintptr { 4145 r0, _, err := syscall.Syscall(procGetCurrentThread.Addr(), 0, 0, 0, 0) 4146 if err != 0 { 4147 t.setErrno(err) 4148 } 4149 return r0 4150 } 4151 4152 // BOOL RevertToSelf(); 4153 func XRevertToSelf(t *TLS) int32 { 4154 r0, _, err := syscall.Syscall(procRevertToSelf.Addr(), 0, 0, 0, 0) 4155 if err != 0 { 4156 t.setErrno(err) 4157 } 4158 return int32(r0) 4159 } 4160 4161 // BOOL AccessCheck( 4162 // 4163 // PSECURITY_DESCRIPTOR pSecurityDescriptor, 4164 // HANDLE ClientToken, 4165 // DWORD DesiredAccess, 4166 // PGENERIC_MAPPING GenericMapping, 4167 // PPRIVILEGE_SET PrivilegeSet, 4168 // LPDWORD PrivilegeSetLength, 4169 // LPDWORD GrantedAccess, 4170 // LPBOOL AccessStatus 4171 // 4172 // ); 4173 func XAccessCheck(t *TLS, pSecurityDescriptor, ClientToken uintptr, DesiredAccess uint32, GenericMapping, PrivilegeSet, PrivilegeSetLength, GrantedAccess, AccessStatus uintptr) int32 { 4174 r0, _, err := syscall.Syscall9(procAccessCheck.Addr(), 8, 4175 pSecurityDescriptor, 4176 ClientToken, 4177 uintptr(DesiredAccess), 4178 GenericMapping, 4179 PrivilegeSet, 4180 PrivilegeSetLength, 4181 GrantedAccess, 4182 AccessStatus, 4183 0, 4184 ) 4185 if err != 0 { 4186 t.setErrno(err) 4187 } 4188 return int32(r0) 4189 } 4190 4191 // int _wcsicmp( 4192 // 4193 // const wchar_t *string1, 4194 // const wchar_t *string2 4195 // 4196 // ); 4197 func Xwcsicmp(t *TLS, string1, string2 uintptr) int32 { 4198 var s1 = strings.ToLower(goWideString(string1)) 4199 var s2 = strings.ToLower(goWideString(string2)) 4200 return int32(strings.Compare(s1, s2)) 4201 } 4202 4203 // BOOL SetCurrentDirectoryW( 4204 // 4205 // LPCTSTR lpPathName 4206 // 4207 // ); 4208 func XSetCurrentDirectoryW(t *TLS, lpPathName uintptr) int32 { 4209 err := syscall.SetCurrentDirectory((*uint16)(unsafe.Pointer(lpPathName))) 4210 if err != nil { 4211 t.setErrno(err) 4212 return 0 4213 } 4214 return 1 4215 } 4216 4217 // DWORD GetCurrentDirectory( 4218 // 4219 // DWORD nBufferLength, 4220 // LPWTSTR lpBuffer 4221 // 4222 // ); 4223 func XGetCurrentDirectoryW(t *TLS, nBufferLength uint32, lpBuffer uintptr) uint32 { 4224 n, err := syscall.GetCurrentDirectory(nBufferLength, (*uint16)(unsafe.Pointer(lpBuffer))) 4225 if err != nil { 4226 t.setErrno(err) 4227 } 4228 return n 4229 } 4230 4231 // BOOL GetFileInformationByHandle( 4232 // 4233 // HANDLE hFile, 4234 // LPBY_HANDLE_FILE_INFORMATION lpFileInformation 4235 // 4236 // ); 4237 func XGetFileInformationByHandle(t *TLS, hFile, lpFileInformation uintptr) int32 { 4238 r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, hFile, lpFileInformation, 0) 4239 if r1 == 0 { 4240 if e1 != 0 { 4241 t.setErrno(e1) 4242 } else { 4243 t.setErrno(errno.EINVAL) 4244 } 4245 } 4246 return int32(r1) 4247 } 4248 4249 // BOOL GetVolumeInformationW( 4250 // 4251 // LPCWSTR lpRootPathName, 4252 // LPWSTR lpVolumeNameBuffer, 4253 // DWORD nVolumeNameSize, 4254 // LPDWORD lpVolumeSerialNumber, 4255 // LPDWORD lpMaximumComponentLength, 4256 // LPDWORD lpFileSystemFlags, 4257 // LPWSTR lpFileSystemNameBuffer, 4258 // DWORD nFileSystemNameSize 4259 // 4260 // ); 4261 func XGetVolumeInformationW(t *TLS, lpRootPathName, lpVolumeNameBuffer uintptr, nVolumeNameSize uint32, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer uintptr, nFileSystemNameSize uint32) int32 { 4262 r0, _, err := syscall.Syscall9(procGetVolumeInformationW.Addr(), 8, 4263 lpRootPathName, 4264 lpVolumeNameBuffer, 4265 uintptr(nVolumeNameSize), 4266 lpVolumeSerialNumber, 4267 lpMaximumComponentLength, 4268 lpFileSystemFlags, 4269 lpFileSystemNameBuffer, 4270 uintptr(nFileSystemNameSize), 4271 0, 4272 ) 4273 if err != 0 { 4274 t.setErrno(err) 4275 } 4276 return int32(r0) 4277 } 4278 4279 // wchar_t *wcschr( 4280 // 4281 // const wchar_t *str, 4282 // wchar_t c 4283 // 4284 // ); 4285 func Xwcschr(t *TLS, str uintptr, c wchar_t) uintptr { 4286 var source = str 4287 for { 4288 var buf = *(*uint16)(unsafe.Pointer(source)) 4289 if buf == 0 { 4290 return 0 4291 } 4292 if buf == c { 4293 return source 4294 } 4295 // wchar_t = 2 bytes 4296 source++ 4297 source++ 4298 } 4299 } 4300 4301 // BOOL SetFileTime( 4302 // 4303 // HANDLE hFile, 4304 // const FILETIME *lpCreationTime, 4305 // const FILETIME *lpLastAccessTime, 4306 // const FILETIME *lpLastWriteTime 4307 // 4308 // ); 4309 func XSetFileTime(t *TLS, hFile uintptr, lpCreationTime, lpLastAccessTime, lpLastWriteTime uintptr) int32 { 4310 panic(todo("")) 4311 } 4312 4313 // DWORD GetNamedSecurityInfoW( 4314 // 4315 // LPCWSTR pObjectName, 4316 // SE_OBJECT_TYPE ObjectType, 4317 // SECURITY_INFORMATION SecurityInfo, 4318 // PSID *ppsidOwner, 4319 // PSID *ppsidGroup, 4320 // PACL *ppDacl, 4321 // PACL *ppSacl, 4322 // PSECURITY_DESCRIPTOR *ppSecurityDescriptor 4323 // 4324 // ); 4325 func XGetNamedSecurityInfoW(t *TLS, pObjectName uintptr, ObjectType, SecurityInfo uint32, ppsidOwner, ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor uintptr) uint32 { 4326 panic(todo("")) 4327 } 4328 4329 // BOOL OpenProcessToken( 4330 // 4331 // HANDLE ProcessHandle, 4332 // DWORD DesiredAccess, 4333 // PHANDLE TokenHandle 4334 // 4335 // ); 4336 func XOpenProcessToken(t *TLS, ProcessHandle uintptr, DesiredAccess uint32, TokenHandle uintptr) int32 { 4337 panic(todo("")) 4338 } 4339 4340 // BOOL GetTokenInformation( 4341 // 4342 // HANDLE TokenHandle, 4343 // TOKEN_INFORMATION_CLASS TokenInformationClass, 4344 // LPVOID TokenInformation, 4345 // DWORD TokenInformationLength, 4346 // PDWORD ReturnLength 4347 // 4348 // ); 4349 func XGetTokenInformation(t *TLS, TokenHandle uintptr, TokenInformationClass uint32, TokenInformation uintptr, TokenInformationLength uint32, ReturnLength uintptr) int32 { 4350 panic(todo("")) 4351 } 4352 4353 // BOOL EqualSid( 4354 // 4355 // PSID pSid1, 4356 // PSID pSid2 4357 // 4358 // ); 4359 func XEqualSid(t *TLS, pSid1, pSid2 uintptr) int32 { 4360 panic(todo("")) 4361 } 4362 4363 // int WSAStartup( 4364 // 4365 // WORD wVersionRequired, 4366 // LPWSADATA lpWSAData 4367 // 4368 // ); 4369 func XWSAStartup(t *TLS, wVersionRequired uint16, lpWSAData uintptr) int32 { 4370 r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(wVersionRequired), lpWSAData, 0) 4371 if r0 != 0 { 4372 t.setErrno(r0) 4373 } 4374 return int32(r0) 4375 } 4376 4377 // HMODULE GetModuleHandleA(LPCSTR lpModuleName); 4378 func XGetModuleHandleA(t *TLS, lpModuleName uintptr) uintptr { 4379 r0, _, err := syscall.Syscall(procGetModuleHandleA.Addr(), 1, lpModuleName, 0, 0) 4380 if r0 == 0 { 4381 t.setErrno(err) 4382 } 4383 return r0 4384 } 4385 4386 // HMODULE GetModuleHandleW( 4387 // 4388 // LPCWSTR lpModuleName 4389 // 4390 // ); 4391 func XGetModuleHandleW(t *TLS, lpModuleName uintptr) uintptr { 4392 r0, _, err := syscall.Syscall(procGetModuleHandleW.Addr(), 1, lpModuleName, 0, 0) 4393 if r0 == 0 { 4394 t.setErrno(err) 4395 } 4396 return r0 4397 } 4398 4399 // DWORD GetEnvironmentVariableW( 4400 // 4401 // LPCWSTR lpName, 4402 // LPWSTR lpBuffer, 4403 // DWORD nSize 4404 // 4405 // ); 4406 func XGetEnvironmentVariableW(t *TLS, lpName, lpBuffer uintptr, nSize uint32) uint32 { 4407 r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, lpName, lpBuffer, uintptr(nSize)) 4408 n := uint32(r0) 4409 if n == 0 { 4410 if e1 != 0 { 4411 t.setErrno(e1) 4412 } else { 4413 t.setErrno(errno.EINVAL) 4414 } 4415 } 4416 return n 4417 } 4418 4419 // int lstrcmpiA( 4420 // 4421 // LPCSTR lpString1, 4422 // LPCSTR lpString2 4423 // 4424 // ); 4425 func XlstrcmpiA(t *TLS, lpString1, lpString2 uintptr) int32 { 4426 var s1 = strings.ToLower(GoString(lpString1)) 4427 var s2 = strings.ToLower(GoString(lpString2)) 4428 return int32(strings.Compare(s1, s2)) 4429 } 4430 4431 func XGetModuleFileNameA(t *TLS, _ ...interface{}) int32 { 4432 panic(todo("")) 4433 } 4434 4435 // UINT GetACP(); 4436 func XGetACP(t *TLS) uint32 { 4437 r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0) 4438 return uint32(r0) 4439 } 4440 4441 // BOOL GetUserNameW( 4442 // 4443 // LPWSTR lpBuffer, 4444 // LPDWORD pcbBuffer 4445 // 4446 // ); 4447 func XGetUserNameW(t *TLS, lpBuffer, pcbBuffer uintptr) int32 { 4448 u, err := user.Current() 4449 if err != nil { 4450 panic(todo("")) 4451 return 0 4452 } 4453 4454 wcnt := *(*uint16)(unsafe.Pointer(pcbBuffer)) 4455 s := utf16.Encode([]rune(u.Username)) 4456 if len(s)+1 > int(wcnt) { 4457 panic(todo("")) 4458 } 4459 4460 *(*uint16)(unsafe.Pointer(pcbBuffer)) = uint16(len(s) + 1) 4461 for _, v := range s { 4462 *(*uint16)(unsafe.Pointer(lpBuffer)) = v 4463 lpBuffer += 2 4464 } 4465 return 1 4466 } 4467 4468 // HMODULE LoadLibraryExW( 4469 // 4470 // LPCWSTR lpLibFileName, 4471 // HANDLE hFile, 4472 // DWORD dwFlags 4473 // 4474 // ); 4475 func XLoadLibraryExW(t *TLS, lpLibFileName, hFile uintptr, dwFlags uint32) uintptr { 4476 return 0 // If the function fails, the return value is NULL. 4477 } 4478 4479 // wchar_t *wcscpy( 4480 // 4481 // wchar_t *strDestination, 4482 // const wchar_t *strSource 4483 // 4484 // ); 4485 func Xwcscpy(t *TLS, strDestination, strSource uintptr) uintptr { 4486 if strSource == 0 { 4487 return 0 4488 } 4489 4490 d := strDestination 4491 for { 4492 c := *(*uint16)(unsafe.Pointer(strSource)) 4493 strSource += 2 4494 *(*uint16)(unsafe.Pointer(d)) = c 4495 d += 2 4496 if c == 0 { 4497 return strDestination 4498 } 4499 } 4500 } 4501 4502 func XwsprintfW(t *TLS, _ ...interface{}) int32 { 4503 panic(todo("")) 4504 } 4505 4506 // ATOM RegisterClassW( 4507 // 4508 // const WNDCLASSW *lpWndClass 4509 // 4510 // ); 4511 func XRegisterClassW(t *TLS, lpWndClass uintptr) int32 { 4512 r0, _, err := syscall.Syscall(procRegisterClassW.Addr(), 1, lpWndClass, 0, 0) 4513 if r0 == 0 { 4514 t.setErrno(err) 4515 } 4516 return int32(r0) 4517 } 4518 4519 func XKillTimer(t *TLS, _ ...interface{}) int32 { 4520 panic(todo("")) 4521 } 4522 4523 func XDestroyWindow(t *TLS, _ ...interface{}) int32 { 4524 panic(todo("")) 4525 } 4526 4527 // BOOL UnregisterClassW( 4528 // 4529 // LPCWSTR lpClassName, 4530 // HINSTANCE hInstance 4531 // 4532 // ); 4533 func XUnregisterClassW(t *TLS, lpClassName, hInstance uintptr) int32 { 4534 r0, _, err := syscall.Syscall(procUnregisterClassW.Addr(), 2, lpClassName, hInstance, 0) 4535 if r0 == 0 { 4536 t.setErrno(err) 4537 } 4538 return int32(r0) 4539 } 4540 4541 func XPostMessageW(t *TLS, _ ...interface{}) int32 { 4542 panic(todo("")) 4543 } 4544 4545 func XSetTimer(t *TLS, _ ...interface{}) int32 { 4546 panic(todo("")) 4547 } 4548 4549 // HWND CreateWindowExW( 4550 // 4551 // DWORD dwExStyle, 4552 // LPCWSTR lpClassName, 4553 // LPCWSTR lpWindowName, 4554 // DWORD dwStyle, 4555 // int X, 4556 // int Y, 4557 // int nWidth, 4558 // int nHeight, 4559 // HWND hWndParent, 4560 // HMENU hMenu, 4561 // HINSTANCE hInstance, 4562 // LPVOID lpParam 4563 // 4564 // ); 4565 func XCreateWindowExW(t *TLS, dwExStyle uint32, lpClassName, lpWindowName uintptr, dwStyle uint32, x, y, nWidth, nHeight int32, hWndParent, hMenu, hInstance, lpParam uintptr) uintptr { 4566 r0, _, err := syscall.Syscall12(procCreateWindowExW.Addr(), 12, 4567 uintptr(dwExStyle), 4568 lpClassName, 4569 lpWindowName, 4570 uintptr(dwStyle), 4571 uintptr(x), 4572 uintptr(y), 4573 uintptr(nWidth), 4574 uintptr(nHeight), 4575 hWndParent, 4576 hMenu, 4577 hInstance, 4578 lpParam, 4579 ) 4580 if err != 0 { 4581 t.setErrno(err) 4582 } 4583 return r0 4584 } 4585 4586 // BOOL PeekMessageW( 4587 // 4588 // LPMSG lpMsg, 4589 // HWND hWnd, 4590 // UINT wMsgFilterMin, 4591 // UINT wMsgFilterMax, 4592 // UINT wRemoveMsg 4593 // 4594 // ); 4595 func XPeekMessageW(t *TLS, lpMsg, hWnd uintptr, wMsgFilterMin, wMsgFilterMax, wRemoveMsg uint32) int32 { 4596 r0, _, err := syscall.Syscall6(procPeekMessageW.Addr(), 5, 4597 lpMsg, 4598 hWnd, 4599 uintptr(wMsgFilterMin), 4600 uintptr(wMsgFilterMax), 4601 uintptr(wRemoveMsg), 4602 0, 4603 ) 4604 if err != 0 { 4605 t.setErrno(err) 4606 } 4607 return int32(r0) 4608 } 4609 4610 func XGetMessageW(t *TLS, _ ...interface{}) int32 { 4611 panic(todo("")) 4612 } 4613 4614 func XPostQuitMessage(t *TLS, _ ...interface{}) int32 { 4615 panic(todo("")) 4616 } 4617 4618 func XTranslateMessage(t *TLS, _ ...interface{}) int32 { 4619 panic(todo("")) 4620 } 4621 4622 func XDispatchMessageW(t *TLS, _ ...interface{}) int32 { 4623 panic(todo("")) 4624 } 4625 4626 // DWORD SleepEx( 4627 // 4628 // DWORD dwMilliseconds, 4629 // BOOL bAlertable 4630 // 4631 // ); 4632 func XSleepEx(t *TLS, dwMilliseconds uint32, bAlertable int32) uint32 { 4633 r0, _, _ := syscall.Syscall(procSleepEx.Addr(), 2, uintptr(dwMilliseconds), uintptr(bAlertable), 0) 4634 return uint32(r0) 4635 } 4636 4637 // BOOL CreatePipe( 4638 // 4639 // PHANDLE hReadPipe, 4640 // PHANDLE hWritePipe, 4641 // LPSECURITY_ATTRIBUTES lpPipeAttributes, 4642 // DWORD nSize 4643 // 4644 // ); 4645 func XCreatePipe(t *TLS, hReadPipe, hWritePipe, lpPipeAttributes uintptr, nSize uint32) int32 { 4646 r0, _, err := syscall.Syscall6(procCreatePipe.Addr(), 4, hReadPipe, hWritePipe, lpPipeAttributes, uintptr(nSize), 0, 0) 4647 if r0 == 0 { 4648 t.setErrno(err) 4649 } 4650 return int32(r0) 4651 } 4652 4653 // BOOL CreateProcessW( 4654 // 4655 // LPCWSTR lpApplicationName, 4656 // LPWSTR lpCommandLine, 4657 // LPSECURITY_ATTRIBUTES lpProcessAttributes, 4658 // LPSECURITY_ATTRIBUTES lpThreadAttributes, 4659 // BOOL bInheritHandles, 4660 // DWORD dwCreationFlags, 4661 // LPVOID lpEnvironment, 4662 // LPCWSTR lpCurrentDirectory, 4663 // LPSTARTUPINFOW lpStartupInfo, 4664 // LPPROCESS_INFORMATION lpProcessInformation 4665 // 4666 // ); 4667 func XCreateProcessW(t *TLS, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes uintptr, bInheritHandles int32, dwCreationFlags uint32, 4668 lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation uintptr) int32 { 4669 4670 r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, 4671 uintptr(bInheritHandles), uintptr(dwCreationFlags), lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, 0, 0) 4672 if r1 == 0 { 4673 if e1 != 0 { 4674 t.setErrno(e1) 4675 } else { 4676 t.setErrno(errno.EINVAL) 4677 } 4678 } 4679 4680 return int32(r1) 4681 } 4682 4683 // DWORD WaitForInputIdle( 4684 // 4685 // HANDLE hProcess, 4686 // DWORD dwMilliseconds 4687 // 4688 // ); 4689 func XWaitForInputIdle(t *TLS, hProcess uintptr, dwMilliseconds uint32) int32 { 4690 r0, _, _ := syscall.Syscall(procWaitForInputIdle.Addr(), 2, hProcess, uintptr(dwMilliseconds), 0) 4691 return int32(r0) 4692 } 4693 4694 // DWORD SearchPathW( 4695 // 4696 // LPCWSTR lpPath, 4697 // LPCWSTR lpFileName, 4698 // LPCWSTR lpExtension, 4699 // DWORD nBufferLength, 4700 // LPWSTR lpBuffer, 4701 // LPWSTR *lpFilePart 4702 // 4703 // ); 4704 func XSearchPathW(t *TLS, lpPath, lpFileName, lpExtension uintptr, nBufferLength uint32, lpBuffer, lpFilePart uintptr) int32 { 4705 r0, _, err := syscall.Syscall6(procSearchPathW.Addr(), 6, lpPath, lpFileName, lpExtension, uintptr(nBufferLength), lpBuffer, lpFilePart) 4706 if r0 == 0 { 4707 t.setErrno(err) 4708 } 4709 return int32(r0) 4710 } 4711 4712 func XGetShortPathNameW(t *TLS, _ ...interface{}) int32 { 4713 panic(todo("")) 4714 } 4715 4716 // BOOL GetExitCodeProcess( 4717 // 4718 // HANDLE hProcess, 4719 // LPDWORD lpExitCode 4720 // 4721 // ); 4722 func XGetExitCodeProcess(t *TLS, hProcess, lpExitCode uintptr) int32 { 4723 r0, _, err := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, hProcess, lpExitCode, 0) 4724 if r0 == 0 { 4725 t.setErrno(err) 4726 } 4727 return int32(r0) 4728 } 4729 4730 // BOOL PeekNamedPipe( 4731 // 4732 // HANDLE hNamedPipe, 4733 // LPVOID lpBuffer, 4734 // DWORD nBufferSize, 4735 // LPDWORD lpBytesRead, 4736 // LPDWORD lpTotalBytesAvail, 4737 // LPDWORD lpBytesLeftThisMessage 4738 // 4739 // ); 4740 func XPeekNamedPipe(t *TLS, hNamedPipe, lpBuffer uintptr, nBufferSize uint32, lpBytesRead, lpTotalBytesAvail, lpBytesLeftThisMessage uintptr) int32 { 4741 r0, _, err := syscall.Syscall6(procPeekNamedPipe.Addr(), 6, hNamedPipe, lpBuffer, uintptr(nBufferSize), lpBytesRead, lpTotalBytesAvail, lpBytesLeftThisMessage) 4742 if r0 == 0 { 4743 t.setErrno(err) 4744 } 4745 return int32(r0) 4746 } 4747 4748 // long _InterlockedExchange( 4749 // 4750 // long volatile * Target, 4751 // long Value 4752 // 4753 // ); 4754 func X_InterlockedExchange(t *TLS, Target uintptr, Value long) long { 4755 old := atomic.SwapInt32((*int32)(unsafe.Pointer(Target)), Value) 4756 return old 4757 } 4758 4759 // BOOL TerminateThread( 4760 // 4761 // [in, out] HANDLE hThread, 4762 // [in] DWORD dwExitCode 4763 // 4764 // ); 4765 func XTerminateThread(t *TLS, hThread uintptr, dwExitCode uint32) int32 { 4766 r0, _, err := syscall.Syscall(procTerminateThread.Addr(), 2, hThread, uintptr(dwExitCode), 0) 4767 if err != 0 { 4768 t.setErrno(err) 4769 } 4770 return int32(r0) 4771 } 4772 4773 // BOOL GetComputerNameW( 4774 // 4775 // LPWSTR lpBuffer, 4776 // LPDWORD nSize 4777 // 4778 // ); 4779 func XGetComputerNameW(t *TLS, lpBuffer, nSize uintptr) int32 { 4780 panic(todo("")) 4781 } 4782 4783 func Xgethostname(t *TLS, _ ...interface{}) int32 { 4784 panic(todo("")) 4785 } 4786 4787 func XSendMessageW(t *TLS, _ ...interface{}) int32 { 4788 panic(todo("")) 4789 } 4790 4791 func XWSAGetLastError(t *TLS, _ ...interface{}) int32 { 4792 panic(todo("")) 4793 } 4794 4795 func Xclosesocket(t *TLS, _ ...interface{}) int32 { 4796 panic(todo("")) 4797 } 4798 4799 func XWspiapiFreeAddrInfo(t *TLS, _ ...interface{}) int32 { 4800 panic(todo("")) 4801 } 4802 4803 func XWspiapiGetNameInfo(t *TLS, _ ...interface{}) int32 { 4804 panic(todo("")) 4805 } 4806 4807 func XIN6_ADDR_EQUAL(t *TLS, _ ...interface{}) int32 { 4808 panic(todo("")) 4809 } 4810 4811 func X__ccgo_in6addr_anyp(t *TLS, _ ...interface{}) int32 { 4812 panic(todo("")) 4813 } 4814 4815 func XIN6_IS_ADDR_V4MAPPED(t *TLS, _ ...interface{}) int32 { 4816 panic(todo("")) 4817 } 4818 4819 func XSetHandleInformation(t *TLS, _ ...interface{}) int32 { 4820 panic(todo("")) 4821 } 4822 4823 func Xioctlsocket(t *TLS, _ ...interface{}) int32 { 4824 panic(todo("")) 4825 } 4826 4827 func XGetWindowLongPtrW(t *TLS, _ ...interface{}) int32 { 4828 panic(todo("")) 4829 } 4830 4831 func XSetWindowLongPtrW(t *TLS, _ ...interface{}) int32 { 4832 panic(todo("")) 4833 } 4834 4835 func XWSAAsyncSelect(t *TLS, _ ...interface{}) int32 { 4836 panic(todo("")) 4837 } 4838 4839 func Xinet_ntoa(t *TLS, _ ...interface{}) uintptr { 4840 panic(todo("")) 4841 } 4842 4843 func X_controlfp(t *TLS, _ ...interface{}) uint32 { 4844 panic(todo("")) 4845 } 4846 4847 // BOOL QueryPerformanceFrequency( 4848 // 4849 // LARGE_INTEGER *lpFrequency 4850 // 4851 // ); 4852 func XQueryPerformanceFrequency(t *TLS, lpFrequency uintptr) int32 { 4853 4854 r1, _, err := syscall.Syscall(procQueryPerformanceFrequency.Addr(), 1, lpFrequency, 0, 0) 4855 if r1 == 0 { 4856 t.setErrno(err) 4857 return 0 4858 } 4859 return int32(r1) 4860 } 4861 4862 func inDST(t gotime.Time) bool { 4863 4864 jan1st := gotime.Date(t.Year(), 1, 1, 0, 0, 0, 0, t.Location()) // January 1st is always outside DST window 4865 4866 _, off1 := t.Zone() 4867 _, off2 := jan1st.Zone() 4868 4869 return off1 != off2 4870 } 4871 4872 // void _ftime( struct _timeb *timeptr ); 4873 func X_ftime(t *TLS, timeptr uintptr) { 4874 var tm = gotime.Now() 4875 var tPtr = (*time.X__timeb64)(unsafe.Pointer(timeptr)) 4876 tPtr.Ftime = tm.Unix() 4877 tPtr.Fmillitm = uint16(gotime.Duration(tm.Nanosecond()) / gotime.Millisecond) 4878 if inDST(tm) { 4879 tPtr.Fdstflag = 1 4880 } 4881 _, offset := tm.Zone() 4882 tPtr.Ftimezone = int16(offset) 4883 } 4884 4885 func Xgmtime(t *TLS, _ ...interface{}) uintptr { 4886 panic(todo("")) 4887 } 4888 4889 func XDdeInitializeW(t *TLS, _ ...interface{}) uint32 { 4890 panic(todo("")) 4891 } 4892 4893 func XDdeCreateStringHandleW(t *TLS, _ ...interface{}) uintptr { 4894 panic(todo("")) 4895 } 4896 4897 func XDdeNameService(t *TLS, _ ...interface{}) int32 { 4898 panic(todo("")) 4899 } 4900 4901 func X_snwprintf(t *TLS, _ ...interface{}) int32 { 4902 panic(todo("")) 4903 } 4904 4905 func XDdeQueryStringW(t *TLS, _ ...interface{}) int32 { 4906 panic(todo("")) 4907 } 4908 4909 // int _wcsicmp( 4910 // 4911 // const wchar_t *string1, 4912 // const wchar_t *string2 4913 // 4914 // ); 4915 func X_wcsicmp(t *TLS, string1, string2 uintptr) int32 { 4916 return Xwcsicmp(t, string1, string2) 4917 } 4918 4919 func XDdeCreateDataHandle(t *TLS, _ ...interface{}) uintptr { 4920 panic(todo("")) 4921 } 4922 4923 func XDdeAccessData(t *TLS, _ ...interface{}) uintptr { 4924 panic(todo("")) 4925 } 4926 4927 func XDdeUnaccessData(t *TLS, _ ...interface{}) int32 { 4928 panic(todo("")) 4929 } 4930 4931 func XDdeUninitialize(t *TLS, _ ...interface{}) int32 { 4932 panic(todo("")) 4933 } 4934 4935 func XDdeConnect(t *TLS, _ ...interface{}) uintptr { 4936 panic(todo("")) 4937 } 4938 4939 func XDdeFreeStringHandle(t *TLS, _ ...interface{}) int32 { 4940 panic(todo("")) 4941 } 4942 4943 func XRegisterClassExW(t *TLS, _ ...interface{}) int32 { 4944 panic(todo("")) 4945 } 4946 4947 func XGlobalGetAtomNameW(t *TLS, _ ...interface{}) int32 { 4948 panic(todo("")) 4949 } 4950 4951 func XGlobalAddAtomW(t *TLS, _ ...interface{}) uint16 { 4952 panic(todo("")) 4953 } 4954 4955 func XEnumWindows(t *TLS, _ ...interface{}) int32 { 4956 panic(todo("")) 4957 } 4958 4959 func XIsWindow(t *TLS, _ ...interface{}) int32 { 4960 panic(todo("")) 4961 } 4962 4963 func XGlobalDeleteAtom(t *TLS, _ ...interface{}) int32 { 4964 panic(todo("")) 4965 } 4966 4967 func XDdeGetLastError(t *TLS, _ ...interface{}) uint32 { 4968 panic(todo("")) 4969 } 4970 4971 // HDDEDATA DdeClientTransaction( 4972 // 4973 // LPBYTE pData, 4974 // DWORD cbData, 4975 // HCONV hConv, 4976 // HSZ hszItem, 4977 // UINT wFmt, 4978 // UINT wType, 4979 // DWORD dwTimeout, 4980 // LPDWORD pdwResult 4981 // 4982 // ); 4983 func XDdeClientTransaction(t *TLS, pData uintptr, cbData uint32, hConv uintptr, hszItem uintptr, wFmt, wType, dwTimeout uint32, pdwResult uintptr) uintptr { 4984 panic(todo("")) 4985 } 4986 4987 func XDdeAbandonTransaction(t *TLS, _ ...interface{}) int32 { 4988 panic(todo("")) 4989 } 4990 4991 func XDdeFreeDataHandle(t *TLS, _ ...interface{}) int32 { 4992 panic(todo("")) 4993 } 4994 4995 func XDdeGetData(t *TLS, _ ...interface{}) int32 { 4996 panic(todo("")) 4997 } 4998 4999 func XDdeDisconnect(t *TLS, _ ...interface{}) int32 { 5000 panic(todo("")) 5001 } 5002 5003 func XRegCloseKey(t *TLS, _ ...interface{}) int32 { 5004 panic(todo("")) 5005 } 5006 5007 func XRegDeleteValueW(t *TLS, _ ...interface{}) int32 { 5008 panic(todo("")) 5009 } 5010 5011 func XRegEnumKeyExW(t *TLS, _ ...interface{}) int32 { 5012 panic(todo("")) 5013 } 5014 5015 func XRegQueryValueExW(t *TLS, _ ...interface{}) int32 { 5016 panic(todo("")) 5017 } 5018 5019 func XRegEnumValueW(t *TLS, _ ...interface{}) int32 { 5020 panic(todo("")) 5021 } 5022 5023 func XRegConnectRegistryW(t *TLS, _ ...interface{}) int32 { 5024 panic(todo("")) 5025 } 5026 5027 func XRegCreateKeyExW(t *TLS, _ ...interface{}) int32 { 5028 panic(todo("")) 5029 } 5030 5031 func XRegOpenKeyExW(t *TLS, _ ...interface{}) int32 { 5032 panic(todo("")) 5033 } 5034 5035 func XRegDeleteKeyW(t *TLS, _ ...interface{}) int32 { 5036 panic(todo("")) 5037 } 5038 5039 func XRegSetValueExW(t *TLS, _ ...interface{}) int32 { 5040 panic(todo("")) 5041 } 5042 5043 // int _vsnwprintf( 5044 // 5045 // wchar_t *buffer, 5046 // size_t count, 5047 // const wchar_t *format, 5048 // va_list argptr 5049 // 5050 // ); 5051 func X__mingw_vsnwprintf(t *TLS, buffer uintptr, count types.Size_t, format, va uintptr) int32 { 5052 panic(todo("")) 5053 } 5054 5055 // int vprintf(const char *format, va_list ap); 5056 func X__mingw_vprintf(t *TLS, s, ap uintptr) int32 { return Xvprintf(t, s, ap) } 5057 5058 // int vfscanf(FILE * restrict stream, const char * restrict format, va_list arg); 5059 func X__mingw_vfscanf(t *TLS, stream, format, ap uintptr) int32 { 5060 panic(todo("")) 5061 } 5062 5063 // int vsscanf(const char *str, const char *format, va_list ap); 5064 func X__mingw_vsscanf(t *TLS, str, format, ap uintptr) int32 { 5065 return Xsscanf(t, str, format, ap) 5066 } 5067 5068 // int vfprintf(FILE * restrict stream, const char * restrict format, va_list arg); 5069 func X__mingw_vfprintf(t *TLS, f uintptr, format, va uintptr) int32 { 5070 return Xvfprintf(t, f, format, va) 5071 } 5072 5073 // int vsprintf(char * restrict s, const char * restrict format, va_list arg); 5074 func X__mingw_vsprintf(t *TLS, s, format, ap uintptr) int32 { 5075 return Xvsprintf(t, s, format, ap) 5076 } 5077 5078 // int vsnprintf(char *str, size_t size, const char *format, va_list ap); 5079 func X__mingw_vsnprintf(t *TLS, str uintptr, size types.Size_t, format, ap uintptr) int32 { 5080 panic(todo("")) 5081 } 5082 5083 // int putchar(int char) 5084 func X_putchar(t *TLS, c int32) int32 { 5085 if _, err := fwrite(unistd.STDOUT_FILENO, []byte{byte(c)}); err != nil { 5086 return -1 5087 } 5088 return int32(byte(c)) 5089 } 5090 5091 // int vfwscanf(FILE *stream, const wchar_t *format, va_list argptr;); 5092 func X__mingw_vfwscanf(t *TLS, stream uintptr, format, ap uintptr) int32 { 5093 panic(todo("")) 5094 } 5095 5096 // int vswscanf(const wchar_t *buffer, const wchar_t *format, va_list arglist); 5097 func X__mingw_vswscanf(t *TLS, stream uintptr, format, ap uintptr) int32 { 5098 panic(todo("")) 5099 } 5100 5101 // int vfwprintf(FILE * restrict stream, const wchar_t * restrict format, va_list arg); 5102 func X__mingw_vfwprintf(t *TLS, stream, format, ap uintptr) int32 { 5103 panic(todo("")) 5104 } 5105 5106 // int putchar(int c); 5107 func Xputchar(t *TLS, c int32) int32 { 5108 panic(todo("")) 5109 } 5110 5111 // void _assert( 5112 // 5113 // char const* message, 5114 // char const* filename, 5115 // unsigned line 5116 // 5117 // ); 5118 func X_assert(t *TLS, message, filename uintptr, line uint32) { 5119 panic(todo("")) 5120 } 5121 5122 // char *strdup(const char *s); 5123 func X_strdup(t *TLS, s uintptr) uintptr { 5124 panic(todo("")) 5125 } 5126 5127 // int _access( 5128 // 5129 // const char *path, 5130 // int mode 5131 // 5132 // ); 5133 func X_access(t *TLS, pathname uintptr, mode int32) int32 { 5134 5135 var path = GoString(pathname) 5136 5137 info, err := os.Stat(path) 5138 if err != nil { 5139 // doesn't exist 5140 return errno.ENOENT 5141 } 5142 5143 switch mode { 5144 case 0: 5145 // exists 5146 return 0 5147 case 2: 5148 // write-only 5149 // Check if the user bit is enabled in file permission 5150 if info.Mode().Perm()&(1<<(uint(7))) == 1 { 5151 // write-able 5152 return 0 5153 } 5154 case 4: 5155 // read-only 5156 // Check if the user bit is enabled in file permission 5157 if info.Mode().Perm()&(1<<(uint(7))) == 0 { 5158 // not set, so read-only 5159 return 0 5160 } 5161 case 6: 5162 // r/w 5163 if info.Mode().Perm()&(1<<(uint(7))) == 1 { 5164 // write-able 5165 return 0 5166 } 5167 } 5168 5169 return errno.EACCES 5170 5171 } 5172 5173 // BOOL WINAPI SetConsoleCtrlHandler( 5174 // 5175 // _In_opt_ PHANDLER_ROUTINE HandlerRoutine, 5176 // _In_ BOOL Add 5177 // 5178 // ); 5179 func XSetConsoleCtrlHandler(t *TLS, HandlerRoutine uintptr, Add int32) int32 { 5180 5181 //var fcc = &struct { 5182 // f func(*TLS, uint32) int32 5183 //}{} 5184 //fcc = (*struct{ f func(*TLS, uint32) int32 })(unsafe.Pointer(HandlerRoutine)) 5185 //var hdlr = fcc.f 5186 // 5187 //_, _, err := procSetConsoleCtrlHandler.Call( 5188 //syscall.NewCallback(func(controlType uint) uint { 5189 // return uint( hdlr(t, uint32(controlType)) ) 5190 // }), 1) 5191 // 5192 //if err != nil { 5193 // panic("failed: SetConsoleCtrlHandler") 5194 //} 5195 5196 return 0 5197 } 5198 5199 // DebugBreak 5200 func XDebugBreak(t *TLS) { 5201 panic(todo("")) 5202 } 5203 5204 // int _isatty( int fd ); 5205 func X_isatty(t *TLS, fd int32) int32 { 5206 5207 f, ok := fdToFile(fd) 5208 if !ok { 5209 t.setErrno(errno.EBADF) 5210 return 0 5211 } 5212 5213 if fd == unistd.STDOUT_FILENO || 5214 fd == unistd.STDIN_FILENO || 5215 fd == unistd.STDERR_FILENO { 5216 var mode uint32 5217 err := syscall.GetConsoleMode(f.Handle, &mode) 5218 if err != nil { 5219 t.setErrno(errno.EINVAL) 5220 return 0 5221 } 5222 // is console 5223 return 1 5224 } 5225 5226 return 0 5227 } 5228 5229 // BOOL WINAPI SetConsoleTextAttribute( 5230 // 5231 // _In_ HANDLE hConsoleOutput, 5232 // _In_ WORD wAttributes 5233 // 5234 // ); 5235 func XSetConsoleTextAttribute(t *TLS, hConsoleOutput uintptr, wAttributes uint16) int32 { 5236 r1, _, _ := syscall.Syscall(procSetConsoleTextAttribute.Addr(), 2, hConsoleOutput, uintptr(wAttributes), 0) 5237 return int32(r1) 5238 } 5239 5240 // BOOL WINAPI GetConsoleScreenBufferInfo( 5241 // 5242 // _In_ HANDLE hConsoleOutput, 5243 // _Out_ PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo 5244 // 5245 // ); 5246 func XGetConsoleScreenBufferInfo(t *TLS, hConsoleOutput, lpConsoleScreenBufferInfo uintptr) int32 { 5247 r1, _, _ := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, hConsoleOutput, lpConsoleScreenBufferInfo, 0) 5248 return int32(r1) 5249 } 5250 5251 // FILE *_popen( 5252 // 5253 // const char *command, 5254 // const char *mode 5255 // 5256 // ); 5257 func X_popen(t *TLS, command, mode uintptr) uintptr { 5258 panic(todo("")) 5259 } 5260 5261 // int _wunlink( 5262 // 5263 // const wchar_t *filename 5264 // 5265 // ); 5266 func X_wunlink(t *TLS, filename uintptr) int32 { 5267 panic(todo("")) 5268 } 5269 5270 func Xclosedir(tls *TLS, dir uintptr) int32 { 5271 panic(todo("")) 5272 } 5273 5274 func Xopendir(tls *TLS, name uintptr) uintptr { 5275 panic(todo("")) 5276 } 5277 5278 func Xreaddir(tls *TLS, dir uintptr) uintptr { 5279 panic(todo("")) 5280 } 5281 5282 // int _unlink( 5283 // 5284 // const char *filename 5285 // 5286 // ); 5287 func X_unlink(t *TLS, filename uintptr) int32 { 5288 panic(todo("")) 5289 } 5290 5291 // int pclose(FILE *stream); 5292 func X_pclose(t *TLS, stream uintptr) int32 { 5293 panic(todo("")) 5294 } 5295 5296 // int setmode (int fd, int mode); 5297 func Xsetmode(t *TLS, fd, mode int32) int32 { 5298 return X_setmode(t, fd, mode) 5299 } 5300 5301 // int _setmode (int fd, int mode); 5302 func X_setmode(t *TLS, fd, mode int32) int32 { 5303 5304 _, ok := fdToFile(fd) 5305 if !ok { 5306 t.setErrno(errno.EBADF) 5307 return -1 5308 } 5309 5310 // we're always in binary mode. 5311 // at least for now. 5312 5313 if mode == fcntl.O_BINARY { 5314 return fcntl.O_BINARY 5315 } else { 5316 t.setErrno(errno.EINVAL) 5317 return -1 5318 } 5319 } 5320 5321 // int _mkdir(const char *dirname); 5322 func X_mkdir(t *TLS, dirname uintptr) int32 { 5323 panic(todo("")) 5324 } 5325 5326 // int _chmod( const char *filename, int pmode ); 5327 func X_chmod(t *TLS, filename uintptr, pmode int32) int32 { 5328 panic(todo("")) 5329 } 5330 5331 // int _fileno(FILE *stream); 5332 func X_fileno(t *TLS, stream uintptr) int32 { 5333 f, ok := winGetObject(stream).(*file) 5334 if !ok { 5335 t.setErrno(errno.EBADF) 5336 return -1 5337 } 5338 return f._fd 5339 } 5340 5341 // void rewind(FILE *stream); 5342 func Xrewind(t *TLS, stream uintptr) { 5343 Xfseek(t, stream, 0, unistd.SEEK_SET) 5344 } 5345 5346 // __atomic_load_n 5347 func X__atomic_load_n(t *TLS) { 5348 panic(todo("")) 5349 } 5350 5351 // __atomic_store_n 5352 func X__atomic_store_n(t *TLS, _ ...interface{}) int32 { 5353 panic(todo("")) 5354 } 5355 5356 // __builtin_add_overflow 5357 func X__builtin_add_overflow(t *TLS) { 5358 panic(todo("")) 5359 } 5360 5361 // __builtin_mul_overflow 5362 func X__builtin_mul_overflow(t *TLS) { 5363 panic(todo("")) 5364 } 5365 5366 // __builtin_sub_overflow 5367 func X__builtin_sub_overflow(t *TLS) { 5368 panic(todo("")) 5369 } 5370 5371 func goWideBytes(p uintptr, n int) []uint16 { 5372 b := GoBytes(p, 2*n) 5373 var w []uint16 5374 for i := 0; i < len(b); i += 2 { 5375 w = append(w, *(*uint16)(unsafe.Pointer(&b[i]))) 5376 } 5377 return w 5378 } 5379 5380 // This version does include the zero terminator in the returned Go string. 5381 func goWideString(p uintptr) string { 5382 if p == 0 { 5383 return "" 5384 } 5385 var w []uint16 5386 var raw = (*RawMem)(unsafe.Pointer(p)) 5387 var i = 0 5388 for { 5389 wc := *(*uint16)(unsafe.Pointer(&raw[i])) 5390 w = append(w, wc) 5391 // append until U0000 5392 if wc == 0 { 5393 break 5394 } 5395 i = i + 2 5396 } 5397 s := utf16.Decode(w) 5398 return string(s) 5399 } 5400 5401 func goWideStringN(p uintptr, n int) string { 5402 panic(todo("")) 5403 } 5404 5405 // This version does not include the zero terminator in the returned Go string. 5406 func goWideStringNZ(p uintptr) string { 5407 if p == 0 { 5408 return "" 5409 } 5410 5411 var w []uint16 5412 var raw = (*RawMem)(unsafe.Pointer(p)) 5413 var i = 0 5414 for { 5415 wc := *(*uint16)(unsafe.Pointer(&raw[i])) 5416 if wc == 0 { 5417 break 5418 } 5419 5420 w = append(w, wc) 5421 i = i + 2 5422 } 5423 s := utf16.Decode(w) 5424 return string(s) 5425 } 5426 5427 // LPWSTR GetCommandLineW(); 5428 func XGetCommandLineW(t *TLS) uintptr { 5429 return uintptr(unsafe.Pointer(syscall.GetCommandLine())) 5430 } 5431 5432 // BOOL AddAccessDeniedAce( 5433 // 5434 // PACL pAcl, 5435 // DWORD dwAceRevision, 5436 // DWORD AccessMask, 5437 // PSID pSid 5438 // 5439 // ); 5440 func XAddAccessDeniedAce(t *TLS, pAcl uintptr, dwAceRevision, AccessMask uint32, pSid uintptr) int32 { 5441 panic(todo("")) 5442 } 5443 5444 // BOOL AddAce( 5445 // 5446 // PACL pAcl, 5447 // DWORD dwAceRevision, 5448 // DWORD dwStartingAceIndex, 5449 // LPVOID pAceList, 5450 // DWORD nAceListLength 5451 // 5452 // ); 5453 func XAddAce(t *TLS, pAcl uintptr, dwAceRevision, dwStartingAceIndex uint32, pAceList uintptr, nAceListLength uint32) int32 { 5454 panic(todo("")) 5455 } 5456 5457 // BOOL GetAce( 5458 // 5459 // PACL pAcl, 5460 // DWORD dwAceIndex, 5461 // LPVOID *pAce 5462 // 5463 // ); 5464 func XGetAce(t *TLS, pAcl uintptr, dwAceIndex uint32, pAce uintptr) int32 { 5465 panic(todo("")) 5466 } 5467 5468 // BOOL GetAclInformation( 5469 // 5470 // PACL pAcl, 5471 // LPVOID pAclInformation, 5472 // DWORD nAclInformationLength, 5473 // ACL_INFORMATION_CLASS dwAclInformationClass 5474 // 5475 // ); 5476 func XGetAclInformation(t *TLS, pAcl, pAclInformation uintptr, nAclInformationLength, dwAclInformationClass uint32) int32 { 5477 r0, _, err := syscall.Syscall6(procGetAclInformation.Addr(), 4, 5478 pAclInformation, 5479 pAclInformation, 5480 uintptr(nAclInformationLength), 5481 uintptr(dwAclInformationClass), 5482 0, 5483 0, 5484 ) 5485 if err != 0 { 5486 t.setErrno(err) 5487 } 5488 return int32(r0) 5489 } 5490 5491 // BOOL GetFileSecurityA( 5492 // 5493 // LPCSTR lpFileName, 5494 // SECURITY_INFORMATION RequestedInformation, 5495 // PSECURITY_DESCRIPTOR pSecurityDescriptor, 5496 // DWORD nLength, 5497 // LPDWORD lpnLengthNeeded 5498 // 5499 // ); 5500 func XGetFileSecurityA(t *TLS, lpFileName uintptr, RequestedInformation uint32, pSecurityDescriptor uintptr, nLength uint32, lpnLengthNeeded uintptr) int32 { 5501 r0, _, err := syscall.Syscall6(procGetFileSecurityA.Addr(), 5, 5502 lpFileName, 5503 uintptr(RequestedInformation), 5504 pSecurityDescriptor, 5505 uintptr(nLength), 5506 lpnLengthNeeded, 5507 0, 5508 ) 5509 if err != 0 { 5510 t.setErrno(err) 5511 } 5512 return int32(r0) 5513 } 5514 5515 // DWORD GetLengthSid( 5516 // 5517 // PSID pSid 5518 // 5519 // ); 5520 func XGetLengthSid(t *TLS, pSid uintptr) uint32 { 5521 panic(todo("")) 5522 } 5523 5524 // BOOL GetSecurityDescriptorDacl( 5525 // 5526 // PSECURITY_DESCRIPTOR pSecurityDescriptor, 5527 // LPBOOL lpbDaclPresent, 5528 // PACL *pDacl, 5529 // LPBOOL lpbDaclDefaulted 5530 // 5531 // ); 5532 func XGetSecurityDescriptorDacl(t *TLS, pSecurityDescriptor, lpbDaclPresent, pDacl, lpbDaclDefaulted uintptr) int32 { 5533 r0, _, err := syscall.Syscall6(procGetSecurityDescriptorDacl.Addr(), 4, 5534 pSecurityDescriptor, 5535 lpbDaclPresent, 5536 pDacl, 5537 lpbDaclDefaulted, 5538 0, 5539 0, 5540 ) 5541 if err != 0 { 5542 t.setErrno(err) 5543 } 5544 return int32(r0) 5545 } 5546 5547 // DWORD GetSidLengthRequired( 5548 // 5549 // UCHAR nSubAuthorityCount 5550 // 5551 // ); 5552 func XGetSidLengthRequired(t *TLS, nSubAuthorityCount uint8) int32 { 5553 r0, _, err := syscall.Syscall(procGetSidLengthRequired.Addr(), 1, uintptr(nSubAuthorityCount), 0, 0) 5554 if err != 0 { 5555 t.setErrno(err) 5556 } 5557 return int32(r0) 5558 } 5559 5560 // PDWORD GetSidSubAuthority( 5561 // 5562 // PSID pSid, 5563 // DWORD nSubAuthority 5564 // 5565 // ); 5566 func XGetSidSubAuthority(t *TLS, pSid uintptr, nSubAuthority uint32) uintptr { 5567 r0, _, err := syscall.Syscall(procGetSidSubAuthority.Addr(), 2, pSid, uintptr(nSubAuthority), 0) 5568 if err != 0 { 5569 t.setErrno(err) 5570 } 5571 return r0 5572 } 5573 5574 // BOOL InitializeAcl( 5575 // 5576 // PACL pAcl, 5577 // DWORD nAclLength, 5578 // DWORD dwAclRevision 5579 // 5580 // ); 5581 func XInitializeAcl(t *TLS, pAcl uintptr, nAclLength, dwAclRevision uint32) int32 { 5582 panic(todo("")) 5583 } 5584 5585 // BOOL InitializeSid( 5586 // 5587 // PSID Sid, 5588 // PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, 5589 // BYTE nSubAuthorityCount 5590 // 5591 // ); 5592 func XInitializeSid(t *TLS, Sid, pIdentifierAuthority uintptr, nSubAuthorityCount uint8) int32 { 5593 r0, _, err := syscall.Syscall(procInitializeSid.Addr(), 3, Sid, pIdentifierAuthority, uintptr(nSubAuthorityCount)) 5594 if err != 0 { 5595 t.setErrno(err) 5596 } 5597 return int32(r0) 5598 } 5599 5600 // VOID RaiseException( 5601 // 5602 // DWORD dwExceptionCode, 5603 // DWORD dwExceptionFlags, 5604 // DWORD nNumberOfArguments, 5605 // const ULONG_PTR *lpArguments 5606 // 5607 // ); 5608 func XRaiseException(t *TLS, dwExceptionCode, dwExceptionFlags, nNumberOfArguments uint32, lpArguments uintptr) { 5609 panic(todo("")) 5610 } 5611 5612 // UINT SetErrorMode( 5613 // 5614 // UINT uMode 5615 // 5616 // ); 5617 func XSetErrorMode(t *TLS, uMode uint32) int32 { 5618 panic(todo("")) 5619 } 5620 5621 // DWORD SetNamedSecurityInfoA( 5622 // 5623 // LPSTR pObjectName, 5624 // SE_OBJECT_TYPE ObjectType, 5625 // SECURITY_INFORMATION SecurityInfo, 5626 // PSID psidOwner, 5627 // PSID psidGroup, 5628 // PACL pDacl, 5629 // PACL pSacl 5630 // 5631 // ); 5632 func XSetNamedSecurityInfoA(t *TLS, pObjectName uintptr, ObjectType, SecurityInfo uint32, psidOwner, psidGroup, pDacl, pSacl uintptr) uint32 { 5633 panic(todo("")) 5634 } 5635 5636 // BOOL CreateProcessA( 5637 // 5638 // LPCSTR lpApplicationName, 5639 // LPSTR lpCommandLine, 5640 // LPSECURITY_ATTRIBUTES lpProcessAttributes, 5641 // LPSECURITY_ATTRIBUTES lpThreadAttributes, 5642 // BOOL bInheritHandles, 5643 // DWORD dwCreationFlags, 5644 // LPVOID lpEnvironment, 5645 // LPCSTR lpCurrentDirectory, 5646 // LPSTARTUPINFOA lpStartupInfo, 5647 // LPPROCESS_INFORMATION lpProcessInformation 5648 // 5649 // ); 5650 func XCreateProcessA(t *TLS, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes uintptr, bInheritHandles int32, 5651 dwCreationFlags uint32, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation uintptr) int32 { 5652 r1, _, err := syscall.Syscall12(procCreateProcessA.Addr(), 10, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, 5653 uintptr(bInheritHandles), uintptr(dwCreationFlags), lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, 0, 0) 5654 if r1 == 0 { 5655 if err != 0 { 5656 t.setErrno(err) 5657 } else { 5658 t.setErrno(errno.EINVAL) 5659 } 5660 } 5661 return int32(r1) 5662 } 5663 5664 // unsigned int _set_abort_behavior( 5665 // 5666 // unsigned int flags, 5667 // unsigned int mask 5668 // 5669 // ); 5670 func X_set_abort_behavior(t *TLS, _ ...interface{}) uint32 { 5671 panic(todo("")) 5672 } 5673 5674 // HANDLE OpenEventA( 5675 // 5676 // DWORD dwDesiredAccess, 5677 // BOOL bInheritHandle, 5678 // LPCSTR lpName 5679 // 5680 // ); 5681 func XOpenEventA(t *TLS, dwDesiredAccess uint32, bInheritHandle uint32, lpName uintptr) uintptr { 5682 r0, _, err := syscall.Syscall(procOpenEventA.Addr(), 3, uintptr(dwDesiredAccess), uintptr(bInheritHandle), lpName) 5683 if r0 == 0 { 5684 t.setErrno(err) 5685 } 5686 return r0 5687 } 5688 5689 // size_t _msize( 5690 // 5691 // void *memblock 5692 // 5693 // ); 5694 func X_msize(t *TLS, memblock uintptr) types.Size_t { 5695 return types.Size_t(UsableSize(memblock)) 5696 } 5697 5698 // unsigned long _byteswap_ulong ( unsigned long val ); 5699 func X_byteswap_ulong(t *TLS, val ulong) ulong { 5700 return X__builtin_bswap32(t, val) 5701 } 5702 5703 // unsigned __int64 _byteswap_uint64 ( unsigned __int64 val ); 5704 func X_byteswap_uint64(t *TLS, val uint64) uint64 { 5705 return X__builtin_bswap64(t, val) 5706 } 5707 5708 // int _commit( 5709 // 5710 // int fd 5711 // 5712 // ); 5713 func X_commit(t *TLS, fd int32) int32 { 5714 return Xfsync(t, fd) 5715 } 5716 5717 // int _stati64( 5718 // 5719 // const char *path, 5720 // struct _stati64 *buffer 5721 // 5722 // ); 5723 func X_stati64(t *TLS, path, buffer uintptr) int32 { 5724 panic(todo("")) 5725 } 5726 5727 // int _fstati64( 5728 // 5729 // int fd, 5730 // struct _stati64 *buffer 5731 // 5732 // ); 5733 func X_fstati64(t *TLS, fd int32, buffer uintptr) int32 { 5734 panic(todo("")) 5735 } 5736 5737 // int _findnext32( 5738 // 5739 // intptr_t handle, 5740 // struct _finddata32_t *fileinfo 5741 // 5742 // ); 5743 func X_findnext32(t *TLS, handle types.Intptr_t, buffer uintptr) int32 { 5744 panic(todo("")) 5745 } 5746 5747 // intptr_t _findfirst32( 5748 // 5749 // const char *filespec, 5750 // struct _finddata32_t *fileinfo 5751 // 5752 // ); 5753 func X_findfirst32(t *TLS, filespec, fileinfo uintptr) types.Intptr_t { 5754 panic(todo("")) 5755 } 5756 5757 /*- 5758 * Copyright (c) 1990 The Regents of the University of California. 5759 * All rights reserved. 5760 * 5761 * Redistribution and use in source and binary forms, with or without 5762 * modification, are permitted provided that the following conditions 5763 * are met: 5764 * 1. Redistributions of source code must retain the above copyright 5765 * notice, this list of conditions and the following disclaimer. 5766 * 2. Redistributions in binary form must reproduce the above copyright 5767 * notice, this list of conditions and the following disclaimer in the 5768 * documentation and/or other materials provided with the distribution. 5769 * 3. Neither the name of the University nor the names of its contributors 5770 * may be used to endorse or promote products derived from this software 5771 * without specific prior written permission. 5772 * 5773 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 5774 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 5775 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 5776 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 5777 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 5778 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 5779 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 5780 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 5781 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 5782 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5783 * SUCH DAMAGE. 5784 */ 5785 5786 // long strtol(const char *nptr, char **endptr, int base); 5787 func Xstrtol(t *TLS, nptr, endptr uintptr, base int32) long { 5788 5789 var s uintptr = nptr 5790 var acc ulong 5791 var c byte 5792 var cutoff ulong 5793 var neg int32 5794 var any int32 5795 var cutlim int32 5796 5797 /* 5798 * Skip white space and pick up leading +/- sign if any. 5799 * If base is 0, allow 0x for hex and 0 for octal, else 5800 * assume decimal; if base is already 16, allow 0x. 5801 */ 5802 for { 5803 c = *(*byte)(unsafe.Pointer(s)) 5804 PostIncUintptr(&s, 1) 5805 var sp = strings.TrimSpace(string(c)) 5806 if len(sp) > 0 { 5807 break 5808 } 5809 } 5810 5811 if c == '-' { 5812 neg = 1 5813 c = *(*byte)(unsafe.Pointer(s)) 5814 PostIncUintptr(&s, 1) 5815 } else if c == '+' { 5816 c = *(*byte)(unsafe.Pointer(s)) 5817 PostIncUintptr(&s, 1) 5818 } 5819 5820 sp := *(*byte)(unsafe.Pointer(s)) 5821 5822 if (base == 0 || base == 16) && 5823 c == '0' && (sp == 'x' || sp == 'X') { 5824 PostIncUintptr(&s, 1) 5825 c = *(*byte)(unsafe.Pointer(s)) //s[1]; 5826 PostIncUintptr(&s, 1) 5827 base = 16 5828 } 5829 if base == 0 { 5830 if c == '0' { 5831 base = 0 5832 } else { 5833 base = 10 5834 } 5835 } 5836 /* 5837 * Compute the cutoff value between legal numbers and illegal 5838 * numbers. That is the largest legal value, divided by the 5839 * base. An input number that is greater than this value, if 5840 * followed by a legal input character, is too big. One that 5841 * is equal to this value may be valid or not; the limit 5842 * between valid and invalid numbers is then based on the last 5843 * digit. For instance, if the range for longs is 5844 * [-2147483648..2147483647] and the input base is 10, 5845 * cutoff will be set to 214748364 and cutlim to either 5846 * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated 5847 * a value > 214748364, or equal but the next digit is > 7 (or 8), 5848 * the number is too big, and we will return a range error. 5849 * 5850 * Set any if any `digits' consumed; make it negative to indicate 5851 * overflow. 5852 */ 5853 var ULONG_MAX ulong = 0xFFFFFFFF 5854 var LONG_MAX long = long(ULONG_MAX >> 1) 5855 var LONG_MIN long = ^LONG_MAX 5856 5857 if neg == 1 { 5858 cutoff = ulong(-1 * LONG_MIN) 5859 } else { 5860 cutoff = ulong(LONG_MAX) 5861 } 5862 cutlim = int32(cutoff % ulong(base)) 5863 cutoff = cutoff / ulong(base) 5864 5865 acc = 0 5866 any = 0 5867 5868 for { 5869 var cs = string(c) 5870 if unicode.IsDigit([]rune(cs)[0]) { 5871 c -= '0' 5872 } else if unicode.IsLetter([]rune(cs)[0]) { 5873 if unicode.IsUpper([]rune(cs)[0]) { 5874 c -= 'A' - 10 5875 } else { 5876 c -= 'a' - 10 5877 } 5878 } else { 5879 break 5880 } 5881 5882 if int32(c) >= base { 5883 break 5884 } 5885 if any < 0 || acc > cutoff || (acc == cutoff && int32(c) > cutlim) { 5886 any = -1 5887 5888 } else { 5889 any = 1 5890 acc *= ulong(base) 5891 acc += ulong(c) 5892 } 5893 5894 c = *(*byte)(unsafe.Pointer(s)) 5895 PostIncUintptr(&s, 1) 5896 } 5897 5898 if any < 0 { 5899 if neg == 1 { 5900 acc = ulong(LONG_MIN) 5901 } else { 5902 acc = ulong(LONG_MAX) 5903 } 5904 t.setErrno(errno.ERANGE) 5905 } else if neg == 1 { 5906 acc = -acc 5907 } 5908 5909 if endptr != 0 { 5910 if any == 1 { 5911 PostDecUintptr(&s, 1) 5912 AssignPtrUintptr(endptr, s) 5913 } else { 5914 AssignPtrUintptr(endptr, nptr) 5915 } 5916 } 5917 return long(acc) 5918 } 5919 5920 // unsigned long int strtoul(const char *nptr, char **endptr, int base); 5921 func Xstrtoul(t *TLS, nptr, endptr uintptr, base int32) ulong { 5922 var s uintptr = nptr 5923 var acc ulong 5924 var c byte 5925 var cutoff ulong 5926 var neg int32 5927 var any int32 5928 var cutlim int32 5929 5930 /* 5931 * Skip white space and pick up leading +/- sign if any. 5932 * If base is 0, allow 0x for hex and 0 for octal, else 5933 * assume decimal; if base is already 16, allow 0x. 5934 */ 5935 for { 5936 c = *(*byte)(unsafe.Pointer(s)) 5937 PostIncUintptr(&s, 1) 5938 var sp = strings.TrimSpace(string(c)) 5939 if len(sp) > 0 { 5940 break 5941 } 5942 } 5943 5944 if c == '-' { 5945 neg = 1 5946 c = *(*byte)(unsafe.Pointer(s)) 5947 PostIncUintptr(&s, 1) 5948 } else if c == '+' { 5949 c = *(*byte)(unsafe.Pointer(s)) 5950 PostIncUintptr(&s, 1) 5951 } 5952 5953 sp := *(*byte)(unsafe.Pointer(s)) 5954 5955 if (base == 0 || base == 16) && 5956 c == '0' && (sp == 'x' || sp == 'X') { 5957 PostIncUintptr(&s, 1) 5958 c = *(*byte)(unsafe.Pointer(s)) //s[1]; 5959 PostIncUintptr(&s, 1) 5960 base = 16 5961 } 5962 if base == 0 { 5963 if c == '0' { 5964 base = 0 5965 } else { 5966 base = 10 5967 } 5968 } 5969 var ULONG_MAX ulong = 0xFFFFFFFF 5970 5971 cutoff = ULONG_MAX / ulong(base) 5972 cutlim = int32(ULONG_MAX % ulong(base)) 5973 5974 acc = 0 5975 any = 0 5976 5977 for { 5978 var cs = string(c) 5979 if unicode.IsDigit([]rune(cs)[0]) { 5980 c -= '0' 5981 } else if unicode.IsLetter([]rune(cs)[0]) { 5982 if unicode.IsUpper([]rune(cs)[0]) { 5983 c -= 'A' - 10 5984 } else { 5985 c -= 'a' - 10 5986 } 5987 } else { 5988 break 5989 } 5990 5991 if int32(c) >= base { 5992 break 5993 } 5994 if any < 0 || acc > cutoff || (acc == cutoff && int32(c) > cutlim) { 5995 any = -1 5996 5997 } else { 5998 any = 1 5999 acc *= ulong(base) 6000 acc += ulong(c) 6001 } 6002 6003 c = *(*byte)(unsafe.Pointer(s)) 6004 PostIncUintptr(&s, 1) 6005 } 6006 6007 if any < 0 { 6008 acc = ULONG_MAX 6009 t.setErrno(errno.ERANGE) 6010 } else if neg == 1 { 6011 acc = -acc 6012 } 6013 6014 if endptr != 0 { 6015 if any == 1 { 6016 PostDecUintptr(&s, 1) 6017 AssignPtrUintptr(endptr, s) 6018 } else { 6019 AssignPtrUintptr(endptr, nptr) 6020 } 6021 } 6022 return acc 6023 } 6024 6025 // int __isoc99_sscanf(const char *str, const char *format, ...); 6026 func X__isoc99_sscanf(t *TLS, str, format, va uintptr) int32 { 6027 r := scanf(strings.NewReader(GoString(str)), format, va) 6028 // if dmesgs { 6029 // dmesg("%v: %q %q: %d", origin(1), GoString(str), GoString(format), r) 6030 // } 6031 return r 6032 } 6033 6034 // int sscanf(const char *str, const char *format, ...); 6035 func Xsscanf(t *TLS, str, format, va uintptr) int32 { 6036 r := scanf(strings.NewReader(GoString(str)), format, va) 6037 // if dmesgs { 6038 // dmesg("%v: %q %q: %d", origin(1), GoString(str), GoString(format), r) 6039 // } 6040 return r 6041 } 6042 6043 func Xstrtod(tls *TLS, s uintptr, p uintptr) float64 { /* strtod.c:22:8: */ 6044 panic(todo("")) 6045 } 6046 6047 func Xrint(tls *TLS, x float64) float64 { 6048 switch { 6049 case x == 0: // also +0 and -0 6050 return 0 6051 case math.IsInf(x, 0), math.IsNaN(x): 6052 return x 6053 case x >= math.MinInt64 && x <= math.MaxInt64 && float64(int64(x)) == x: 6054 return x 6055 case x >= 0: 6056 return math.Floor(x + 0.5) 6057 default: 6058 return math.Ceil(x - 0.5) 6059 } 6060 } 6061 6062 // FILE *fdopen(int fd, const char *mode); 6063 func Xfdopen(t *TLS, fd int32, mode uintptr) uintptr { 6064 panic(todo("")) 6065 } 6066 6067 // struct tm *_gmtime64( const __time64_t *sourceTime ); 6068 func X_gmtime64(t *TLS, sourceTime uintptr) uintptr { 6069 panic(todo("")) 6070 } 6071 6072 // __time64_t _mktime64(struct tm *timeptr); 6073 func X_mktime64(t *TLS, timeptr uintptr) time.X__time64_t { 6074 return time.X__time64_t(Xmktime(t, timeptr)) 6075 } 6076 6077 // char * gai_strerrorA(int ecode); 6078 func Xgai_strerrorA(t *TLS, ecode int32) uintptr { 6079 panic(todo("")) 6080 } 6081 6082 // https://github.com/Alexpux/mingw-w64/blob/master/mingw-w64-headers/crt/sys/timeb.h#L69 6083 // 6084 // struct __timeb64 { 6085 // __time64_t time; 6086 // unsigned short millitm; 6087 // short timezone; 6088 // short dstflag; 6089 // }; 6090 6091 type __timeb64 struct { 6092 time types.X__time64_t 6093 millitm uint32 6094 timezone int16 6095 dstflag int16 6096 } 6097 6098 // void _ftime64( struct __timeb64 *timeptr ); 6099 func X_ftime64(t *TLS, timeptr uintptr) { 6100 tm := gotime.Now() 6101 (*__timeb64)(unsafe.Pointer(timeptr)).time = types.X__time64_t(tm.Unix()) 6102 6103 //TODO When Go 1.16 is no more supported 6104 // (*__timeb64)(unsafe.Pointer(timeptr)).millitm = uint32(tm.UnixMilli() % 1000) 6105 6106 (*__timeb64)(unsafe.Pointer(timeptr)).millitm = uint32(int64(tm.Nanosecond()) / 1e6) 6107 } 6108 6109 func X__ccgo_getMutexType(tls *TLS, m uintptr) int32 { /* pthread_mutex_lock.c:3:5: */ 6110 return *(*int32)(unsafe.Pointer(m)) & 15 6111 } 6112 6113 func X__ccgo_pthreadAttrGetDetachState(tls *TLS, a uintptr) int32 { /* pthread_attr_get.c:3:5: */ 6114 return *(*int32)(unsafe.Pointer(a)) 6115 } 6116 6117 func X__ccgo_pthreadMutexattrGettype(tls *TLS, a uintptr) int32 { /* pthread_attr_get.c:93:5: */ 6118 return *(*int32)(unsafe.Pointer(a)) & int32(3) 6119 } 6120 6121 func Xchmod(t *TLS, pathname uintptr, mode int32) int32 { 6122 panic(todo("%q %#o", GoString(pathname), mode)) 6123 } 6124 6125 // typedef enum _COMPUTER_NAME_FORMAT { 6126 // ComputerNameNetBIOS, 6127 // ComputerNameDnsHostname, 6128 // ComputerNameDnsDomain, 6129 // ComputerNameDnsFullyQualified, 6130 // ComputerNamePhysicalNetBIOS, 6131 // ComputerNamePhysicalDnsHostname, 6132 // ComputerNamePhysicalDnsDomain, 6133 // ComputerNamePhysicalDnsFullyQualified, 6134 // ComputerNameMax 6135 // } COMPUTER_NAME_FORMAT; 6136 6137 // BOOL GetComputerNameExW( 6138 // 6139 // [in] COMPUTER_NAME_FORMAT NameType, 6140 // [out] LPWSTR lpBuffer, 6141 // [in, out] LPDWORD nSize 6142 // 6143 // ); 6144 func XGetComputerNameExW(t *TLS, nameType int32, lpBuffer, nSize uintptr) int32 { 6145 r0, _, err := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nameType), lpBuffer, nSize) 6146 if err != 0 { 6147 t.setErrno(err) 6148 } 6149 return int32(r0) 6150 } 6151 6152 // double _copysign( 6153 // 6154 // double x, 6155 // double y 6156 // 6157 // ); 6158 func X_copysign(t *TLS, x, y float64) float64 { return Xcopysign(t, x, y) } 6159 6160 // int _wtoi( 6161 // 6162 // const wchar_t *str 6163 // 6164 // ); 6165 func X_wtoi(t *TLS, str uintptr) int32 { 6166 panic(todo("")) 6167 } 6168 6169 func allocW(t *TLS, v string) (r uintptr) { 6170 s := utf16.Encode([]rune(v)) 6171 p := Xcalloc(t, types.Size_t(len(s)+1), 2) 6172 if p == 0 { 6173 panic(todo("")) 6174 } 6175 6176 r = p 6177 for _, v := range s { 6178 *(*uint16)(unsafe.Pointer(p)) = v 6179 p += 2 6180 } 6181 return r 6182 } 6183 6184 // wchar_t *_wgetenv( 6185 // 6186 // const wchar_t *varname 6187 // 6188 // ); 6189 func X_wgetenv(t *TLS, varname uintptr) uintptr { 6190 if !wenvValid { 6191 bootWinEnviron(t) 6192 } 6193 k := strings.ToLower(goWideStringNZ(varname)) 6194 for _, v := range winEnviron[:len(winEnviron)-1] { 6195 s := strings.ToLower(goWideStringNZ(v)) 6196 x := strings.IndexByte(s, '=') 6197 if s[:x] == k { 6198 // trc("%v: %q -> %q", origin(1), goWideStringNZ(varname), goWideStringNZ(v)) 6199 return v 6200 } 6201 } 6202 6203 // trc("%v: %q -> %q", origin(1), goWideStringNZ(varname), "") 6204 return 0 6205 } 6206 6207 // int _wputenv( 6208 // 6209 // const wchar_t *envstring 6210 // 6211 // ); 6212 func X_wputenv(t *TLS, envstring uintptr) int32 { 6213 if !wenvValid { 6214 bootWinEnviron(t) 6215 } 6216 s0 := goWideStringNZ(envstring) 6217 s := strings.ToLower(s0) 6218 x := strings.IndexByte(s, '=') 6219 k := s[:x] 6220 for i, v := range winEnviron[:len(winEnviron)-1] { 6221 s2 := strings.ToLower(goWideStringNZ(v)) 6222 x := strings.IndexByte(s2, '=') 6223 if s2[:x] == k { 6224 Xfree(t, v) 6225 winEnviron[i] = allocW(t, s0) 6226 return 0 6227 } 6228 } 6229 6230 np := allocW(t, s0) 6231 winEnviron = winEnviron[:len(winEnviron)-1] 6232 winEnviron = append(winEnviron, np, 0) 6233 wenviron = uintptr(unsafe.Pointer(&winEnviron[0])) 6234 return 0 6235 } 6236 6237 func bootWinEnviron(t *TLS) { 6238 winEnviron = winEnviron[:0] 6239 p := Environ() 6240 for { 6241 q := *(*uintptr)(unsafe.Pointer(p)) 6242 p += unsafe.Sizeof(uintptr(0)) 6243 if q == 0 { 6244 break 6245 } 6246 6247 s := GoString(q) 6248 // trc("%v: %q", origin(1), s) 6249 r := allocW(t, s) 6250 winEnviron = append(winEnviron, r) 6251 } 6252 wenviron = uintptr(unsafe.Pointer(&winEnviron[0])) 6253 wenvValid = true 6254 } 6255 6256 func Xfabsl(t *TLS, x float64) float64 { return math.Abs(x) } 6257 6258 func X__stdio_common_vfprintf(t *TLS, args ...interface{}) int32 { panic("TODO") } 6259 func X__stdio_common_vfprintf_p(t *TLS, args ...interface{}) int32 { panic("TODO") } 6260 func X__stdio_common_vfprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") } 6261 func X__stdio_common_vfscanf(t *TLS, args ...interface{}) int32 { panic("TODO") } 6262 func X__stdio_common_vfwprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") } 6263 func X__stdio_common_vfwscanf(t *TLS, args ...interface{}) int32 { panic("TODO") } 6264 func X__stdio_common_vsnprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") } 6265 func X__stdio_common_vsnwprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") } 6266 func X__stdio_common_vsprintf(t *TLS, args ...interface{}) int32 { panic("TODO") } 6267 func X__stdio_common_vsprintf_p(t *TLS, args ...interface{}) int32 { panic("TODO") } 6268 func X__stdio_common_vsprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") } 6269 func X__stdio_common_vsscanf(t *TLS, args ...interface{}) int32 { panic("TODO") } 6270 func X__stdio_common_vswprintf(t *TLS, args ...interface{}) int32 { panic("TODO") } 6271 func X__stdio_common_vswprintf_s(t *TLS, args ...interface{}) int32 { panic("TODO") } 6272 func X__stdio_common_vswscanf(t *TLS, args ...interface{}) int32 { panic("TODO") }