]> wimlib.net Git - wimlib/blobdiff - include/wimlib/win32_common.h
win32_common: add winnt_fsctl() helper method
[wimlib] / include / wimlib / win32_common.h
index fa10469bc777c0cd0cef4aedf49c3204878b932f..e669d5225a836b1f406b968b4a089e011ad0bd38 100644 (file)
@@ -1,58 +1,65 @@
+/*
+ * 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 <ntstatus.h>
 #include <windows.h>
+#include <winternl.h>
+
 #ifdef ERROR
 #  undef ERROR
 #endif
-
 #include "wimlib/types.h"
 #include "wimlib/win32.h"
 
-#ifdef WITH_NTDLL
-#  include <ntstatus.h>
-#  include <winternl.h>
-#endif
-
-extern void
-set_errno_from_GetLastError(void);
-
-extern void
-set_errno_from_win32_error(DWORD err);
+/* ntdll functions  */
 
-#ifdef WITH_NTDLL
-extern void
-set_errno_from_nt_status(NTSTATUS status);
+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);
+
+#ifndef FILE_OPENED
+#  define FILE_OPENED 0x00000001
 #endif
 
-extern bool
-win32_path_is_root_of_drive(const wchar_t *path);
-
-extern int
-win32_get_vol_flags(const wchar_t *path, unsigned *vol_flags_ret,
-                   bool *supports_SetFileShortName_ret);
-
-extern HANDLE
-win32_open_existing_file(const wchar_t *path, DWORD dwDesiredAccess);
-
-/* Vista and later */
-extern HANDLE (WINAPI *win32func_FindFirstStreamW)(LPCWSTR lpFileName,
-                                                  STREAM_INFO_LEVELS InfoLevel,
-                                                  LPVOID lpFindStreamData,
-                                                  DWORD dwFlags);
-
-/* Vista and later */
-extern BOOL (WINAPI *win32func_FindNextStreamW)(HANDLE hFindStream,
-                                               LPVOID lpFindStreamData);
-
-/* Vista and later */
-extern BOOL (WINAPI *win32func_CreateSymbolicLinkW)(const wchar_t *lpSymlinkFileName,
-                                                   const wchar_t *lpTargetFileName,
-                                                   DWORD dwFlags);
-
-/* ntdll functions  */
-
-#ifdef WITH_NTDLL
+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,
@@ -78,31 +85,86 @@ extern NTSTATUS (WINAPI *func_NtQueryDirectoryFile) (HANDLE FileHandle,
                                                     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_NtClose) (HANDLE Handle);
+
 extern DWORD (WINAPI *func_RtlNtStatusToDosError)(NTSTATUS status);
 
+typedef struct _RTLP_CURDIR_REF {
+       LONG RefCount;
+       HANDLE Handle;
+} RTLP_CURDIR_REF, *PRTLP_CURDIR_REF;
+
+typedef struct _RTL_RELATIVE_NAME_U {
+       UNICODE_STRING RelativeName;
+       HANDLE ContainingDirectory;
+       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);
+
+extern NTSTATUS (WINAPI *func_RtlDosPathNameToNtPathName_U_WithStatus)
+               (IN PCWSTR DosName,
+                OUT PUNICODE_STRING NtName,
+                OUT PCWSTR *PartName,
+                OUT PRTL_RELATIVE_NAME_U RelativeName);
+
 extern NTSTATUS (WINAPI *func_RtlCreateSystemVolumeInformationFolder)
                        (PCUNICODE_STRING VolumeRootPath);
-#endif
 
+#define FSCTL_SET_PERSISTENT_VOLUME_STATE 0x90238
+
+#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;
+
+extern int
+win32_path_to_nt_path(const wchar_t *win32_path, UNICODE_STRING *nt_path);
+
+extern int
+win32_get_drive_path(const wchar_t *file_path, wchar_t drive_path[7]);
 
 extern bool
-windows_version_is_at_least(unsigned major, unsigned minor);
+win32_try_to_attach_wof(const wchar_t *drive);
 
-#define running_on_windows_xp_or_later() \
-                       windows_version_is_at_least(5, 1)
+extern void
+win32_warning(DWORD err, const wchar_t *format, ...) _cold_attribute;
 
-#define running_on_windows_vista_or_later() \
-                       windows_version_is_at_least(6, 0)
+extern void
+win32_error(DWORD err, const wchar_t *format, ...) _cold_attribute;
 
-#define running_on_windows_7_or_later() \
-                       windows_version_is_at_least(6, 1)
+extern void
+winnt_warning(NTSTATUS status, const wchar_t *format, ...) _cold_attribute;
 
+extern void
+winnt_error(NTSTATUS status, const wchar_t *format, ...) _cold_attribute;
 
+extern 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 */