Add support for Microsoft Universal Windows Platform.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9a28f08..1b1b9f7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -133,6 +133,11 @@
ADD_DEFINITIONS("-D_CRT_NONSTDC_NO_DEPRECATE")
ENDIF(MSVC)
+if(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
+ ADD_DEFINITIONS(-DMS_UWP)
+ SET (OPTIONAL_LIBRARY "${OPTIONAL_LIBRARY}" bcrypt)
+endif(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
+
ADD_DEFINITIONS("-DHAVE_CONFIG_H")
# rpath handling: use rpath in installed binaries
diff --git a/THANKS b/THANKS
index dadd1bd..5b270d1 100644
--- a/THANKS
+++ b/THANKS
@@ -40,6 +40,7 @@
Martin Buchholz <martinrb@google.com>
Martin Szulecki <m.szulecki@libimobiledevice.org>
Michael Beck <mm.beck@gmx.net>
+Michał Janiszewski
Michal Vyskocil <mvyskocil@suse.cz>
Mikhail Gusarov <dottedmag@dottedmag.net>.
Oliver Kaiser <under.northern.sky@googlemail.com>
diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt
index 14803dc..855ccf5 100644
--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -165,12 +165,20 @@
IF(WIN32)
SET(LIBZIP_OPSYS_FILES
- zip_random_win32.c
- zip_source_win32a.c
zip_source_win32handle.c
zip_source_win32utf8.c
zip_source_win32w.c
)
+ IF(CMAKE_SYSTEM_NAME MATCHES WindowsPhone OR CMAKE_SYSTEM_NAME MATCHES WindowsStore)
+ SET(LIBZIP_OPSYS_FILES "${LIBZIP_OPSYS_FILES}"
+ zip_random_uwp.c
+ )
+ ELSE()
+ SET(LIBZIP_OPSYS_FILES "${LIBZIP_OPSYS_FILES}"
+ zip_random_win32.c
+ zip_source_win32a.c
+ )
+ ENDIF()
ELSE(WIN32)
SET(LIBZIP_OPSYS_FILES
zip_random_unix.c
diff --git a/lib/zip_random_uwp.c b/lib/zip_random_uwp.c
new file mode 100644
index 0000000..aeead0f
--- /dev/null
+++ b/lib/zip_random_uwp.c
@@ -0,0 +1,55 @@
+/*
+ zip_random_uwp.c -- fill the user's buffer with random stuff (UWP version)
+ Copyright (C) 2017 Dieter Baron and Thomas Klausner
+
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <windows.h>
+#include <ntstatus.h>
+#include <bcrypt.h>
+
+#include "zipint.h"
+#include "zipwin32.h"
+
+bool
+zip_random(zip_uint8_t *buffer, zip_uint16_t length)
+{
+ BCRYPT_ALG_HANDLE hAlg = NULL;
+ NTSTATUS hr = BCryptOpenAlgorithmProvider(&hAlg, BCRYPT_RNG_ALGORITHM, MS_PRIMITIVE_PROVIDER, 0);
+ if (hr != STATUS_SUCCESS || hAlg == NULL) {
+ return false;
+ }
+ hr = BCryptGenRandom(&hAlg, buffer, length, 0);
+ BCryptCloseAlgorithmProvider(&hAlg, 0);
+ if (hr != STATUS_SUCCESS) {
+ return false;
+ }
+ return true;
+}
diff --git a/lib/zip_source_win32handle.c b/lib/zip_source_win32handle.c
index 7fe003d..543593b 100644
--- a/lib/zip_source_win32handle.c
+++ b/lib/zip_source_win32handle.c
@@ -35,6 +35,7 @@
#include <wchar.h>
#include <stdlib.h>
#include <string.h>
+#include <aclapi.h>
#include "zipint.h"
#include "zipwin32.h"
@@ -420,12 +421,12 @@
int i;
HANDLE th = INVALID_HANDLE_VALUE;
void *temp = NULL;
- SECURITY_INFORMATION si;
- SECURITY_ATTRIBUTES sa;
PSECURITY_DESCRIPTOR psd = NULL;
PSECURITY_ATTRIBUTES psa = NULL;
- DWORD len;
- BOOL success;
+ SECURITY_ATTRIBUTES sa;
+ SECURITY_INFORMATION si;
+ DWORD success;
+ PACL dacl = NULL;
/*
Read the DACL from the original file, so we can copy it to the temp file.
@@ -434,16 +435,8 @@
*/
if (ctx->h != INVALID_HANDLE_VALUE && GetFileType(ctx->h) == FILE_TYPE_DISK) {
si = DACL_SECURITY_INFORMATION | UNPROTECTED_DACL_SECURITY_INFORMATION;
- len = 0;
- success = GetUserObjectSecurity(ctx->h, &si, NULL, len, &len);
- if (!success && GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
- if ((psd = (PSECURITY_DESCRIPTOR)malloc(len)) == NULL) {
- zip_error_set(&ctx->error, ZIP_ER_MEMORY, 0);
- return -1;
- }
- success = GetUserObjectSecurity(ctx->h, &si, psd, len, &len);
- }
- if (success) {
+ success = GetSecurityInfo(ctx->h, SE_FILE_OBJECT, si, NULL, NULL, &dacl, NULL, &psd);
+ if (success == ERROR_SUCCESS) {
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = psd;
@@ -451,7 +444,13 @@
}
}
+
+#ifndef MS_UWP
value = GetTickCount();
+#else
+ value = (zip_uint32_t)GetTickCount64();
+#endif
+
for (i = 0; i < 1024 && th == INVALID_HANDLE_VALUE; i++) {
th = ctx->ops->op_create_temp(ctx, &temp, value + i, psa);
if (th == INVALID_HANDLE_VALUE && GetLastError() != ERROR_FILE_EXISTS)
@@ -460,12 +459,12 @@
if (th == INVALID_HANDLE_VALUE) {
free(temp);
- free(psd);
+ LocalFree(psd);
zip_error_set(&ctx->error, ZIP_ER_TMPOPEN, _zip_win32_error_to_errno(GetLastError()));
return -1;
}
- free(psd);
+ LocalFree(psd);
ctx->hout = th;
ctx->tmpname = temp;
diff --git a/lib/zip_source_win32w.c b/lib/zip_source_win32w.c
index 21fd3bd..685b57f 100644
--- a/lib/zip_source_win32w.c
+++ b/lib/zip_source_win32w.c
@@ -1,34 +1,34 @@
/*
-zip_source_win32w.c -- create data source from Windows file (UTF-16)
-Copyright (C) 1999-2017 Dieter Baron and Thomas Klausner
+ zip_source_win32w.c -- create data source from Windows file (UTF-16)
+ Copyright (C) 1999-2017 Dieter Baron and Thomas Klausner
-This file is part of libzip, a library to manipulate ZIP archives.
-The authors can be contacted at <libzip@nih.at>
+ This file is part of libzip, a library to manipulate ZIP archives.
+ The authors can be contacted at <libzip@nih.at>
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-notice, this list of conditions and the following disclaimer in
-the documentation and/or other materials provided with the
-distribution.
-3. The names of the authors may not be used to endorse or promote
-products derived from this software without specific prior
-written permission.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ 3. The names of the authors may not be used to endorse or promote
+ products derived from this software without specific prior
+ written permission.
-THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
-OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
-GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
-IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
@@ -83,7 +83,19 @@
static HANDLE
_win32_open_w(_zip_source_win32_read_file_t *ctx)
{
+#ifdef MS_UWP
+ CREATEFILE2_EXTENDED_PARAMETERS extParams = { 0 };
+ extParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
+ extParams.dwFileFlags = FILE_FLAG_RANDOM_ACCESS;
+ extParams.dwSecurityQosFlags = SECURITY_ANONYMOUS;
+ extParams.dwSize = sizeof(extParams);
+ extParams.hTemplateFile = NULL;
+ extParams.lpSecurityAttributes = NULL;
+
+ return CreateFile2(ctx->fname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_EXISTING, &extParams);
+#else
return CreateFileW(ctx->fname, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+#endif
}
@@ -103,7 +115,19 @@
return INVALID_HANDLE_VALUE;
}
+#ifdef MS_UWP
+ CREATEFILE2_EXTENDED_PARAMETERS extParams = { 0 };
+ extParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY;
+ extParams.dwFileFlags = FILE_FLAG_RANDOM_ACCESS;
+ extParams.dwSecurityQosFlags = SECURITY_ANONYMOUS;
+ extParams.dwSize = sizeof(extParams);
+ extParams.hTemplateFile = NULL;
+ extParams.lpSecurityAttributes = NULL;
+
+ return CreateFile2((const wchar_t *)*temp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, CREATE_NEW, &extParams);
+#else
return CreateFileW((const wchar_t *)*temp, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, sa, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_TEMPORARY, NULL);
+#endif
}
diff --git a/lib/zipwin32.h b/lib/zipwin32.h
index 60f8d0c..db549e2 100644
--- a/lib/zipwin32.h
+++ b/lib/zipwin32.h
@@ -35,7 +35,10 @@
*/
/* 0x0501 => Windows XP; needs to be at least this value because of GetFileSizeEx */
+#ifndef MS_UWP
#define _WIN32_WINNT 0x0501
+#endif
+
#include <windows.h>
/* context for Win32 source */