mireado

starting commit

cmake_minimum_required(VERSION 2.8)
set(CMAKE_CONFIGURATION_TYPES Debug Release)
project(vnr)
set(WDK_HOME "C:\\WinDDK\\7600.16385.1" CACHE FILEPATH "path to the Windows DDK directory")
add_definitions(
-DUNICODE
-D_UNICODE
)
include_directories(${PROJECT_SOURCE_DIR})
set(common_src
${PROJECT_SOURCE_DIR}/ith/common/const.h
${PROJECT_SOURCE_DIR}/ith/common/defs.h
${PROJECT_SOURCE_DIR}/ith/common/except.h
${PROJECT_SOURCE_DIR}/ith/common/growl.h
${PROJECT_SOURCE_DIR}/ith/common/memory.h
${PROJECT_SOURCE_DIR}/ith/common/types.h
)
set(import_src
${PROJECT_SOURCE_DIR}/ith/import/mono/funcinfo.h
${PROJECT_SOURCE_DIR}/ith/import/mono/types.h
${PROJECT_SOURCE_DIR}/ith/import/ppsspp/funcinfo.h
)
add_subdirectory(ith/hook)
add_subdirectory(ith/host)
add_subdirectory(ith/sys)
#ifndef CCMACRO_H
#define CCMACRO_H
// ccmacro.h
// 12/9/2011 jichi
#define CC_UNUSED(_var) (void)(_var)
#define CC_NOP CC_UNUSED(0)
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
# define CC_LIKELY(expr) __builtin_expect(!!(expr), true)
# define CC_UNLIKELY(expr) __builtin_expect(!!(expr), false)
#else
# define CC_LIKELY(x) (x)
# define CC_UNLIKELY(x) (x)
#endif
#define CC_MIN(x, y) ((x) < (y) ? (x) : (y))
#define CC_MAX(x, y) ((x) < (y) ? (y) : (x))
#endif // CCMACRO_H
# ccutil.pri
# 1/31/2012 jichi
DEFINES += WITH_LIB_CCUTIL
DEPENDPATH += $$PWD
HEADERS += \
$$PWD/ccmacro.h
# EOF
# config.pri
# 9/3/2011 jichi
## Locations
ROOTDIR = $$PWD
BUILDDIR = $$ROOTDIR/build
SRCDIR = $$ROOTDIR/cpp
CONFDIR = $$SRCDIR/conf
LIBDIR = $$SRCDIR/libs
COMDIR = $$SRCDIR/coms
PLUGINDIR = $$SRCDIR/plugins
#SERVICEDIR = $$SRCDIR/services
DESTDIR = $$BUILDDIR
#win32: DESTDIR_TARGET = $$BUILDDIR/release.win
#unix: DESTDIR_TARGET = $$BUILDDIR/release.unix
#mac: DESTDIR_TARGET = $$BUILDDIR/release.mac
LIBS += -L$$DESTDIR
mac: LIBS += -F$$DESTDIR
INCLUDEPATH += \
$$SRCDIR \
$$LIBDIR \
$$COMDIR \
$$PLUGINDIR \
$$SERVICEDIR
## Qt Translation
CODECFORTR = UTF-8
#CODECFORSRC = UTF-8 # there are sources in SJIS encoding
## Compiling options
# Windows
win32: DEFINES += UNICODE # force using UNICODE interface by default
# Mac
#CONFIG += x86 x86_64 ppc64
mac: CONFIG -= ppc ppc64 # disable compiling fat architectures
# Enable C++11
win32: QMAKE_CXXFLAGS += -Zc:auto
unix: QMAKE_CXXFLAGS += -std=c++11
mac {
# Enable TR1 such as tuple
# Clang is required to take place of llvm gcc, which uses /usr/lib/libstdc++.dylib
QMAKE_CXXFLAGS += -stdlib=libc++
QMAKE_LFLAGS += -stdlib=libc++
}
# MSVC warnings
win32 {
# Disable checked iterator and compiler warning.
# SCL: http://msdn.microsoft.com/en-us/library/aa985896.aspx
# SCL Warning: http://msdn.microsoft.com/en-us/library/aa985974.aspx
# Performance comparison: http://askldjd.wordpress.com/2009/09/13/stl-performance-comparison-vc71-vc90-and-stlport/
DEFINES += _SECURE_SCL=0 _SCL_SECURE_NO_WARNINGS
# Disable CRT string function warnings
DEFINES += _CRT_SECURE_NO_WARNINGS
# Disable CRT posix warnings
#DEFINES += _CRT_NONSTDC_NO_DEPRECATE
QMAKE_CXXFLAGS += -wd4819 # ignore the warning on Japanese characters
}
## External Libraries
win32 {
D3D_HOME = "$$PROGRAMFILES/Microsoft DirectX SDK"
DETOURS_HOME = "$$PROGRAMFILES/Microsoft Research/Detours Express 3.0"
#DEV_HOME = c:/dev
DEV_HOME = z:/local/windows/developer
BOOST_HOME = $$DEV_HOME/boost/build
#ITH_HOME = $$DEV_HOME/ith
MSIME_HOME = $$DEV_HOME/msime
#PYTHON_HOME = $$ROOTDIR/../Python
#PYTHON_HOME = C:/Python
PYTHON_HOME = Z:/Local/Windows/Developer/Python
PYSIDE_HOME = $$PYTHON_HOME/Lib/site-packages/PySide
QT_HOME = c:/qt/4
QT_SRC = c:/qt
SAPI_HOME = "$$PROGRAMFILES/Microsoft Speech SDK 5.1"
#WMSDK_HOME = c:/wmsdk/wmpsdk9
WDK7_HOME = c:/winddk/7600.16385.1
WDK8_HOME = "$$PROGRAMFILES/Windows Kits/8.1"
UTF8_HOME = z:/users/jichi/opt/utf8
}
mac {
MACPORTS_HOME = /opt/local
BOOST_HOME = $$MACPORTS_HOME
DEV_HOME = ${HOME}/opt
#ITH_HOME = ${HOME}/opt/ith
MSIME_HOME = $$DEV_HOME/msime
PYSIDE_HOME = $$MACPORTS_HOME
PYTHON_HOME = $$MACPORTS_HOME/Library/Frameworks/Python.framework/Versions/Current
#QT_HOME = ${HOME}/opt/qt
QT_HOME = $$MACPORTS_HOME
QT_SRC = ${HOME}/src
UTF8_HOME = $$DEV_HOME/utf8
}
INCLUDEPATH += $$BOOST_HOME $$BOOST_HOME/include
LIBS += -L$$BOOST_HOME/lib
# Disable automatically linking with boost silently
# See: http://www.boost.org/doc/libs/1_56_0/boost/config/user.hpp
DEFINES += BOOST_ALL_NO_LIB
mac: BOOST_VARIANT = -mt
## Config
CONFIG(release) {
message(CONFIG release)
#DEFINES += QT_NO_DEBUG_OUTPUT QT_NO_WARNING_OUTPUT
}
CONFIG(noqt) {
message(CONFIG noqt)
CONFIG += noqtcore noqtgui
CONFIG -= qt
}
CONFIG(noqtcore) {
message(CONFIG noqtcore)
QT -= core
LIBS -= -lQtCore
}
CONFIG(noqtgui) {
message(CONFIG noqtgui)
QT -= gui
LIBS -= -lQtGui
mac: CONFIG -= app_bundle
}
win32 {
CONFIG(nocrt) { # No runtime CRT. Use -MT for static linking.
message(CONFIG nocrt)
QMAKE_CFLAGS -= -MD -MDd
QMAKE_CFLAGS_DEBUG -= -MD -MDd
QMAKE_CFLAGS_RELEASE -= -MD -MDd
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO -= -MD -MDd
QMAKE_CXXFLAGS -= -MD -MDd
QMAKE_CXXFLAGS_DEBUG -= -MD -MDd
QMAKE_CXXFLAGS_RELEASE -= -MD -MDd
QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO -= -MD -MDd
#QMAKE_LFLAGS += -NODEFAULTLIB:msvcrt.lib \
# -NODEFAULTLIB:msvcrtd.lib
}
# http://social.msdn.microsoft.com/Forums/vstudio/en-US/96c906d9-de1d-4ace-af37-71169617b6ff/destructors-and-seh
CONFIG(eha) { # Catch all exceptions
message(CONFIG eha)
QMAKE_CXXFLAGS_STL_ON -= -EHsc
QMAKE_CXXFLAGS_EXCEPTIONS_ON -= -EHsc
QMAKE_CXXFLAGS_STL_ON += -EHa
QMAKE_CXXFLAGS_EXCEPTIONS_ON += -EHa
}
CONFIG(noeh) { # No Exception handler
message(CONFIG noeh)
#CONFIG -= rtti #-exceptions -stl
QMAKE_CXXFLAGS += /GR-
QMAKE_CXXFLAGS_RTTI_ON -= -GR
QMAKE_CXXFLAGS_STL_ON -= -EHsc
QMAKE_CXXFLAGS_EXCEPTIONS_ON -= -EHsc
CONFIG(dll) {
QMAKE_LFLAGS += /ENTRY:"DllMain"
}
}
CONFIG(nosafeseh) { # No Exception handler
message(CONFIG nosafeseh)
# Disable SafeSEH table
# http://stackoverflow.com/questions/19722308/exception-handler-not-called-in-c/20344222
# Alternative way: Register handler using MASM
# http://stackoverflow.com/questions/12019689/custom-seh-handler-with-safeseh
QMAKE_LFLAGS += -safeseh:no
}
}
CONFIG(gdb) {
message(CONFIG gdb)
QMAKE_CXXFLAGS += -g -ggdb
}
CONFIG(lldb) {
message(CONFIG lldb)
QMAKE_CXXFLAGS += -g #-glldb
}
CONFIG(qmlplugin) {
message(CONFIG qmlplugin)
QT += core declarative
win32: CONFIG += dll
}
CONFIG(pysideplugin) {
message(CONFIG pysideplugin)
CONFIG += pyplugin shiboken
QT += core
LIBS += -L$$PYSIDE_HOME -lpyside-python2.7
INCLUDEPATH += \
$$PYSIDE_HOME/include/PySide \
$$PYSIDE_HOME/include/PySide-2.7 \
$$PYSIDE_HOME/include \
$$PYSIDE_HOME/include/PySide/QtCore \
$$PYSIDE_HOME/include/PySide/QtGui \
$$QT_HOME/include/QtGui # needed by pyside qtcore
}
CONFIG(shiboken) {
message(CONFIG shiboken)
LIBS += -L$$PYSIDE_HOME -lshiboken-python2.7
INCLUDEPATH += \
$$PYSIDE_HOME/include/shiboken \
$$PYSIDE_HOME/include/shiboken-2.7
# Ignore warnings from Shiboken and PySide
mac {
QMAKE_CXXFLAGS_WARN_ON += \
-Wno-header-guard \
-Wno-mismatched-tags \
-Wno-missing-field-initializers \
-Wno-unused-parameter
}
win32 {
# QMAKE_CXXFLAGS_WARN_ON does not work on windows
#
#ifdef _MSC_VER
# pragma warning (disable:4099) // C4099: mix class and struct
# pragma warning (disable:4100) // C4100: unreferenced parametter
# pragma warning (disable:4244) // C4244: conversion lost of data
# pragma warning (disable:4390) // C4390: empty controlled statement
# pragma warning (disable:4522) // C4522: multiple assignment operators
# pragma warning (disable:4800) // C4800: forcing value to bool
#endif // _MSC_VER
QMAKE_CXXFLAGS += -wd4099 -wd4100 -wd4244 -wd4390 -wd4522 -wd4800
}
}
CONFIG(pyplugin) {
message(CONFIG pyplugin)
INCLUDEPATH += $$PYTHON_HOME/include/python2.7 $$PYTHON_HOME/include
unix: LIBS += -L$$PYTHON_HOME/lib -lpython2.7
win32: LIBS += -L$$PYTHON_HOME/libs -lpython27
unix: QMAKE_EXTENSION_SHLIB = so
win32: QMAKE_EXTENSION_SHLIB = pyd
win32: CONFIG += dll
}
CONFIG(qt) {
message(CONFIG qt)
INCLUDEPATH += $$QT_SRC $$QT_SRC/qt # always allow access to Qt source code
# Clang: Disable warning while processing Qt library headers
# http://stackoverflow.com/questions/17846909/how-can-i-stop-warnings-about-unused-private-fields
mac {
QMAKE_CXXFLAGS_WARN_ON += -Wno-deprecated-register # register storage class specifier is deprecated
QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-private-field # private field 'type' is not used in qmime.h
}
}
# EOF
## Debug
#include($$ROOTDIR/lib/debug/debug.pri)
## Deploy
#DEFINES += VERSION=\\\"$$VERSION\\\"
## IDs
# Azure Market Key: https://datamarket.azure.com/account/datasets
#DEFINES += CONFIG_AZURE_ID=\\\"tuSmXew4CSnnGaX0vZyYdNLCrlInvAUepCX6p5l5THc=\\\"
# Yahoo!JAPAN AppID: https://e.developer.yahoo.co.jp/dashboard/
#DEFINES += CONFIG_YAHOO_ID=\\\"mRr.UCWxg65ZTZTR_Mz0OTtj3sJ7xa5K66ZOGp55cgJsIDDeaB6e1LDY1NpEZ_AfZA--\\\"
## Deploy
# See: http://wiki.maemo.org/Packaging_a_Qt_application
# See: http://www.developer.nokia.com/Community/Wiki/Creating_Debian_packages_for_Maemo_5_Qt_applications_and_showing_in_the_application_menu
# See: https://wiki.kubuntu.org/PackagingGuide/QtApplication
#QMLDIR=$$DESTDIR/qml
#LUADIR=$$DESTDIR/lua
#DOCDIR=$$DESTDIR/doc
#TABLEDIR=$$DESTDIR/table
#IMAGEDIR=$$DESTDIR/images
#JSFDIR=$$DESTDIR/jsf
#AVATARDIR=$$DESTDIR/avatars
#unix:!mac {
# isEmpty(PREFIX): PREFIX = /usr
# BINDIR = $$PREFIX/bin
# DATADIR = $$PREFIX/share
#}
#mac {
# isEmpty(PREFIX): PREFIX = /opt/annot
# BINDIR = $$PREFIX/bin
# DATADIR = $$PREFIX/share
#}
#
#!win32 {
# DEFINES += \
# BINDIR=\\\"$$BINDIR\\\" \
# DATADIR=\\\"$$DATADIR\\\"
#}
#DEFINES += \
# AVATARDIR=\\\"$$AVATARDIR\\\" \
# DOCDIR=\\\"$$DOCDIR\\\" \
# TABLEDIR=\\\"$$TABLEDIR\\\" \
# IMAGEDIR=\\\"$$IMAGDIR\\\" \
# LUADIR=\\\"$$LUADIR\\\" \
# JSFDIR=\\\"$$JSFDIR\\\"
## External libraries
#win32 {
# DEV_HOME = c:/dev
# #DEV_HOME = B:/Developer
# QT_HOME = c:/qt/qt4
# QT_SRC = c:/qt
# QT5_HOME = c:/qt/qt5
# QT5_SRC = c:/qt
# #VLC_HOME = "c:/Program Files/VideoLAN/VLC/sdk"
# VLC_HOME = $$DEV_HOME/vlc
# VLC_SRC = $$VLC_HOME/src
# #WSF_HOME = $$DEV_HOME/wso2
# #CDIO_HOME = $$DEV_HOME/cdio
# #FFMPEG_HOME = $$DEV_HOME/ffmpeg
# GPAC_HOME = $$DEV_HOME/gpac
# MP4V2_HOME = $$DEV_HOME/mp4v2
# LIVE_HOME = $$DEV_HOME/live
# POPPLER_HOME = $$DEV_HOME/poppler
# BOOST_HOME = $$DEV_HOME/boost
# GSOAP_HOME = $$DEV_HOME/gsoap
# GSOAP_SRC = $$DEV_HOME/gsoap/src
# ZDEV_HOME = $$DEV_HOME/zlib
# LUA_HOME = $$DEV_HOME/lua
# FREETYPE_HOME = $$DEV_HOME/freetype
# FONTCONFIG_HOME = $$DEV_HOME/fontconfig
# MECAB_HOME = $$DEV_HOME/mecab
# #LUA_VERSION = 52
# #LUA_VERSION = 5.1
# LUA_VERSION =
#
# ITH_HOME = $$DEV_HOME/ith
#
# WDK_HOME = c:/winddk/current
#
# INCLUDEPATH += $$DEV_HOME/inttypes/include
#
# INCLUDEPATH += $$ITH_HOME/include
# LIBS += -L$$ITH_HOME/lib
#
# # wdk/inc/api/sal.h MUST be removed.
# # See: http://stackoverflow.com/questions/1356653/multiple-compiling-errors-with-basic-c-application-on-vs2010-beta-1
# # Select WinXP x86
# INCLUDEPATH += $$WDK_HOME/inc
# LIBS += -L$$WDK_HOME/lib/wxp/i386
#}
#
#unix {
# X11_HOME = /usr/X11
# QT_HOME = /usr/share/qt4
# QT_SRC =
# VLC_HOME = /usr
# VLC_SRC = ${HOME}/opt/src
# #WSF_HOME = ${HOME}/opt/wso2/wsf
# #CDIO_HOME = /usr
# #FFMPEG_HOME = /usr
# MECAB_HOME = /usr
# GPAC_HOME = /usr
# MP4V2_HOME = /usr
# LIVE_HOME = /usr
# POPPLER_HOME = ${HOME}/opt/poppler
# BOOST_HOME = /usr
# GSOAP_HOME = ${HOME}/opt/gsoap
# GSOAP_SRC = ${HOME}/opt/src/gsoap
# LUA_HOME = /usr
# ZDEV_HOME = /usr
# FREETYPE_HOME = $$X11_HOME
# FONTCONFIG_HOME = $$X11_HOME
# LUA_VERSION = 5.1
#}
#
#mac {
# SDK_HOME = /Developer/SDKs/MacOSX10.7.sdk
# X11_HOME = $$SDK_HOME/usr/X11
# MACPORTS_HOME = /opt/local
# QT_HOME = ${HOME}/opt/qt
# QT_SRC = ${HOME}/opt/src
# QT5_HOME = ${HOME}/opt/qt5
# QT5_SRC = ${HOME}/opt/src
# #VLC_HOME = ${HOME}/opt/vlc
# VLC_HOME = /Applications/VLC.app/Contents/MacOS
# VLC_SRC = ${HOME}/opt/src
# #WSF_HOME = ${HOME}/opt/wso2/wsf
# #CDIO_HOME = ${HOME}/opt/libcdio
# #FFMPEG_HOME = $$MACPORTS_HOME
# GPAC_HOME = ${HOME}/opt/gpac
# MP4V2_HOME = $$MACPORTS_HOME
# MECAB_HOME = $$MACPORTS_HOME
# LIVE_HOME = ${HOME}/opt/live
# POPPLER_HOME = ${HOME}/opt/poppler
# BOOST_HOME = $$MACPORTS_HOME
# GSOAP_HOME = ${HOME}/opt/gsoap
# GSOAP_SRC = ${HOME}/opt/src/gsoap
# ZDEV_HOME = $$SDK_HOME/usr
# FREETYPE_HOME = $$X11_HOME
# FONTCONFIG_HOME = $$X11_HOME
# #LUA_HOME = ${HOME}/opt/lua
# LUA_HOME = $$MACPORTS_HOME
# #LUA_VERSION = 52
# LUA_VERSION =
#}
#
#INCLUDEPATH += $$QT_SRC/qt/src
##INCLUDEPATH += $$QT5_SRC/qt/src
#
#INCLUDEPATH += $$VLC_HOME/include
#INCLUDEPATH += $$VLC_HOME/include/vlc/plugins
##INCLUDEPATH += $$VLC_SRC/include
#LIBS += -L$$VLC_HOME/lib
##INCLUDEPATH += $$WSF_HOME/include
##LIBS += -L$$WSF_HOME/lib
##INCLUDEPATH += $$CDIO_HOME/include
##LIBS += -L$$CDIO_HOME/lib
##INCLUDEPATH += $$POPPLER_HOME/include/poppler/qt4
##LIBS += -L$$POPPLER_HOME/lib
#INCLUDEPATH += $$BOOST_HOME/include
#LIBS += -L$$BOOST_HOME/lib
#INCLUDEPATH += $$GSOAP_HOME/include
##LIBS += -L$$GSOAP_HOME/lib
#INCLUDEPATH += $$ZDEV_HOME/include
#LIBS += -L$$ZDEV_HOME/lib
#INCLUDEPATH += $$MECAB_HOME/include
#LIBS += -L$$MECAB_HOME/lib
#INCLUDEPATH += $$FREETYPE_HOME/include \
# $$FREETYPE_HOME/include/freetype2
#LIBS += -L$$FREETYPE_HOME/lib
#INCLUDEPATH += $$FONTCONFIG_HOME/include
#LIBS += -L$$FONTCONFIG_HOME/lib
#INCLUDEPATH += $$LUA_HOME/include \
# $$LUA_HOME/include/lua$$LUA_VERSION
#LIBS += -L$$LUA_HOME/lib
##INCLUDEPATH += $$FFMPEG_HOME/include
##LIBS += -L$$FFMPEG_HOME/lib
##INCLUDEPATH += $$GPAC_HOME/include
##LIBS += -L$$GPAC_HOME/lib
##INCLUDEPATH += $$MP4V2_HOME/include
##LIBS += -L$$MP4V2_HOME/lib
##INCLUDEPATH += \
## $$LIVE_HOME/BasicUsageEnvironment/include \
## $$LIVE_HOME/UsageEnvironment/include \
## $$LIVE_HOME/groupsock/include \
## $$LIVE_HOME/liveMedia/include
# #$$LIVE_HOME/BasicUsageEnvironment $$LIVE_HOME/BasicUsageEnvironment/include \
# #$$LIVE_HOME/UsageEnvironment $$LIVE_HOME/UsageEnvironment/include \
# #$$LIVE_HOME/groupsock $$LIVE_HOME/groupsock/include \
# #$$LIVE_HOME/liveMedia $$LIVE_HOME/liveMedia/include
##LIBS += \
## -L$$LIVE_HOME/BasicUsageEnvironment \
## -L$$LIVE_HOME/UsageEnvironment \
## -L$$LIVE_HOME/groupsock \
## -L$$LIVE_HOME/liveMedia
#
#mac: INCLUDEPATH += $$SDK_HOME/usr/include
#
# assistant.pro - Qt 4.7.3
#
#include(../../../shared/fontpanel/fontpanel.pri)
#TEMPLATE = app
#LANGUAGE = C++
#TARGET = assistant
#contains(QT_CONFIG, webkit):QT += webkit
#CONFIG += qt \
# warn_on \
# help
#QT += network
#PROJECTNAME = Assistant
#DESTDIR = ../../../../bin
#target.path = $$[QT_INSTALL_BINS]
#INSTALLS += target
#DEPENDPATH += ../shared
#
## ## Work around a qmake issue when statically linking to
## ## not-yet-installed plugins
#QMAKE_LIBDIR += $$QT_BUILD_TREE/plugins/sqldrivers
#HEADERS += aboutdialog.h \
# bookmarkdialog.h \
# bookmarkfiltermodel.h \
# bookmarkitem.h \
# bookmarkmanager.h \
# bookmarkmanagerwidget.h \
# bookmarkmodel.h \
# centralwidget.h \
# cmdlineparser.h \
# contentwindow.h \
# findwidget.h \
# filternamedialog.h \
# helpenginewrapper.h \
# helpviewer.h \
# indexwindow.h \
# installdialog.h \
# mainwindow.h \
# preferencesdialog.h \
# qtdocinstaller.h \
# remotecontrol.h \
# searchwidget.h \
# topicchooser.h \
# tracer.h \
# xbelsupport.h \
# ../shared/collectionconfiguration.h
#contains(QT_CONFIG, webkit) {
# HEADERS += helpviewer_qwv.h
#} else {
# HEADERS += helpviewer_qtb.h
# }
#win32:HEADERS += remotecontrol_win.h
#
#SOURCES += aboutdialog.cpp \
# bookmarkdialog.cpp \
# bookmarkfiltermodel.cpp \
# bookmarkitem.cpp \
# bookmarkmanager.cpp \
# bookmarkmanagerwidget.cpp \
# bookmarkmodel.cpp \
# centralwidget.cpp \
# cmdlineparser.cpp \
# contentwindow.cpp \
# findwidget.cpp \
# filternamedialog.cpp \
# helpenginewrapper.cpp \
# helpviewer.cpp \
# indexwindow.cpp \
# installdialog.cpp \
# main.cpp \
# mainwindow.cpp \
# preferencesdialog.cpp \
# qtdocinstaller.cpp \
# remotecontrol.cpp \
# searchwidget.cpp \
# topicchooser.cpp \
# xbelsupport.cpp \
# ../shared/collectionconfiguration.cpp
# contains(QT_CONFIG, webkit) {
# SOURCES += helpviewer_qwv.cpp
#} else {
# SOURCES += helpviewer_qtb.cpp
#}
#
#FORMS += bookmarkdialog.ui \
# bookmarkmanagerwidget.ui \
# bookmarkwidget.ui \
# filternamedialog.ui \
# installdialog.ui \
# preferencesdialog.ui \
# topicchooser.ui
#
#RESOURCES += assistant.qrc \
# assistant_images.qrc
#
#win32 {
# !wince*:LIBS += -lshell32
# RC_FILE = assistant.rc
#}
#
#mac {
# ICON = assistant.icns
# TARGET = Assistant
# QMAKE_INFO_PLIST = Info_mac.plist
#}
#
#contains(CONFIG, static): {
# SQLPLUGINS = $$unique(sql-plugins)
# contains(SQLPLUGINS, sqlite): {
# QTPLUGIN += qsqlite
# DEFINES += USE_STATIC_SQLITE_PLUGIN
# }
#}
@echo off
setlocal
if [%1] == [] (
echo usage: copy_vnr <path-to-Sakura-directory>
goto :EOF
)
xcopy %1\config.pri . /S /Y /I
xcopy %1\cpp\libs\ccutil ccutil /S /Y /I
xcopy %1\cpp\libs\cpputil cpputil /S /Y /I
xcopy %1\cpp\libs\disasm disasm /S /Y /I /EXCLUDE:exclude.txt
xcopy %1\cpp\plugins\ith ith /S /Y /I
xcopy %1\cpp\libs\memdbg memdbg /S /Y /I
xcopy %1\cpp\libs\ntdll ntdll /S /Y /I
xcopy %1\cpp\libs\ntinspect ntinspect /S /Y /I
xcopy %1\cpp\libs\winmaker winmaker /S /Y /I
xcopy %1\cpp\libs\winmutex winmutex /S /Y /I
xcopy %1\cpp\libs\winversion winversion /S /Y /I
xcopy %1\cpp\libs\winseh winseh /S /Y /I
endlocal
#pragma once
#include "winmutex/winmutex.h"
#pragma once
// winmutex.h
// 12/11/2011 jichi
#include <windows.h>
#ifdef _MSC_VER
# pragma warning(disable:4800) // C4800: forcing value to bool
#endif // _MSC_VER
// Mutex lock
// The interface of this class is consistent with the mutex class
template <typename _Mutex>
class win_mutex_lock
{
typedef win_mutex_lock<_Mutex> _Self;
win_mutex_lock(const _Self&);
_Self &operator=(const _Self&);
_Mutex &_M_mutex;
bool _M_locked;
public:
typedef _Mutex mutex_type;
typedef typename _Mutex::native_handle_type native_handle_type;
explicit win_mutex_lock(mutex_type &mutex)
: _M_mutex(mutex), _M_locked(false) { lock(); }
~win_mutex_lock() { if (_M_locked) _M_mutex.unlock(); }
mutex_type &mutex() { return _M_mutex; }
//bool isLock() const { return _M_locked; }
native_handle_type native_handle() { return _M_mutex.native_handle(); }
void unlock() { _M_mutex.unlock(); _M_locked = false; }
void lock() { _M_mutex.lock(); _M_locked = true; }
bool tryLock() { return _M_locked = _M_mutex.tryLock(); }
};
// Mutex
template <typename _Mutex, size_t _Irql = 0>
class win_mutex
{
typedef win_mutex<_Mutex> _Self;
typedef _Mutex __native_type;
enum { __minimal_irql = _Irql };
__native_type _M_mutex;
win_mutex(const _Self&);
_Self &operator=(const _Self&);
private:
win_mutex() {}
typedef __native_type *native_handle_type;
native_handle_type native_handle() { return &_M_mutex; }
static size_t minimal_irql() { return __minimal_irql; }
void unlock() {}
void lock() {}
bool try_lock() {}
};
template <>
class IHFSERVICE win_mutex<CRITICAL_SECTION>
{
typedef win_mutex<CRITICAL_SECTION> _Self;
typedef CRITICAL_SECTION __native_type;
enum { __minimal_irql = 0 };
win_mutex(const _Self&);
_Self &operator=(const _Self&);
__native_type _M_mutex;
public:
typedef __native_type *native_handle_type;
native_handle_type native_handle() { return &_M_mutex; }
static size_t minimal_irql() { return __minimal_irql; }
win_mutex() { ::InitializeCriticalSection(&_M_mutex); }
~win_mutex() { ::DeleteCriticalSection(&_M_mutex); }
void lock() { ::EnterCriticalSection(&_M_mutex); }
void unlock() { ::LeaveCriticalSection(&_M_mutex); }
bool try_lock() { return ::TryEnterCriticalSection(&_M_mutex); }
};
// Conditional variable
template <typename _Cond>
class win_mutex_cond
{
typedef win_mutex_cond<_Cond> _Self;
typedef _Cond __native_type;
win_mutex_cond(const _Self&);
_Self &operator=(const _Self&);
__native_type _M_cond;
public:
enum wait_status { no_timeout = 0, timeout };
typedef __native_type *native_handle_type;
win_mutex_cond() {}
native_handle_type native_handle() { return &_M_cond; }
void notify_one() {}
void notify_all() {}
template <typename _Mutex>
void wait(_Mutex &mutex) {}
template <typename _Mutex, typename _Pred>
void wait(_Mutex &mutex, _Pred pred) {}
template <typename _Mutex>
wait_status wait_for(_Mutex &mutex, int msecs) {}
template <typename _Mutex, typename _Pred>
wait_status wait_for(_Mutex &mutex, int msecs, _Pred pred) {}
};
// Note: Conditional variables are NOT availabe on Windows XP/2003
// See: http://en.cppreference.com/w/cpp/thread/condition_variable
// See: http://msdn.microsoft.com/en-us/library/windows/desktop/ms686903%28v=vs.85%29.aspx
template <>
class win_mutex_cond<CONDITION_VARIABLE>
{
typedef win_mutex_cond<CONDITION_VARIABLE> _Self;
typedef CONDITION_VARIABLE __native_type;
win_mutex_cond(const _Self&);
_Self &operator=(const _Self&);
__native_type _M_cond;
public:
enum wait_status { no_timeout = 0, timeout };
typedef __native_type *native_handle_type;
native_handle_type native_handle() { return &_M_cond; }
win_mutex_cond() { ::InitializeConditionVariable(&_M_cond); }
void notify_one() { ::WakeConditionVariable(&_M_cond); }
void notify_all() { ::WakeAllConditionVariable(&_M_cond); }
template <typename _Mutex>
void wait(_Mutex &mutex)
{ ::SleepConditionVariableCS(&_M_cond, mutex.native_handle(), INFINITE); }
template <typename _Mutex, typename _Pred>
void wait(_Mutex &mutex, _Pred pred)
{ while (!pred()) wait(mutex); }
template <typename _Mutex>
wait_status wait_for(_Mutex &mutex, int msecs)
{ return ::SleepConditionVariableCS(&_M_cond, mutex.native_handle(), msecs) ? no_timeout : timeout; }
template <typename _Mutex, typename _Pred>
wait_status wait_for(_Mutex &mutex, int msecs, _Pred pred)
{
auto start = ::GetTickCount();
while (!pred()) {
auto now = ::GetTickCount();
msecs -= now - start;
if (msecs <= 0)
return timeout;
start = now;
wait_for(mutex, msecs);
}
return no_timeout;
}
};
// EOF
# winmutex.pri
# 3/8/2013 jichi
DEFINES += WITH_LIB_WINMUTEX
DEPENDPATH += $$PWD
#LIBS += -lkernel32 -luser32
HEADERS += \
$$PWD/winmutex \
$$PWD/winmutex.h
# EOF
# Makefile
# 12/13/2013 jichi
# This file is for Windows only.
# Compile SAFESEH table from the ASM file.
# See: http://stackoverflow.com/questions/19722308/exception-handler-not-called-in-c
# See: ::http://stackoverflow.com/questions/12019689/custom-seh-handler-with-safeseh
# See: http://msdn.microsoft.com/en-us/library/16aexws6.aspx
BUILDDIR = ../../../build
OBJ = $(BUILDDIR)/safeseh.obj
ML = ml
CFLAGS =
.PHONY: all compile clean
all: compile
compile: $(OBJ)
$(OBJ): safeseh.asm
$(ML) $(CFLAGS) -Fo $@ -c -safeseh $^
clean:
# EOF
; safeseh.asm
; 12/13/2013 jichi
; see: http://stackoverflow.com/questions/12019689/custom-seh-handler-with-safeseh
; see: http://code.metager.de/source/xref/WebKit/Source/WebCore/platform/win/makesafeseh.asm
; see: http://jpassing.com/2008/05/20/fun-with-low-level-seh/
.386
.model flat, stdcall
option casemap :none
; The symbol name can be found out using: dumpbin /symbols winseh.obj
extern _seh_handler:near ; defined in winseh.cc
_seh_asm_handler proto
.safeseh _seh_asm_handler
.code
_seh_asm_handler proc
jmp _seh_handler
_seh_asm_handler endp
end
// winseh.cc
// 12/13/2013 jichi
#include "winseh/winseh.h"
#include "ntdll/ntdll.h"
//#include <cstdio>
// - Global variables -
seh_dword_t seh_esp[seh_capacity],
seh_eip[seh_capacity],
seh_eh[seh_capacity];
seh_dword_t seh_count;
// - Exception handlers -
// VC 2013: http://msdn.microsoft.com/en-us/library/b6sf5kbd.aspx
// typedef EXCEPTION_DISPOSITION (*PEXCEPTION_ROUTINE) (
// _In_ PEXCEPTION_RECORD ExceptionRecord,
// _In_ ULONG64 EstablisherFrame,
// _Inout_ PCONTEXT ContextRecord,
// _Inout_ PDISPATCHER_CONTEXT DispatcherContext
// );
//
// winnt.h: http://www.codemachine.com/downloads/win81/ntdef.h
// typedef
// __drv_sameIRQL
// __drv_functionClass(EXCEPTION_ROUTINE)
// EXCEPTION_DISPOSITION
// NTAPI
// EXCEPTION_ROUTINE (
// _Inout_ struct _EXCEPTION_RECORD *ExceptionRecord,
// _In_ PVOID EstablisherFrame,
// _In_ struct _CONTEXT *ContextRecord,
// _In_ PVOID DispatcherContext
// );
extern "C" EXCEPTION_DISPOSITION _seh_handler( // extern C is needed to avoid name hashing in C++
_In_ PEXCEPTION_RECORD ExceptionRecord,
_In_ PVOID EstablisherFrame, // does not work if I use ULONG64
_Inout_ PCONTEXT ContextRecord,
_In_ PVOID DispatcherContext) // PDISPATCHER_CONTEXT is not declared in windows.h
{
//assert(::seh_count > 0);
ContextRecord->Esp = ::seh_esp[::seh_count - 1];
ContextRecord->Eip = ::seh_eip[::seh_count - 1];
//printf("seh_handler:%i,%x,%x\n", ::seh_count, ContextRecord->Esp, ContextRecord->Eip);
return ::seh_eh[::seh_count - 1] ?
reinterpret_cast<PEXCEPTION_ROUTINE>(::seh_eh[::seh_count - 1])(ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext) :
ExceptionContinueExecution;
}
// EOF
#pragma once
// winseh.h
// 12/13/2013 jichi
// See: http://code.metager.de/source/xref/WebKit/Source/WebCore/platform/win/makesafeseh.asm
// See: http://jpassing.com/2008/05/20/fun-with-low-level-seh/
#ifdef _MSC_VER
# pragma warning (disable:4733) // C4733: Inline asm assigning to 'FS:0' : handler not registered as safe handler
#endif // _MSC_VER
#define SEH_RAISE (*(int*)0 = 0) // raise C000005, for debugging only
// Maximum number of nested SEH
// Default nested function count is 100, see: http://stackoverflow.com/questions/8656089/solution-for-fatal-error-maximum-function-nesting-level-of-100-reached-abor
#ifndef SEH_CAPACITY
# define SEH_CAPACITY 100
#endif // SEH_CAPACITY
enum { seh_capacity = SEH_CAPACITY };
typedef unsigned long seh_dword_t; // DWORD in <windows.h>
// 12/13/2013 jichi
// The list implementation is not thread-safe
extern seh_dword_t seh_esp[seh_capacity], // LPVOID, current stack
seh_eip[seh_capacity], // LPVOID, current IP address
seh_eh[seh_capacity]; // EXCEPTION_ROUTINE, current exception handler function address
extern seh_dword_t seh_count; // current number of exception handlers
extern seh_dword_t seh_handler; //extern PEXCEPTION_ROUTINE seh_handler;
/**
* Push SEH handler
* @param _label exception recover label which should be the same as seh_pop_
* @param _eh EXCEPTION_ROUTINE or 0
* @param _r1 scalar register name, such as eax
* @param _r2 counter register name, such as ecx
*
* Note: __asm prefix is needed to allow inlining macro
* I didn't pushad and popad which seems to be not needed
*
* For SEH, see:
* http://www.codeproject.com/Articles/82701/Win32-Exceptions-OS-Level-Point-of-View
* http://sploitfun.blogspot.com/2012/08/seh-exploit-part1.html
* http://sploitfun.blogspot.com/2012/08/seh-exploit-part2.html
*
* fs:0x0 on Windows is the pointer to ExceptionList
* http://stackoverflow.com/questions/4657661/what-lies-at-fs0x0-on-windows
*
* EPB and ESP
* http://stackoverflow.com/questions/1395591/what-is-exactly-the-base-pointer-and-stack-pointer-to-what-do-they-point
*/
#define seh_push_(_label, _eh, _r1, _r2) \
{ \
__asm mov _r1, _eh /* move new handler address */ \
__asm mov _r2, seh_count /* get current seh counter */ \
__asm mov dword ptr seh_eh[_r2*4], _r1 /* set recover exception hander */ \
__asm mov _r1, _label /* move jump label address */ \
__asm mov dword ptr seh_eip[_r2*4], _r1 /* set recover eip as the jump label */ \
__asm push seh_handler /* push new safe seh handler */ \
__asm push fs:[0] /* push old fs:0 */ \
__asm mov dword ptr seh_esp[_r2*4], esp /* safe current stack address */ \
__asm mov fs:[0], esp /* change fs:0 to the current stack */ \
__asm inc seh_count /* increase number of seh */ \
}
//TODO: get sizeof dword instead of hardcode 4
/**
* Restore old SEH handler
* @param _label exception recover label which should be the same as seh_push_
*/
#define seh_pop_(_label) \
{ \
__asm _label: /* the exception recover label */ \
__asm pop dword ptr fs:[0] /* restore old fs:0 */ \
__asm add esp, 4 /* pop seh_handler */ \
__asm dec seh_count /* decrease number of seh */ \
}
#define seh_pop() seh_pop_(seh_exit)
#define seh_push() seh_push_(seh_exit, 0, eax, ecx) // use ecx as counter better than ebx
/**
* @param _eh EXCEPTION_ROUTINE or 0
*/
#define seh_push_eh(_eh) seh_push_(seh_exit, _eh, eax, ecx)
/**
* Wrap the code block with SEH handler
* @param* any code block. The colon for the last expression is optional.
*/
#define seh_with(...) \
{ \
seh_push() \
__VA_ARGS__ \
; \
seh_pop() \
}
/**
* Wrap the code block with SEH handler
* @param _eh EXCEPTION_ROUTINE or 0
* @param* any code block. The colon for the last expression is optional.
*/
#define seh_with_eh(_eh, ...) \
{ \
seh_push_eh(_eh) \
__VA_ARGS__ \
; \
seh_pop() \
}
// EOF
//#define seh_push_front() \
// { \
// __asm mov eax, seh_exit \
// __asm mov seh_eip, eax \
// __asm push seh_handler \
// __asm push fs:[0] \
// __asm mov seh_esp, esp \
// __asm mov fs:[0], esp \
// }
//
//#define seh_pop_front() \
// { \
// __asm seh_exit: \
// __asm mov eax, [esp] \
// __asm mov fs:[0], eax \
// __asm add esp, 8 \
// }
//
//#define seh_push_back() \
// { \
// __asm mov eax, seh_exit \
// __asm mov ecx, seh_capacity - 1 \
// __asm mov DWORD PTR seh_eip[ecx*4], eax \
// __asm push seh_handler \
// __asm push fs:[0] \
// __asm mov DWORD PTR seh_esp[ecx*4], esp \
// __asm mov fs:[0], esp \
// }
//
//#define seh_pop_back() \
// { \
// __asm seh_exit: \
// __asm mov eax, [esp] \
// __asm mov fs:[0], eax \
// __asm add esp, 8 \
// }
// winseh_safe.cc
// 12/13/2013 jichi
// See: http://stackoverflow.com/questions/12019689/custom-seh-handler-with-safeseh
#include "winseh/winseh.h"
extern "C" int __stdcall _seh_asm_handler();
seh_dword_t seh_handler = reinterpret_cast<seh_dword_t>(_seh_asm_handler);
// EOF
# winseh_safe.pri
# 12/13/2013 jichi
#
# Need link with with SEH assembly
# See: http://stackoverflow.com/questions/12019689/custom-seh-handler-with-safeseh
# See: http://stackoverflow.com/questions/19722308/exception-handler-not-called-in-c
win32 {
#include(../../../config.pri)
# Disable buffer security check: http://msdn.microsoft.com/en-us/library/8dbf701c.aspx
#QMAKE_CXXFLAGS += /GS-
LIBS += safeseh.obj # compiled from safeseh.asm using ml -safeseh
DEFINES += WITH_LIB_WINSEH
DEPENDPATH += $$PWD
HEADERS += $$PWD/winseh.h
SOURCES += \
$$PWD/winseh.cc \
$$PWD/winseh_safe.cc
OTHER_FILES += \
$$PWD/safeseh.asm \
$$PWD/Makefile
}
# EOF
// winseh_unsafe.cc
// 12/13/2013 jichi
// See: http://stackoverflow.com/questions/19722308/exception-handler-not-called-in-c
#include "winseh/winseh.h"
#include <windows.h>
extern "C" EXCEPTION_DISPOSITION _seh_handler(PEXCEPTION_RECORD, PVOID, PCONTEXT, PVOID);
seh_dword_t seh_handler = reinterpret_cast<seh_dword_t>(_seh_handler);
// EOF