X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=include%2Fwimlib%2Fwin32_common.h;h=a886b56daafe44fc6fefe8673394bd45e9c7df03;hp=7cd991ed9ad753113da5cf4d6793279f720beffd;hb=HEAD;hpb=e0cb5f9264bdea9938e48a37ebe9007467c0dd46 diff --git a/include/wimlib/win32_common.h b/include/wimlib/win32_common.h index 7cd991ed..46faf6ac 100644 --- a/include/wimlib/win32_common.h +++ b/include/wimlib/win32_common.h @@ -1,121 +1,23 @@ +/* + * win32_common.h - common header for Windows-specific files. This always + * should be included first. + */ + #ifndef _WIMLIB_WIN32_COMMON_H #define _WIMLIB_WIN32_COMMON_H +#include #include +#include + #ifdef ERROR # undef ERROR #endif - -#include "wimlib/types.h" #include "wimlib/win32.h" -#include -#include - -extern void -set_errno_from_GetLastError(void); - -extern void -set_errno_from_win32_error(DWORD err); +/* ntdll definitions */ -extern void -set_errno_from_nt_status(NTSTATUS status); - -/* ntdll functions */ - -extern NTSTATUS (WINAPI *func_NtCreateFile)(PHANDLE FileHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes, - PIO_STATUS_BLOCK IoStatusBlock, - PLARGE_INTEGER AllocationSize, - ULONG FileAttributes, - ULONG ShareAccess, - ULONG CreateDisposition, - ULONG CreateOptions, - PVOID EaBuffer, - ULONG EaLength); - -extern NTSTATUS (WINAPI *func_NtOpenFile) (PHANDLE FileHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes, - PIO_STATUS_BLOCK IoStatusBlock, - ULONG ShareAccess, - ULONG OpenOptions); - -extern NTSTATUS (WINAPI *func_NtReadFile) (HANDLE FileHandle, - HANDLE Event, - PIO_APC_ROUTINE ApcRoutine, - PVOID ApcContext, - PIO_STATUS_BLOCK IoStatusBlock, - PVOID Buffer, - ULONG Length, - PLARGE_INTEGER ByteOffset, - PULONG Key); - -extern NTSTATUS (WINAPI *func_NtWriteFile) (HANDLE FileHandle, - HANDLE Event, - PIO_APC_ROUTINE ApcRoutine, - PVOID ApcContext, - PIO_STATUS_BLOCK IoStatusBlock, - PVOID Buffer, - ULONG Length, - PLARGE_INTEGER ByteOffset, - PULONG Key); - -extern NTSTATUS (WINAPI *func_NtQueryInformationFile)(HANDLE FileHandle, - PIO_STATUS_BLOCK IoStatusBlock, - PVOID FileInformation, - ULONG Length, - FILE_INFORMATION_CLASS FileInformationClass); - -extern NTSTATUS (WINAPI *func_NtQuerySecurityObject)(HANDLE handle, - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR SecurityDescriptor, - ULONG Length, - PULONG LengthNeeded); - -extern NTSTATUS (WINAPI *func_NtQueryDirectoryFile) (HANDLE FileHandle, - HANDLE Event, - PIO_APC_ROUTINE ApcRoutine, - PVOID ApcContext, - PIO_STATUS_BLOCK IoStatusBlock, - PVOID FileInformation, - ULONG Length, - FILE_INFORMATION_CLASS FileInformationClass, - BOOLEAN ReturnSingleEntry, - PUNICODE_STRING FileName, - BOOLEAN RestartScan); - -extern NTSTATUS (WINAPI *func_NtQueryVolumeInformationFile) (HANDLE FileHandle, - PIO_STATUS_BLOCK IoStatusBlock, - PVOID FsInformation, - ULONG Length, - FS_INFORMATION_CLASS FsInformationClass); - -extern NTSTATUS (WINAPI *func_NtSetInformationFile)(HANDLE FileHandle, - PIO_STATUS_BLOCK IoStatusBlock, - PVOID FileInformation, - ULONG Length, - FILE_INFORMATION_CLASS FileInformationClass); - -extern NTSTATUS (WINAPI *func_NtSetSecurityObject)(HANDLE Handle, - SECURITY_INFORMATION SecurityInformation, - PSECURITY_DESCRIPTOR SecurityDescriptor); - -extern NTSTATUS (WINAPI *func_NtFsControlFile) (HANDLE FileHandle, - HANDLE Event, - PIO_APC_ROUTINE ApcRoutine, - PVOID ApcContext, - PIO_STATUS_BLOCK IoStatusBlock, - ULONG FsControlCode, - PVOID InputBuffer, - ULONG InputBufferLength, - PVOID OutputBuffer, - ULONG OutputBufferLength); - -extern NTSTATUS (WINAPI *func_NtClose) (HANDLE Handle); - -extern DWORD (WINAPI *func_RtlNtStatusToDosError)(NTSTATUS status); +#define FILE_OPENED 0x00000001 typedef struct _RTLP_CURDIR_REF { LONG RefCount; @@ -128,11 +30,100 @@ typedef struct _RTL_RELATIVE_NAME_U { PRTLP_CURDIR_REF CurDirRef; } RTL_RELATIVE_NAME_U, *PRTL_RELATIVE_NAME_U; -extern BOOLEAN (WINAPI *func_RtlDosPathNameToNtPathName_U) - (IN PCWSTR DosName, - OUT PUNICODE_STRING NtName, - OUT PCWSTR *PartName, - OUT PRTL_RELATIVE_NAME_U RelativeName); +#ifndef FSCTL_SET_PERSISTENT_VOLUME_STATE +#define FSCTL_SET_PERSISTENT_VOLUME_STATE \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED 0x00000001 + +typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION { + ULONG VolumeFlags; + ULONG FlagMask; + ULONG Version; + ULONG Reserved; +} FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION; +#endif /* FSCTL_SET_PERSISTENT_VOLUME_STATE */ + +/* ntdll functions */ + +NTSTATUS +NTAPI +NtReadFile(IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTSTATUS +NTAPI +NtWriteFile(IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTSTATUS +NTAPI +NtQueryDirectoryFile(IN HANDLE FileHandle, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan); + +NTSTATUS +NTAPI +NtQuerySecurityObject(IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSTATUS +NTAPI +NtSetSecurityObject(IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTSTATUS +NTAPI +NtOpenSymbolicLinkObject(PHANDLE LinkHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes); + +NTSTATUS +NTAPI +NtQueryEaFile(IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan); + +NTSTATUS +NTAPI +NtSetEaFile(IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length); + +/* Dynamically loaded ntdll functions */ extern NTSTATUS (WINAPI *func_RtlDosPathNameToNtPathName_U_WithStatus) (IN PCWSTR DosName, @@ -143,18 +134,31 @@ extern NTSTATUS (WINAPI *func_RtlDosPathNameToNtPathName_U_WithStatus) extern NTSTATUS (WINAPI *func_RtlCreateSystemVolumeInformationFolder) (PCUNICODE_STRING VolumeRootPath); -#define FSCTL_SET_PERSISTENT_VOLUME_STATE 0x90238 +/* Other utility functions */ -#define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED 0x00000001 +int +win32_path_to_nt_path(const wchar_t *win32_path, UNICODE_STRING *nt_path); -typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION { - ULONG VolumeFlags; - ULONG FlagMask; - ULONG Version; - ULONG Reserved; -} FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION; +int +win32_get_drive_path(const wchar_t *file_path, wchar_t drive_path[7]); -extern int -win32_path_to_nt_path(const wchar_t *win32_path, UNICODE_STRING *nt_path); +bool +win32_try_to_attach_wof(const wchar_t *drive); + +void __attribute__((cold)) +win32_warning(DWORD err, const wchar_t *format, ...); + +void __attribute__((cold)) +win32_error(DWORD err, const wchar_t *format, ...); + +void __attribute__((cold)) +winnt_warning(NTSTATUS status, const wchar_t *format, ...); + +void __attribute__((cold)) +winnt_error(NTSTATUS status, const wchar_t *format, ...); + +NTSTATUS +winnt_fsctl(HANDLE h, u32 code, const void *in, u32 in_size, + void *out, u32 out_size_avail, u32 *actual_out_size_ret); #endif /* _WIMLIB_WIN32_COMMON_H */