-static voidpf ZCALLBACK win32_open64_file_funcW(voidpf opaque, const void *filename, int mode)
-{
- DWORD dwDesiredAccess, dwCreationDisposition, dwShareMode, dwFlagsAndAttributes;
- HANDLE hFile = NULL;
- WIN32FILE_IOWIN *iowin = NULL;
-
- win32_translate_open_mode(mode, &dwDesiredAccess, &dwCreationDisposition, &dwShareMode, &dwFlagsAndAttributes);
-
- if ((filename != NULL) && (dwDesiredAccess != 0))
- {
-#ifdef IOWIN32_USING_WINRT_API
- hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
-#else
- hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
-#endif
- }
-
- iowin = win32_build_iowin(hFile);
- if (iowin == NULL)
- return NULL;
- if (iowin->filename == NULL)
- {
- iowin->filenameLength = wcslen(filename) + 1;
- iowin->filename = (void*)malloc(iowin->filenameLength * sizeof(WCHAR));
- wcsncpy(iowin->filename, filename, iowin->filenameLength);
- }
- return iowin;
-}
-
-voidpf ZCALLBACK win32_open_file_func(voidpf opaque, const char *filename, int mode)
-{
- DWORD dwDesiredAccess, dwCreationDisposition, dwShareMode, dwFlagsAndAttributes ;
- HANDLE hFile = NULL;
- WIN32FILE_IOWIN *iowin = NULL;
-
- win32_translate_open_mode(mode, &dwDesiredAccess, &dwCreationDisposition, &dwShareMode, &dwFlagsAndAttributes);
-
- if ((filename != NULL) && (dwDesiredAccess != 0))
- {
-#ifdef IOWIN32_USING_WINRT_API
-#ifdef UNICODE
- hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
-#else
- WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
- MultiByteToWideChar(CP_ACP, 0, (const char*)filename, -1, filenameW, FILENAME_MAX + 0x200);
- hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
-#endif
-#else
- hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
-#endif
- }
-
- iowin = win32_build_iowin(hFile);
- if (iowin == NULL)
- return NULL;
- iowin->filenameLength = _tcslen((TCHAR*)filename) + 1;
- iowin->filename = (void*)malloc(iowin->filenameLength * sizeof(TCHAR));
- _tcsncpy(iowin->filename, (TCHAR*)filename, iowin->filenameLength);
- return iowin;
-}
-
-static voidpf ZCALLBACK win32_opendisk64_file_func(voidpf opaque, voidpf stream, uint32_t number_disk, int mode)
-{
- WIN32FILE_IOWIN *iowin = NULL;
- TCHAR *diskFilename = NULL;
- voidpf ret = NULL;
- int i = 0;
-
- if (stream == NULL)
- return NULL;
- iowin = (WIN32FILE_IOWIN*)stream;
- diskFilename = (TCHAR*)malloc(iowin->filenameLength * sizeof(TCHAR));
- _tcsncpy(diskFilename, iowin->filename, iowin->filenameLength);
- for (i = iowin->filenameLength - 1; i >= 0; i -= 1)
- {
- if (diskFilename[i] != _T('.'))
- continue;
- _sntprintf(&diskFilename[i], iowin->filenameLength - i, _T(".z%02d"), number_disk + 1);
- break;
- }
- if (i >= 0)
- ret = win32_open64_file_func(opaque, (char*)diskFilename, mode);
- free(diskFilename);
- return ret;
-}
-
-static voidpf ZCALLBACK win32_opendisk64_file_funcW(voidpf opaque, voidpf stream, uint32_t number_disk, int mode)
-{
- WIN32FILE_IOWIN *iowin = NULL;
- WCHAR *diskFilename = NULL;
- voidpf ret = NULL;
- int i = 0;
-
- if (stream == NULL)
- return NULL;
- iowin = (WIN32FILE_IOWIN*)stream;
- diskFilename = (WCHAR*)malloc((iowin->filenameLength + 10) * sizeof(WCHAR));
- wcsncpy(diskFilename, iowin->filename, iowin->filenameLength);
- for (i = iowin->filenameLength - 1; i >= 0; i -= 1)
- {
- if (diskFilename[i] != L'.')
- continue;
- _snwprintf(&diskFilename[i], (iowin->filenameLength + 10) - i, L".z%02d", number_disk + 1);
- break;
- }
- if (i >= 0)
- ret = win32_open64_file_funcW(opaque, diskFilename, mode);
- free(diskFilename);
- return ret;
-}
-