mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 19:43:32 +00:00
417797d218
We always favor calling functions like openat(), fstatat(), etc. because Linux, XNU, FreeBSD, and OpenBSD all elected to support them, while some systems like Android love them so much, that they stopped supporting the old interfaces. This change ensures that when dirfd is actually a dirfd and not AT_FDCWD we'll do the right thing on Windows NT. We use an API that's been around since Vista to accomplish that. This change also adds exponential backoff to chdir() on Windows since it seems almost as flaky on Windows 7 as the rmdir() function.
216 lines
12 KiB
C
216 lines
12 KiB
C
#ifndef COSMOPOLITAN_LIBC_NT_FILES_H_
|
|
#define COSMOPOLITAN_LIBC_NT_FILES_H_
|
|
#include "libc/nt/struct/byhandlefileinformation.h"
|
|
#include "libc/nt/struct/filesegmentelement.h"
|
|
#include "libc/nt/struct/filetime.h"
|
|
#include "libc/nt/struct/genericmapping.h"
|
|
#include "libc/nt/struct/objectattributes.h"
|
|
#include "libc/nt/struct/overlapped.h"
|
|
#include "libc/nt/struct/privilegeset.h"
|
|
#include "libc/nt/struct/securityattributes.h"
|
|
#include "libc/nt/struct/win32finddata.h"
|
|
#include "libc/nt/thunk/msabi.h"
|
|
/* ░░░░
|
|
▒▒▒░░░▒▒▒▒▒▒▒▓▓▓░
|
|
▒▒▒▒░░░▒▒▒▒▒▒▓▓▓▓▓▓░
|
|
▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▒▓░
|
|
▒▒▒░░░░▒▒▒▒▒▒▓▓▓▓▓▓ ▓▓▓▓▓▓▒ ▒▒▒▓▓█
|
|
▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓
|
|
░▒▒▒░░░░▒▒▒▒▒▒▓▓▓▓▓▓ █▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█
|
|
▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓░ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓
|
|
▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▒
|
|
▒▒▒▒▓▓ ▓▒▒▓▓▓▓ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█
|
|
▒▓ ▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓
|
|
░░░░░░░░░░░▒▒▒▒ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█
|
|
▒▒░░░░░░░░░░▒▒▒▒▒▓▓▓ ▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓
|
|
░▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓░ ░▓███▓
|
|
▒▒░░░░░░░░░░▒▒▒▒▒▓▓░ ▒▓▓▓▒▒▒ ░▒▒▒▓ ████████████
|
|
▒▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▒▓▓▓▓▒▒▒▒▒▒▒▒░░░▒▒▒▒▒░ ░███
|
|
▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▓ ███
|
|
▒▒░░░░░░░░░░▒▒▒▒▒▒▓▓ ▒▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▒ ▓██
|
|
▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓▓▓▓▒▒▒▒▒▒▒▒░░░▒▒▒▒▒▓ ▓██
|
|
▒▒░░░▒▒▒░░░▒▒░▒▒▒▓▓▒ ▒▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▒ ███
|
|
░▒▓ ░▓▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▓ ▓██
|
|
╔────────────────────────────────────────────────────────────────▀▀▀─────────│─╗
|
|
│ cosmopolitan § new technology » files ─╬─│┼
|
|
╚────────────────────────────────────────────────────────────────────────────│*/
|
|
|
|
#define kNtHandleFlagInherit 1 /* SetHandleInformation */
|
|
#define kNtHandleFlagProtectFromClose 2
|
|
|
|
#define kNtFindFirstExCaseSensitive 1
|
|
#define kNtFindFirstExLargeFetch 2
|
|
|
|
#define kNtDuplicateCloseSource 1
|
|
#define kNtDuplicateSameAccess 2
|
|
|
|
#define kNtSymbolicLinkFlagDirectory 1
|
|
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
COSMOPOLITAN_C_START_
|
|
|
|
intptr_t LoadResource(int64_t hModule, int64_t hResInfo);
|
|
uint32_t SetHandleCount(uint32_t uNumber);
|
|
uint32_t GetLogicalDrives(void);
|
|
bool32 FlushFileBuffers(int64_t hFile);
|
|
|
|
int64_t ReOpenFile(int64_t hOriginalFile, uint32_t dwDesiredAccess,
|
|
uint32_t dwShareMode, uint32_t dwFlagsAndAttributes);
|
|
|
|
bool32 DeleteFile(const char16_t *lpFileName) paramsnonnull();
|
|
|
|
bool32 CopyFile(const char16_t *lpExistingFileName,
|
|
const char16_t *lpNewFileName, bool32 bFailIfExists)
|
|
paramsnonnull();
|
|
|
|
bool32 MoveFile(const char16_t *lpExistingFileName,
|
|
const char16_t *lpNewFileName) paramsnonnull();
|
|
bool32 MoveFileEx(const char16_t *lpExistingFileName,
|
|
const char16_t *lpNewFileName, int dwFlags) paramsnonnull();
|
|
|
|
bool32 SetCurrentDirectory(const char16_t *lpPathName);
|
|
uint32_t GetCurrentDirectory(uint32_t nBufferLength, char16_t *out_lpBuffer);
|
|
|
|
bool32 CreateDirectory(const char16_t *lpPathName,
|
|
struct NtSecurityAttributes *lpSecurityAttributes);
|
|
bool32 RemoveDirectory(const char16_t *lpPathName);
|
|
|
|
bool32 DuplicateHandle(int64_t hSourceProcessHandle, int64_t hSourceHandle,
|
|
int64_t hTargetProcessHandle, int64_t *lpTargetHandle,
|
|
uint32_t dwDesiredAccess, bool32 bInheritHandle,
|
|
uint32_t dwOptions);
|
|
|
|
bool32 GetHandleInformation(int64_t hObject, uint32_t *out_lpdwFlags);
|
|
bool32 SetHandleInformation(int64_t hObject, uint32_t dwMask, uint32_t dwFlags);
|
|
int GetFileType(int64_t hFile);
|
|
|
|
bool32 GetFileInformationByHandleEx(int64_t hFile,
|
|
uint32_t FileInformationClass,
|
|
void *out_lpFileInformation,
|
|
uint32_t dwBufferSize);
|
|
|
|
bool32 GetFileInformationByHandle(
|
|
int64_t hFile, struct NtByHandleFileInformation *lpFileInformation);
|
|
|
|
uint32_t GetFileAttributes(const char16_t *lpFileName);
|
|
bool32 GetFileAttributesEx(
|
|
const char16_t *lpFileName, int fInfoLevelId /* kNtGetFileExInfoStandard */,
|
|
void *out_lpFileInformation /* → struct NtWin32FileAttributeData * */)
|
|
paramsnonnull();
|
|
|
|
uint32_t GetCompressedFileSize(const char16_t *lpFileName,
|
|
uint32_t *lpFileSizeHigh);
|
|
bool32 SetFileAttributes(const char16_t *lpFileName, uint32_t dwFileAttributes);
|
|
bool32 GetFileTime(int64_t hFile, struct NtFileTime *opt_lpCreationFileTime,
|
|
struct NtFileTime *opt_lpLastAccessFileTime,
|
|
struct NtFileTime *opt_lpLastWriteFileTime);
|
|
bool32 SetFileTime(int64_t hFile,
|
|
const struct NtFileTime *opt_lpCreationFileTime,
|
|
const struct NtFileTime *opt_lpLastAccessFileTime,
|
|
const struct NtFileTime *opt_lpLastWriteFileTime);
|
|
|
|
bool32 DeviceIoControl(int64_t hDevice, uint32_t dwIoControlCode,
|
|
void *lpInBuffer, uint32_t nInBufferSize,
|
|
void *lpOutBuffer, uint32_t nOutBufferSize,
|
|
uint32_t *lpBytesReturned,
|
|
struct NtOverlapped *lpOverlapped);
|
|
|
|
bool32 LockFile(int64_t hFile, uint32_t dwFileOffsetLow,
|
|
uint32_t dwFileOffsetHigh, uint32_t nNumberOfBytesToLockLow,
|
|
uint32_t nNumberOfBytesToLockHigh);
|
|
bool32 LockFileEx(int64_t hFile, uint32_t dwFlags, uint32_t dwReserved,
|
|
uint32_t nNumberOfBytesToLockLow,
|
|
uint32_t nNumberOfBytesToLockHigh,
|
|
struct NtOverlapped *lpOverlapped) paramsnonnull();
|
|
bool32 UnlockFile(int64_t hFile, uint32_t dwFileOffsetLow,
|
|
uint32_t dwFileOffsetHigh, uint32_t nNumberOfBytesToUnlockLow,
|
|
uint32_t nNumberOfBytesToUnlockHigh);
|
|
bool32 UnlockFileEx(int64_t hFile, uint32_t dwReserved,
|
|
uint32_t nNumberOfBytesToUnlockLow,
|
|
uint32_t nNumberOfBytesToUnlockHigh,
|
|
struct NtOverlapped *lpOverlapped) paramsnonnull();
|
|
|
|
bool32 CreateHardLink(const char16_t *lpFileName,
|
|
const char16_t *lpExistingFileName,
|
|
struct NtSecurityAttributes *reserved)
|
|
paramsnonnull((1, 2));
|
|
bool32 CreateSymbolicLink(const char16_t *lpSymlinkFileName,
|
|
const char16_t *lpTargetPathName, uint32_t dwFlags)
|
|
paramsnonnull();
|
|
|
|
uint32_t SetFilePointer(int64_t hFile, int32_t lDistanceToMove,
|
|
int32_t *optional_lpDistanceToMoveHigh,
|
|
int dwMoveMethod);
|
|
bool32 SetFilePointerEx(int64_t hFile, int64_t liDistanceToMove,
|
|
int64_t *optional_lpNewFilePointer, int dwMoveMethod);
|
|
|
|
bool32 SetEndOfFile(int64_t hFile);
|
|
bool32 SetFileValidData(int64_t hFile, int64_t ValidDataLength);
|
|
|
|
bool32 GetFileSecurity(const char16_t *lpFileName,
|
|
uint32_t RequestedInformation,
|
|
struct NtSecurityDescriptor *pSecurityDescriptor,
|
|
uint32_t nLength, uint32_t *lpnLengthNeeded);
|
|
|
|
bool32 OpenProcessToken(int64_t hProcessHandle, uint32_t dwDesiredAccess,
|
|
int64_t *out_hTokenHandle);
|
|
bool32 DuplicateToken(int64_t hExistingTokenHandle, int dwImpersonationLevel,
|
|
int64_t *out_hDuplicateTokenHandle);
|
|
bool32 DuplicateTokenEx(int64_t hExistingToken, unsigned int dwDesiredAccess,
|
|
struct NtSecurityAttributes *lpTokenAttributes,
|
|
int ImpersonationLevel, int TokenType,
|
|
int64_t *out_phNewToken);
|
|
|
|
bool32 AccessCheck(struct NtSecurityDescriptor *pSecurityDescriptor,
|
|
int64_t ClientToken, unsigned int DesiredAccess,
|
|
struct NtGenericMapping *lpGenericMapping,
|
|
struct NtPrivilegeSet *lpPrivilegeSet,
|
|
unsigned int *PrivilegeSetLength,
|
|
unsigned int *GrantedAccess, bool32 *AccessStatus);
|
|
|
|
void MapGenericMask(uint32_t *AccessMask,
|
|
struct NtGenericMapping *GenericMapping);
|
|
|
|
int64_t FindFirstFile(const char16_t *lpFileName,
|
|
struct NtWin32FindData *out_lpFindFileData);
|
|
int64_t FindFirstFileEx(const char16_t *lpFileName, int fInfoLevelId,
|
|
void *out_lpFindFileData, int fSearchOp,
|
|
void *reserved_lpSearchFilter,
|
|
uint32_t dwAdditionalFlags);
|
|
bool32 FindNextFile(int64_t hFindFile,
|
|
struct NtWin32FindData *out_lpFindFileData);
|
|
bool32 FindClose(int64_t inout_hFindFile);
|
|
|
|
int64_t FindFirstVolume(char16_t *out_lpszVolumeName, uint32_t cchBufferLength);
|
|
bool32 FindNextVolume(int64_t inout_hFindVolume, char16_t *out_lpszVolumeName,
|
|
uint32_t cchBufferLength);
|
|
bool32 FindVolumeClose(int64_t hFindVolume);
|
|
|
|
bool32 ReadFileScatter(
|
|
int64_t hFileOpenedWithOverlappedAndNoBuffering,
|
|
const union NtFileSegmentElement
|
|
aNullTerminatedPageAlignedSizedSegmentArray[],
|
|
uint32_t nNumberOfBytesToReadThatsMultipleOfFileVolumeSectorSize,
|
|
uint32_t *lpReserved, struct NtOverlapped *inout_lpOverlapped)
|
|
paramsnonnull();
|
|
|
|
bool32 WriteFileGather(int64_t hFileOpenedWithOverlappedAndNoBuffering,
|
|
const union NtFileSegmentElement aSegmentArray[],
|
|
uint32_t nNumberOfBytesToWrite, uint32_t *lpReserved,
|
|
struct NtOverlapped inout_lpOverlapped) paramsnonnull();
|
|
|
|
#define kNtFileNameNormalized 0x0
|
|
#define kNtFileNameOpened 0x8
|
|
#define kNtVolumeNameDos 0x0 /* e.g. \\?\C:\Users\jart */
|
|
#define kNtVolumeNameGuid 0x1 /* e.g. \\?\Volume{ea38-etc.}\Users\jart */
|
|
#define kNtVolumeNameNt 0x2 /* e.g. \Device\HarddiskVolume4\Users\jart */
|
|
#define kNtVolumeNameNone 0x4 /* e.g. \Users\jart */
|
|
uint32_t GetFinalPathNameByHandle(int64_t hFile, char16_t *out_path,
|
|
uint32_t arraylen, uint32_t flags);
|
|
|
|
#if ShouldUseMsabiAttribute()
|
|
#include "libc/nt/thunk/files.inc"
|
|
#endif /* ShouldUseMsabiAttribute() */
|
|
COSMOPOLITAN_C_END_
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* COSMOPOLITAN_LIBC_NT_FILES_H_ */
|