Merge pull request #3108 from stoeckmann/windows_legacy
Reduce Windows legacy support
(cherry picked from commit 5c516433ee)
This commit is contained in:
1 parent
95310a785d
commit
c93ad88df8
3 files changed
+13
-71
No files matched your search
+1
-1
@@ -140,7 +140,7 @@ cpio_CreateFile(const char *path, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
CREATEFILE2_EXTENDED_PARAMETERS createExParams;
|
||||
#endif
|
||||
|
||||
#if !defined(WINAPI_FAMILY_PARTITION) || WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
|
||||
#if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
|
||||
handle = CreateFileA(path, dwDesiredAccess, dwShareMode,
|
||||
lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes,
|
||||
hTemplateFile);
|
||||
|
||||
@@ -329,17 +329,4 @@ WINBASEAPI BOOL WINAPI GetVolumePathNameW(
|
||||
DWORD cchBufferLength
|
||||
);
|
||||
#endif
|
||||
#if defined(_MSC_VER) && _MSC_VER < 1300
|
||||
# if _WIN32_WINNT < 0x0500 /* windows.h not providing 0x500 API */
|
||||
typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
|
||||
LARGE_INTEGER FileOffset;
|
||||
LARGE_INTEGER Length;
|
||||
} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
|
||||
# define FSCTL_SET_SPARSE \
|
||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
|
||||
# define FSCTL_QUERY_ALLOCATED_RANGES \
|
||||
CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* !LIBARCHIVE_ARCHIVE_WINDOWS_H_INCLUDED */
|
||||
@@ -580,45 +580,11 @@ la_mktemp(struct archive_write_disk *a)
|
||||
return (fd);
|
||||
}
|
||||
|
||||
#if _WIN32_WINNT < _WIN32_WINNT_VISTA
|
||||
static void *
|
||||
la_GetFunctionKernel32(const char *name)
|
||||
{
|
||||
static HINSTANCE lib;
|
||||
static int set;
|
||||
if (!set) {
|
||||
set = 1;
|
||||
lib = LoadLibrary(TEXT("kernel32.dll"));
|
||||
}
|
||||
if (lib == NULL) {
|
||||
fprintf(stderr, "Can't load kernel32.dll?!\n");
|
||||
exit(1);
|
||||
}
|
||||
return (void *)GetProcAddress(lib, name);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
la_CreateHardLinkW(wchar_t *linkname, wchar_t *target)
|
||||
{
|
||||
static BOOL (WINAPI *f)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
|
||||
BOOL ret;
|
||||
|
||||
#if _WIN32_WINNT < _WIN32_WINNT_XP
|
||||
static int set;
|
||||
/* CreateHardLinkW is available since XP and always loaded */
|
||||
if (!set) {
|
||||
set = 1;
|
||||
f = la_GetFunctionKernel32("CreateHardLinkW");
|
||||
}
|
||||
#else
|
||||
f = CreateHardLinkW;
|
||||
#endif
|
||||
if (!f) {
|
||||
errno = ENOTSUP;
|
||||
return (0);
|
||||
}
|
||||
ret = (*f)(linkname, target, NULL);
|
||||
ret = CreateHardLinkW(linkname, target, NULL);
|
||||
if (!ret) {
|
||||
/* Under windows 2000, it is necessary to remove
|
||||
* the "\\?\" prefix. */
|
||||
@@ -637,7 +603,7 @@ la_CreateHardLinkW(wchar_t *linkname, wchar_t *target)
|
||||
target += 4;
|
||||
}
|
||||
#undef IS_UNC
|
||||
ret = (*f)(linkname, target, NULL);
|
||||
ret = CreateHardLinkW(linkname, target, NULL);
|
||||
}
|
||||
return (ret);
|
||||
}
|
||||
@@ -651,30 +617,18 @@ la_CreateHardLinkW(wchar_t *linkname, wchar_t *target)
|
||||
static int
|
||||
la_CreateSymbolicLinkW(const wchar_t *linkname, const wchar_t *target,
|
||||
int linktype) {
|
||||
static BOOLEAN (WINAPI *f)(LPCWSTR, LPCWSTR, DWORD);
|
||||
BOOL ret = 0;
|
||||
#if _WIN32_WINNT < _WIN32_WINNT_VISTA ||\
|
||||
!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
|
||||
(void)linkname; /* UNUSED */
|
||||
(void)target; /* UNUSED */
|
||||
(void)linktype; /* UNUSED */
|
||||
#else
|
||||
wchar_t *ttarget, *p;
|
||||
size_t len;
|
||||
DWORD attrs = 0;
|
||||
DWORD flags = 0;
|
||||
DWORD newflags = 0;
|
||||
BOOL ret = 0;
|
||||
|
||||
#if _WIN32_WINNT < _WIN32_WINNT_VISTA
|
||||
/* CreateSymbolicLinkW is available since Vista and always loaded */
|
||||
static int set;
|
||||
if (!set) {
|
||||
set = 1;
|
||||
f = la_GetFunctionKernel32("CreateSymbolicLinkW");
|
||||
}
|
||||
#else
|
||||
# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM)
|
||||
f = CreateSymbolicLinkW;
|
||||
# else
|
||||
f = NULL;
|
||||
# endif
|
||||
#endif
|
||||
if (!f)
|
||||
return (0);
|
||||
|
||||
len = wcslen(target);
|
||||
if (len == 0) {
|
||||
@@ -736,15 +690,16 @@ la_CreateSymbolicLinkW(const wchar_t *linkname, const wchar_t *target,
|
||||
disk_unlink(linkname);
|
||||
}
|
||||
|
||||
ret = (*f)(linkname, ttarget, newflags);
|
||||
ret = CreateSymbolicLinkW(linkname, ttarget, newflags);
|
||||
/*
|
||||
* Prior to Windows 10 calling CreateSymbolicLinkW() will fail
|
||||
* if SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE is set
|
||||
*/
|
||||
if (!ret) {
|
||||
ret = (*f)(linkname, ttarget, flags);
|
||||
ret = CreateSymbolicLinkW(linkname, ttarget, flags);
|
||||
}
|
||||
free(ttarget);
|
||||
#endif
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user