mirror of
https://github.com/tiennm99/time-mocker-cpp.git
synced 2026-06-08 22:15:46 +00:00
feat: 2nd version
This commit is contained in:
+27
-35
@@ -1,21 +1,18 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(TimeMocker CXX)
|
||||
|
||||
# ── vcpkg toolchain (set via: cmake -DCMAKE_TOOLCHAIN_FILE=<vcpkg>/scripts/buildsystems/vcpkg.cmake)
|
||||
find_package(detours CONFIG REQUIRED)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# Require Windows
|
||||
if (NOT WIN32)
|
||||
message(FATAL_ERROR "TimeMocker is Windows-only (uses Win32 API and MS Detours).")
|
||||
if(NOT WIN32)
|
||||
message(FATAL_ERROR "Windows only.")
|
||||
endif()
|
||||
|
||||
add_compile_definitions(WIN32_LEAN_AND_MEAN UNICODE _UNICODE)
|
||||
add_compile_definitions(WIN32_LEAN_AND_MEAN NOMINMAX UNICODE _UNICODE)
|
||||
|
||||
# ── Shared headers ────────────────────────────────────────────────────────────
|
||||
set(SHARED_DIR ${CMAKE_SOURCE_DIR}/Shared)
|
||||
set(IMGUI_DIR "${CMAKE_SOURCE_DIR}/TimeMocker.UI/imgui")
|
||||
|
||||
# ── TimeMocker.Hook (DLL) ─────────────────────────────────────────────────────
|
||||
add_library(TimeMocker.Hook SHARED
|
||||
@@ -23,41 +20,36 @@ add_library(TimeMocker.Hook SHARED
|
||||
TimeMocker.Hook/exports.cpp
|
||||
TimeMocker.Hook/TimeMocker.Hook.def
|
||||
)
|
||||
target_include_directories(TimeMocker.Hook PRIVATE ${SHARED_DIR})
|
||||
target_include_directories(TimeMocker.Hook PRIVATE Shared)
|
||||
target_link_libraries(TimeMocker.Hook PRIVATE detours::detours)
|
||||
set_target_properties(TimeMocker.Hook PROPERTIES
|
||||
OUTPUT_NAME "TimeMocker.Hook"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
|
||||
)
|
||||
set_target_properties(TimeMocker.Hook PROPERTIES OUTPUT_NAME "TimeMocker.Hook"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||
|
||||
# ── TimeMocker.Injector (static lib) ─────────────────────────────────────────
|
||||
add_library(TimeMocker.Injector STATIC
|
||||
# ── ImGui static lib ──────────────────────────────────────────────────────────
|
||||
add_library(imgui STATIC
|
||||
${IMGUI_DIR}/imgui.cpp
|
||||
${IMGUI_DIR}/imgui_draw.cpp
|
||||
${IMGUI_DIR}/imgui_tables.cpp
|
||||
${IMGUI_DIR}/imgui_widgets.cpp
|
||||
${IMGUI_DIR}/imgui_impl_win32.cpp
|
||||
${IMGUI_DIR}/imgui_impl_dx11.cpp
|
||||
)
|
||||
target_include_directories(imgui PUBLIC ${IMGUI_DIR})
|
||||
|
||||
# ── TimeMocker.UI (GUI exe) ───────────────────────────────────────────────────
|
||||
add_executable(TimeMocker.UI WIN32
|
||||
TimeMocker.UI/main.cpp
|
||||
TimeMocker.Injector/InjectionManager.cpp
|
||||
)
|
||||
target_include_directories(TimeMocker.Injector
|
||||
PUBLIC ${CMAKE_SOURCE_DIR}/TimeMocker.Injector
|
||||
PRIVATE ${SHARED_DIR}
|
||||
)
|
||||
target_link_libraries(TimeMocker.Injector PUBLIC detours::detours Psapi)
|
||||
target_include_directories(TimeMocker.UI PRIVATE Shared TimeMocker.Injector ${IMGUI_DIR})
|
||||
target_link_libraries(TimeMocker.UI PRIVATE imgui detours::detours d3d11 dxgi Psapi)
|
||||
set_target_properties(TimeMocker.UI PROPERTIES OUTPUT_NAME "TimeMocker"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||
|
||||
# ── TimeMocker.UI (console exe) ───────────────────────────────────────────────
|
||||
add_executable(TimeMocker.UI
|
||||
TimeMocker.UI/main.cpp
|
||||
)
|
||||
target_include_directories(TimeMocker.UI PRIVATE ${SHARED_DIR})
|
||||
target_link_libraries(TimeMocker.UI PRIVATE TimeMocker.Injector detours::detours)
|
||||
set_target_properties(TimeMocker.UI PROPERTIES
|
||||
OUTPUT_NAME "TimeMocker"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
|
||||
)
|
||||
|
||||
# Copy hook DLLs next to the UI executable after build
|
||||
add_custom_command(TARGET TimeMocker.UI POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
$<TARGET_FILE:TimeMocker.Hook>
|
||||
"${CMAKE_BINARY_DIR}/bin/TimeMocker.Hook.x64.dll"
|
||||
COMMENT "Copying Hook DLL (x64) → bin/"
|
||||
)
|
||||
COMMENT "Copying Hook DLL")
|
||||
|
||||
install(TARGETS TimeMocker.UI TimeMocker.Hook
|
||||
RUNTIME DESTINATION bin)
|
||||
install(TARGETS TimeMocker.UI TimeMocker.Hook RUNTIME DESTINATION bin)
|
||||
|
||||
@@ -4,92 +4,61 @@
|
||||
<ProjectConfiguration Include="Debug|x64"> <Configuration>Debug</Configuration> <Platform>x64</Platform> </ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64"><Configuration>Release</Configuration><Platform>x64</Platform> </ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{C3333333-3333-3333-3333-333333333333}</ProjectGuid>
|
||||
<RootNamespace>TimeMockerUI</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<ConfigurationType>Application</ConfigurationType><UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset><CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<ConfigurationType>Application</ConfigurationType><UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset><WholeProgramOptimization>true</WholeProgramOptimization><CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<AdditionalIncludeDirectories>
|
||||
$(SolutionDir)packages\detours\include;
|
||||
$(SolutionDir)Shared;
|
||||
%(AdditionalIncludeDirectories)
|
||||
</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<WarningLevel>Level3</WarningLevel><SDLCheck>true</SDLCheck>
|
||||
<ConformanceMode>true</ConformanceMode><LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)imgui;$(SolutionDir)packages\detours\include;$(SolutionDir)Shared;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<AdditionalDependencies>detours.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<AdditionalDependencies>d3d11.lib;dxgi.lib;d3dcompiler.lib;detours.lib;Psapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalLibraryDirectories>
|
||||
$(SolutionDir)packages\detours\lib\x64;
|
||||
$(OutDir);
|
||||
%(AdditionalLibraryDirectories)
|
||||
</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>TimeMocker.Injector.lib;detours.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
<ClCompile><Optimization>Disabled</Optimization><RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary></ClCompile>
|
||||
<Link><AdditionalLibraryDirectories>$(SolutionDir)packages\detours\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories></Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<ClCompile><Optimization>MaxSpeed</Optimization><RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary></ClCompile>
|
||||
<Link>
|
||||
<AdditionalLibraryDirectories>
|
||||
$(SolutionDir)packages\detours\lib\x64;
|
||||
$(OutDir);
|
||||
%(AdditionalLibraryDirectories)
|
||||
</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>TimeMocker.Injector.lib;detours.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<AdditionalLibraryDirectories>$(SolutionDir)packages\detours\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding><OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ClCompile Include="main.cpp" />
|
||||
<!-- Compile injector source directly (alternative to linking static lib) -->
|
||||
<ClCompile Include="..\TimeMocker.Injector\InjectionManager.cpp" />
|
||||
<ClCompile Include="imgui\imgui.cpp" />
|
||||
<ClCompile Include="imgui\imgui_draw.cpp" />
|
||||
<ClCompile Include="imgui\imgui_tables.cpp" />
|
||||
<ClCompile Include="imgui\imgui_widgets.cpp" />
|
||||
<ClCompile Include="imgui\imgui_impl_win32.cpp" />
|
||||
<ClCompile Include="imgui\imgui_impl_dx11.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="imgui\imgui.h" />
|
||||
<ClInclude Include="imgui\imgui_impl_win32.h" />
|
||||
<ClInclude Include="imgui\imgui_impl_dx11.h" />
|
||||
<ClInclude Include="..\TimeMocker.Injector\InjectionManager.h" />
|
||||
<ClInclude Include="..\TimeMocker.Injector\ProcessWatcher.h" />
|
||||
<ClInclude Include="..\Shared\MockTimeInfo.h" />
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# imgui/
|
||||
|
||||
This directory must contain Dear ImGui source files.
|
||||
|
||||
Run `scripts/setup.ps1` to download them automatically, or place them here manually
|
||||
from https://github.com/ocornut/imgui (latest release).
|
||||
|
||||
Required files:
|
||||
imgui.h
|
||||
imgui.cpp
|
||||
imgui_internal.h
|
||||
imgui_draw.cpp
|
||||
imgui_tables.cpp
|
||||
imgui_widgets.cpp
|
||||
imgui_impl_win32.h
|
||||
imgui_impl_win32.cpp
|
||||
imgui_impl_dx11.h
|
||||
imgui_impl_dx11.cpp
|
||||
imconfig.h
|
||||
imstb_rectpack.h
|
||||
imstb_textedit.h
|
||||
imstb_truetype.h
|
||||
+587
-409
File diff suppressed because it is too large
Load Diff
+72
-37
@@ -1,64 +1,99 @@
|
||||
# =============================================================================
|
||||
# setup.ps1 — Bootstrap MS Detours for TimeMockerCpp
|
||||
# setup.ps1 — Bootstrap MS Detours + Dear ImGui for TimeMockerCpp
|
||||
#
|
||||
# Run once before opening the solution in Visual Studio:
|
||||
# Run once before opening the solution:
|
||||
# powershell -ExecutionPolicy Bypass -File scripts\setup.ps1
|
||||
#
|
||||
# What it does:
|
||||
# 1. Clones / updates vcpkg (if not already present at $env:VCPKG_ROOT or ./vcpkg)
|
||||
# 2. Installs detours:x64-windows and detours:x86-windows
|
||||
# 3. Copies the resulting headers + libs into packages\detours\
|
||||
# so the vcxproj files can find them without requiring vcpkg integration.
|
||||
# =============================================================================
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$scriptDir = $PSScriptRoot
|
||||
$repoRoot = Split-Path $scriptDir -Parent
|
||||
$pkgDir = Join-Path $repoRoot "packages\detours"
|
||||
$vcpkgRoot = if ($env:VCPKG_ROOT) { $env:VCPKG_ROOT } else { Join-Path $repoRoot "vcpkg" }
|
||||
$repoRoot = Split-Path $PSScriptRoot -Parent
|
||||
$vcpkgRoot = if ($env:VCPKG_ROOT) { $env:VCPKG_ROOT } else { Join-Path $repoRoot "vcpkg" }
|
||||
$pkgDir = Join-Path $repoRoot "packages\detours"
|
||||
$imguiDir = Join-Path $repoRoot "TimeMocker.UI\imgui"
|
||||
|
||||
# ── 1. Ensure vcpkg ──────────────────────────────────────────────────────────
|
||||
# ── 1. vcpkg ─────────────────────────────────────────────────────────────────
|
||||
if (!(Test-Path (Join-Path $vcpkgRoot "vcpkg.exe")))
|
||||
{
|
||||
Write-Host "Cloning vcpkg into $vcpkgRoot ..." -ForegroundColor Cyan
|
||||
Write-Host "Cloning vcpkg..." -ForegroundColor Cyan
|
||||
git clone https://github.com/microsoft/vcpkg.git $vcpkgRoot
|
||||
& (Join-Path $vcpkgRoot "bootstrap-vcpkg.bat") -disableMetrics
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "vcpkg found at $vcpkgRoot" -ForegroundColor Green
|
||||
}
|
||||
else { Write-Host "vcpkg found at $vcpkgRoot" -ForegroundColor Green }
|
||||
|
||||
$vcpkg = Join-Path $vcpkgRoot "vcpkg.exe"
|
||||
|
||||
# ── 2. Install Detours ───────────────────────────────────────────────────────
|
||||
Write-Host "Installing detours:x64-windows ..." -ForegroundColor Cyan
|
||||
# ── 2. Install Detours ────────────────────────────────────────────────────────
|
||||
Write-Host "Installing detours:x64-windows..." -ForegroundColor Cyan
|
||||
& $vcpkg install "detours:x64-windows"
|
||||
|
||||
Write-Host "Installing detours:x86-windows ..." -ForegroundColor Cyan
|
||||
Write-Host "Installing detours:x86-windows..." -ForegroundColor Cyan
|
||||
& $vcpkg install "detours:x86-windows"
|
||||
|
||||
# ── 3. Copy headers + libs into packages\detours\ ───────────────────────────
|
||||
$x64installed = Join-Path $vcpkgRoot "installed\x64-windows"
|
||||
$x86installed = Join-Path $vcpkgRoot "installed\x86-windows"
|
||||
|
||||
$incSrc = Join-Path $x64installed "include"
|
||||
$incDst = Join-Path $pkgDir "include"
|
||||
|
||||
Write-Host "Copying headers → $incDst" -ForegroundColor Cyan
|
||||
# ── 3. Copy Detours headers + libs ───────────────────────────────────────────
|
||||
$incDst = Join-Path $pkgDir "include"
|
||||
New-Item -ItemType Directory -Force -Path $incDst | Out-Null
|
||||
Copy-Item -Path (Join-Path $incSrc "detours.h") -Destination $incDst -Force
|
||||
Copy-Item -Path (Join-Path $vcpkgRoot "installed\x64-windows\include\detours.h") `
|
||||
-Destination $incDst -Force
|
||||
|
||||
foreach ($triplet in @("x64", "x86"))
|
||||
foreach ($triplet in @("x64","x86"))
|
||||
{
|
||||
$libSrc = Join-Path (Join-Path $vcpkgRoot "installed\$triplet-windows") "lib\detours.lib"
|
||||
$libDst = Join-Path $pkgDir "lib\$triplet"
|
||||
New-Item -ItemType Directory -Force -Path $libDst | Out-Null
|
||||
Copy-Item -Path $libSrc -Destination (Join-Path $libDst "detours.lib") -Force
|
||||
Write-Host "Copied $triplet detours.lib → $libDst" -ForegroundColor Green
|
||||
Copy-Item -Path (Join-Path $vcpkgRoot "installed\$triplet-windows\lib\detours.lib") `
|
||||
-Destination (Join-Path $libDst "detours.lib") -Force
|
||||
Write-Host " Detours $triplet copied" -ForegroundColor Green
|
||||
}
|
||||
|
||||
# ── 4. Download Dear ImGui ────────────────────────────────────────────────────
|
||||
Write-Host ""
|
||||
Write-Host "Fetching Dear ImGui (latest release)..." -ForegroundColor Cyan
|
||||
New-Item -ItemType Directory -Force -Path $imguiDir | Out-Null
|
||||
|
||||
# Use the GitHub API to find the latest release tag
|
||||
$release = Invoke-RestMethod "https://api.github.com/repos/ocornut/imgui/releases/latest"
|
||||
$tag = $release.tag_name
|
||||
Write-Host " Tag: $tag" -ForegroundColor Green
|
||||
|
||||
$baseUrl = "https://raw.githubusercontent.com/ocornut/imgui/$tag"
|
||||
|
||||
$coreFiles = @(
|
||||
"imgui.h", "imgui.cpp",
|
||||
"imgui_internal.h",
|
||||
"imgui_draw.cpp",
|
||||
"imgui_tables.cpp",
|
||||
"imgui_widgets.cpp",
|
||||
"imconfig.h",
|
||||
"imstb_rectpack.h",
|
||||
"imstb_textedit.h",
|
||||
"imstb_truetype.h"
|
||||
)
|
||||
|
||||
$backendFiles = @(
|
||||
"imgui_impl_win32.h", "imgui_impl_win32.cpp",
|
||||
"imgui_impl_dx11.h", "imgui_impl_dx11.cpp"
|
||||
)
|
||||
|
||||
foreach ($f in $coreFiles)
|
||||
{
|
||||
$url = "$baseUrl/$f"
|
||||
$dest = Join-Path $imguiDir $f
|
||||
Write-Host " Downloading $f" -NoNewline
|
||||
Invoke-WebRequest -Uri $url -OutFile $dest -UseBasicParsing
|
||||
Write-Host " ✓" -ForegroundColor Green
|
||||
}
|
||||
|
||||
foreach ($f in $backendFiles)
|
||||
{
|
||||
$url = "$baseUrl/backends/$f"
|
||||
$dest = Join-Path $imguiDir $f
|
||||
Write-Host " Downloading $f" -NoNewline
|
||||
Invoke-WebRequest -Uri $url -OutFile $dest -UseBasicParsing
|
||||
Write-Host " ✓" -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "Setup complete! Open TimeMocker.sln in Visual Studio 2022." -ForegroundColor Green
|
||||
Write-Host "Build configuration: Debug|x64 or Release|x64" -ForegroundColor Green
|
||||
Write-Host "═══════════════════════════════════════════════════" -ForegroundColor Cyan
|
||||
Write-Host " Setup complete!" -ForegroundColor Green
|
||||
Write-Host " Open TimeMocker.sln in Visual Studio 2022" -ForegroundColor Green
|
||||
Write-Host " Build: Release | x64" -ForegroundColor Green
|
||||
Write-Host "═══════════════════════════════════════════════════" -ForegroundColor Cyan
|
||||
|
||||
Reference in New Issue
Block a user