259 lines
14 KiB
C
259 lines
14 KiB
C
#ifndef COSMOPOLITAN_LIBC_NT_FILES_H_
|
|
#define COSMOPOLITAN_LIBC_NT_FILES_H_
|
|
#include "libc/nt/enum/accessmask.h"
|
|
#include "libc/nt/enum/fileinfobyhandleclass.h"
|
|
#include "libc/nt/enum/filemovemethod.h"
|
|
#include "libc/nt/enum/filesharemode.h"
|
|
#include "libc/nt/enum/findexinfolevels.h"
|
|
#include "libc/nt/enum/findexsearchops.h"
|
|
#include "libc/nt/enum/getfileexinfolevels.h"
|
|
#include "libc/nt/enum/movefileexflags.h"
|
|
#include "libc/nt/enum/securityimpersonationlevel.h"
|
|
#include "libc/nt/enum/securityinformation.h"
|
|
#include "libc/nt/enum/tokentype.h"
|
|
#include "libc/nt/struct/filesegmentelement.h"
|
|
#include "libc/nt/struct/filetime.h"
|
|
#include "libc/nt/thunk/msabi.h"
|
|
#if 0
|
|
/* ░░░░
|
|
▒▒▒░░░▒▒▒▒▒▒▒▓▓▓░
|
|
▒▒▒▒░░░▒▒▒▒▒▒▓▓▓▓▓▓░
|
|
▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▒▓░
|
|
▒▒▒░░░░▒▒▒▒▒▒▓▓▓▓▓▓ ▓▓▓▓▓▓▒ ▒▒▒▓▓█
|
|
▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓
|
|
░▒▒▒░░░░▒▒▒▒▒▒▓▓▓▓▓▓ █▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█
|
|
▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓░ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓
|
|
▒▒▒▒░░░▒▒▒▒▒▒▒▓▓▓▓▓▓ ▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▒
|
|
▒▒▒▒▓▓ ▓▒▒▓▓▓▓ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█
|
|
▒▓ ▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓
|
|
░░░░░░░░░░░▒▒▒▒ ▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓█
|
|
▒▒░░░░░░░░░░▒▒▒▒▒▓▓▓ ▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓
|
|
░▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓░ ░▓███▓
|
|
▒▒░░░░░░░░░░▒▒▒▒▒▓▓░ ▒▓▓▓▒▒▒ ░▒▒▒▓ ████████████
|
|
▒▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▒▓▓▓▓▒▒▒▒▒▒▒▒░░░▒▒▒▒▒░ ░███
|
|
▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▓ ███
|
|
▒▒░░░░░░░░░░▒▒▒▒▒▒▓▓ ▒▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▒ ▓██
|
|
▒░░░░░░░░░░░▒▒▒▒▒▓▓ ▓▓▓▓▒▒▒▒▒▒▒▒░░░▒▒▒▒▒▓ ▓██
|
|
▒▒░░░▒▒▒░░░▒▒░▒▒▒▓▓▒ ▒▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▒ ███
|
|
░▒▓ ░▓▓▓▓▒▒▒▒▒▒▒▒░░░░▒▒▒▒▓ ▓██
|
|
╔────────────────────────────────────────────────────────────────▀▀▀─────────│─╗
|
|
│ cosmopolitan § new technology » files ─╬─│┼
|
|
╚────────────────────────────────────────────────────────────────────────────│*/
|
|
#endif
|
|
|
|
/* CopyFileEx */
|
|
#define NT_PROGRESS_CONTINUE 0
|
|
#define NT_PROGRESS_CANCEL 1
|
|
#define NT_PROGRESS_STOP 2
|
|
#define NT_PROGRESS_QUIET 3
|
|
#define NT_CALLBACK_CHUNK_FINISHED 0x00000000
|
|
#define NT_CALLBACK_STREAM_SWITCH 0x00000001
|
|
#define NT_COPY_FILE_FAIL_IF_EXISTS 0x00000001
|
|
#define NT_COPY_FILE_RESTARTABLE 0x00000002
|
|
#define NT_COPY_FILE_OPEN_SOURCE_FOR_WRITE 0x00000004
|
|
#define NT_COPY_FILE_ALLOW_DECRYPTED_DESTINATION 0x00000008
|
|
#define NT_COPY_FILE_COPY_SYMLINK 0x00000800
|
|
#define NT_COPY_FILE_NO_BUFFERING 0x00001000
|
|
#define NT_COPY_FILE_REQUEST_SECURITY_PRIVILEGES 0x00002000 /* Win8+ */
|
|
#define NT_COPY_FILE_RESUME_FROM_PAUSE 0x00004000 /* Win8+ */
|
|
#define NT_COPY_FILE_REQUEST_SECURITY_PRIVILEGES 0x00002000 /* Win8+ */
|
|
#define NT_COPY_FILE_NO_OFFLOAD 0x00040000 /* Win8+ */
|
|
#define NT_COPY_FILE_IGNORE_EDP_BLOCK 0x00400000 /* Win10+ */
|
|
#define NT_COPY_FILE_IGNORE_SOURCE_ENCRYPTION 0x00800000 /* Win10+ */
|
|
|
|
/* ReplaceFile */
|
|
#define NT_REPLACEFILE_WRITE_THROUGH 0x00000001
|
|
#define NT_REPLACEFILE_IGNORE_MERGE_ERRORS 0x00000002
|
|
#define NT_REPLACEFILE_IGNORE_ACL_ERRORS 0x00000004
|
|
#define NT_REPLACEFILE_WRITE_THROUGH 0x00000001
|
|
#define NT_REPLACEFILE_IGNORE_MERGE_ERRORS 0x00000002
|
|
#define NT_REPLACEFILE_IGNORE_ACL_ERRORS 0x00000004
|
|
|
|
/* SetHandleInformation */
|
|
#define kNtHandleFlagInherit 0x00000001
|
|
#define kNtHandleFlagProtectFromClose 0x00000002
|
|
|
|
#define kNtFindFirstExCaseSensitive 0x00000001
|
|
#define kNtFindFirstExLargeFetch 0x00000002
|
|
|
|
#define kNtDuplicateCloseSource 0x00000001
|
|
#define kNtDuplicateSameAccess 0x00000002
|
|
|
|
#define kNtSymbolicLinkFlagDirectory 1
|
|
|
|
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
|
COSMOPOLITAN_C_START_
|
|
|
|
struct NtByHandleFileInformation;
|
|
struct NtFileTime;
|
|
struct NtGenericMapping;
|
|
struct NtOverlapped;
|
|
struct NtPrivilegeSet;
|
|
struct NtSecurityAttributes;
|
|
struct NtSecurityDescriptor;
|
|
struct NtWin32FindData;
|
|
struct NtWin32FindData;
|
|
|
|
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, enum NtMoveFileExFlags 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);
|
|
enum NtFileType 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,
|
|
enum NtGetFileexInfoLevels 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,
|
|
enum NtFileMoveMethod dwMoveMethod);
|
|
bool32 SetFilePointerEx(int64_t hFile, int64_t liDistanceToMove,
|
|
int64_t *optional_lpNewFilePointer,
|
|
enum NtFileMoveMethod 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,
|
|
enum NtSecurityImpersonationLevel dwImpersonationLevel,
|
|
int64_t *out_hDuplicateTokenHandle);
|
|
bool32 DuplicateTokenEx(int64_t hExistingToken, unsigned int dwDesiredAccess,
|
|
struct NtSecurityAttributes *lpTokenAttributes,
|
|
enum NtSecurityImpersonationLevel ImpersonationLevel,
|
|
enum NtTokenType 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,
|
|
enum NtFindexInfoLevels fInfoLevelId,
|
|
void *out_lpFindFileData,
|
|
enum NtFindexSearchOps 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();
|
|
|
|
#if ShouldUseMsabiAttribute()
|
|
#include "libc/nt/thunk/files.inc"
|
|
#endif /* ShouldUseMsabiAttribute() */
|
|
COSMOPOLITAN_C_END_
|
|
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
|
#endif /* COSMOPOLITAN_LIBC_NT_FILES_H_ */
|