cosmopolitan/libc/nt/files.h
Justine Tunney 0d74673213
Introduce interprocess signaling on Windows
This change gets rsync working without any warning or errors. On Windows
we now create a bunch of C:\var\sig\x\y.pid shared memory files, so sigs
can be delivered between processes. WinMain() creates this file when the
process starts. If the program links signaling system calls then we make
a thread at startup too, which allows asynchronous delivery each quantum
and cancelation points can spot these signals potentially faster on wait

See #1240
2024-09-19 03:02:13 -07:00

236 lines
13 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
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 *opt_lpNewFileName, int dwFlags)
paramsnonnull((1));
bool32 SetCurrentDirectory(const char16_t *lpPathName);
uint32_t GetCurrentDirectory(uint32_t nBufferLength, char16_t *out_lpBuffer);
bool32 CreateDirectory(const char16_t *lpPathName,
const 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);
bool32 SetFileInformationByHandle(int64_t hFile, int FileInformationClass,
const void *lpFileInformation,
uint32_t dwBufferSize);
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 UnlockFile(int64_t hFile, uint32_t dwFileOffsetLow,
uint32_t dwFileOffsetHigh, uint32_t nNumberOfBytesToUnlockLow,
uint32_t nNumberOfBytesToUnlockHigh);
bool32 LockFileEx(int64_t hFile, uint32_t dwFlags, uint32_t dwReserved,
uint32_t nNumberOfBytesToLockLow,
uint32_t nNumberOfBytesToLockHigh,
struct NtOverlapped *lpOverlapped) paramsnonnull();
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,
const struct NtSecurityAttributes *reserved)
paramsnonnull((1, 2));
bool32 CreateSymbolicLink(const char16_t *lpSymlinkFileName,
const char16_t *lpTargetPathName, uint32_t dwFlags)
paramsnonnull();
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,
const 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 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);
uint32_t GetFullPathName(const char16_t *lpFileName, uint32_t nBufferLength,
char16_t *lpBuffer, char16_t **lpFilePart);
bool32 GetOverlappedResult(int64_t hFile, struct NtOverlapped *lpOverlapped,
uint32_t *lpNumberOfBytesTransferred, bool32 bWait);
bool32 GetOverlappedResultEx(int64_t hFile, struct NtOverlapped *lpOverlapped,
uint32_t *lpNumberOfBytesTransferred,
uint32_t dwMilliseconds, bool32 bAlertable);
bool32 GetVolumePathName(const char16_t *lpszFileName,
char16_t *lpszVolumePathName,
uint32_t cchBufferLength);
bool32 GetVolumeInformationByHandle(int64_t hFile,
char16_t *opt_out_lpVolumeNameBuffer,
uint32_t nVolumeNameSize,
uint32_t *opt_out_lpVolumeSerialNumber,
uint32_t *opt_out_lpMaximumComponentLength,
uint32_t *opt_out_lpFileSystemFlags,
char16_t *opt_out_lpFileSystemNameBuffer,
uint32_t nFileSystemNameSize);
uint32_t SetFilePointer(intptr_t hFile, int32_t lDistanceToMove,
long *opt_inout_lpDistanceToMoveHigh,
uint32_t dwMoveMethod);
#if ShouldUseMsabiAttribute()
#include "libc/nt/thunk/files.inc"
#endif /* ShouldUseMsabiAttribute() */
COSMOPOLITAN_C_END_
#endif /* COSMOPOLITAN_LIBC_NT_FILES_H_ */