Skip to content

add cmake support #64

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions 3rdparty/CMakelists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
cmake_minimum_required(VERSION 3.30)
project(Detours LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(libname lib_detours)
set(DETOURS_SOURCE Detours)

add_library(${libname} STATIC)
target_include_directories(${libname} PRIVATE ${DETOURS_SOURCE})
target_sources(${libname} PRIVATE
${DETOURS_SOURCE}/creatwth.cpp
${DETOURS_SOURCE}/detours.cpp
${DETOURS_SOURCE}/disasm.cpp
${DETOURS_SOURCE}/disolarm.cpp
${DETOURS_SOURCE}/disolarm64.cpp
${DETOURS_SOURCE}/disolia64.cpp
${DETOURS_SOURCE}/disolx64.cpp
${DETOURS_SOURCE}/disolx86.cpp
${DETOURS_SOURCE}/image.cpp
${DETOURS_SOURCE}/modules.cpp
${DETOURS_SOURCE}/uimports.cpp
${DETOURS_SOURCE}/detours.h
${DETOURS_SOURCE}/detver.h
)

# This file is included and not compiled on its own
set_property (
SOURCE ${DETOURS_SOURCE}/uimports.cpp
APPEND PROPERTY HEADER_FILE_ONLY true)

# Install libraries and public headers
install(TARGETS ${libname}
EXPORT ${PROJECT_NAME}Targets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
FILE_SET HEADERS DESTINATION include
)

# Install export file
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION lib/cmake/${PROJECT_NAME}
)

# Generate and install CMake config file
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
VERSION 1.0.0
COMPATIBILITY SameMajorVersion
)

configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
@ONLY
)

install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
DESTINATION lib/cmake/${PROJECT_NAME}
)

# CPack configuration for packaging
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_DESCRIPTION "A custom MemoryModulePP implementation")
set(CPACK_PACKAGE_VENDOR "xAI")
set(CPACK_GENERATOR "ZIP;TGZ")
include(CPack)
4 changes: 4 additions & 0 deletions 3rdparty/DetoursConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
check_required_components("@PROJECT_NAME@")
14 changes: 14 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
cmake_minimum_required(VERSION 3.27)
project(MemoryModulePP LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# add _d to debug targets
SET(CMAKE_DEBUG_POSTFIX _d)

# build spec done in subdirectories
add_subdirectory(3rdparty)
add_subdirectory(a)
add_subdirectory(MemoryModule)
add_subdirectory(test)
157 changes: 157 additions & 0 deletions MemoryModule/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
cmake_minimum_required(VERSION 3.30)
project(MemoryModulePP LANGUAGES CXX)

# Define static library target
set(static_libname "MemoryModulePP-static")
add_library(${static_libname} STATIC)

# Define shared library target
set(shared_libname "MemoryModulePP-shared")
add_library(${shared_libname} SHARED)

# turn on "reflection"
target_compile_definitions(${shared_libname} PRIVATE _USRDLL)

# link libraries for DLL
target_link_libraries(${shared_libname} PRIVATE lib_detours)

# Common sources and headers for both libraries
set(common_sources
BaseAddressIndex.cpp
ImportTable.cpp
Initialize.cpp
InvertedFunctionTable.cpp
LdrEntry.cpp
LoadDllMemoryApi.cpp
Loader.cpp
MemoryModule.cpp
MmpDotNet.cpp
MmpLdrpTls.cpp
MmpTls.cpp
MmpTlsFiber.cpp
Utils.cpp

# exports
MemoryModulePP.def
)

set(common_public_headers
BaseAddressIndex.h
ImportTable.h
Initialize.h
InvertedFunctionTable.h
LdrEntry.h
LoadDllMemoryApi.h
Loader.h
MemoryModule.h
MmpGlobalData.h
MmpDotNet.h
MmpTls.h
Utils.h
)

set(common_private_headers
LoaderPrivate.h
MmpTlsFiber.h
MmpTlsp.h
ReflectiveDLLInjection.h
ReflectiveLoader.h
)

# Specify sources and headers for static library
target_sources(${static_libname}
PRIVATE
${common_sources}
PUBLIC
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
FILES
${common_public_headers}
PRIVATE
FILE_SET private_headers
TYPE HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
FILES
${common_private_headers}
)

# Specify sources and headers for shared library
target_sources(${shared_libname}
PRIVATE
${common_sources}
PUBLIC
FILE_SET HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
FILES
${common_public_headers}
PRIVATE
FILE_SET private_headers
TYPE HEADERS
BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}
FILES
${common_private_headers}
)

# Set include directories for libraries
foreach(libname ${static_libname} ${shared_libname})
target_include_directories(${libname}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
$<INSTALL_INTERFACE:include>
)

# Ensure C++ standard
target_compile_features(${libname} PRIVATE cxx_std_23)

# key definitions
target_compile_definitions(${libname} PRIVATE
_MEMORY_MODULE
_HAS_AUTO_INITIALIZE
MMPP_USE_TLS=1
)
endforeach()

# Install libraries and public headers
install(TARGETS ${static_libname} ${shared_libname}
EXPORT ${PROJECT_NAME}Targets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
FILE_SET HEADERS DESTINATION include
)

# Install export file
install(EXPORT ${PROJECT_NAME}Targets
FILE ${PROJECT_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION lib/cmake/${PROJECT_NAME}
)

# Generate and install CMake config file
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
VERSION 1.0.0
COMPATIBILITY SameMajorVersion
)

configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_NAME}Config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
@ONLY
)

install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
DESTINATION lib/cmake/${PROJECT_NAME}
)

# CPack configuration for packaging
set(CPACK_PACKAGE_NAME "${PROJECT_NAME}")
set(CPACK_PACKAGE_VERSION "1.0.0")
set(CPACK_PACKAGE_DESCRIPTION "A custom MemoryModulePP implementation")
set(CPACK_PACKAGE_VENDOR "xAI")
set(CPACK_GENERATOR "ZIP;TGZ")
include(CPack)
8 changes: 7 additions & 1 deletion MemoryModule/Initialize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@

PMMP_GLOBAL_DATA MmpGlobalDataPtr;

// DLL compliant access
extern "C" PMMP_GLOBAL_DATA NTAPI GetMmpGlobalDataPtr()
{
return MmpGlobalDataPtr;
}

#if MEMORY_MODULE_IS_PREVIEW(MEMORY_MODULE_MINOR_VERSION)
#pragma message("WARNING: You are using a preview version of MemoryModulePP.")
#endif
Expand Down Expand Up @@ -621,6 +627,6 @@ BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReser
}
#else
#ifdef _HAS_AUTO_INITIALIZE
const NTSTATUS Initializer = MmInitialize();
static const NTSTATUS Initializer = MmInitialize();
#endif
#endif
8 changes: 4 additions & 4 deletions MemoryModule/LoadDllMemoryApi.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#include "stdafx.h"
#include <cstdlib>

HMEMORYMODULE WINAPI LoadLibraryMemoryExW(
extern "C" HMEMORYMODULE WINAPI LoadLibraryMemoryExW(
_In_ PVOID BufferAddress,
_In_ size_t Reserved,
_In_opt_ LPCWSTR DllBaseName,
Expand All @@ -15,7 +15,7 @@ HMEMORYMODULE WINAPI LoadLibraryMemoryExW(
return hMemoryModule;
}

HMEMORYMODULE WINAPI LoadLibraryMemoryExA(
extern "C" HMEMORYMODULE WINAPI LoadLibraryMemoryExA(
_In_ PVOID BufferAddress,
_In_ size_t Reserved,
_In_opt_ LPCSTR DllBaseName,
Expand Down Expand Up @@ -59,11 +59,11 @@ HMEMORYMODULE WINAPI LoadLibraryMemoryExA(
return result;
}

HMEMORYMODULE WINAPI LoadLibraryMemory(_In_ PVOID BufferAddress) {
extern "C" HMEMORYMODULE WINAPI LoadLibraryMemory(_In_ PVOID BufferAddress) {
return LoadLibraryMemoryExW(BufferAddress, 0, nullptr, nullptr, 0);
}

BOOL WINAPI FreeLibraryMemory(_In_ HMEMORYMODULE hMemoryModule) {
extern "C" BOOL WINAPI FreeLibraryMemory(_In_ HMEMORYMODULE hMemoryModule) {
NTSTATUS status = LdrUnloadDllMemory(hMemoryModule);
if (!NT_SUCCESS(status)) {
SetLastError(RtlNtStatusToDosError(status));
Expand Down
15 changes: 6 additions & 9 deletions MemoryModule/Loader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ NTSTATUS NTAPI LdrMapDllMemory(
return STATUS_SUCCESS;
}

NTSTATUS NTAPI LdrLoadDllMemoryExW(
extern "C" NTSTATUS NTAPI LdrLoadDllMemoryExW(
_Out_ HMEMORYMODULE* BaseAddress,
_Out_opt_ PVOID* LdrEntry,
_In_ DWORD dwFlags,
Expand Down Expand Up @@ -96,12 +96,8 @@ NTSTATUS NTAPI LdrLoadDllMemoryExW(

auto dist = (CurEntry->BaseDllName.Length / sizeof(wchar_t)) - length;
bool equal = false;
if (dist == 0 || dist == 4) {
equal = !_wcsnicmp(DllName, CurEntry->BaseDllName.Buffer, length);
}
else {
continue;
}
if (!(dist == 0 || dist == 4)) continue;
equal = !_wcsnicmp(DllName, CurEntry->BaseDllName.Buffer, length);

/* Check if name matches */
if (equal) {
Expand Down Expand Up @@ -221,7 +217,7 @@ NTSTATUS NTAPI LdrLoadDllMemoryExW(
return status;
}

NTSTATUS NTAPI LdrUnloadDllMemory(_In_ HMEMORYMODULE BaseAddress) {
extern "C" NTSTATUS NTAPI LdrUnloadDllMemory(_In_ HMEMORYMODULE BaseAddress) {
PLDR_DATA_TABLE_ENTRY CurEntry;
ULONG count = 0;
NTSTATUS status = STATUS_SUCCESS;
Expand Down Expand Up @@ -292,13 +288,14 @@ NTSTATUS NTAPI LdrUnloadDllMemory(_In_ HMEMORYMODULE BaseAddress) {
return status;
}

extern "C"
DECLSPEC_NORETURN
VOID NTAPI LdrUnloadDllMemoryAndExitThread(_In_ HMEMORYMODULE BaseAddress, _In_ DWORD dwExitCode) {
LdrUnloadDllMemory(BaseAddress);
RtlExitUserThread(dwExitCode);
}

NTSTATUS NTAPI LdrQuerySystemMemoryModuleFeatures(_Out_ PDWORD pFeatures) {
extern "C" NTSTATUS NTAPI LdrQuerySystemMemoryModuleFeatures(_Out_ PDWORD pFeatures) {
NTSTATUS status = STATUS_SUCCESS;
__try {
*pFeatures = MmpGlobalDataPtr->MmpFeatures;
Expand Down
1 change: 1 addition & 0 deletions MemoryModule/MemoryModulePP.def
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ LdrUnloadDllMemoryAndExitThread
LdrQuerySystemMemoryModuleFeatures

MmpGlobalDataPtr
GetMmpGlobalDataPtr
1 change: 1 addition & 0 deletions MemoryModule/MmpGlobalData.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,4 @@ typedef struct _MMP_GLOBAL_DATA {
)

extern PMMP_GLOBAL_DATA MmpGlobalDataPtr;
extern "C" PMMP_GLOBAL_DATA NTAPI GetMmpGlobalDataPtr() ;
9 changes: 3 additions & 6 deletions MemoryModule/MmpLdrpTls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,9 @@ static NTSTATUS NTAPI RtlFindLdrpHandleTlsData10() {
}

static NTSTATUS NTAPI RtlFindLdrpHandleTlsData() {
if (MmpGlobalDataPtr->NtVersions.MajorVersion >= 10) {
return RtlFindLdrpHandleTlsData10();
}
else {
return RtlFindLdrpHandleTlsDataOld();
}
return MmpGlobalDataPtr->NtVersions.MajorVersion >= 10
? RtlFindLdrpHandleTlsData10()
: RtlFindLdrpHandleTlsDataOld();
}

static NTSTATUS NTAPI RtlFindLdrpReleaseTlsEntry() {
Expand Down
4 changes: 2 additions & 2 deletions MemoryModule/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -393,9 +393,9 @@ BOOL NTAPI RtlIsWindowsVersionOrGreater(
) {
if (MmpGlobalDataPtr->NtVersions.MajorVersion == MajorVersion) {
if (MmpGlobalDataPtr->NtVersions.MinorVersion == MinorVersion) return MmpGlobalDataPtr->NtVersions.BuildNumber >= BuildNumber;
else return (MmpGlobalDataPtr->NtVersions.MinorVersion > MinorVersion);
return (MmpGlobalDataPtr->NtVersions.MinorVersion > MinorVersion);
}
else return MmpGlobalDataPtr->NtVersions.MajorVersion > MajorVersion;
return MmpGlobalDataPtr->NtVersions.MajorVersion > MajorVersion;
}

BOOL NTAPI RtlIsWindowsVersionInScope(
Expand Down
4 changes: 4 additions & 0 deletions MemoryModulePPConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
check_required_components("@PROJECT_NAME@")
Loading