diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..2e2607aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,149 @@ +### Windows + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Shortcuts +*.lnk + +### OSX + +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### Visual Studio + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +build + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +### IDA +*.id0 +*.id1 +*.id2 +*.nam +*.til + +### Custom user files +# User scripts +user*.bat + +.vscode/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..91b9ad64 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,5 @@ +[submodule "deps/unicorn"] + path = deps/unicorn + url = https://github.com/unicorn-engine/unicorn.git + shallow = true + branch = dev diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..6ba19fff --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,48 @@ +cmake_minimum_required(VERSION 3.26.4) + +########################################## + +option(MOMO_ENABLE_SANITIZER "Enable sanitizer" OFF) + +########################################## + +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0) +set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64") + +########################################## + +project(bird LANGUAGES C CXX) + +########################################## + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +########################################## + +include(cmake/utils.cmake) +include(cmake/compiler-env.cmake) + +########################################## + +momo_set_new_artifact_directory() + +########################################## + +momo_add_subdirectory_and_get_targets("deps" EXTERNAL_TARGETS) +momo_add_subdirectory_and_get_targets("src" OWN_TARGETS) + +########################################## + +momo_targets_set_folder("External Dependencies" ${EXTERNAL_TARGETS}) + +momo_targets_exclude_from_all(${EXTERNAL_TARGETS}) +momo_targets_disable_warnings(${EXTERNAL_TARGETS}) + +momo_targets_expose_includes(${OWN_TARGETS}) +momo_targets_set_warnings_as_errors(${OWN_TARGETS}) diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 00000000..d7a107f3 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,83 @@ +{ + "version": 6, + "cmakeMinimumRequired": { + "major": 3, + "minor": 26, + "patch": 4 + }, + "configurePresets": [ + { + "name": "build", + "hidden": true, + "binaryDir": "${sourceDir}/build/${presetName}" + }, + { + "name": "ninja", + "hidden": true, + "generator": "Ninja" + }, + { + "name": "release", + "inherits": [ + "ninja", + "build" + ], + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release" + } + }, + { + "name": "debug", + "inherits": [ + "ninja", + "build" + ], + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug" + } + }, + { + "name": "vs2022", + "generator": "Visual Studio 17 2022", + "inherits": "build" + } + ], + "buildPresets": [ + { + "name": "release", + "configurePreset": "release" + }, + { + "name": "debug", + "configurePreset": "debug" + } + ], + "workflowPresets": [ + { + "name": "release", + "steps": [ + { + "type": "configure", + "name": "release" + }, + { + "type": "build", + "name": "release" + } + ] + }, + { + "name": "debug", + "steps": [ + { + "type": "configure", + "name": "debug" + }, + { + "type": "build", + "name": "debug" + } + ] + } + ] +} \ No newline at end of file diff --git a/cmake/compiler-env.cmake b/cmake/compiler-env.cmake new file mode 100644 index 00000000..2dd73a23 --- /dev/null +++ b/cmake/compiler-env.cmake @@ -0,0 +1,147 @@ +include_guard() + +########################################## +# System identification + +set(OSX OFF) +set(LINUX OFF) +set(WIN OFF) + +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + set(LINUX ON) +elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin") + set(OSX ON) +elseif(CMAKE_SYSTEM_NAME MATCHES "Windows") + set(WIN ON) +endif() + +########################################## + +cmake_policy(SET CMP0069 NEW) +set(CMAKE_POLICY_DEFAULT_CMP0069 NEW) + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +#set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + +########################################## + +if(UNIX) + momo_add_c_and_cxx_compile_options(-fvisibility=hidden) +endif() + +########################################## + +if(LINUX) + add_link_options( + -Wl,--no-undefined + -Wl,--gc-sections + -Wl,-z,now + -Wl,-z,noexecstack + -static-libstdc++ + ) + + momo_add_c_and_cxx_compile_options( + -ffunction-sections + -fdata-sections + -fstack-protector-strong + -fdiagnostics-color=always + ) + + add_compile_definitions( + _REENTRANT + _THREAD_SAFE + ) + + if(NOT MOMO_ENABLE_SANITIZER) + add_compile_definitions( + _FORTIFY_SOURCE=2 + ) + endif() + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") +endif() + +########################################## + +if(MSVC) + string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + string(REPLACE "/EHs" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + + momo_add_c_and_cxx_compile_options( + /sdl + /GS + /Gy + /EHa + /guard:cf + ) + + momo_add_compile_options(CXX + /Zc:__cplusplus + ) + + add_link_options( + /INCREMENTAL:NO + ) + + momo_add_c_and_cxx_release_compile_options( + /Ob2 + #/GL + ) + + momo_add_release_link_options( + #/LTCG + ) +endif() + +########################################## + +if(MOMO_ENABLE_SANITIZER) +momo_add_c_and_cxx_compile_options( + -fsanitize=address +) +endif() + +########################################## + +if(MOMO_ENABLE_SANITIZER) + # ASAN on Windows needs /MD + # https://developercommunity.visualstudio.com/t/c-address-sanitizer-statically-linked-dlls-do-not/1403680 + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$:Debug>DLL) +else() + set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded$<$:Debug>) +endif() + +########################################## + +if(MSVC) + add_link_options( + $<$>:/NODEFAULTLIB:libcmt.lib> + $<$>:/NODEFAULTLIB:msvcrt.lib> + $<$>:/NODEFAULTLIB:libcmtd.lib> + $<$>:/NODEFAULTLIB:msvcrtd.lib> + ) +endif() + +########################################## + +set(OPT_DEBUG "-O0 -g") +set(OPT_RELEASE "-O3 -g") + +if(MSVC) + set(OPT_DEBUG "/Od /Ob0 /Zi") + set(OPT_RELEASE "/O2 /Ob2 /Zi") + + add_link_options(/DEBUG) +endif() + +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${OPT_DEBUG}") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${OPT_DEBUG}") + +set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${OPT_RELEASE}") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${OPT_RELEASE}") + +########################################## + +if(CMAKE_GENERATOR MATCHES "Visual Studio") + momo_add_c_and_cxx_compile_options(/MP) +endif() diff --git a/cmake/utils.cmake b/cmake/utils.cmake new file mode 100644 index 00000000..3d026088 --- /dev/null +++ b/cmake/utils.cmake @@ -0,0 +1,344 @@ +include_guard() + +########################################## + +function(momo_silence_deprecation_warnings) + set(CMAKE_WARN_DEPRECATED_OLD ${CMAKE_WARN_DEPRECATED} PARENT_SCOPE) + set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "" FORCE) +endfunction() + +########################################## + +function(momo_restore_deprecation_warnings) + set(CMAKE_WARN_DEPRECATED ${CMAKE_WARN_DEPRECATED_OLD} CACHE BOOL "" FORCE) +endfunction() + +########################################## + +function(momo_target_exclude_from_all target) + set_target_properties(${target} PROPERTIES EXCLUDE_FROM_ALL 1) + #set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1) +endfunction() + +########################################## + +function(momo_targets_exclude_from_all) + foreach(target ${ARGV}) + momo_target_exclude_from_all(${target}) + endforeach() +endfunction() + +########################################## + +function(momo_target_set_folder folder target) + #get_target_property(CURRENT_FOLDER ${target} FOLDER) + #if(NOT CURRENT_FOLDER) + set_target_properties(${target} PROPERTIES FOLDER "${folder}") + #endif() +endfunction() + +########################################## + +function(momo_targets_set_folder folder) + foreach(target ${ARGN}) + momo_target_set_folder(${folder} ${target}) + endforeach() +endfunction() + +########################################## + +function(momo_target_disable_compile_commands target) + set_target_properties(${target} PROPERTIES EXPORT_COMPILE_COMMANDS OFF) +endfunction() + +########################################## + +function(momo_targets_disable_compile_commands) + foreach(target ${ARGV}) + momo_target_disable_compile_commands(${target}) + endforeach() +endfunction() + +########################################## + +function(momo_target_expose_includes target) + get_target_property(target_type ${target} TYPE) + if("${target_type}" STREQUAL "UTILITY") + return() + endif() + + get_target_property(TARGET_SOURCE_DIR ${target} SOURCE_DIR) + target_include_directories(${target} INTERFACE ${TARGET_SOURCE_DIR}/..) +endfunction() + +########################################## + +function(momo_targets_expose_includes) + foreach(target ${ARGV}) + momo_target_expose_includes(${target}) + endforeach() +endfunction() + +########################################## + +function(momo_target_compile_options language target mode) + foreach(compile_option ${ARGN}) + target_compile_options(${target} ${mode} + $<$:${compile_option}> + ) + endforeach() +endfunction() + +########################################## + +function(momo_target_c_and_cxx_compile_options) + momo_target_compile_options(C ${ARGV}) + momo_target_compile_options(CXX ${ARGV}) +endfunction() + +########################################## + +macro(momo_target_remove_compile_option target option) + get_target_property(target_flags ${target} COMPILE_OPTIONS) + if(target_flags) + list(REMOVE_ITEM target_flags ${option}) + set_target_properties(${target} PROPERTIES COMPILE_OPTIONS "${target_flags}") + endif() + + get_target_property(target_interface_flags ${target} INTERFACE_COMPILE_OPTIONS) + if(target_interface_flags) + list(REMOVE_ITEM target_interface_flags ${option}) + set_target_properties(${target} PROPERTIES INTERFACE_COMPILE_OPTIONS "${target_interface_flags}") + endif() +endmacro() + +########################################## + +macro(momo_target_remove_compile_options target) + foreach(option ${ARGV}) + momo_target_remove_compile_option(${target} ${option}) + endforeach() +endmacro() + +########################################## + +function(momo_add_compile_options language) + foreach(option ${ARGN}) + add_compile_options( + $<$:${option}> + ) + endforeach() +endfunction() + +########################################## + +function(momo_add_release_compile_options language) + foreach(option ${ARGN}) + add_compile_options( + $<$:$<$:${option}>> + $<$:$<$:${option}>> + ) + endforeach() +endfunction() + +########################################## + +function(momo_add_release_link_options) + foreach(option ${ARGN}) + add_link_options( + $<$:${option}> + $<$:${option}> + ) + endforeach() +endfunction() + +########################################## + +function(momo_add_c_and_cxx_compile_options) + momo_add_compile_options(C ${ARGV}) + momo_add_compile_options(CXX ${ARGV}) +endfunction() + +########################################## + +function(momo_add_c_and_cxx_release_compile_options) + momo_add_release_compile_options(C ${ARGV}) + momo_add_release_compile_options(CXX ${ARGV}) +endfunction() + +########################################## + +function(momo_target_disable_warnings target) + get_target_property(target_type ${target} TYPE) + if(("${target_type}" STREQUAL "INTERFACE_LIBRARY") OR ("${target_type}" STREQUAL "UTILITY")) + return() + endif() + + momo_target_remove_compile_options(${target} /W3 -W3 /W4 -W4) + + if(MSVC) + set(compile_options + /W0 + /D_CRT_SECURE_NO_WARNINGS=1 + ) + endif() + + momo_target_c_and_cxx_compile_options(${target} PRIVATE ${compile_options}) + + set_target_properties(${target} PROPERTIES MOMO_WARNINGS_DISABLE ON) +endfunction() + +########################################## + +function(momo_targets_disable_warnings) + foreach(target ${ARGV}) + momo_target_disable_warnings(${target}) + endforeach() +endfunction() + +########################################## + +function(momo_target_set_warnings_as_errors target) + get_target_property(target_type ${target} TYPE) + if(("${target_type}" STREQUAL "INTERFACE_LIBRARY") OR ("${target_type}" STREQUAL "UTILITY")) + return() + endif() + + get_target_property(warnings_disabled ${target} MOMO_WARNINGS_DISABLE) + if(warnings_disabled) + return() + endif() + + set(compile_options) + + if(MSVC) + set(compile_options /W4 /WX) + endif() + + target_compile_options(${target} PRIVATE + $<$:$<$:${compile_options}>> + $<$:$<$:${compile_options}>> + $<$:$<$:${compile_options}>> + $<$:$<$:${compile_options}>> + ) +endfunction() + +########################################## + +function(momo_targets_set_warnings_as_errors) + foreach(target ${ARGV}) + momo_target_set_warnings_as_errors(${target}) + endforeach() +endfunction() + +########################################## + +function(momo_get_all_targets var) + set(targets) + momo_get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR}) + set(${var} ${targets} PARENT_SCOPE) +endfunction() + +########################################## + +macro(momo_get_all_targets_recursive targets dir) + get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES) + foreach(subdir ${subdirectories}) + momo_get_all_targets_recursive(${targets} ${subdir}) + endforeach() + + get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS) + list(APPEND ${targets} ${current_targets}) +endmacro() + +########################################## + +macro(momo_list_difference list_a list_to_remove result) + set(${result} ${list_a}) + list(REMOVE_ITEM ${result} ${list_to_remove}) +endmacro() + +########################################## + +macro(momo_set_artifact_directory directory) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${directory}) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${directory}) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${directory}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${directory}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${directory}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${directory}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${directory}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${directory}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${directory}) +endmacro() + +########################################## + +macro(momo_set_new_artifact_directory) + get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(IS_MULTI_CONFIG) + set(ARTIFACT_FOLDER_NAME "artifacts-$>") + else() + set(ARTIFACT_FOLDER_NAME "artifacts") + endif() + + set(ARTIFACT_DIRECTORY "${CMAKE_BINARY_DIR}/${ARTIFACT_FOLDER_NAME}") + momo_set_artifact_directory(${ARTIFACT_DIRECTORY}) +endmacro() + +########################################## + +macro(momo_add_subdirectory_and_get_targets directory targets) + momo_get_all_targets(EXISTING_TARGETS) + add_subdirectory(${directory}) + momo_get_all_targets(ALL_TARGETS) + + momo_list_difference("${ALL_TARGETS}" "${EXISTING_TARGETS}" ${targets}) +endmacro() + +########################################## + +macro(momo_target_include_libraries target mode) + foreach(inc_target ${ARGN}) + target_include_directories(${target} ${mode} + $ + $ + ) + endforeach() +endmacro() + +########################################## + +function(momo_strip_target target) + if (CMAKE_BUILD_TYPE STREQUAL "Debug") + return() + endif() + + if(NOT MSVC) + if(NOT DEFINED STRIP_COMMAND) + set(STRIP_COMMAND strip) + endif() + + if(NOT DEFINED STRIP_FLAGS) + set(STRIP_FLAGS -g -s) + if(OSX) + set(STRIP_FLAGS -x) + endif() + endif() + + set(IN_FILE "$") + set(OUT_FILE "$/$$-unstripped$") + + add_custom_command(TARGET ${target} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${IN_FILE} ${OUT_FILE} + COMMAND "${STRIP_COMMAND}" ${STRIP_FLAGS} "${IN_FILE}" + COMMENT "Strippping ${target}" + ) + endif() +endfunction() + +########################################## + +macro(momo_assign_source_group) + source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${ARGN}) +endmacro() diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt new file mode 100644 index 00000000..df0677b9 --- /dev/null +++ b/deps/CMakeLists.txt @@ -0,0 +1,5 @@ +set(UNICORN_ARCH "x86" CACHE STRING "") + +add_subdirectory(unicorn) + +########################################## diff --git a/deps/unicorn b/deps/unicorn new file mode 160000 index 00000000..87610baa --- /dev/null +++ b/deps/unicorn @@ -0,0 +1 @@ +Subproject commit 87610baa3f0d028552bd80f2269adef349a67f50 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 00000000..a1e13d1e --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(emulator) \ No newline at end of file diff --git a/src/emulator/CMakeLists.txt b/src/emulator/CMakeLists.txt new file mode 100644 index 00000000..17d102f9 --- /dev/null +++ b/src/emulator/CMakeLists.txt @@ -0,0 +1,21 @@ +file(GLOB_RECURSE SRC_FILES CONFIGURE_DEPENDS + *.cpp + *.hpp + *.rc +) + +list(SORT SRC_FILES) + +add_executable(client ${SRC_FILES}) + +momo_assign_source_group(${SRC_FILES}) + +target_precompile_headers(client PRIVATE std_include.hpp) + +target_link_libraries(client PRIVATE unicorn) + +set_target_properties(client PROPERTIES OUTPUT_NAME "bird") + +set_property(GLOBAL PROPERTY VS_STARTUP_PROJECT client) + +momo_strip_target(client) diff --git a/src/emulator/main.cpp b/src/emulator/main.cpp new file mode 100644 index 00000000..b6842261 --- /dev/null +++ b/src/emulator/main.cpp @@ -0,0 +1,84 @@ +#include "std_include.hpp" + +// code to be emulated +#define X86_CODE32 "\x41\x4a" // INC ecx; DEC edx + +// memory address where emulation starts +#define ADDRESS 0x1000000 + + +namespace +{ + void run() + { + uc_engine* uc; + uc_err err; + int r_ecx = 0x1234; // ECX register + int r_edx = 0x7890; // EDX register + + printf("Emulate i386 code\n"); + + // Initialize emulator in X86-32bit mode + err = uc_open(UC_ARCH_X86, UC_MODE_32, &uc); + if (err != UC_ERR_OK) { + printf("Failed on uc_open() with error returned: %u\n", err); + return ; + } + + // map 2MB memory for this emulation + uc_mem_map(uc, ADDRESS, 0x1000, UC_PROT_ALL); + + // write machine code to be emulated to memory + if (uc_mem_write(uc, ADDRESS, X86_CODE32, sizeof(X86_CODE32) - 1)) { + printf("Failed to write emulation code to memory, quit!\n"); + return; + } + + // initialize machine registers + uc_reg_write(uc, UC_X86_REG_ECX, &r_ecx); + uc_reg_write(uc, UC_X86_REG_EDX, &r_edx); + + // emulate code in infinite time & unlimited instructions + err = uc_emu_start(uc, ADDRESS, ADDRESS + sizeof(X86_CODE32) - 1, 0, 0); + if (err) { + printf("Failed on uc_emu_start() with error returned %u: %s\n", + err, uc_strerror(err)); + } + + // now print out some registers + printf("Emulation done. Below is the CPU context\n"); + + uc_reg_read(uc, UC_X86_REG_ECX, &r_ecx); + uc_reg_read(uc, UC_X86_REG_EDX, &r_edx); + printf(">>> ECX = 0x%x\n", r_ecx); + printf(">>> EDX = 0x%x\n", r_edx); + + uc_close(uc); + } +} + +int main(int /*argc*/, char** /*argv*/) +{ + try + { + run(); + return 0; + } + catch (std::exception& e) + { + puts(e.what()); + +#ifdef _WIN32 + MessageBoxA(nullptr, e.what(), "ERROR", MB_ICONERROR); +#endif + } + + return 1; +} + +#ifdef _WIN32 +int WINAPI WinMain(HINSTANCE, HINSTANCE, PSTR, int) +{ + return main(__argc, __argv); +} +#endif diff --git a/src/emulator/resource.rc b/src/emulator/resource.rc new file mode 100644 index 00000000..03e5cf69 --- /dev/null +++ b/src/emulator/resource.rc @@ -0,0 +1,101 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "windows.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "#include ""windows.h""\r\n" + "\0" +END + +2 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,0 + PRODUCTVERSION 1,0,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE VFT_DLL + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "momo5502" + VALUE "FileDescription", "Bird" + VALUE "FileVersion", "1.0.0.0" + VALUE "InternalName", "Bird" + VALUE "LegalCopyright", "All rights reserved." + VALUE "OriginalFilename", "bird.exe" + VALUE "ProductName", "bird" + VALUE "ProductVersion", "1.0.0.0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +///////////////////////////////////////////////////////////////////////////// +// +// Binary Data +// + +GLFW_ICON ICON "resources/icon.ico" + + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/emulator/resources/icon.ico b/src/emulator/resources/icon.ico new file mode 100644 index 00000000..2df456da Binary files /dev/null and b/src/emulator/resources/icon.ico differ diff --git a/src/emulator/std_include.hpp b/src/emulator/std_include.hpp new file mode 100644 index 00000000..de75f06a --- /dev/null +++ b/src/emulator/std_include.hpp @@ -0,0 +1,76 @@ +#pragma once + +#ifdef _WIN32 +#pragma warning(push) +#pragma warning(disable: 4127) +#pragma warning(disable: 4244) +#pragma warning(disable: 4245) +#pragma warning(disable: 4458) +#pragma warning(disable: 4505) +#pragma warning(disable: 4702) +#pragma warning(disable: 4996) +#pragma warning(disable: 5054) +#pragma warning(disable: 6011) +#pragma warning(disable: 6297) +#pragma warning(disable: 6385) +#pragma warning(disable: 6386) +#pragma warning(disable: 6387) +#pragma warning(disable: 26110) +#pragma warning(disable: 26451) +#pragma warning(disable: 26444) +#pragma warning(disable: 26451) +#pragma warning(disable: 26489) +#pragma warning(disable: 26495) +#pragma warning(disable: 26498) +#pragma warning(disable: 26812) +#pragma warning(disable: 28020) + +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include +#include +#include + +// min and max is required by gdi, therefore NOMINMAX won't work +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +#ifdef _WIN32 +#pragma warning(pop) +#endif + +using namespace std::literals;