diff --git a/libc/nt/enum/memflags.h b/libc/nt/enum/memflags.h index 033d3fa3cbf..f2eb173f6d8 100644 --- a/libc/nt/enum/memflags.h +++ b/libc/nt/enum/memflags.h @@ -16,4 +16,7 @@ #define kNtMemLargePages 0x20000000 #define kNtMem4mbPages 0x80000000 +#define kNtMemReplacePlaceholder 0x00004000 +#define kNtMemLargePages 0x20000000 + #endif /* COSMOPOLITAN_LIBC_NT_ENUM_MEMFLAGS_H_ */ diff --git a/libc/nt/kernel32/MapViewOfFile3.S b/libc/nt/kernel32/MapViewOfFile3.S new file mode 100644 index 00000000000..2b242dfd335 --- /dev/null +++ b/libc/nt/kernel32/MapViewOfFile3.S @@ -0,0 +1,18 @@ +#include "libc/nt/codegen.h" +.imp kernel32,__imp_MapViewOfFile3,MapViewOfFile3 + + .text.windows + .ftrace1 +MapViewOfFile3: + .ftrace2 +#ifdef __x86_64__ + push %rbp + mov %rsp,%rbp + mov __imp_MapViewOfFile3(%rip),%rax + jmp __sysv2nt10 +#elif defined(__aarch64__) + mov x0,#0 + ret +#endif + .endfn MapViewOfFile3,globl + .previous diff --git a/libc/nt/master.sh b/libc/nt/master.sh index 5529622ea7d..ace1dbf5774 100755 --- a/libc/nt/master.sh +++ b/libc/nt/master.sh @@ -203,6 +203,7 @@ imp 'LoadResource' LoadResource kernel32 2 imp 'LocalFree' LocalFree kernel32 1 imp 'LockFile' LockFile kernel32 5 imp 'LockResource' LockResource kernel32 1 +imp 'MapViewOfFile3' MapViewOfFile3 kernel32 9 imp 'MoveFile' MoveFileW kernel32 2 imp 'MultiByteToWideChar' MultiByteToWideChar kernel32 6 imp 'OfferVirtualMemory' OfferVirtualMemory kernel32 3 diff --git a/libc/nt/memory.h b/libc/nt/memory.h index 68ac1ef8356..4923ba1f045 100644 --- a/libc/nt/memory.h +++ b/libc/nt/memory.h @@ -1,5 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_NT_MEMORY_H_ #define COSMOPOLITAN_LIBC_NT_MEMORY_H_ +#include "libc/nt/struct/memextendedparameter.h" #include "libc/nt/struct/memorybasicinformation.h" #include "libc/nt/struct/memoryrangeentry.h" #include "libc/nt/struct/securityattributes.h" @@ -82,6 +83,19 @@ void *HeapReAlloc(int64_t hHeap, uint32_t dwFlags, void *lpMem, void *GlobalAlloc(uint32_t uFlags, uint64_t dwBytes) __wur; void *GlobalFree(void *hMem); +/** + * @param AllocationType + * - kNtMemReserve + * - kNtMemReplacePlaceholder + * - kNtMemLargePages + */ +void *MapViewOfFile3( + intptr_t FileMapping, intptr_t Process, void *opt_BaseAddress, + uint64_t Offset, size_t ViewSize, unsigned AllocationType, + unsigned PageProtection, + struct NtMemExtendedParameter *in_out_opt_ExtendedParameters, + unsigned ParameterCount); + #if ShouldUseMsabiAttribute() #include "libc/nt/thunk/memory.inc" #endif /* ShouldUseMsabiAttribute() */ diff --git a/libc/nt/struct/memextendedparameter.h b/libc/nt/struct/memextendedparameter.h new file mode 100644 index 00000000000..6cd4d0f5db5 --- /dev/null +++ b/libc/nt/struct/memextendedparameter.h @@ -0,0 +1,34 @@ +#ifndef COSMOPOLITAN_LIBC_NT_STRUCT_MEMEXTENDEDPARAMETER_H_ +#define COSMOPOLITAN_LIBC_NT_STRUCT_MEMEXTENDEDPARAMETER_H_ + +#define kNtMemExtendedParameterTypeBits 8 + +#define kNtMemExtendedParameterInvalidType 0 +#define kNtMemExtendedParameterAddressRequirements 1 +#define kNtMemExtendedParameterNumaNode 2 +#define kNtMemExtendedParameterPartitionHandle 3 +#define kNtMemExtendedParameterUserPhysicalHandle 4 +#define kNtMemExtendedParameterAttributeFlags 5 +#define kNtMemExtendedParameterMax 6 + +#define kNtMemExtendedParameterGraphics 0x00000001 +#define kNtMemExtendedParameterNonpaged 0x00000002 +#define kNtMemExtendedParameterZeroPagesOptional 0x00000004 +#define kNtMemExtendedParameterNonpagedLarge 0x00000008 +#define kNtMemExtendedParameterNonpagedHuge 0x00000010 + +struct NtMemExtendedParameter { + struct { + uint64_t Type : kNtMemExtendedParameterTypeBits; + uint64_t Reserved : 64 - kNtMemExtendedParameterTypeBits; + } DUMMYSTRUCTNAME; + union { + uint64_t ULong64; + void *Pointer; + size_t Size; + intptr_t Handle; + unsigned ULong; + } DUMMYUNIONNAME; +}; + +#endif /* COSMOPOLITAN_LIBC_NT_STRUCT_MEMEXTENDEDPARAMETER_H_ */