Compare commits
2 Commits
release-v4
...
vfs
| Author | SHA1 | Date | |
|---|---|---|---|
| 9eee8ae1d9 | |||
| 842295b6b1 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
build/
|
build/
|
||||||
|
.vscode/
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -1,3 +1,6 @@
|
|||||||
[submodule "utils"]
|
[submodule "utils"]
|
||||||
path = utils
|
path = utils
|
||||||
url = https://github.com/lifegpc/c-utils
|
url = https://github.com/lifegpc/c-utils
|
||||||
|
[submodule "libzip"]
|
||||||
|
path = libzip
|
||||||
|
url = https://github.com/nih-at/libzip
|
||||||
|
|||||||
@@ -14,8 +14,33 @@ set(ENABLE_ICONV OFF CACHE BOOL "Libiconv is not needed.")
|
|||||||
add_subdirectory(utils)
|
add_subdirectory(utils)
|
||||||
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/utils")
|
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/utils")
|
||||||
|
|
||||||
add_library(jewena_patch SHARED dllmain.cpp)
|
set(ENABLE_COMMONCRYPTO OFF CACHE BOOL "CommonCrypto is not needed.")
|
||||||
|
set(ENABLE_GNUTLS OFF CACHE BOOL "GnuTLS is not needed.")
|
||||||
|
set(ENABLE_MBEDTLS OFF CACHE BOOL "MbedTLS is not needed.")
|
||||||
|
set(ENABLE_OPENSSL OFF CACHE BOOL "OpenSSL is not needed.")
|
||||||
|
set(ENABLE_WINDOWS_CRYPTO OFF CACHE BOOL "Schannel is not needed.")
|
||||||
|
|
||||||
|
set(ENABLE_BZIP2 OFF CACHE BOOL "Bzip2 is not needed.")
|
||||||
|
set(ENABLE_LZMA OFF CACHE BOOL "Lzma is not needed.")
|
||||||
|
set(ENABLE_ZSTD OFF CACHE BOOL "Zstd is not needed.")
|
||||||
|
|
||||||
|
set(BUILD_TOOLS OFF CACHE BOOL "Tools are not needed.")
|
||||||
|
set(BUILD_REGRESS OFF CACHE BOOL "Tests are not needed.")
|
||||||
|
set(BUILD_OSSFUZZ OFF CACHE BOOL "Fuzz tests are not needed.")
|
||||||
|
set(BUILD_EXAMPLES OFF CACHE BOOL "Examples are not needed.")
|
||||||
|
set(BUILD_DOC OFF CACHE BOOL "Documentation is not needed.")
|
||||||
|
|
||||||
|
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Static library is needed.")
|
||||||
|
set(LIBZIP_DO_INSTALL OFF CACHE BOOL "Installation is not needed.")
|
||||||
|
set(ZLIB_ROOT "${CMAKE_CURRENT_SOURCE_DIR}" CACHE PATH "Zlib is needed.")
|
||||||
|
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
add_subdirectory("libzip")
|
||||||
|
|
||||||
|
add_library(jewena_patch SHARED dllmain.cpp config.hpp config.cpp vfs.hpp vfs.cpp)
|
||||||
target_link_libraries(jewena_patch "${DETOURS_LIB}")
|
target_link_libraries(jewena_patch "${DETOURS_LIB}")
|
||||||
target_link_libraries(jewena_patch utils)
|
target_link_libraries(jewena_patch utils)
|
||||||
|
target_link_libraries(jewena_patch zip)
|
||||||
|
target_link_libraries(jewena_patch shlwapi.lib)
|
||||||
|
|
||||||
add_executable(jewena-chs WIN32 main.cpp winres.rc jewena-chs.exe.manifest)
|
add_executable(jewena-chs WIN32 main.cpp winres.rc jewena-chs.exe.manifest)
|
||||||
|
|||||||
48
config.cpp
Normal file
48
config.cpp
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#include "config.hpp"
|
||||||
|
#include "fileop.h"
|
||||||
|
#include "file_reader.h"
|
||||||
|
#include "malloc.h"
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#if _WIN32
|
||||||
|
#include <Windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool Config::Load(std::string path) {
|
||||||
|
if (!fileop::exists(path)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int fd = 0;
|
||||||
|
int err = fileop::open(path, fd, O_RDONLY, _SH_DENYRW, _S_IREAD);
|
||||||
|
if (err < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
FILE* f = fileop::fdopen(fd, "rb");
|
||||||
|
if (!f) {
|
||||||
|
fileop::close(fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
auto reader = create_file_reader(f, 0);
|
||||||
|
char* line = nullptr;
|
||||||
|
size_t line_size = 0;
|
||||||
|
while (!file_reader_read_line(reader, &line, &line_size)) {
|
||||||
|
std::string l(line, line_size);
|
||||||
|
free(line);
|
||||||
|
line = nullptr;
|
||||||
|
line_size = 0;
|
||||||
|
size_t comment_pos = l.find_first_of('#');
|
||||||
|
if (comment_pos != std::string::npos) {
|
||||||
|
l = l.substr(0, comment_pos);
|
||||||
|
}
|
||||||
|
size_t eq_pos = l.find_first_of('=');
|
||||||
|
if (eq_pos == std::string::npos) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
std::string key = l.substr(0, eq_pos);
|
||||||
|
std::string value = l.substr(eq_pos + 1);
|
||||||
|
configs[key] = value;
|
||||||
|
}
|
||||||
|
free_file_reader(reader);
|
||||||
|
fileop::fclose(f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
11
config.hpp
Normal file
11
config.hpp
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#include <unordered_map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class Config {
|
||||||
|
public:
|
||||||
|
std::unordered_map<std::string, std::string> configs;
|
||||||
|
Config() {
|
||||||
|
configs["defaultFont"] = "微软雅黑";
|
||||||
|
}
|
||||||
|
bool Load(std::string path);
|
||||||
|
};
|
||||||
210
dllmain.cpp
210
dllmain.cpp
@@ -1,10 +1,147 @@
|
|||||||
#include <Windows.h>
|
#include <Windows.h>
|
||||||
|
#include "config.hpp"
|
||||||
#include "detours.h"
|
#include "detours.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <shlwapi.h>
|
||||||
#include "wchar_util.h"
|
#include "wchar_util.h"
|
||||||
|
#include "vfs.hpp"
|
||||||
|
#include "str_util.h"
|
||||||
|
#include "fileop.h"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
static HFONT(WINAPI *TrueCreateFontW)(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD dwItalic, DWORD dwUnderline, DWORD dwStrikeOut, DWORD dwCharSet, DWORD dwOutPrecision, DWORD dwClipPrecision, DWORD dwQuality, DWORD dwPitchAndFamily, LPCWSTR lpFaceName) = CreateFontW;
|
static HFONT(WINAPI *TrueCreateFontW)(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD dwItalic, DWORD dwUnderline, DWORD dwStrikeOut, DWORD dwCharSet, DWORD dwOutPrecision, DWORD dwClipPrecision, DWORD dwQuality, DWORD dwPitchAndFamily, LPCWSTR lpFaceName) = CreateFontW;
|
||||||
static HFONT(WINAPI *TrueCreateFontA)(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD dwItalic, DWORD dwUnderline, DWORD dwStrikeOut, DWORD dwCharSet, DWORD dwOutPrecision, DWORD dwClipPrecision, DWORD dwQuality, DWORD dwPitchAndFamily, LPCSTR lpFaceName) = CreateFontA;
|
static HFONT(WINAPI *TrueCreateFontA)(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD dwItalic, DWORD dwUnderline, DWORD dwStrikeOut, DWORD dwCharSet, DWORD dwOutPrecision, DWORD dwClipPrecision, DWORD dwQuality, DWORD dwPitchAndFamily, LPCSTR lpFaceName) = CreateFontA;
|
||||||
|
static HANDLE(WINAPI *TrueCreateFileW)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) = CreateFileW;
|
||||||
|
static BOOL(WINAPI *TrueReadFile)(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) = ReadFile;
|
||||||
|
static BOOL(WINAPI *TrueCloseHandle)(HANDLE hObject) = CloseHandle;
|
||||||
|
static DWORD(WINAPI *TrueGetFileSize)(HANDLE hFile, LPDWORD lpFileSizeHigh) = GetFileSize;
|
||||||
|
static DWORD(WINAPI *TrueSetFilePointer)(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) = SetFilePointer;
|
||||||
|
static decltype(FindFirstFileExW)* OriginalFindFirstFileExW = FindFirstFileExW;
|
||||||
|
static decltype(FindNextFileW)* OriginalFindNextFileW = FindNextFileW;
|
||||||
|
static decltype(FindClose)* OriginalFindClose = FindClose;
|
||||||
|
|
||||||
|
static Config config;
|
||||||
|
static std::wstring defaultFont;
|
||||||
|
static VFS vfs;
|
||||||
|
|
||||||
|
struct CustomFindContext {
|
||||||
|
std::vector<WIN32_FIND_DATAW> entries;
|
||||||
|
size_t current_index;
|
||||||
|
};
|
||||||
|
|
||||||
|
HANDLE WINAPI HookedFindFirstFileExW(
|
||||||
|
LPCWSTR lpFileName,
|
||||||
|
FINDEX_INFO_LEVELS fInfoLevelId,
|
||||||
|
LPVOID lpFindFileData,
|
||||||
|
FINDEX_SEARCH_OPS fSearchOp,
|
||||||
|
LPVOID lpSearchFilter,
|
||||||
|
DWORD dwAdditionalFlags
|
||||||
|
) {
|
||||||
|
std::wstring filename_w(lpFileName);
|
||||||
|
std::string filename_utf8;
|
||||||
|
wchar_util::wstr_to_str(filename_utf8, filename_w, CP_UTF8);
|
||||||
|
|
||||||
|
// 解析目录和模式
|
||||||
|
std::string dir_part = fileop::dirname(filename_utf8);
|
||||||
|
std::string pattern = fileop::basename(filename_utf8);
|
||||||
|
|
||||||
|
// 标准化路径,判断是否为目标目录
|
||||||
|
std::string abs_dir = fileop::isabs(dir_part) ? dir_part : fileop::join(vfs.GetBasePath(), dir_part);
|
||||||
|
std::string base = fileop::join(vfs.GetBasePath(), ""); // 确保base_path以/结尾
|
||||||
|
|
||||||
|
if (abs_dir != vfs.GetBasePath()) {
|
||||||
|
// 非目标目录,调用原始函数
|
||||||
|
return OriginalFindFirstFileExW(lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 收集实际文件系统的条目
|
||||||
|
HANDLE hFindReal = OriginalFindFirstFileExW(lpFileName, fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags);
|
||||||
|
std::vector<WIN32_FIND_DATAW> real_entries;
|
||||||
|
WIN32_FIND_DATAW data;
|
||||||
|
if (hFindReal != INVALID_HANDLE_VALUE) {
|
||||||
|
while (OriginalFindNextFileW(hFindReal, &data)) {
|
||||||
|
real_entries.push_back(data);
|
||||||
|
}
|
||||||
|
OriginalFindClose(hFindReal);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 转换模式为宽字符
|
||||||
|
std::wstring wpattern;
|
||||||
|
wchar_util::str_to_wstr(wpattern, pattern, CP_UTF8);
|
||||||
|
|
||||||
|
// 收集虚拟条目
|
||||||
|
std::vector<WIN32_FIND_DATAW> virtual_entries;
|
||||||
|
for (const auto& entry : vfs.files) {
|
||||||
|
std::string file_path = entry.first;
|
||||||
|
std::vector<std::string> components = str_util::str_splitv(file_path, "\\");
|
||||||
|
if (components.empty()) continue;
|
||||||
|
|
||||||
|
if (components.size() == 1) {
|
||||||
|
// 文件条目
|
||||||
|
std::wstring wname;
|
||||||
|
wchar_util::str_to_wstr(wname, components[0], CP_UTF8);
|
||||||
|
if (PathMatchSpecW(wname.c_str(), wpattern.c_str())) {
|
||||||
|
WIN32_FIND_DATAW vdata = {0};
|
||||||
|
wcsncpy(vdata.cFileName, wname.c_str(), MAX_PATH);
|
||||||
|
vdata.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE;
|
||||||
|
vdata.nFileSizeLow = static_cast<DWORD>(entry.second & 0xFFFFFFFF);
|
||||||
|
vdata.nFileSizeHigh = static_cast<DWORD>(entry.second >> 32);
|
||||||
|
virtual_entries.push_back(vdata);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 目录条目
|
||||||
|
std::wstring wdir;
|
||||||
|
wchar_util::str_to_wstr(wdir, components[0], CP_UTF8);
|
||||||
|
if (PathMatchSpecW(wdir.c_str(), wpattern.c_str())) {
|
||||||
|
bool dir_exists = std::any_of(real_entries.begin(), real_entries.end(),
|
||||||
|
[&](const WIN32_FIND_DATAW& d) {
|
||||||
|
return (d.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
||||||
|
_wcsicmp(d.cFileName, wdir.c_str()) == 0;
|
||||||
|
});
|
||||||
|
if (!dir_exists) {
|
||||||
|
WIN32_FIND_DATAW vdata = {0};
|
||||||
|
wcsncpy(vdata.cFileName, wdir.c_str(), MAX_PATH);
|
||||||
|
vdata.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
|
||||||
|
virtual_entries.push_back(vdata);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 合并条目
|
||||||
|
std::vector<WIN32_FIND_DATAW> all_entries;
|
||||||
|
all_entries.reserve(real_entries.size() + virtual_entries.size());
|
||||||
|
all_entries.insert(all_entries.end(), real_entries.begin(), real_entries.end());
|
||||||
|
all_entries.insert(all_entries.end(), virtual_entries.begin(), virtual_entries.end());
|
||||||
|
|
||||||
|
// 创建上下文
|
||||||
|
CustomFindContext* ctx = new CustomFindContext{all_entries, 0};
|
||||||
|
if (!all_entries.empty()) {
|
||||||
|
*static_cast<WIN32_FIND_DATAW*>(lpFindFileData) = all_entries[1];
|
||||||
|
ctx->current_index = 2;
|
||||||
|
}
|
||||||
|
return reinterpret_cast<HANDLE>(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI HookedFindNextFileW(HANDLE hFindFile, LPWIN32_FIND_DATAW lpFindFileData) {
|
||||||
|
CustomFindContext* ctx = reinterpret_cast<CustomFindContext*>(hFindFile);
|
||||||
|
if (ctx && ctx->current_index < ctx->entries.size()) {
|
||||||
|
*lpFindFileData = ctx->entries[ctx->current_index++];
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
SetLastError(ERROR_NO_MORE_FILES);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI HookedFindClose(HANDLE hFindFile) {
|
||||||
|
CustomFindContext* ctx = reinterpret_cast<CustomFindContext*>(hFindFile);
|
||||||
|
if (ctx) {
|
||||||
|
delete ctx;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return OriginalFindClose(hFindFile);
|
||||||
|
}
|
||||||
|
|
||||||
char* to_utf8(char* target, const char* source, UINT cp) {
|
char* to_utf8(char* target, const char* source, UINT cp) {
|
||||||
int count = MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, source, -1, NULL, 0);
|
int count = MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS, source, -1, NULL, 0);
|
||||||
@@ -42,7 +179,7 @@ static PVOID h = nullptr;
|
|||||||
HFONT WINAPI HookedCreateFontW(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD dwItalic, DWORD dwUnderline, DWORD dwStrikeOut, DWORD dwCharSet, DWORD dwOutPrecision, DWORD dwClipPrecision, DWORD dwQuality, DWORD dwPitchAndFamily, LPCWSTR lpFaceName) {
|
HFONT WINAPI HookedCreateFontW(int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD dwItalic, DWORD dwUnderline, DWORD dwStrikeOut, DWORD dwCharSet, DWORD dwOutPrecision, DWORD dwClipPrecision, DWORD dwQuality, DWORD dwPitchAndFamily, LPCWSTR lpFaceName) {
|
||||||
std::wstring name(lpFaceName);
|
std::wstring name(lpFaceName);
|
||||||
if (name == L"Meiryo") {
|
if (name == L"Meiryo") {
|
||||||
lpFaceName = L"微软雅黑";
|
lpFaceName = defaultFont.c_str();
|
||||||
}
|
}
|
||||||
return TrueCreateFontW(nHeight, nWidth, nEscapement, nOrientation, fnWeight, dwItalic, dwUnderline, dwStrikeOut, dwCharSet, dwOutPrecision, dwClipPrecision, dwQuality, dwPitchAndFamily, lpFaceName);
|
return TrueCreateFontW(nHeight, nWidth, nEscapement, nOrientation, fnWeight, dwItalic, dwUnderline, dwStrikeOut, dwCharSet, dwOutPrecision, dwClipPrecision, dwQuality, dwPitchAndFamily, lpFaceName);
|
||||||
}
|
}
|
||||||
@@ -53,7 +190,7 @@ HFONT WINAPI HookedCreateFontA(int nHeight, int nWidth, int nEscapement, int nOr
|
|||||||
for (int i = 0; i < 4; i++) {
|
for (int i = 0; i < 4; i++) {
|
||||||
if (wchar_util::str_to_wstr(font, lpFaceName, cp[i])) {
|
if (wchar_util::str_to_wstr(font, lpFaceName, cp[i])) {
|
||||||
if (font == L"Meiryo") {
|
if (font == L"Meiryo") {
|
||||||
font = L"微软雅黑";
|
font = defaultFont;
|
||||||
}
|
}
|
||||||
return TrueCreateFontW(nHeight, nWidth, nEscapement, nOrientation, fnWeight, dwItalic, dwUnderline, dwStrikeOut, dwCharSet, dwOutPrecision, dwClipPrecision, dwQuality, dwPitchAndFamily, font.c_str());
|
return TrueCreateFontW(nHeight, nWidth, nEscapement, nOrientation, fnWeight, dwItalic, dwUnderline, dwStrikeOut, dwCharSet, dwOutPrecision, dwClipPrecision, dwQuality, dwPitchAndFamily, font.c_str());
|
||||||
}
|
}
|
||||||
@@ -64,14 +201,75 @@ HFONT WINAPI HookedCreateFontA(int nHeight, int nWidth, int nEscapement, int nOr
|
|||||||
return TrueCreateFontA(nHeight, nWidth, nEscapement, nOrientation, fnWeight, dwItalic, dwUnderline, dwStrikeOut, dwCharSet, dwOutPrecision, dwClipPrecision, dwQuality, dwPitchAndFamily, lpFaceName);
|
return TrueCreateFontA(nHeight, nWidth, nEscapement, nOrientation, fnWeight, dwItalic, dwUnderline, dwStrikeOut, dwCharSet, dwOutPrecision, dwClipPrecision, dwQuality, dwPitchAndFamily, lpFaceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HANDLE WINAPI HookedCreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) {
|
||||||
|
if (vfs.ContainsFile(lpFileName)) {
|
||||||
|
return vfs.CreateFileW(lpFileName);
|
||||||
|
}
|
||||||
|
return TrueCreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI HookedReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) {
|
||||||
|
if (vfs.ContainsHandle(hFile)) {
|
||||||
|
if (lpOverlapped) {
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return vfs.ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead);
|
||||||
|
}
|
||||||
|
return TrueReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL WINAPI HookedCloseHandle(HANDLE hObject) {
|
||||||
|
if (vfs.ContainsHandle(hObject)) {
|
||||||
|
vfs.CloseHandle(hObject);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return TrueCloseHandle(hObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD WINAPI HookedGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) {
|
||||||
|
if (vfs.ContainsHandle(hFile)) {
|
||||||
|
return vfs.GetFileSize(hFile, lpFileSizeHigh);
|
||||||
|
}
|
||||||
|
return TrueGetFileSize(hFile, lpFileSizeHigh);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD WINAPI HookedSetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) {
|
||||||
|
if (vfs.ContainsHandle(hFile)) {
|
||||||
|
return vfs.SetFilePointer(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
|
||||||
|
}
|
||||||
|
return TrueSetFilePointer(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" __declspec(dllexport) void Attach() {
|
extern "C" __declspec(dllexport) void Attach() {
|
||||||
|
config.Load("config.txt");
|
||||||
|
if (!wchar_util::str_to_wstr(defaultFont, config.configs["defaultFont"], CP_UTF8)) {
|
||||||
|
defaultFont = L"微软雅黑";
|
||||||
|
}
|
||||||
|
if (!vfs.AddArchive("jewena-chs.dat")) {
|
||||||
|
MessageBoxW(NULL, L"无法打开 jewena-chs.dat。请检查文件是否存在", L"错误", MB_ICONERROR);
|
||||||
|
ExitProcess(1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
DetourTransactionBegin();
|
DetourTransactionBegin();
|
||||||
DetourUpdateThread(GetCurrentThread());
|
DetourUpdateThread(GetCurrentThread());
|
||||||
h = GetHandle();
|
h = GetHandle();
|
||||||
DetourAttach(&h, (PVOID)jis_to_utf8);
|
DetourAttach(&h, (PVOID)jis_to_utf8);
|
||||||
DetourAttach(&TrueCreateFontW, HookedCreateFontW);
|
DetourAttach(&TrueCreateFontW, HookedCreateFontW);
|
||||||
DetourAttach(&TrueCreateFontA, HookedCreateFontA);
|
DetourAttach(&TrueCreateFontA, HookedCreateFontA);
|
||||||
|
DetourAttach(&TrueCreateFileW, HookedCreateFileW);
|
||||||
|
DetourAttach(&TrueReadFile, HookedReadFile);
|
||||||
|
DetourAttach(&TrueCloseHandle, HookedCloseHandle);
|
||||||
|
DetourAttach(&TrueGetFileSize, HookedGetFileSize);
|
||||||
|
DetourAttach(&TrueSetFilePointer, HookedSetFilePointer);
|
||||||
|
DetourAttach(&OriginalFindFirstFileExW, HookedFindFirstFileExW);
|
||||||
|
DetourAttach(&OriginalFindNextFileW, HookedFindNextFileW);
|
||||||
|
DetourAttach(&OriginalFindClose, HookedFindClose);
|
||||||
DetourTransactionCommit();
|
DetourTransactionCommit();
|
||||||
|
#if _DEBUG
|
||||||
|
while( !::IsDebuggerPresent() )
|
||||||
|
::Sleep( 1000 );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" __declspec(dllexport) void Detach() {
|
extern "C" __declspec(dllexport) void Detach() {
|
||||||
@@ -81,6 +279,14 @@ extern "C" __declspec(dllexport) void Detach() {
|
|||||||
DetourDetach(&h, (PVOID)jis_to_utf8);
|
DetourDetach(&h, (PVOID)jis_to_utf8);
|
||||||
DetourDetach(&TrueCreateFontW, HookedCreateFontW);
|
DetourDetach(&TrueCreateFontW, HookedCreateFontW);
|
||||||
DetourDetach(&TrueCreateFontA, HookedCreateFontA);
|
DetourDetach(&TrueCreateFontA, HookedCreateFontA);
|
||||||
|
DetourDetach(&TrueCreateFileW, HookedCreateFileW);
|
||||||
|
DetourDetach(&TrueReadFile, HookedReadFile);
|
||||||
|
DetourDetach(&TrueCloseHandle, HookedCloseHandle);
|
||||||
|
DetourDetach(&TrueGetFileSize, HookedGetFileSize);
|
||||||
|
DetourDetach(&TrueSetFilePointer, HookedSetFilePointer);
|
||||||
|
DetourDetach(&OriginalFindFirstFileExW, HookedFindFirstFileExW);
|
||||||
|
DetourDetach(&OriginalFindNextFileW, HookedFindNextFileW);
|
||||||
|
DetourDetach(&OriginalFindClose, HookedFindClose);
|
||||||
DetourTransactionCommit();
|
DetourTransactionCommit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
545
include/zconf.h
Normal file
545
include/zconf.h
Normal file
@@ -0,0 +1,545 @@
|
|||||||
|
/* zconf.h -- configuration of the zlib compression library
|
||||||
|
* Copyright (C) 1995-2024 Jean-loup Gailly, Mark Adler
|
||||||
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* @(#) $Id$ */
|
||||||
|
|
||||||
|
#ifndef ZCONF_H
|
||||||
|
#define ZCONF_H
|
||||||
|
/* #undef Z_PREFIX */
|
||||||
|
/* #undef Z_HAVE_UNISTD_H */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you *really* need a unique prefix for all types and library functions,
|
||||||
|
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
|
||||||
|
* Even better than compiling with -DZ_PREFIX would be to use configure to set
|
||||||
|
* this permanently in zconf.h using "./configure --zprefix".
|
||||||
|
*/
|
||||||
|
#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
|
||||||
|
# define Z_PREFIX_SET
|
||||||
|
|
||||||
|
/* all linked symbols and init macros */
|
||||||
|
# define _dist_code z__dist_code
|
||||||
|
# define _length_code z__length_code
|
||||||
|
# define _tr_align z__tr_align
|
||||||
|
# define _tr_flush_bits z__tr_flush_bits
|
||||||
|
# define _tr_flush_block z__tr_flush_block
|
||||||
|
# define _tr_init z__tr_init
|
||||||
|
# define _tr_stored_block z__tr_stored_block
|
||||||
|
# define _tr_tally z__tr_tally
|
||||||
|
# define adler32 z_adler32
|
||||||
|
# define adler32_combine z_adler32_combine
|
||||||
|
# define adler32_combine64 z_adler32_combine64
|
||||||
|
# define adler32_z z_adler32_z
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define compress z_compress
|
||||||
|
# define compress2 z_compress2
|
||||||
|
# define compressBound z_compressBound
|
||||||
|
# endif
|
||||||
|
# define crc32 z_crc32
|
||||||
|
# define crc32_combine z_crc32_combine
|
||||||
|
# define crc32_combine64 z_crc32_combine64
|
||||||
|
# define crc32_combine_gen z_crc32_combine_gen
|
||||||
|
# define crc32_combine_gen64 z_crc32_combine_gen64
|
||||||
|
# define crc32_combine_op z_crc32_combine_op
|
||||||
|
# define crc32_z z_crc32_z
|
||||||
|
# define deflate z_deflate
|
||||||
|
# define deflateBound z_deflateBound
|
||||||
|
# define deflateCopy z_deflateCopy
|
||||||
|
# define deflateEnd z_deflateEnd
|
||||||
|
# define deflateGetDictionary z_deflateGetDictionary
|
||||||
|
# define deflateInit z_deflateInit
|
||||||
|
# define deflateInit2 z_deflateInit2
|
||||||
|
# define deflateInit2_ z_deflateInit2_
|
||||||
|
# define deflateInit_ z_deflateInit_
|
||||||
|
# define deflateParams z_deflateParams
|
||||||
|
# define deflatePending z_deflatePending
|
||||||
|
# define deflatePrime z_deflatePrime
|
||||||
|
# define deflateReset z_deflateReset
|
||||||
|
# define deflateResetKeep z_deflateResetKeep
|
||||||
|
# define deflateSetDictionary z_deflateSetDictionary
|
||||||
|
# define deflateSetHeader z_deflateSetHeader
|
||||||
|
# define deflateTune z_deflateTune
|
||||||
|
# define deflate_copyright z_deflate_copyright
|
||||||
|
# define get_crc_table z_get_crc_table
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define gz_error z_gz_error
|
||||||
|
# define gz_intmax z_gz_intmax
|
||||||
|
# define gz_strwinerror z_gz_strwinerror
|
||||||
|
# define gzbuffer z_gzbuffer
|
||||||
|
# define gzclearerr z_gzclearerr
|
||||||
|
# define gzclose z_gzclose
|
||||||
|
# define gzclose_r z_gzclose_r
|
||||||
|
# define gzclose_w z_gzclose_w
|
||||||
|
# define gzdirect z_gzdirect
|
||||||
|
# define gzdopen z_gzdopen
|
||||||
|
# define gzeof z_gzeof
|
||||||
|
# define gzerror z_gzerror
|
||||||
|
# define gzflush z_gzflush
|
||||||
|
# define gzfread z_gzfread
|
||||||
|
# define gzfwrite z_gzfwrite
|
||||||
|
# define gzgetc z_gzgetc
|
||||||
|
# define gzgetc_ z_gzgetc_
|
||||||
|
# define gzgets z_gzgets
|
||||||
|
# define gzoffset z_gzoffset
|
||||||
|
# define gzoffset64 z_gzoffset64
|
||||||
|
# define gzopen z_gzopen
|
||||||
|
# define gzopen64 z_gzopen64
|
||||||
|
# ifdef _WIN32
|
||||||
|
# define gzopen_w z_gzopen_w
|
||||||
|
# endif
|
||||||
|
# define gzprintf z_gzprintf
|
||||||
|
# define gzputc z_gzputc
|
||||||
|
# define gzputs z_gzputs
|
||||||
|
# define gzread z_gzread
|
||||||
|
# define gzrewind z_gzrewind
|
||||||
|
# define gzseek z_gzseek
|
||||||
|
# define gzseek64 z_gzseek64
|
||||||
|
# define gzsetparams z_gzsetparams
|
||||||
|
# define gztell z_gztell
|
||||||
|
# define gztell64 z_gztell64
|
||||||
|
# define gzungetc z_gzungetc
|
||||||
|
# define gzvprintf z_gzvprintf
|
||||||
|
# define gzwrite z_gzwrite
|
||||||
|
# endif
|
||||||
|
# define inflate z_inflate
|
||||||
|
# define inflateBack z_inflateBack
|
||||||
|
# define inflateBackEnd z_inflateBackEnd
|
||||||
|
# define inflateBackInit z_inflateBackInit
|
||||||
|
# define inflateBackInit_ z_inflateBackInit_
|
||||||
|
# define inflateCodesUsed z_inflateCodesUsed
|
||||||
|
# define inflateCopy z_inflateCopy
|
||||||
|
# define inflateEnd z_inflateEnd
|
||||||
|
# define inflateGetDictionary z_inflateGetDictionary
|
||||||
|
# define inflateGetHeader z_inflateGetHeader
|
||||||
|
# define inflateInit z_inflateInit
|
||||||
|
# define inflateInit2 z_inflateInit2
|
||||||
|
# define inflateInit2_ z_inflateInit2_
|
||||||
|
# define inflateInit_ z_inflateInit_
|
||||||
|
# define inflateMark z_inflateMark
|
||||||
|
# define inflatePrime z_inflatePrime
|
||||||
|
# define inflateReset z_inflateReset
|
||||||
|
# define inflateReset2 z_inflateReset2
|
||||||
|
# define inflateResetKeep z_inflateResetKeep
|
||||||
|
# define inflateSetDictionary z_inflateSetDictionary
|
||||||
|
# define inflateSync z_inflateSync
|
||||||
|
# define inflateSyncPoint z_inflateSyncPoint
|
||||||
|
# define inflateUndermine z_inflateUndermine
|
||||||
|
# define inflateValidate z_inflateValidate
|
||||||
|
# define inflate_copyright z_inflate_copyright
|
||||||
|
# define inflate_fast z_inflate_fast
|
||||||
|
# define inflate_table z_inflate_table
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define uncompress z_uncompress
|
||||||
|
# define uncompress2 z_uncompress2
|
||||||
|
# endif
|
||||||
|
# define zError z_zError
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define zcalloc z_zcalloc
|
||||||
|
# define zcfree z_zcfree
|
||||||
|
# endif
|
||||||
|
# define zlibCompileFlags z_zlibCompileFlags
|
||||||
|
# define zlibVersion z_zlibVersion
|
||||||
|
|
||||||
|
/* all zlib typedefs in zlib.h and zconf.h */
|
||||||
|
# define Byte z_Byte
|
||||||
|
# define Bytef z_Bytef
|
||||||
|
# define alloc_func z_alloc_func
|
||||||
|
# define charf z_charf
|
||||||
|
# define free_func z_free_func
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# define gzFile z_gzFile
|
||||||
|
# endif
|
||||||
|
# define gz_header z_gz_header
|
||||||
|
# define gz_headerp z_gz_headerp
|
||||||
|
# define in_func z_in_func
|
||||||
|
# define intf z_intf
|
||||||
|
# define out_func z_out_func
|
||||||
|
# define uInt z_uInt
|
||||||
|
# define uIntf z_uIntf
|
||||||
|
# define uLong z_uLong
|
||||||
|
# define uLongf z_uLongf
|
||||||
|
# define voidp z_voidp
|
||||||
|
# define voidpc z_voidpc
|
||||||
|
# define voidpf z_voidpf
|
||||||
|
|
||||||
|
/* all zlib structs in zlib.h and zconf.h */
|
||||||
|
# define gz_header_s z_gz_header_s
|
||||||
|
# define internal_state z_internal_state
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__MSDOS__) && !defined(MSDOS)
|
||||||
|
# define MSDOS
|
||||||
|
#endif
|
||||||
|
#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
|
||||||
|
# define OS2
|
||||||
|
#endif
|
||||||
|
#if defined(_WINDOWS) && !defined(WINDOWS)
|
||||||
|
# define WINDOWS
|
||||||
|
#endif
|
||||||
|
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
|
||||||
|
# ifndef WIN32
|
||||||
|
# define WIN32
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
|
||||||
|
# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
|
||||||
|
# ifndef SYS16BIT
|
||||||
|
# define SYS16BIT
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compile with -DMAXSEG_64K if the alloc function cannot allocate more
|
||||||
|
* than 64k bytes at a time (needed on systems with 16-bit int).
|
||||||
|
*/
|
||||||
|
#ifdef SYS16BIT
|
||||||
|
# define MAXSEG_64K
|
||||||
|
#endif
|
||||||
|
#ifdef MSDOS
|
||||||
|
# define UNALIGNED_OK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __STDC_VERSION__
|
||||||
|
# ifndef STDC
|
||||||
|
# define STDC
|
||||||
|
# endif
|
||||||
|
# if __STDC_VERSION__ >= 199901L
|
||||||
|
# ifndef STDC99
|
||||||
|
# define STDC99
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
|
||||||
|
# define STDC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STDC
|
||||||
|
# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
|
||||||
|
# define const /* note: need a more gentle solution here */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ZLIB_CONST) && !defined(z_const)
|
||||||
|
# define z_const const
|
||||||
|
#else
|
||||||
|
# define z_const
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Z_SOLO
|
||||||
|
# ifdef _WIN64
|
||||||
|
typedef unsigned long long z_size_t;
|
||||||
|
# else
|
||||||
|
typedef unsigned long z_size_t;
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define z_longlong long long
|
||||||
|
# if defined(NO_SIZE_T)
|
||||||
|
typedef unsigned NO_SIZE_T z_size_t;
|
||||||
|
# elif defined(STDC)
|
||||||
|
# include <stddef.h>
|
||||||
|
typedef size_t z_size_t;
|
||||||
|
# else
|
||||||
|
typedef unsigned long z_size_t;
|
||||||
|
# endif
|
||||||
|
# undef z_longlong
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Maximum value for memLevel in deflateInit2 */
|
||||||
|
#ifndef MAX_MEM_LEVEL
|
||||||
|
# ifdef MAXSEG_64K
|
||||||
|
# define MAX_MEM_LEVEL 8
|
||||||
|
# else
|
||||||
|
# define MAX_MEM_LEVEL 9
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Maximum value for windowBits in deflateInit2 and inflateInit2.
|
||||||
|
* WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
|
||||||
|
* created by gzip. (Files created by minigzip can still be extracted by
|
||||||
|
* gzip.)
|
||||||
|
*/
|
||||||
|
#ifndef MAX_WBITS
|
||||||
|
# define MAX_WBITS 15 /* 32K LZ77 window */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The memory requirements for deflate are (in bytes):
|
||||||
|
(1 << (windowBits+2)) + (1 << (memLevel+9))
|
||||||
|
that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
|
||||||
|
plus a few kilobytes for small objects. For example, if you want to reduce
|
||||||
|
the default memory requirements from 256K to 128K, compile with
|
||||||
|
make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
|
||||||
|
Of course this will generally degrade compression (there's no free lunch).
|
||||||
|
|
||||||
|
The memory requirements for inflate are (in bytes) 1 << windowBits
|
||||||
|
that is, 32K for windowBits=15 (default value) plus about 7 kilobytes
|
||||||
|
for small objects.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Type declarations */
|
||||||
|
|
||||||
|
#ifndef OF /* function prototypes */
|
||||||
|
# ifdef STDC
|
||||||
|
# define OF(args) args
|
||||||
|
# else
|
||||||
|
# define OF(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The following definitions for FAR are needed only for MSDOS mixed
|
||||||
|
* model programming (small or medium model with some far allocations).
|
||||||
|
* This was tested only with MSC; for other MSDOS compilers you may have
|
||||||
|
* to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
|
||||||
|
* just define FAR to be empty.
|
||||||
|
*/
|
||||||
|
#ifdef SYS16BIT
|
||||||
|
# if defined(M_I86SM) || defined(M_I86MM)
|
||||||
|
/* MSC small or medium model */
|
||||||
|
# define SMALL_MEDIUM
|
||||||
|
# ifdef _MSC_VER
|
||||||
|
# define FAR _far
|
||||||
|
# else
|
||||||
|
# define FAR far
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# if (defined(__SMALL__) || defined(__MEDIUM__))
|
||||||
|
/* Turbo C small or medium model */
|
||||||
|
# define SMALL_MEDIUM
|
||||||
|
# ifdef __BORLANDC__
|
||||||
|
# define FAR _far
|
||||||
|
# else
|
||||||
|
# define FAR far
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(WINDOWS) || defined(WIN32)
|
||||||
|
/* If building or using zlib as a DLL, define ZLIB_DLL.
|
||||||
|
* This is not mandatory, but it offers a little performance increase.
|
||||||
|
*/
|
||||||
|
# ifdef ZLIB_DLL
|
||||||
|
# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
|
||||||
|
# ifdef ZLIB_INTERNAL
|
||||||
|
# define ZEXTERN extern __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define ZEXTERN extern __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif /* ZLIB_DLL */
|
||||||
|
/* If building or using zlib with the WINAPI/WINAPIV calling convention,
|
||||||
|
* define ZLIB_WINAPI.
|
||||||
|
* Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
|
||||||
|
*/
|
||||||
|
# ifdef ZLIB_WINAPI
|
||||||
|
# ifdef FAR
|
||||||
|
# undef FAR
|
||||||
|
# endif
|
||||||
|
# ifndef WIN32_LEAN_AND_MEAN
|
||||||
|
# define WIN32_LEAN_AND_MEAN
|
||||||
|
# endif
|
||||||
|
# include <windows.h>
|
||||||
|
/* No need for _export, use ZLIB.DEF instead. */
|
||||||
|
/* For complete Windows compatibility, use WINAPI, not __stdcall. */
|
||||||
|
# define ZEXPORT WINAPI
|
||||||
|
# ifdef WIN32
|
||||||
|
# define ZEXPORTVA WINAPIV
|
||||||
|
# else
|
||||||
|
# define ZEXPORTVA FAR CDECL
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__BEOS__)
|
||||||
|
# ifdef ZLIB_DLL
|
||||||
|
# ifdef ZLIB_INTERNAL
|
||||||
|
# define ZEXPORT __declspec(dllexport)
|
||||||
|
# define ZEXPORTVA __declspec(dllexport)
|
||||||
|
# else
|
||||||
|
# define ZEXPORT __declspec(dllimport)
|
||||||
|
# define ZEXPORTVA __declspec(dllimport)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ZEXTERN
|
||||||
|
# define ZEXTERN extern
|
||||||
|
#endif
|
||||||
|
#ifndef ZEXPORT
|
||||||
|
# define ZEXPORT
|
||||||
|
#endif
|
||||||
|
#ifndef ZEXPORTVA
|
||||||
|
# define ZEXPORTVA
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FAR
|
||||||
|
# define FAR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__MACTYPES__)
|
||||||
|
typedef unsigned char Byte; /* 8 bits */
|
||||||
|
#endif
|
||||||
|
typedef unsigned int uInt; /* 16 bits or more */
|
||||||
|
typedef unsigned long uLong; /* 32 bits or more */
|
||||||
|
|
||||||
|
#ifdef SMALL_MEDIUM
|
||||||
|
/* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
|
||||||
|
# define Bytef Byte FAR
|
||||||
|
#else
|
||||||
|
typedef Byte FAR Bytef;
|
||||||
|
#endif
|
||||||
|
typedef char FAR charf;
|
||||||
|
typedef int FAR intf;
|
||||||
|
typedef uInt FAR uIntf;
|
||||||
|
typedef uLong FAR uLongf;
|
||||||
|
|
||||||
|
#ifdef STDC
|
||||||
|
typedef void const *voidpc;
|
||||||
|
typedef void FAR *voidpf;
|
||||||
|
typedef void *voidp;
|
||||||
|
#else
|
||||||
|
typedef Byte const *voidpc;
|
||||||
|
typedef Byte FAR *voidpf;
|
||||||
|
typedef Byte *voidp;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
|
||||||
|
# include <limits.h>
|
||||||
|
# if (UINT_MAX == 0xffffffffUL)
|
||||||
|
# define Z_U4 unsigned
|
||||||
|
# elif (ULONG_MAX == 0xffffffffUL)
|
||||||
|
# define Z_U4 unsigned long
|
||||||
|
# elif (USHRT_MAX == 0xffffffffUL)
|
||||||
|
# define Z_U4 unsigned short
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Z_U4
|
||||||
|
typedef Z_U4 z_crc_t;
|
||||||
|
#else
|
||||||
|
typedef unsigned long z_crc_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
|
||||||
|
# define Z_HAVE_UNISTD_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
|
||||||
|
# define Z_HAVE_STDARG_H
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STDC
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# include <sys/types.h> /* for off_t */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# include <stdarg.h> /* for va_list */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# ifndef Z_SOLO
|
||||||
|
# include <stddef.h> /* for wchar_t */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
|
||||||
|
* "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
|
||||||
|
* though the former does not conform to the LFS document), but considering
|
||||||
|
* both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
|
||||||
|
* equivalently requesting no 64-bit operations
|
||||||
|
*/
|
||||||
|
#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
|
||||||
|
# undef _LARGEFILE64_SOURCE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef Z_HAVE_UNISTD_H
|
||||||
|
# ifdef __WATCOMC__
|
||||||
|
# define Z_HAVE_UNISTD_H
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#ifndef Z_HAVE_UNISTD_H
|
||||||
|
# if defined(_LARGEFILE64_SOURCE) && !defined(_WIN32)
|
||||||
|
# define Z_HAVE_UNISTD_H
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#ifndef Z_SOLO
|
||||||
|
# if defined(Z_HAVE_UNISTD_H)
|
||||||
|
//# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
|
||||||
|
# ifdef VMS
|
||||||
|
# include <unixio.h> /* for off_t */
|
||||||
|
# endif
|
||||||
|
# ifndef z_off_t
|
||||||
|
# define z_off_t off_t
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
|
||||||
|
# define Z_LFS64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
|
||||||
|
# define Z_LARGE64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
|
||||||
|
# define Z_WANT64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(SEEK_SET) && !defined(Z_SOLO)
|
||||||
|
# define SEEK_SET 0 /* Seek from beginning of file. */
|
||||||
|
# define SEEK_CUR 1 /* Seek from current position. */
|
||||||
|
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef z_off_t
|
||||||
|
# define z_off_t long
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(_WIN32) && defined(Z_LARGE64)
|
||||||
|
# define z_off64_t off64_t
|
||||||
|
#else
|
||||||
|
# if defined(_WIN32) && !defined(__GNUC__)
|
||||||
|
# define z_off64_t __int64
|
||||||
|
# else
|
||||||
|
# define z_off64_t z_off_t
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* MVS linker does not support external names larger than 8 bytes */
|
||||||
|
#if defined(__MVS__)
|
||||||
|
#pragma map(deflateInit_,"DEIN")
|
||||||
|
#pragma map(deflateInit2_,"DEIN2")
|
||||||
|
#pragma map(deflateEnd,"DEEND")
|
||||||
|
#pragma map(deflateBound,"DEBND")
|
||||||
|
#pragma map(inflateInit_,"ININ")
|
||||||
|
#pragma map(inflateInit2_,"ININ2")
|
||||||
|
#pragma map(inflateEnd,"INEND")
|
||||||
|
#pragma map(inflateSync,"INSY")
|
||||||
|
#pragma map(inflateSetDictionary,"INSEDI")
|
||||||
|
#pragma map(compressBound,"CMBND")
|
||||||
|
#pragma map(inflate_table,"INTABL")
|
||||||
|
#pragma map(inflate_fast,"INFA")
|
||||||
|
#pragma map(inflate_copyright,"INCOPY")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ZCONF_H */
|
||||||
1938
include/zlib.h
Normal file
1938
include/zlib.h
Normal file
File diff suppressed because it is too large
Load Diff
BIN
lib/zlib.lib
Normal file
BIN
lib/zlib.lib
Normal file
Binary file not shown.
1
libzip
Submodule
1
libzip
Submodule
Submodule libzip added at 0581df5105
2
utils
2
utils
Submodule utils updated: d4d0be7e7a...f4b05a3dfc
161
vfs.cpp
Normal file
161
vfs.cpp
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
#include "vfs.hpp"
|
||||||
|
#include "wchar_util.h"
|
||||||
|
#include "str_util.h"
|
||||||
|
#include "fileop.h"
|
||||||
|
#include "shlwapi.h"
|
||||||
|
|
||||||
|
VFS::VFS() {
|
||||||
|
WCHAR exePath[MAX_PATH];
|
||||||
|
GetModuleFileNameW(NULL, exePath, MAX_PATH);
|
||||||
|
std::wstring path = exePath;
|
||||||
|
std::string pathStr;
|
||||||
|
if (!wchar_util::wstr_to_str(pathStr, path, CP_UTF8)) {
|
||||||
|
char buf[MAX_PATH];
|
||||||
|
GetModuleFileNameA(NULL, buf, MAX_PATH);
|
||||||
|
pathStr = buf;
|
||||||
|
}
|
||||||
|
base_path = fileop::dirname(pathStr);
|
||||||
|
base_path = str_util::str_replace(base_path, "/", "\\");
|
||||||
|
}
|
||||||
|
|
||||||
|
VFS::~VFS() {
|
||||||
|
for (auto file : handles) {
|
||||||
|
zip_fclose((zip_file_t*)file.first);
|
||||||
|
}
|
||||||
|
for (auto archive : archives) {
|
||||||
|
zip_close(archive);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VFS::AddArchive(std::string path) {
|
||||||
|
zip_t* archive = zip_open(path.c_str(), ZIP_RDONLY, nullptr);
|
||||||
|
if (!archive) return false;
|
||||||
|
archives.push_back(archive);
|
||||||
|
auto len = zip_get_num_entries(archive, 0);
|
||||||
|
for (zip_int64_t i = 0; i < len; i++) {
|
||||||
|
struct zip_stat st;
|
||||||
|
zip_stat_init(&st);
|
||||||
|
zip_stat_index(archive, i, 0, &st);
|
||||||
|
// Skip directories/folders (directory entries usually end with a '/')
|
||||||
|
if (st.name[strlen(st.name) - 1] == '/') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
std::string name = st.name;
|
||||||
|
name = str_util::str_replace(name, "/", "\\");
|
||||||
|
files[name] = st.size;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VFS::ContainsFile(std::string path) {
|
||||||
|
path = str_util::str_replace(path, "/", "\\");
|
||||||
|
if (fileop::isabs(path)) {
|
||||||
|
path = fileop::relpath(path, base_path);
|
||||||
|
}
|
||||||
|
return files.find(path) != files.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VFS::ContainsFile(std::wstring path) {
|
||||||
|
std::string str;
|
||||||
|
if (!wchar_util::wstr_to_str(str, path, CP_UTF8)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return ContainsFile(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VFS::ContainsHandle(HANDLE hFile) {
|
||||||
|
return handles.find(hFile) != handles.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
HANDLE VFS::CreateFileW(std::wstring path) {
|
||||||
|
std::string str;
|
||||||
|
if (!wchar_util::wstr_to_str(str, path, CP_UTF8)) {
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
str = fileop::relpath(str, base_path);
|
||||||
|
str = str_util::str_replace(str, "\\", "/");
|
||||||
|
zip_t* archive = nullptr;
|
||||||
|
zip_uint64_t index = 0;
|
||||||
|
for (auto a : archives) {
|
||||||
|
if (zip_name_locate(a, str.c_str(), 0) != -1) {
|
||||||
|
archive = a;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!archive) {
|
||||||
|
SetLastError(ERROR_FILE_NOT_FOUND);
|
||||||
|
return INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
index = zip_name_locate(archive, str.c_str(), 0);
|
||||||
|
zip_file_t* file = zip_fopen_index(archive, index, 0);
|
||||||
|
handles[(HANDLE)file] = str;
|
||||||
|
return (HANDLE)file;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool VFS::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead) {
|
||||||
|
if (!ContainsHandle(hFile)) {
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
zip_file_t* file = (zip_file_t*)hFile;
|
||||||
|
if (!file) {
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
zip_int64_t n = zip_fread(file, lpBuffer, nNumberOfBytesToRead);
|
||||||
|
if (n == -1) {
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (lpNumberOfBytesRead) {
|
||||||
|
*lpNumberOfBytesRead = n;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VFS::CloseHandle(HANDLE hFile) {
|
||||||
|
if (!ContainsHandle(hFile)) {
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
zip_fclose((zip_file_t*)hFile);
|
||||||
|
handles.erase(hFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD VFS::GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) {
|
||||||
|
auto f = handles.find(hFile);
|
||||||
|
if (f == handles.end()) {
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return INVALID_FILE_SIZE;
|
||||||
|
}
|
||||||
|
auto data = *f;
|
||||||
|
auto name = data.second;
|
||||||
|
auto size = files[name];
|
||||||
|
if (lpFileSizeHigh) {
|
||||||
|
*lpFileSizeHigh = size >> 32;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD VFS::SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod) {
|
||||||
|
if (!ContainsHandle(hFile)) {
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return INVALID_SET_FILE_POINTER;
|
||||||
|
}
|
||||||
|
zip_file_t* file = (zip_file_t*)hFile;
|
||||||
|
if (!file) {
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return INVALID_SET_FILE_POINTER;
|
||||||
|
}
|
||||||
|
zip_int64_t n = zip_fseek(file, lDistanceToMove, dwMoveMethod);
|
||||||
|
if (n == -1) {
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return INVALID_SET_FILE_POINTER;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string VFS::GetBasePath() {
|
||||||
|
return base_path;
|
||||||
|
}
|
||||||
26
vfs.hpp
Normal file
26
vfs.hpp
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#include "zip.h"
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
class VFS {
|
||||||
|
public:
|
||||||
|
VFS();
|
||||||
|
~VFS();
|
||||||
|
bool AddArchive(std::string path);
|
||||||
|
bool ContainsFile(std::string path);
|
||||||
|
bool ContainsFile(std::wstring path);
|
||||||
|
bool ContainsHandle(HANDLE hFile);
|
||||||
|
HANDLE CreateFileW(std::wstring path);
|
||||||
|
bool ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead);
|
||||||
|
void CloseHandle(HANDLE hFile);
|
||||||
|
DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
|
||||||
|
DWORD SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);
|
||||||
|
std::unordered_map<std::string, zip_uint64_t> files;
|
||||||
|
std::string GetBasePath();
|
||||||
|
private:
|
||||||
|
std::string base_path;
|
||||||
|
std::list<zip_t*> archives;
|
||||||
|
std::unordered_map<HANDLE, std::string> handles;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user