diff --git a/libc/calls/directmap-nt.c b/libc/calls/directmap-nt.c index 65df866ff..bf5e646af 100644 --- a/libc/calls/directmap-nt.c +++ b/libc/calls/directmap-nt.c @@ -44,12 +44,12 @@ textwindows noasan struct DirectMap sys_mmap_nt(void *addr, size_t size, * combination of flags, that'll cause Windows to actually do this! */ upsize = ROUNDUP(size, FRAMESIZE); - if ((dm.maphandle = CreateFileMappingNuma( - -1, &kNtIsInheritable, kNtPageExecuteReadwrite, upsize >> 32, - upsize, NULL, kNtNumaNoPreferredNode))) { - if ((dm.addr = MapViewOfFileExNuma( - dm.maphandle, kNtFileMapWrite | kNtFileMapExecute, 0, 0, upsize, - addr, kNtNumaNoPreferredNode))) { + if ((dm.maphandle = + CreateFileMapping(-1, &kNtIsInheritable, kNtPageExecuteReadwrite, + upsize >> 32, upsize, NULL))) { + if ((dm.addr = MapViewOfFileEx(dm.maphandle, + kNtFileMapWrite | kNtFileMapExecute, 0, 0, + upsize, addr))) { for (i = 0; i < size; i += got) { got = 0; op.Internal = 0; @@ -68,16 +68,15 @@ textwindows noasan struct DirectMap sys_mmap_nt(void *addr, size_t size, CloseHandle(dm.maphandle); } } else { - if ((dm.maphandle = CreateFileMappingNuma( + if ((dm.maphandle = CreateFileMapping( handle, &kNtIsInheritable, (prot & PROT_WRITE) ? kNtPageExecuteReadwrite : kNtPageExecuteRead, - handle != -1 ? 0 : size >> 32, handle != -1 ? 0 : size, NULL, - kNtNumaNoPreferredNode))) { - if ((dm.addr = MapViewOfFileExNuma( - dm.maphandle, - (prot & PROT_WRITE) ? kNtFileMapWrite | kNtFileMapExecute - : kNtFileMapRead | kNtFileMapExecute, - off >> 32, off, size, addr, kNtNumaNoPreferredNode))) { + handle != -1 ? 0 : size >> 32, handle != -1 ? 0 : size, NULL))) { + if ((dm.addr = MapViewOfFileEx(dm.maphandle, + (prot & PROT_WRITE) + ? kNtFileMapWrite | kNtFileMapExecute + : kNtFileMapRead | kNtFileMapExecute, + off >> 32, off, size, addr))) { return dm; } CloseHandle(dm.maphandle); diff --git a/libc/calls/ntspawn.c b/libc/calls/ntspawn.c index 403b4866c..b9d9a91b5 100644 --- a/libc/calls/ntspawn.c +++ b/libc/calls/ntspawn.c @@ -75,15 +75,13 @@ textwindows int ntspawn( block = NULL; if (__mkntpath(prog, prog16) == -1) return -1; blocksize = ROUNDUP(sizeof(*block), FRAMESIZE); - if ((handle = CreateFileMappingNuma( + if ((handle = CreateFileMapping( -1, &(struct NtSecurityAttributes){sizeof(struct NtSecurityAttributes), NULL, false}, - pushpop(kNtPageReadwrite), 0, blocksize, NULL, - kNtNumaNoPreferredNode)) && - (block = - MapViewOfFileExNuma(handle, kNtFileMapRead | kNtFileMapWrite, 0, 0, - blocksize, NULL, kNtNumaNoPreferredNode))) { + pushpop(kNtPageReadwrite), 0, blocksize, NULL)) && + (block = MapViewOfFileEx(handle, kNtFileMapRead | kNtFileMapWrite, 0, 0, + blocksize, NULL))) { if (mkntcmdline(block->cmdline, prog, argv) != -1 && mkntenvblock(block->envvars, envp, extravar) != -1) { if (CreateProcess(prog16, block->cmdline, opt_lpProcessAttributes, diff --git a/libc/intrin/createfile.greg.c b/libc/intrin/createfile.greg.c index 733fc4542..215770db3 100644 --- a/libc/intrin/createfile.greg.c +++ b/libc/intrin/createfile.greg.c @@ -47,13 +47,12 @@ static const char *DescribeDisposition(int x) { * * @return handle, or -1 on failure * @note this wrapper takes care of ABI, STRACE(), and __winerr() - * @see MapViewOfFileExNuma() */ -int64_t CreateFile(const char16_t *lpFileName, uint32_t dwDesiredAccess, - uint32_t dwShareMode, - struct NtSecurityAttributes *opt_lpSecurityAttributes, - int dwCreationDisposition, uint32_t dwFlagsAndAttributes, - int64_t opt_hTemplateFile) { +textwindows int64_t CreateFile( + const char16_t *lpFileName, uint32_t dwDesiredAccess, uint32_t dwShareMode, + struct NtSecurityAttributes *opt_lpSecurityAttributes, + int dwCreationDisposition, uint32_t dwFlagsAndAttributes, + int64_t opt_hTemplateFile) { int64_t hHandle; hHandle = __imp_CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, opt_lpSecurityAttributes, dwCreationDisposition, diff --git a/libc/intrin/createfilemapping.greg.c b/libc/intrin/createfilemapping.greg.c new file mode 100644 index 000000000..3429e9aeb --- /dev/null +++ b/libc/intrin/createfilemapping.greg.c @@ -0,0 +1,50 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/calls/internal.h" +#include "libc/calls/strace.internal.h" +#include "libc/intrin/describeflags.internal.h" +#include "libc/nt/memory.h" +#include "libc/nt/struct/securityattributes.h" + +extern typeof(CreateFileMapping) *const __imp_CreateFileMappingW __msabi; + +/** + * Creates file mapping object on the New Technology. + * + * @param opt_hFile may be -1 for MAP_ANONYMOUS behavior + * @return handle, or 0 on failure + * @note this wrapper takes care of ABI, STRACE(), and __winerr() + * @see MapViewOfFileEx() + */ +textwindows int64_t CreateFileMapping( + int64_t opt_hFile, + const struct NtSecurityAttributes *opt_lpFileMappingAttributes, + uint32_t flProtect, uint32_t dwMaximumSizeHigh, uint32_t dwMaximumSizeLow, + const char16_t *opt_lpName) { + int64_t hHandle; + hHandle = __imp_CreateFileMappingW(opt_hFile, opt_lpFileMappingAttributes, + flProtect, dwMaximumSizeHigh, + dwMaximumSizeLow, opt_lpName); + if (!hHandle) __winerr(); + STRACE("CreateFileMapping(%ld, %s, max:%'zu, name:%#hs) → %ld% m", opt_hFile, + DescribeNtPageFlags(flProtect), + (uint64_t)dwMaximumSizeHigh << 32 | dwMaximumSizeLow, opt_lpName, + hHandle); + return hHandle; +} diff --git a/libc/intrin/createfilemappingnuma.greg.c b/libc/intrin/createfilemappingnuma.greg.c index d4b45ecb2..117b436ee 100644 --- a/libc/intrin/createfilemappingnuma.greg.c +++ b/libc/intrin/createfilemappingnuma.greg.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/internal.h" #include "libc/calls/strace.internal.h" +#include "libc/dce.h" #include "libc/intrin/describeflags.internal.h" #include "libc/nt/memory.h" #include "libc/nt/struct/securityattributes.h" @@ -33,7 +34,7 @@ extern typeof(CreateFileMappingNuma) *const * @note this wrapper takes care of ABI, STRACE(), and __winerr() * @see MapViewOfFileExNuma() */ -int64_t CreateFileMappingNuma( +textwindows int64_t CreateFileMappingNuma( int64_t opt_hFile, const struct NtSecurityAttributes *opt_lpFileMappingAttributes, uint32_t flProtect, uint32_t dwMaximumSizeHigh, uint32_t dwMaximumSizeLow, diff --git a/libc/intrin/mapviewoffileex.greg.c b/libc/intrin/mapviewoffileex.greg.c new file mode 100644 index 000000000..757cb22b3 --- /dev/null +++ b/libc/intrin/mapviewoffileex.greg.c @@ -0,0 +1,53 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2022 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/assert.h" +#include "libc/calls/internal.h" +#include "libc/calls/strace.internal.h" +#include "libc/intrin/describeflags.internal.h" +#include "libc/nt/enum/filemapflags.h" +#include "libc/nt/memory.h" + +extern typeof(MapViewOfFileEx) *const __imp_MapViewOfFileEx __msabi; + +/** + * Maps view of file mapping into memory on the New Technology. + * + * @param hFileMappingObject was returned by CreateFileMapping() + * @param dwDesiredAccess has kNtFileMap... flags + * @param opt_lpDesiredBaseAddress may be NULL to let o/s choose + * @return base address, or NULL on failure + * @note this wrapper takes care of ABI, STRACE(), and __winerr() + */ +textwindows void *MapViewOfFileEx(int64_t hFileMappingObject, + uint32_t dwDesiredAccess, + uint32_t dwFileOffsetHigh, + uint32_t dwFileOffsetLow, + size_t dwNumberOfBytesToMap, + void *opt_lpDesiredBaseAddress) { + void *pStartingAddress; + pStartingAddress = __imp_MapViewOfFileEx( + hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, + dwNumberOfBytesToMap, opt_lpDesiredBaseAddress); + if (!pStartingAddress) __winerr(); + STRACE("MapViewOfFileEx(%ld, %s, off:%'ld, size:%'zu, %p) → %p% m", + hFileMappingObject, DescribeNtFileMapFlags(dwDesiredAccess), + (uint64_t)dwFileOffsetHigh << 32 | dwFileOffsetLow, + dwNumberOfBytesToMap, opt_lpDesiredBaseAddress, pStartingAddress); + return pStartingAddress; +} diff --git a/libc/intrin/mapviewoffileexnuma.greg.c b/libc/intrin/mapviewoffileexnuma.greg.c index ef914824b..b9bc50828 100644 --- a/libc/intrin/mapviewoffileexnuma.greg.c +++ b/libc/intrin/mapviewoffileexnuma.greg.c @@ -19,6 +19,7 @@ #include "libc/assert.h" #include "libc/calls/internal.h" #include "libc/calls/strace.internal.h" +#include "libc/dce.h" #include "libc/intrin/describeflags.internal.h" #include "libc/nt/enum/filemapflags.h" #include "libc/nt/memory.h" @@ -34,11 +35,13 @@ extern typeof(MapViewOfFileExNuma) *const __imp_MapViewOfFileExNuma __msabi; * @return base address, or NULL on failure * @note this wrapper takes care of ABI, STRACE(), and __winerr() */ -void *MapViewOfFileExNuma(int64_t hFileMappingObject, uint32_t dwDesiredAccess, - uint32_t dwFileOffsetHigh, uint32_t dwFileOffsetLow, - size_t dwNumberOfBytesToMap, - void *opt_lpDesiredBaseAddress, - uint32_t nndDesiredNumaNode) { +textwindows void *MapViewOfFileExNuma(int64_t hFileMappingObject, + uint32_t dwDesiredAccess, + uint32_t dwFileOffsetHigh, + uint32_t dwFileOffsetLow, + size_t dwNumberOfBytesToMap, + void *opt_lpDesiredBaseAddress, + uint32_t nndDesiredNumaNode) { void *pStartingAddress; pStartingAddress = __imp_MapViewOfFileExNuma( hFileMappingObject, dwDesiredAccess, dwFileOffsetHigh, dwFileOffsetLow, diff --git a/libc/nt/kernel32/CreateFileMappingW.s b/libc/nt/kernel32/CreateFileMappingW.s index 6fa9275fd..6d4330c59 100644 --- a/libc/nt/kernel32/CreateFileMappingW.s +++ b/libc/nt/kernel32/CreateFileMappingW.s @@ -2,11 +2,11 @@ .imp kernel32,__imp_CreateFileMappingW,CreateFileMappingW,0 .text.windows -CreateFileMapping: +__CreateFileMapping: push %rbp mov %rsp,%rbp .profilable mov __imp_CreateFileMappingW(%rip),%rax - jmp __sysv2nt8 - .endfn CreateFileMapping,globl + jmp __sysv2nt6 + .endfn __CreateFileMapping,globl .previous diff --git a/libc/nt/kernel32/MapViewOfFileEx.s b/libc/nt/kernel32/MapViewOfFileEx.s index 0c0b1c667..a4036ecba 100644 --- a/libc/nt/kernel32/MapViewOfFileEx.s +++ b/libc/nt/kernel32/MapViewOfFileEx.s @@ -1,2 +1,12 @@ .include "o/libc/nt/codegen.inc" .imp kernel32,__imp_MapViewOfFileEx,MapViewOfFileEx,0 + + .text.windows +__MapViewOfFileEx: + push %rbp + mov %rsp,%rbp + .profilable + mov __imp_MapViewOfFileEx(%rip),%rax + jmp __sysv2nt6 + .endfn __MapViewOfFileEx,globl + .previous diff --git a/libc/nt/master.sh b/libc/nt/master.sh index e175d5d09..b7c140694 100755 --- a/libc/nt/master.sh +++ b/libc/nt/master.sh @@ -580,10 +580,11 @@ imp 'CreateFiber' CreateFiber kernel32 0 # KernelBase imp 'CreateFiberEx' CreateFiberEx kernel32 0 # KernelBase imp 'CreateFileA' CreateFileA kernel32 0 7 # KernelBase imp '__CreateFile' CreateFileW kernel32 0 7 # KernelBase +imp '__CreateFileMapping' CreateFileMappingW kernel32 0 6 # KernelBase imp '__CreateFileMappingNuma' CreateFileMappingNumaW kernel32 0 7 # Kernelbase +imp '__MapViewOfFileEx' MapViewOfFileEx kernel32 0 6 # KernelBase imp '__MapViewOfFileExNuma' MapViewOfFileExNuma kernel32 0 7 # KernelBase imp 'CreateFileMappingNumaA' CreateFileMappingNumaA kernel32 198 7 -imp 'CreateFileMapping' CreateFileMappingW kernel32 0 7 # KernelBase imp 'CreateFileMappingA' CreateFileMappingA kernel32 196 7 imp 'CreateFileTransacted' CreateFileTransactedW kernel32 202 imp 'CreateFileTransactedA' CreateFileTransactedA kernel32 201 @@ -3339,7 +3340,6 @@ imp 'MapUserPhysicalPagesScatter' MapUserPhysicalPagesScatter kernel32 986 imp 'MapViewOfFile' MapViewOfFile kernel32 0 # KernelBase imp 'MapViewOfFile3' MapViewOfFile3 KernelBase 1003 imp 'MapViewOfFile3FromApp' MapViewOfFile3FromApp KernelBase 1004 -imp 'MapViewOfFileEx' MapViewOfFileEx kernel32 0 # KernelBase imp 'MapViewOfFileFromApp' MapViewOfFileFromApp kernel32 0 # KernelBase imp 'MapViewOfFileNuma2' MapViewOfFileNuma2 KernelBase 1008 imp 'MapVirtualKeyA' MapVirtualKeyA user32 2153 diff --git a/libc/nt/memory.h b/libc/nt/memory.h index c9ddfaa2a..9086f4025 100644 --- a/libc/nt/memory.h +++ b/libc/nt/memory.h @@ -36,18 +36,26 @@ COSMOPOLITAN_C_START_ void *LocalFree(void *hMem); +int64_t CreateFileMapping( + int64_t opt_hFile, + const struct NtSecurityAttributes *opt_lpFileMappingAttributes, + uint32_t flProtect, uint32_t dwMaximumSizeHigh, uint32_t dwMaximumSizeLow, + const char16_t *opt_lpName); int64_t CreateFileMappingNuma( - int64_t opt_hFile /* -1ul is MAP_ANONYMOUS */, + int64_t opt_hFile, const struct NtSecurityAttributes *opt_lpFileMappingAttributes, uint32_t flProtect, uint32_t dwMaximumSizeHigh, uint32_t dwMaximumSizeLow, const char16_t *opt_lpName, uint32_t nndDesiredNumaNode); -void *MapViewOfFileExNuma( - int64_t hFileMappingObject, /* @see CreateFileMapping() */ - uint32_t dwDesiredAccess, uint32_t dwFileOffsetHigh, /* high order bits */ - uint32_t dwFileOffsetLow, /* low order bits */ - size_t dwNumberOfBytesToMap, void *opt_lpDesiredBaseAddress, - uint32_t nndDesiredNumaNode); +void *MapViewOfFileEx(int64_t hFileMappingObject, uint32_t dwDesiredAccess, + uint32_t dwFileOffsetHigh, uint32_t dwFileOffsetLow, + size_t dwNumberOfBytesToMap, + void *opt_lpDesiredBaseAddress); +void *MapViewOfFileExNuma(int64_t hFileMappingObject, uint32_t dwDesiredAccess, + uint32_t dwFileOffsetHigh, uint32_t dwFileOffsetLow, + size_t dwNumberOfBytesToMap, + void *opt_lpDesiredBaseAddress, + uint32_t nndDesiredNumaNode); bool32 UnmapViewOfFile(const void *lpBaseAddress); bool32 FlushViewOfFile(const void *lpBaseAddress, diff --git a/libc/runtime/exit.c b/libc/runtime/exit.c index 3dcaad2ce..da4e882d1 100644 --- a/libc/runtime/exit.c +++ b/libc/runtime/exit.c @@ -33,9 +33,14 @@ * @noreturn */ wontreturn void exit(int exitcode) { + const uintptr_t *p; STRACE("exit(%d)", exitcode); if (weaken(__cxa_finalize)) { weaken(__cxa_finalize)(NULL); } - quick_exit(exitcode); + for (p = __fini_array_end; p > __fini_array_start;) { + ((void (*)(void))(*--p))(); + } + __restorewintty(); + _Exit(exitcode); } diff --git a/libc/runtime/fork-nt.c b/libc/runtime/fork-nt.c index 412c83f51..20f284ffe 100644 --- a/libc/runtime/fork-nt.c +++ b/libc/runtime/fork-nt.c @@ -160,19 +160,16 @@ textwindows void WinMainForked(void) { ReadAll(reader, &mapcount, sizeof(_mmi.i)); ReadAll(reader, &mapcapacity, sizeof(_mmi.n)); specialz = ROUNDUP(mapcapacity * sizeof(_mmi.p[0]), kMemtrackGran); - MapViewOfFileExNuma(CreateFileMappingNuma( - -1, &kNtIsInheritable, kNtPageReadwrite, - specialz >> 32, specialz, 0, kNtNumaNoPreferredNode), - kNtFileMapWrite, 0, 0, specialz, maps, - kNtNumaNoPreferredNode); + MapViewOfFileEx(CreateFileMapping(-1, &kNtIsInheritable, kNtPageReadwrite, + specialz >> 32, specialz, 0), + kNtFileMapWrite, 0, 0, specialz, maps); ReadAll(reader, maps, mapcount * sizeof(_mmi.p[0])); if (IsAsan()) { shad = (char *)(((intptr_t)maps >> 3) + 0x7fff8000); size = ROUNDUP(specialz >> 3, FRAMESIZE); - MapViewOfFileExNuma( - CreateFileMappingNuma(-1, &kNtIsInheritable, kNtPageReadwrite, - size >> 32, size, 0, kNtNumaNoPreferredNode), - kNtFileMapWrite, 0, 0, size, maps, kNtNumaNoPreferredNode); + MapViewOfFileEx(CreateFileMapping(-1, &kNtIsInheritable, kNtPageReadwrite, + size >> 32, size, 0), + kNtFileMapWrite, 0, 0, size, maps); #if 0 ReadAll(reader, shad, (mapcount * sizeof(_mmi.p[0])) >> 3); #endif @@ -191,21 +188,20 @@ textwindows void WinMainForked(void) { STRACE("fork() child CloseHandle(%ld) ~~~FAILED~~~ %m", maps[i].h); } upsize = ROUNDUP(size, FRAMESIZE); - maps[i].h = CreateFileMappingNuma(-1, &kNtIsInheritable, - kNtPageExecuteReadwrite, upsize >> 32, - upsize, NULL, kNtNumaNoPreferredNode); - MapViewOfFileExNuma(maps[i].h, kNtFileMapWrite | kNtFileMapExecute, 0, 0, - upsize, addr, kNtNumaNoPreferredNode); + maps[i].h = + CreateFileMapping(-1, &kNtIsInheritable, kNtPageExecuteReadwrite, + upsize >> 32, upsize, NULL); + MapViewOfFileEx(maps[i].h, kNtFileMapWrite | kNtFileMapExecute, 0, 0, + upsize, addr); ReadAll(reader, addr, size); } else { STRACE("fork() child %p %'zu mapping shared hand:%ld offset:%'lu", addr, size, maps[i].h, maps[i].offset); - MapViewOfFileExNuma(maps[i].h, - (maps[i].prot & PROT_WRITE) - ? kNtFileMapWrite | kNtFileMapExecute - : kNtFileMapRead | kNtFileMapExecute, - maps[i].offset >> 32, maps[i].offset, size, addr, - kNtNumaNoPreferredNode); + MapViewOfFileEx(maps[i].h, + (maps[i].prot & PROT_WRITE) + ? kNtFileMapWrite | kNtFileMapExecute + : kNtFileMapRead | kNtFileMapExecute, + maps[i].offset >> 32, maps[i].offset, size, addr); } } diff --git a/libc/runtime/winmain.greg.c b/libc/runtime/winmain.greg.c index e42a2cd63..f0c5aa490 100644 --- a/libc/runtime/winmain.greg.c +++ b/libc/runtime/winmain.greg.c @@ -50,6 +50,13 @@ #include "libc/str/tpenc.h" #include "libc/str/utf16.h" +#if IsTiny() +extern typeof(CreateFileMapping) *const __imp_CreateFileMappingW __msabi; +extern typeof(MapViewOfFileEx) *const __imp_MapViewOfFileEx __msabi; +#define CreateFileMapping __imp_CreateFileMappingW +#define MapViewOfFileEx __imp_MapViewOfFileEx +#endif + #define AT_EXECFN 31L #define MAP_ANONYMOUS 32 #define MAP_PRIVATE 2 @@ -121,7 +128,6 @@ static noasan textwindows wontreturn noinstrument void WinMainNew( STRACE("SetConsoleCP(kNtCpUtf8) → %hhhd", rc); rc = SetConsoleOutputCP(kNtCpUtf8); STRACE("SetConsoleOutputCP(kNtCpUtf8) → %hhhd", rc); - SetEnvironmentVariable(u"TERM", u"xterm-truecolor"); for (i = 0; i < 2; ++i) { hand = GetStdHandle(kConsoleHandles[i]); rc = GetConsoleMode(hand, __ntconsolemode + i); @@ -139,12 +145,11 @@ static noasan textwindows wontreturn noinstrument void WinMainNew( allocaddr = stackaddr - argsize; STRACE("WinMainNew() mapping %'zu byte arg block + stack at %p", allocsize, allocaddr); - MapViewOfFileExNuma( - (_mmi.p[0].h = CreateFileMappingNuma( - -1, &kNtIsInheritable, kNtPageExecuteReadwrite, allocsize >> 32, - allocsize, NULL, kNtNumaNoPreferredNode)), - kNtFileMapWrite | kNtFileMapExecute, 0, 0, allocsize, (void *)allocaddr, - kNtNumaNoPreferredNode); + MapViewOfFileEx( + (_mmi.p[0].h = + CreateFileMapping(-1, &kNtIsInheritable, kNtPageExecuteReadwrite, + allocsize >> 32, allocsize, NULL)), + kNtFileMapWrite | kNtFileMapExecute, 0, 0, allocsize, (void *)allocaddr); _mmi.p[0].x = allocaddr >> 16; _mmi.p[0].y = (allocaddr >> 16) + ((allocsize >> 16) - 1); _mmi.p[0].prot = PROT_READ | PROT_WRITE | PROT_EXEC;