mirror of
https://github.com/vxcontrol/MemoryModule.git
synced 2026-07-25 08:35:44 -04:00
Compare commits
150 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a8da72d503 | |||
| 59307f0a63 | |||
| 47a9ee83db | |||
| 08a59f2922 | |||
| 5e850c0b76 | |||
| 0a984057da | |||
| fdf41455e9 | |||
| acd7da679a | |||
| fef80b544b | |||
| 5f83e41c3a | |||
| 316aa59c48 | |||
| 9f37952407 | |||
| d1a0824733 | |||
| e4c1b3566c | |||
| a15e0769b0 | |||
| e039372355 | |||
| 060f0bd736 | |||
| 403a31e7bb | |||
| e7d53b53e0 | |||
| 0acf4e7785 | |||
| 663ddca84b | |||
| 9ecfeb025d | |||
| 9e295953a8 | |||
| 55577d939c | |||
| ac78ea10e7 | |||
| 98b95eca4c | |||
| 0884dccfa7 | |||
| 00bc61e8c7 | |||
| 2bbbc205d6 | |||
| 7d0c143f92 | |||
| 2ecf5b764b | |||
| 5c6b699b36 | |||
| 184113ca09 | |||
| f5c9db8b5c | |||
| 6c4ab3589d | |||
| 8d609dc2a2 | |||
| 5ce3707c7d | |||
| d9dcc0eb8c | |||
| e2826eb956 | |||
| 49a82873f7 | |||
| 4074f1e6ab | |||
| caf917707b | |||
| 221a470ad1 | |||
| 097403a8ad | |||
| 6c2c3e2fee | |||
| 03cd7c91d9 | |||
| de5dbce770 | |||
| 89883558fe | |||
| b26476ff8d | |||
| 1d19f9f750 | |||
| d19c62ed82 | |||
| cfba548c66 | |||
| af2c521cf2 | |||
| 164b21ac07 | |||
| c4074afd3e | |||
| c174ed1177 | |||
| 4b3d2a08d5 | |||
| a1fb42d4c5 | |||
| bc38a6b01d | |||
| d46b74d00d | |||
| d88817fbf7 | |||
| d9a6bb9c8f | |||
| 905ad75e82 | |||
| 2e193f153a | |||
| cc562219af | |||
| cddc54a671 | |||
| 5bda2104b9 | |||
| 394fae8d51 | |||
| 15983313f4 | |||
| 583e1b4a93 | |||
| bc04853584 | |||
| 9df6e7dc93 | |||
| f02a8e6a38 | |||
| 71643ae62b | |||
| d19707369a | |||
| 8d5dbf39e8 | |||
| 62e357e515 | |||
| b4bf2f7c4a | |||
| 422f918c33 | |||
| a13ad18e11 | |||
| 8c3d253325 | |||
| 70c4977019 | |||
| 5a0c512885 | |||
| 78330cd2f1 | |||
| db9c2389f2 | |||
| 83899ac7f7 | |||
| 6276f4426d | |||
| e5d42852de | |||
| 48d3c5a7f6 | |||
| 82b11d57db | |||
| 0ce2454fc3 | |||
| 89e02fcd9e | |||
| dc173cad6d | |||
| d9dc0b0270 | |||
| 31cbe89bfe | |||
| 2da44d00e9 | |||
| 36574a5638 | |||
| 463447c1ed | |||
| d321abf8fa | |||
| aa6b93bab4 | |||
| 927bd2a9f0 | |||
| dd5e818dfc | |||
| 4c08d8eb92 | |||
| 625aa47035 | |||
| dacdbaba9a | |||
| 6212358a24 | |||
| 808c043faf | |||
| dcccd79158 | |||
| b889c72727 | |||
| 3422b5791c | |||
| 52b0379749 | |||
| 1d55f77753 | |||
| 5a448ce93a | |||
| 2d504b533e | |||
| b8125d0a65 | |||
| bb736dc160 | |||
| da78edc39b | |||
| 8d286f8566 | |||
| ce62f60a6e | |||
| de7840af70 | |||
| f76963b8ea | |||
| e75438a006 | |||
| 147fdde848 | |||
| fc6a58a785 | |||
| 54e3a29836 | |||
| fa31e34ff9 | |||
| 3c74a360e5 | |||
| a064d0e636 | |||
| 390efc33a1 | |||
| f4d15a53ac | |||
| 132964d838 | |||
| a199afce7c | |||
| f210f67771 | |||
| 536a597836 | |||
| c4e8de7d4f | |||
| f7a34964ff | |||
| 6f4f2bdd5b | |||
| 44ae72da04 | |||
| 0c19658eb1 | |||
| 7ffe0e2b66 | |||
| c23d0642d6 | |||
| 257a77c0e9 | |||
| 1cc307a883 | |||
| d9a3b23830 | |||
| c01e010793 | |||
| 2b846b727a | |||
| 6a5d3d420e | |||
| 0f6bdc7c16 | |||
| 8a7f64ea3a | |||
| d0cf3a2084 |
@@ -0,0 +1,11 @@
|
|||||||
|
* text=auto
|
||||||
|
|
||||||
|
# Native line endings.
|
||||||
|
*.c text
|
||||||
|
*.cpp text
|
||||||
|
*.h text
|
||||||
|
*.rc text
|
||||||
|
|
||||||
|
# Windows line endings.
|
||||||
|
*.bat text eol=crlf
|
||||||
|
*.eln text eol=crlf
|
||||||
@@ -1 +1,8 @@
|
|||||||
*.o
|
*.o
|
||||||
|
*.obj
|
||||||
|
*.exe
|
||||||
|
tests/*.dll
|
||||||
|
tests/*.res
|
||||||
|
|
||||||
|
tests/SampleExports.cpp
|
||||||
|
tests/SampleExports.h
|
||||||
|
|||||||
+95
@@ -0,0 +1,95 @@
|
|||||||
|
sudo: true
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- env: PLATFORM=x86_64 UNICODE= CMAKE= WINE_PACKAGE=winehq-stable:amd64
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-x86-64
|
||||||
|
- mingw-w64-x86-64-dev
|
||||||
|
- g++-mingw-w64-x86-64
|
||||||
|
- gcc-mingw-w64-x86-64
|
||||||
|
- env: PLATFORM=i686 UNICODE= CMAKE= WINE_PACKAGE=winehq-stable:i386
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-i686
|
||||||
|
- mingw-w64-i686-dev
|
||||||
|
- g++-mingw-w64-i686
|
||||||
|
- gcc-mingw-w64-i686
|
||||||
|
- env: PLATFORM=x86_64 UNICODE=1 CMAKE= WINE_PACKAGE=winehq-stable:amd64
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-x86-64
|
||||||
|
- mingw-w64-x86-64-dev
|
||||||
|
- g++-mingw-w64-x86-64
|
||||||
|
- gcc-mingw-w64-x86-64
|
||||||
|
- env: PLATFORM=i686 UNICODE=1 CMAKE= WINE_PACKAGE=winehq-stable:i386
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-i686
|
||||||
|
- mingw-w64-i686-dev
|
||||||
|
- g++-mingw-w64-i686
|
||||||
|
- gcc-mingw-w64-i686
|
||||||
|
- env: PLATFORM=x86_64 UNICODE= CMAKE=1 WINE_PACKAGE=winehq-stable:amd64
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-x86-64
|
||||||
|
- mingw-w64-x86-64-dev
|
||||||
|
- g++-mingw-w64-x86-64
|
||||||
|
- gcc-mingw-w64-x86-64
|
||||||
|
- env: PLATFORM=i686 UNICODE= CMAKE=1 WINE_PACKAGE=winehq-stable:i386
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-i686
|
||||||
|
- cmake
|
||||||
|
- mingw-w64-i686-dev
|
||||||
|
- g++-mingw-w64-i686
|
||||||
|
- gcc-mingw-w64-i686
|
||||||
|
- env: PLATFORM=x86_64 UNICODE=1 CMAKE=1 WINE_PACKAGE=winehq-stable:amd64
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-x86-64
|
||||||
|
- cmake
|
||||||
|
- mingw-w64-x86-64-dev
|
||||||
|
- g++-mingw-w64-x86-64
|
||||||
|
- gcc-mingw-w64-x86-64
|
||||||
|
- env: PLATFORM=i686 UNICODE=1 CMAKE=1 WINE_PACKAGE=winehq-stable:i386
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- binutils-mingw-w64-i686
|
||||||
|
- cmake
|
||||||
|
- mingw-w64-i686-dev
|
||||||
|
- g++-mingw-w64-i686
|
||||||
|
- gcc-mingw-w64-i686
|
||||||
|
|
||||||
|
language: cpp
|
||||||
|
|
||||||
|
dist: xenial
|
||||||
|
|
||||||
|
cache:
|
||||||
|
- apt
|
||||||
|
- ccache
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- curl https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add -
|
||||||
|
- echo "deb https://dl.winehq.org/wine-builds/ubuntu/ xenial main" | sudo tee /etc/apt/sources.list.d/winehq.list
|
||||||
|
- sudo apt-get -y update && sudo apt-get -y install --install-recommends $WINE_PACKAGE
|
||||||
|
- if [ ! -z "$CMAKE" ]; then cmake -DPLATFORM=$PLATFORM -DUNICODE=$UNICODE -DTESTSUITE=ON -H. -B.; fi
|
||||||
|
|
||||||
|
script:
|
||||||
|
- if [ -z "$CMAKE" ]; then make PLATFORM=$PLATFORM UNICODE=$UNICODE; fi
|
||||||
|
- if [ -z "$CMAKE" ]; then make test PLATFORM=$PLATFORM UNICODE=$UNICODE; fi
|
||||||
|
- if [ ! -z "$CMAKE" ]; then cmake --build .; fi
|
||||||
|
- cd example/DllLoader
|
||||||
|
- ../../tests/runwine.sh $PLATFORM ./DllLoader.exe
|
||||||
|
- ../../tests/runwine.sh $PLATFORM ./DllLoaderLoader.exe
|
||||||
|
- cd ../../tests
|
||||||
|
- ./runwine.sh $PLATFORM ./TestSuite.exe
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
project (MemoryModule)
|
||||||
|
cmake_minimum_required (VERSION 2.8.7)
|
||||||
|
|
||||||
|
set (PLATFORM "x86_64" CACHE STRING "Platform to compile for")
|
||||||
|
message (STATUS "Compile for ${PLATFORM} platform")
|
||||||
|
|
||||||
|
if (NOT MSVC)
|
||||||
|
set (CMAKE_SYSTEM_NAME Windows)
|
||||||
|
set (CMAKE_POSITION_INDEPENDENT_CODE False)
|
||||||
|
|
||||||
|
set (COMPILER_PREFIX "${PLATFORM}-w64-mingw32")
|
||||||
|
set (CMAKE_C_COMPILER "${COMPILER_PREFIX}-gcc")
|
||||||
|
set (CMAKE_CXX_COMPILER "${COMPILER_PREFIX}-g++")
|
||||||
|
set (CMAKE_RC_COMPILER "${COMPILER_PREFIX}-windres")
|
||||||
|
set (CMAKE_AR "${COMPILER_PREFIX}-ar")
|
||||||
|
set (CMAKE_RANLIB "${COMPILER_PREFIX}-ranlib")
|
||||||
|
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
|
||||||
|
set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
|
||||||
|
set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
|
||||||
|
|
||||||
|
set (CMAKE_RC_COMPILE_OBJECT "${CMAKE_RC_COMPILER} -O coff -I${CMAKE_CURRENT_SOURCE_DIR} <SOURCE> <OBJECT>")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT MSVC)
|
||||||
|
add_definitions ("-Wall")
|
||||||
|
else ()
|
||||||
|
# Show level 4 warnings.
|
||||||
|
add_definitions ("-W4")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
option(UNICODE "Compile with UNICODE support" OFF)
|
||||||
|
if (UNICODE)
|
||||||
|
message (STATUS "Compile with UNICODE support")
|
||||||
|
add_definitions ("-DUNICODE" "-D_UNICODE")
|
||||||
|
else ()
|
||||||
|
message (STATUS "Compile without UNICODE support")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
option(TESTSUITE "Compile with TESTSUITE support" OFF)
|
||||||
|
if (TESTSUITE)
|
||||||
|
message (STATUS "Compile with TESTSUITE support")
|
||||||
|
add_definitions ("-DTESTSUITE")
|
||||||
|
else ()
|
||||||
|
message (STATUS "Compile without TESTSUITE support")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_library (MemoryModule STATIC MemoryModule.c MemoryModule.h)
|
||||||
|
target_include_directories(MemoryModule PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
if (NOT MSVC)
|
||||||
|
set_target_properties ("MemoryModule" PROPERTIES PREFIX "")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_subdirectory (example)
|
||||||
|
add_subdirectory (tests)
|
||||||
|
|
||||||
|
enable_language (RC)
|
||||||
+298
-395
@@ -1,470 +1,373 @@
|
|||||||
MOZILLA PUBLIC LICENSE
|
Mozilla Public License Version 2.0
|
||||||
Version 1.1
|
==================================
|
||||||
|
|
||||||
---------------
|
1. Definitions
|
||||||
|
--------------
|
||||||
|
|
||||||
1. Definitions.
|
1.1. "Contributor"
|
||||||
|
means each individual or legal entity that creates, contributes to
|
||||||
|
the creation of, or owns Covered Software.
|
||||||
|
|
||||||
1.0.1. "Commercial Use" means distribution or otherwise making the
|
1.2. "Contributor Version"
|
||||||
Covered Code available to a third party.
|
means the combination of the Contributions of others (if any) used
|
||||||
|
by a Contributor and that particular Contributor's Contribution.
|
||||||
|
|
||||||
1.1. "Contributor" means each entity that creates or contributes to
|
1.3. "Contribution"
|
||||||
the creation of Modifications.
|
means Covered Software of a particular Contributor.
|
||||||
|
|
||||||
1.2. "Contributor Version" means the combination of the Original
|
1.4. "Covered Software"
|
||||||
Code, prior Modifications used by a Contributor, and the Modifications
|
means Source Code Form to which the initial Contributor has attached
|
||||||
made by that particular Contributor.
|
the notice in Exhibit A, the Executable Form of such Source Code
|
||||||
|
Form, and Modifications of such Source Code Form, in each case
|
||||||
1.3. "Covered Code" means the Original Code or Modifications or the
|
|
||||||
combination of the Original Code and Modifications, in each case
|
|
||||||
including portions thereof.
|
including portions thereof.
|
||||||
|
|
||||||
1.4. "Electronic Distribution Mechanism" means a mechanism generally
|
1.5. "Incompatible With Secondary Licenses"
|
||||||
accepted in the software development community for the electronic
|
means
|
||||||
transfer of data.
|
|
||||||
|
|
||||||
1.5. "Executable" means Covered Code in any form other than Source
|
(a) that the initial Contributor has attached the notice described
|
||||||
Code.
|
in Exhibit B to the Covered Software; or
|
||||||
|
|
||||||
1.6. "Initial Developer" means the individual or entity identified
|
(b) that the Covered Software was made available under the terms of
|
||||||
as the Initial Developer in the Source Code notice required by Exhibit
|
version 1.1 or earlier of the License, but not also under the
|
||||||
A.
|
terms of a Secondary License.
|
||||||
|
|
||||||
1.7. "Larger Work" means a work which combines Covered Code or
|
1.6. "Executable Form"
|
||||||
portions thereof with code not governed by the terms of this License.
|
means any form of the work other than Source Code Form.
|
||||||
|
|
||||||
1.8. "License" means this document.
|
1.7. "Larger Work"
|
||||||
|
means a work that combines Covered Software with other material, in
|
||||||
|
a separate file or files, that is not Covered Software.
|
||||||
|
|
||||||
1.8.1. "Licensable" means having the right to grant, to the maximum
|
1.8. "License"
|
||||||
extent possible, whether at the time of the initial grant or
|
means this document.
|
||||||
subsequently acquired, any and all of the rights conveyed herein.
|
|
||||||
|
|
||||||
1.9. "Modifications" means any addition to or deletion from the
|
1.9. "Licensable"
|
||||||
substance or structure of either the Original Code or any previous
|
means having the right to grant, to the maximum extent possible,
|
||||||
Modifications. When Covered Code is released as a series of files, a
|
whether at the time of the initial grant or subsequently, any and
|
||||||
Modification is:
|
all of the rights conveyed by this License.
|
||||||
A. Any addition to or deletion from the contents of a file
|
|
||||||
containing Original Code or previous Modifications.
|
|
||||||
|
|
||||||
B. Any new file that contains any part of the Original Code or
|
1.10. "Modifications"
|
||||||
previous Modifications.
|
means any of the following:
|
||||||
|
|
||||||
1.10. "Original Code" means Source Code of computer software code
|
(a) any file in Source Code Form that results from an addition to,
|
||||||
which is described in the Source Code notice required by Exhibit A as
|
deletion from, or modification of the contents of Covered
|
||||||
Original Code, and which, at the time of its release under this
|
Software; or
|
||||||
License is not already Covered Code governed by this License.
|
|
||||||
|
|
||||||
1.10.1. "Patent Claims" means any patent claim(s), now owned or
|
(b) any new file in Source Code Form that contains any Covered
|
||||||
hereafter acquired, including without limitation, method, process,
|
Software.
|
||||||
and apparatus claims, in any patent Licensable by grantor.
|
|
||||||
|
|
||||||
1.11. "Source Code" means the preferred form of the Covered Code for
|
1.11. "Patent Claims" of a Contributor
|
||||||
making modifications to it, including all modules it contains, plus
|
means any patent claim(s), including without limitation, method,
|
||||||
any associated interface definition files, scripts used to control
|
process, and apparatus claims, in any patent Licensable by such
|
||||||
compilation and installation of an Executable, or source code
|
Contributor that would be infringed, but for the grant of the
|
||||||
differential comparisons against either the Original Code or another
|
License, by the making, using, selling, offering for sale, having
|
||||||
well known, available Covered Code of the Contributor's choice. The
|
made, import, or transfer of either its Contributions or its
|
||||||
Source Code can be in a compressed or archival form, provided the
|
Contributor Version.
|
||||||
appropriate decompression or de-archiving software is widely available
|
|
||||||
for no charge.
|
|
||||||
|
|
||||||
1.12. "You" (or "Your") means an individual or a legal entity
|
1.12. "Secondary License"
|
||||||
exercising rights under, and complying with all of the terms of, this
|
means either the GNU General Public License, Version 2.0, the GNU
|
||||||
License or a future version of this License issued under Section 6.1.
|
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||||
For legal entities, "You" includes any entity which controls, is
|
Public License, Version 3.0, or any later versions of those
|
||||||
controlled by, or is under common control with You. For purposes of
|
licenses.
|
||||||
this definition, "control" means (a) the power, direct or indirect,
|
|
||||||
to cause the direction or management of such entity, whether by
|
|
||||||
contract or otherwise, or (b) ownership of more than fifty percent
|
|
||||||
(50%) of the outstanding shares or beneficial ownership of such
|
|
||||||
entity.
|
|
||||||
|
|
||||||
2. Source Code License.
|
1.13. "Source Code Form"
|
||||||
|
means the form of the work preferred for making modifications.
|
||||||
|
|
||||||
2.1. The Initial Developer Grant.
|
1.14. "You" (or "Your")
|
||||||
The Initial Developer hereby grants You a world-wide, royalty-free,
|
means an individual or a legal entity exercising rights under this
|
||||||
non-exclusive license, subject to third party intellectual property
|
License. For legal entities, "You" includes any entity that
|
||||||
claims:
|
controls, is controlled by, or is under common control with You. For
|
||||||
(a) under intellectual property rights (other than patent or
|
purposes of this definition, "control" means (a) the power, direct
|
||||||
trademark) Licensable by Initial Developer to use, reproduce,
|
or indirect, to cause the direction or management of such entity,
|
||||||
modify, display, perform, sublicense and distribute the Original
|
whether by contract or otherwise, or (b) ownership of more than
|
||||||
Code (or portions thereof) with or without Modifications, and/or
|
fifty percent (50%) of the outstanding shares or beneficial
|
||||||
|
ownership of such entity.
|
||||||
|
|
||||||
|
2. License Grants and Conditions
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
2.1. Grants
|
||||||
|
|
||||||
|
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||||
|
non-exclusive license:
|
||||||
|
|
||||||
|
(a) under intellectual property rights (other than patent or trademark)
|
||||||
|
Licensable by such Contributor to use, reproduce, make available,
|
||||||
|
modify, display, perform, distribute, and otherwise exploit its
|
||||||
|
Contributions, either on an unmodified basis, with Modifications, or
|
||||||
as part of a Larger Work; and
|
as part of a Larger Work; and
|
||||||
|
|
||||||
(b) under Patents Claims infringed by the making, using or
|
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||||
selling of Original Code, to make, have made, use, practice,
|
for sale, have made, import, and otherwise transfer either its
|
||||||
sell, and offer for sale, and/or otherwise dispose of the
|
Contributions or its Contributor Version.
|
||||||
Original Code (or portions thereof).
|
|
||||||
|
|
||||||
(c) the licenses granted in this Section 2.1(a) and (b) are
|
2.2. Effective Date
|
||||||
effective on the date Initial Developer first distributes
|
|
||||||
Original Code under the terms of this License.
|
|
||||||
|
|
||||||
(d) Notwithstanding Section 2.1(b) above, no patent license is
|
The licenses granted in Section 2.1 with respect to any Contribution
|
||||||
granted: 1) for code that You delete from the Original Code; 2)
|
become effective for each Contribution on the date the Contributor first
|
||||||
separate from the Original Code; or 3) for infringements caused
|
distributes such Contribution.
|
||||||
by: i) the modification of the Original Code or ii) the
|
|
||||||
combination of the Original Code with other software or devices.
|
|
||||||
|
|
||||||
2.2. Contributor Grant.
|
2.3. Limitations on Grant Scope
|
||||||
Subject to third party intellectual property claims, each Contributor
|
|
||||||
hereby grants You a world-wide, royalty-free, non-exclusive license
|
|
||||||
|
|
||||||
(a) under intellectual property rights (other than patent or
|
The licenses granted in this Section 2 are the only rights granted under
|
||||||
trademark) Licensable by Contributor, to use, reproduce, modify,
|
this License. No additional rights or licenses will be implied from the
|
||||||
display, perform, sublicense and distribute the Modifications
|
distribution or licensing of Covered Software under this License.
|
||||||
created by such Contributor (or portions thereof) either on an
|
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||||
unmodified basis, with other Modifications, as Covered Code
|
Contributor:
|
||||||
and/or as part of a Larger Work; and
|
|
||||||
|
|
||||||
(b) under Patent Claims infringed by the making, using, or
|
(a) for any code that a Contributor has removed from Covered Software;
|
||||||
selling of Modifications made by that Contributor either alone
|
or
|
||||||
and/or in combination with its Contributor Version (or portions
|
|
||||||
of such combination), to make, use, sell, offer for sale, have
|
|
||||||
made, and/or otherwise dispose of: 1) Modifications made by that
|
|
||||||
Contributor (or portions thereof); and 2) the combination of
|
|
||||||
Modifications made by that Contributor with its Contributor
|
|
||||||
Version (or portions of such combination).
|
|
||||||
|
|
||||||
(c) the licenses granted in Sections 2.2(a) and 2.2(b) are
|
(b) for infringements caused by: (i) Your and any other third party's
|
||||||
effective on the date Contributor first makes Commercial Use of
|
modifications of Covered Software, or (ii) the combination of its
|
||||||
the Covered Code.
|
Contributions with other software (except as part of its Contributor
|
||||||
|
Version); or
|
||||||
|
|
||||||
(d) Notwithstanding Section 2.2(b) above, no patent license is
|
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||||
granted: 1) for any code that Contributor has deleted from the
|
its Contributions.
|
||||||
Contributor Version; 2) separate from the Contributor Version;
|
|
||||||
3) for infringements caused by: i) third party modifications of
|
|
||||||
Contributor Version or ii) the combination of Modifications made
|
|
||||||
by that Contributor with other software (except as part of the
|
|
||||||
Contributor Version) or other devices; or 4) under Patent Claims
|
|
||||||
infringed by Covered Code in the absence of Modifications made by
|
|
||||||
that Contributor.
|
|
||||||
|
|
||||||
3. Distribution Obligations.
|
This License does not grant any rights in the trademarks, service marks,
|
||||||
|
or logos of any Contributor (except as may be necessary to comply with
|
||||||
|
the notice requirements in Section 3.4).
|
||||||
|
|
||||||
3.1. Application of License.
|
2.4. Subsequent Licenses
|
||||||
The Modifications which You create or to which You contribute are
|
|
||||||
governed by the terms of this License, including without limitation
|
|
||||||
Section 2.2. The Source Code version of Covered Code may be
|
|
||||||
distributed only under the terms of this License or a future version
|
|
||||||
of this License released under Section 6.1, and You must include a
|
|
||||||
copy of this License with every copy of the Source Code You
|
|
||||||
distribute. You may not offer or impose any terms on any Source Code
|
|
||||||
version that alters or restricts the applicable version of this
|
|
||||||
License or the recipients' rights hereunder. However, You may include
|
|
||||||
an additional document offering the additional rights described in
|
|
||||||
Section 3.5.
|
|
||||||
|
|
||||||
3.2. Availability of Source Code.
|
No Contributor makes additional grants as a result of Your choice to
|
||||||
Any Modification which You create or to which You contribute must be
|
distribute the Covered Software under a subsequent version of this
|
||||||
made available in Source Code form under the terms of this License
|
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||||
either on the same media as an Executable version or via an accepted
|
permitted under the terms of Section 3.3).
|
||||||
Electronic Distribution Mechanism to anyone to whom you made an
|
|
||||||
Executable version available; and if made available via Electronic
|
|
||||||
Distribution Mechanism, must remain available for at least twelve (12)
|
|
||||||
months after the date it initially became available, or at least six
|
|
||||||
(6) months after a subsequent version of that particular Modification
|
|
||||||
has been made available to such recipients. You are responsible for
|
|
||||||
ensuring that the Source Code version remains available even if the
|
|
||||||
Electronic Distribution Mechanism is maintained by a third party.
|
|
||||||
|
|
||||||
3.3. Description of Modifications.
|
2.5. Representation
|
||||||
You must cause all Covered Code to which You contribute to contain a
|
|
||||||
file documenting the changes You made to create that Covered Code and
|
|
||||||
the date of any change. You must include a prominent statement that
|
|
||||||
the Modification is derived, directly or indirectly, from Original
|
|
||||||
Code provided by the Initial Developer and including the name of the
|
|
||||||
Initial Developer in (a) the Source Code, and (b) in any notice in an
|
|
||||||
Executable version or related documentation in which You describe the
|
|
||||||
origin or ownership of the Covered Code.
|
|
||||||
|
|
||||||
3.4. Intellectual Property Matters
|
Each Contributor represents that the Contributor believes its
|
||||||
(a) Third Party Claims.
|
Contributions are its original creation(s) or it has sufficient rights
|
||||||
If Contributor has knowledge that a license under a third party's
|
to grant the rights to its Contributions conveyed by this License.
|
||||||
intellectual property rights is required to exercise the rights
|
|
||||||
granted by such Contributor under Sections 2.1 or 2.2,
|
|
||||||
Contributor must include a text file with the Source Code
|
|
||||||
distribution titled "LEGAL" which describes the claim and the
|
|
||||||
party making the claim in sufficient detail that a recipient will
|
|
||||||
know whom to contact. If Contributor obtains such knowledge after
|
|
||||||
the Modification is made available as described in Section 3.2,
|
|
||||||
Contributor shall promptly modify the LEGAL file in all copies
|
|
||||||
Contributor makes available thereafter and shall take other steps
|
|
||||||
(such as notifying appropriate mailing lists or newsgroups)
|
|
||||||
reasonably calculated to inform those who received the Covered
|
|
||||||
Code that new knowledge has been obtained.
|
|
||||||
|
|
||||||
(b) Contributor APIs.
|
2.6. Fair Use
|
||||||
If Contributor's Modifications include an application programming
|
|
||||||
interface and Contributor has knowledge of patent licenses which
|
|
||||||
are reasonably necessary to implement that API, Contributor must
|
|
||||||
also include this information in the LEGAL file.
|
|
||||||
|
|
||||||
(c) Representations.
|
This License is not intended to limit any rights You have under
|
||||||
Contributor represents that, except as disclosed pursuant to
|
applicable copyright doctrines of fair use, fair dealing, or other
|
||||||
Section 3.4(a) above, Contributor believes that Contributor's
|
equivalents.
|
||||||
Modifications are Contributor's original creation(s) and/or
|
|
||||||
Contributor has sufficient rights to grant the rights conveyed by
|
|
||||||
this License.
|
|
||||||
|
|
||||||
3.5. Required Notices.
|
2.7. Conditions
|
||||||
You must duplicate the notice in Exhibit A in each file of the Source
|
|
||||||
Code. If it is not possible to put such notice in a particular Source
|
|
||||||
Code file due to its structure, then You must include such notice in a
|
|
||||||
location (such as a relevant directory) where a user would be likely
|
|
||||||
to look for such a notice. If You created one or more Modification(s)
|
|
||||||
You may add your name as a Contributor to the notice described in
|
|
||||||
Exhibit A. You must also duplicate this License in any documentation
|
|
||||||
for the Source Code where You describe recipients' rights or ownership
|
|
||||||
rights relating to Covered Code. You may choose to offer, and to
|
|
||||||
charge a fee for, warranty, support, indemnity or liability
|
|
||||||
obligations to one or more recipients of Covered Code. However, You
|
|
||||||
may do so only on Your own behalf, and not on behalf of the Initial
|
|
||||||
Developer or any Contributor. You must make it absolutely clear than
|
|
||||||
any such warranty, support, indemnity or liability obligation is
|
|
||||||
offered by You alone, and You hereby agree to indemnify the Initial
|
|
||||||
Developer and every Contributor for any liability incurred by the
|
|
||||||
Initial Developer or such Contributor as a result of warranty,
|
|
||||||
support, indemnity or liability terms You offer.
|
|
||||||
|
|
||||||
3.6. Distribution of Executable Versions.
|
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||||
You may distribute Covered Code in Executable form only if the
|
in Section 2.1.
|
||||||
requirements of Section 3.1-3.5 have been met for that Covered Code,
|
|
||||||
and if You include a notice stating that the Source Code version of
|
|
||||||
the Covered Code is available under the terms of this License,
|
|
||||||
including a description of how and where You have fulfilled the
|
|
||||||
obligations of Section 3.2. The notice must be conspicuously included
|
|
||||||
in any notice in an Executable version, related documentation or
|
|
||||||
collateral in which You describe recipients' rights relating to the
|
|
||||||
Covered Code. You may distribute the Executable version of Covered
|
|
||||||
Code or ownership rights under a license of Your choice, which may
|
|
||||||
contain terms different from this License, provided that You are in
|
|
||||||
compliance with the terms of this License and that the license for the
|
|
||||||
Executable version does not attempt to limit or alter the recipient's
|
|
||||||
rights in the Source Code version from the rights set forth in this
|
|
||||||
License. If You distribute the Executable version under a different
|
|
||||||
license You must make it absolutely clear that any terms which differ
|
|
||||||
from this License are offered by You alone, not by the Initial
|
|
||||||
Developer or any Contributor. You hereby agree to indemnify the
|
|
||||||
Initial Developer and every Contributor for any liability incurred by
|
|
||||||
the Initial Developer or such Contributor as a result of any such
|
|
||||||
terms You offer.
|
|
||||||
|
|
||||||
3.7. Larger Works.
|
3. Responsibilities
|
||||||
You may create a Larger Work by combining Covered Code with other code
|
-------------------
|
||||||
not governed by the terms of this License and distribute the Larger
|
|
||||||
Work as a single product. In such a case, You must make sure the
|
|
||||||
requirements of this License are fulfilled for the Covered Code.
|
|
||||||
|
|
||||||
4. Inability to Comply Due to Statute or Regulation.
|
3.1. Distribution of Source Form
|
||||||
|
|
||||||
If it is impossible for You to comply with any of the terms of this
|
All distribution of Covered Software in Source Code Form, including any
|
||||||
License with respect to some or all of the Covered Code due to
|
Modifications that You create or to which You contribute, must be under
|
||||||
statute, judicial order, or regulation then You must: (a) comply with
|
the terms of this License. You must inform recipients that the Source
|
||||||
the terms of this License to the maximum extent possible; and (b)
|
Code Form of the Covered Software is governed by the terms of this
|
||||||
describe the limitations and the code they affect. Such description
|
License, and how they can obtain a copy of this License. You may not
|
||||||
must be included in the LEGAL file described in Section 3.4 and must
|
attempt to alter or restrict the recipients' rights in the Source Code
|
||||||
be included with all distributions of the Source Code. Except to the
|
Form.
|
||||||
extent prohibited by statute or regulation, such description must be
|
|
||||||
sufficiently detailed for a recipient of ordinary skill to be able to
|
|
||||||
understand it.
|
|
||||||
|
|
||||||
5. Application of this License.
|
3.2. Distribution of Executable Form
|
||||||
|
|
||||||
This License applies to code to which the Initial Developer has
|
If You distribute Covered Software in Executable Form then:
|
||||||
attached the notice in Exhibit A and to related Covered Code.
|
|
||||||
|
|
||||||
6. Versions of the License.
|
(a) such Covered Software must also be made available in Source Code
|
||||||
|
Form, as described in Section 3.1, and You must inform recipients of
|
||||||
|
the Executable Form how they can obtain a copy of such Source Code
|
||||||
|
Form by reasonable means in a timely manner, at a charge no more
|
||||||
|
than the cost of distribution to the recipient; and
|
||||||
|
|
||||||
6.1. New Versions.
|
(b) You may distribute such Executable Form under the terms of this
|
||||||
Netscape Communications Corporation ("Netscape") may publish revised
|
License, or sublicense it under different terms, provided that the
|
||||||
and/or new versions of the License from time to time. Each version
|
license for the Executable Form does not attempt to limit or alter
|
||||||
will be given a distinguishing version number.
|
the recipients' rights in the Source Code Form under this License.
|
||||||
|
|
||||||
6.2. Effect of New Versions.
|
3.3. Distribution of a Larger Work
|
||||||
Once Covered Code has been published under a particular version of the
|
|
||||||
License, You may always continue to use it under the terms of that
|
|
||||||
version. You may also choose to use such Covered Code under the terms
|
|
||||||
of any subsequent version of the License published by Netscape. No one
|
|
||||||
other than Netscape has the right to modify the terms applicable to
|
|
||||||
Covered Code created under this License.
|
|
||||||
|
|
||||||
6.3. Derivative Works.
|
You may create and distribute a Larger Work under terms of Your choice,
|
||||||
If You create or use a modified version of this License (which you may
|
provided that You also comply with the requirements of this License for
|
||||||
only do in order to apply it to code which is not already Covered Code
|
the Covered Software. If the Larger Work is a combination of Covered
|
||||||
governed by this License), You must (a) rename Your license so that
|
Software with a work governed by one or more Secondary Licenses, and the
|
||||||
the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
|
Covered Software is not Incompatible With Secondary Licenses, this
|
||||||
"MPL", "NPL" or any confusingly similar phrase do not appear in your
|
License permits You to additionally distribute such Covered Software
|
||||||
license (except to note that your license differs from this License)
|
under the terms of such Secondary License(s), so that the recipient of
|
||||||
and (b) otherwise make it clear that Your version of the license
|
the Larger Work may, at their option, further distribute the Covered
|
||||||
contains terms which differ from the Mozilla Public License and
|
Software under the terms of either this License or such Secondary
|
||||||
Netscape Public License. (Filling in the name of the Initial
|
License(s).
|
||||||
Developer, Original Code or Contributor in the notice described in
|
|
||||||
Exhibit A shall not of themselves be deemed to be modifications of
|
|
||||||
this License.)
|
|
||||||
|
|
||||||
7. DISCLAIMER OF WARRANTY.
|
3.4. Notices
|
||||||
|
|
||||||
COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
|
You may not remove or alter the substance of any license notices
|
||||||
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
(including copyright notices, patent notices, disclaimers of warranty,
|
||||||
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
|
or limitations of liability) contained within the Source Code Form of
|
||||||
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
|
the Covered Software, except that You may alter any license notices to
|
||||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
|
the extent required to remedy known factual inaccuracies.
|
||||||
IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
|
|
||||||
YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
|
|
||||||
COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
|
|
||||||
OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
|
|
||||||
ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
|
|
||||||
|
|
||||||
8. TERMINATION.
|
3.5. Application of Additional Terms
|
||||||
|
|
||||||
8.1. This License and the rights granted hereunder will terminate
|
You may choose to offer, and to charge a fee for, warranty, support,
|
||||||
automatically if You fail to comply with terms herein and fail to cure
|
indemnity or liability obligations to one or more recipients of Covered
|
||||||
such breach within 30 days of becoming aware of the breach. All
|
Software. However, You may do so only on Your own behalf, and not on
|
||||||
sublicenses to the Covered Code which are properly granted shall
|
behalf of any Contributor. You must make it absolutely clear that any
|
||||||
survive any termination of this License. Provisions which, by their
|
such warranty, support, indemnity, or liability obligation is offered by
|
||||||
nature, must remain in effect beyond the termination of this License
|
You alone, and You hereby agree to indemnify every Contributor for any
|
||||||
shall survive.
|
liability incurred by such Contributor as a result of warranty, support,
|
||||||
|
indemnity or liability terms You offer. You may include additional
|
||||||
|
disclaimers of warranty and limitations of liability specific to any
|
||||||
|
jurisdiction.
|
||||||
|
|
||||||
8.2. If You initiate litigation by asserting a patent infringement
|
4. Inability to Comply Due to Statute or Regulation
|
||||||
claim (excluding declatory judgment actions) against Initial Developer
|
---------------------------------------------------
|
||||||
or a Contributor (the Initial Developer or Contributor against whom
|
|
||||||
You file such action is referred to as "Participant") alleging that:
|
|
||||||
|
|
||||||
(a) such Participant's Contributor Version directly or indirectly
|
If it is impossible for You to comply with any of the terms of this
|
||||||
infringes any patent, then any and all rights granted by such
|
License with respect to some or all of the Covered Software due to
|
||||||
Participant to You under Sections 2.1 and/or 2.2 of this License
|
statute, judicial order, or regulation then You must: (a) comply with
|
||||||
shall, upon 60 days notice from Participant terminate prospectively,
|
the terms of this License to the maximum extent possible; and (b)
|
||||||
unless if within 60 days after receipt of notice You either: (i)
|
describe the limitations and the code they affect. Such description must
|
||||||
agree in writing to pay Participant a mutually agreeable reasonable
|
be placed in a text file included with all distributions of the Covered
|
||||||
royalty for Your past and future use of Modifications made by such
|
Software under this License. Except to the extent prohibited by statute
|
||||||
Participant, or (ii) withdraw Your litigation claim with respect to
|
or regulation, such description must be sufficiently detailed for a
|
||||||
the Contributor Version against such Participant. If within 60 days
|
recipient of ordinary skill to be able to understand it.
|
||||||
of notice, a reasonable royalty and payment arrangement are not
|
|
||||||
mutually agreed upon in writing by the parties or the litigation claim
|
|
||||||
is not withdrawn, the rights granted by Participant to You under
|
|
||||||
Sections 2.1 and/or 2.2 automatically terminate at the expiration of
|
|
||||||
the 60 day notice period specified above.
|
|
||||||
|
|
||||||
(b) any software, hardware, or device, other than such Participant's
|
5. Termination
|
||||||
Contributor Version, directly or indirectly infringes any patent, then
|
--------------
|
||||||
any rights granted to You by such Participant under Sections 2.1(b)
|
|
||||||
and 2.2(b) are revoked effective as of the date You first made, used,
|
|
||||||
sold, distributed, or had made, Modifications made by that
|
|
||||||
Participant.
|
|
||||||
|
|
||||||
8.3. If You assert a patent infringement claim against Participant
|
5.1. The rights granted under this License will terminate automatically
|
||||||
alleging that such Participant's Contributor Version directly or
|
if You fail to comply with any of its terms. However, if You become
|
||||||
indirectly infringes any patent where such claim is resolved (such as
|
compliant, then the rights granted under this License from a particular
|
||||||
by license or settlement) prior to the initiation of patent
|
Contributor are reinstated (a) provisionally, unless and until such
|
||||||
infringement litigation, then the reasonable value of the licenses
|
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||||
granted by such Participant under Sections 2.1 or 2.2 shall be taken
|
ongoing basis, if such Contributor fails to notify You of the
|
||||||
into account in determining the amount or value of any payment or
|
non-compliance by some reasonable means prior to 60 days after You have
|
||||||
license.
|
come back into compliance. Moreover, Your grants from a particular
|
||||||
|
Contributor are reinstated on an ongoing basis if such Contributor
|
||||||
|
notifies You of the non-compliance by some reasonable means, this is the
|
||||||
|
first time You have received notice of non-compliance with this License
|
||||||
|
from such Contributor, and You become compliant prior to 30 days after
|
||||||
|
Your receipt of the notice.
|
||||||
|
|
||||||
8.4. In the event of termination under Sections 8.1 or 8.2 above,
|
5.2. If You initiate litigation against any entity by asserting a patent
|
||||||
all end user license agreements (excluding distributors and resellers)
|
infringement claim (excluding declaratory judgment actions,
|
||||||
which have been validly granted by You or any distributor hereunder
|
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||||
prior to termination shall survive termination.
|
directly or indirectly infringes any patent, then the rights granted to
|
||||||
|
You by any and all Contributors for the Covered Software under Section
|
||||||
|
2.1 of this License shall terminate.
|
||||||
|
|
||||||
9. LIMITATION OF LIABILITY.
|
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||||
|
end user license agreements (excluding distributors and resellers) which
|
||||||
|
have been validly granted by You or Your distributors under this License
|
||||||
|
prior to termination shall survive termination.
|
||||||
|
|
||||||
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
|
************************************************************************
|
||||||
(INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
|
* *
|
||||||
DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
|
* 6. Disclaimer of Warranty *
|
||||||
OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
|
* ------------------------- *
|
||||||
ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
|
* *
|
||||||
CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
|
* Covered Software is provided under this License on an "as is" *
|
||||||
WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
|
* basis, without warranty of any kind, either expressed, implied, or *
|
||||||
COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
|
* statutory, including, without limitation, warranties that the *
|
||||||
INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
|
* Covered Software is free of defects, merchantable, fit for a *
|
||||||
LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
|
* particular purpose or non-infringing. The entire risk as to the *
|
||||||
RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
|
* quality and performance of the Covered Software is with You. *
|
||||||
PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
|
* Should any Covered Software prove defective in any respect, You *
|
||||||
EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
|
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||||
THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
|
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||||
|
* essential part of this License. No use of any Covered Software is *
|
||||||
|
* authorized under this License except under this disclaimer. *
|
||||||
|
* *
|
||||||
|
************************************************************************
|
||||||
|
|
||||||
10. U.S. GOVERNMENT END USERS.
|
************************************************************************
|
||||||
|
* *
|
||||||
|
* 7. Limitation of Liability *
|
||||||
|
* -------------------------- *
|
||||||
|
* *
|
||||||
|
* Under no circumstances and under no legal theory, whether tort *
|
||||||
|
* (including negligence), contract, or otherwise, shall any *
|
||||||
|
* Contributor, or anyone who distributes Covered Software as *
|
||||||
|
* permitted above, be liable to You for any direct, indirect, *
|
||||||
|
* special, incidental, or consequential damages of any character *
|
||||||
|
* including, without limitation, damages for lost profits, loss of *
|
||||||
|
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||||
|
* and all other commercial damages or losses, even if such party *
|
||||||
|
* shall have been informed of the possibility of such damages. This *
|
||||||
|
* limitation of liability shall not apply to liability for death or *
|
||||||
|
* personal injury resulting from such party's negligence to the *
|
||||||
|
* extent applicable law prohibits such limitation. Some *
|
||||||
|
* jurisdictions do not allow the exclusion or limitation of *
|
||||||
|
* incidental or consequential damages, so this exclusion and *
|
||||||
|
* limitation may not apply to You. *
|
||||||
|
* *
|
||||||
|
************************************************************************
|
||||||
|
|
||||||
The Covered Code is a "commercial item," as that term is defined in
|
8. Litigation
|
||||||
48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
|
-------------
|
||||||
software" and "commercial computer software documentation," as such
|
|
||||||
terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
|
|
||||||
C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
|
|
||||||
all U.S. Government End Users acquire Covered Code with only those
|
|
||||||
rights set forth herein.
|
|
||||||
|
|
||||||
11. MISCELLANEOUS.
|
Any litigation relating to this License may be brought only in the
|
||||||
|
courts of a jurisdiction where the defendant maintains its principal
|
||||||
|
place of business and such litigation shall be governed by laws of that
|
||||||
|
jurisdiction, without reference to its conflict-of-law provisions.
|
||||||
|
Nothing in this Section shall prevent a party's ability to bring
|
||||||
|
cross-claims or counter-claims.
|
||||||
|
|
||||||
This License represents the complete agreement concerning subject
|
9. Miscellaneous
|
||||||
matter hereof. If any provision of this License is held to be
|
----------------
|
||||||
unenforceable, such provision shall be reformed only to the extent
|
|
||||||
necessary to make it enforceable. This License shall be governed by
|
|
||||||
California law provisions (except to the extent applicable law, if
|
|
||||||
any, provides otherwise), excluding its conflict-of-law provisions.
|
|
||||||
With respect to disputes in which at least one party is a citizen of,
|
|
||||||
or an entity chartered or registered to do business in the United
|
|
||||||
States of America, any litigation relating to this License shall be
|
|
||||||
subject to the jurisdiction of the Federal Courts of the Northern
|
|
||||||
District of California, with venue lying in Santa Clara County,
|
|
||||||
California, with the losing party responsible for costs, including
|
|
||||||
without limitation, court costs and reasonable attorneys' fees and
|
|
||||||
expenses. The application of the United Nations Convention on
|
|
||||||
Contracts for the International Sale of Goods is expressly excluded.
|
|
||||||
Any law or regulation which provides that the language of a contract
|
|
||||||
shall be construed against the drafter shall not apply to this
|
|
||||||
License.
|
|
||||||
|
|
||||||
12. RESPONSIBILITY FOR CLAIMS.
|
This License represents the complete agreement concerning the subject
|
||||||
|
matter hereof. If any provision of this License is held to be
|
||||||
|
unenforceable, such provision shall be reformed only to the extent
|
||||||
|
necessary to make it enforceable. Any law or regulation which provides
|
||||||
|
that the language of a contract shall be construed against the drafter
|
||||||
|
shall not be used to construe this License against a Contributor.
|
||||||
|
|
||||||
As between Initial Developer and the Contributors, each party is
|
10. Versions of the License
|
||||||
responsible for claims and damages arising, directly or indirectly,
|
---------------------------
|
||||||
out of its utilization of rights under this License and You agree to
|
|
||||||
work with Initial Developer and Contributors to distribute such
|
|
||||||
responsibility on an equitable basis. Nothing herein is intended or
|
|
||||||
shall be deemed to constitute any admission of liability.
|
|
||||||
|
|
||||||
13. MULTIPLE-LICENSED CODE.
|
10.1. New Versions
|
||||||
|
|
||||||
Initial Developer may designate portions of the Covered Code as
|
Mozilla Foundation is the license steward. Except as provided in Section
|
||||||
"Multiple-Licensed". "Multiple-Licensed" means that the Initial
|
10.3, no one other than the license steward has the right to modify or
|
||||||
Developer permits you to utilize portions of the Covered Code under
|
publish new versions of this License. Each version will be given a
|
||||||
Your choice of the NPL or the alternative licenses, if any, specified
|
distinguishing version number.
|
||||||
by the Initial Developer in the file described in Exhibit A.
|
|
||||||
|
|
||||||
EXHIBIT A -Mozilla Public License.
|
10.2. Effect of New Versions
|
||||||
|
|
||||||
``The contents of this file are subject to the Mozilla Public License
|
You may distribute the Covered Software under the terms of the version
|
||||||
Version 1.1 (the "License"); you may not use this file except in
|
of the License under which You originally received the Covered Software,
|
||||||
compliance with the License. You may obtain a copy of the License at
|
or under the terms of any subsequent version published by the license
|
||||||
http://www.mozilla.org/MPL/
|
steward.
|
||||||
|
|
||||||
Software distributed under the License is distributed on an "AS IS"
|
10.3. Modified Versions
|
||||||
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
||||||
License for the specific language governing rights and limitations
|
|
||||||
under the License.
|
|
||||||
|
|
||||||
The Original Code is ______________________________________.
|
If you create software not governed by this License, and you want to
|
||||||
|
create a new license for such software, you may create and use a
|
||||||
|
modified version of this License if you rename the license and remove
|
||||||
|
any references to the name of the license steward (except to note that
|
||||||
|
such modified license differs from this License).
|
||||||
|
|
||||||
The Initial Developer of the Original Code is ________________________.
|
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||||
Portions created by ______________________ are Copyright (C) ______
|
Licenses
|
||||||
_______________________. All Rights Reserved.
|
|
||||||
|
|
||||||
Contributor(s): ______________________________________.
|
If You choose to distribute Source Code Form that is Incompatible With
|
||||||
|
Secondary Licenses under the terms of this version of the License, the
|
||||||
|
notice described in Exhibit B of this License must be attached.
|
||||||
|
|
||||||
Alternatively, the contents of this file may be used under the terms
|
Exhibit A - Source Code Form License Notice
|
||||||
of the _____ license (the "[___] License"), in which case the
|
-------------------------------------------
|
||||||
provisions of [______] License are applicable instead of those
|
|
||||||
above. If you wish to allow use of your version of this file only
|
|
||||||
under the terms of the [____] License and not to allow others to use
|
|
||||||
your version of this file under the MPL, indicate your decision by
|
|
||||||
deleting the provisions above and replace them with the notice and
|
|
||||||
other provisions required by the [___] License. If you do not delete
|
|
||||||
the provisions above, a recipient may use your version of this file
|
|
||||||
under either the MPL or the [___] License."
|
|
||||||
|
|
||||||
[NOTE: The text of this Exhibit A may differ slightly from the text of
|
This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
the notices in the Source Code files of the Original Code. You should
|
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
use the text of this Exhibit A rather than the text found in the
|
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
Original Code Source Code for Your Modifications.]
|
|
||||||
|
|
||||||
|
If it is not possible or desirable to put the notice in a particular
|
||||||
|
file, then You may include the notice in a location (such as a LICENSE
|
||||||
|
file in a relevant directory) where a recipient would be likely to look
|
||||||
|
for such a notice.
|
||||||
|
|
||||||
|
You may add additional accurate notices of copyright ownership.
|
||||||
|
|
||||||
|
Exhibit B - "Incompatible With Secondary Licenses" Notice
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
This Source Code Form is "Incompatible With Secondary Licenses", as
|
||||||
|
defined by the Mozilla Public License, v. 2.0.
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
SUBDIRS = example tests
|
||||||
|
|
||||||
|
.PHONY: subdirs $(SUBDIRS)
|
||||||
|
|
||||||
|
subdirs: $(SUBDIRS)
|
||||||
|
|
||||||
|
$(SUBDIRS):
|
||||||
|
$(MAKE) -C $@
|
||||||
|
|
||||||
|
CLEANDIRS = $(SUBDIRS:%=clean-%)
|
||||||
|
|
||||||
|
clean: $(CLEANDIRS)
|
||||||
|
$(CLEANDIRS):
|
||||||
|
$(MAKE) -C $(@:clean-%=%) clean
|
||||||
|
|
||||||
|
test:
|
||||||
|
$(MAKE) -C tests test
|
||||||
|
|
||||||
|
.PHONY: subdirs $(INSTALLDIRS)
|
||||||
|
.PHONY: clean test
|
||||||
+983
-217
File diff suppressed because it is too large
Load Diff
+133
-7
@@ -1,12 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
* Memory DLL loading code
|
* Memory DLL loading code
|
||||||
* Version 0.0.3
|
* Version 0.0.4
|
||||||
*
|
*
|
||||||
* Copyright (c) 2004-2012 by Joachim Bauch / mail@joachim-bauch.de
|
* Copyright (c) 2004-2015 by Joachim Bauch / mail@joachim-bauch.de
|
||||||
* http://www.joachim-bauch.de
|
* http://www.joachim-bauch.de
|
||||||
*
|
*
|
||||||
* The contents of this file are subject to the Mozilla Public License Version
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
* 2.0 (the "License"); you may not use this file except in compliance with
|
||||||
* the License. You may obtain a copy of the License at
|
* the License. You may obtain a copy of the License at
|
||||||
* http://www.mozilla.org/MPL/
|
* http://www.mozilla.org/MPL/
|
||||||
*
|
*
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
*
|
*
|
||||||
* The Initial Developer of the Original Code is Joachim Bauch.
|
* The Initial Developer of the Original Code is Joachim Bauch.
|
||||||
*
|
*
|
||||||
* Portions created by Joachim Bauch are Copyright (C) 2004-2012
|
* Portions created by Joachim Bauch are Copyright (C) 2004-2015
|
||||||
* Joachim Bauch. All Rights Reserved.
|
* Joachim Bauch. All Rights Reserved.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -27,20 +27,146 @@
|
|||||||
#ifndef __MEMORY_MODULE_HEADER
|
#ifndef __MEMORY_MODULE_HEADER
|
||||||
#define __MEMORY_MODULE_HEADER
|
#define __MEMORY_MODULE_HEADER
|
||||||
|
|
||||||
#include <Windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
typedef void *HMEMORYMODULE;
|
typedef void *HMEMORYMODULE;
|
||||||
|
|
||||||
|
typedef void *HMEMORYRSRC;
|
||||||
|
|
||||||
|
typedef void *HCUSTOMMODULE;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
HMEMORYMODULE MemoryLoadLibrary(const void *);
|
typedef LPVOID (*CustomAllocFunc)(LPVOID, SIZE_T, DWORD, DWORD, void*);
|
||||||
|
typedef BOOL (*CustomFreeFunc)(LPVOID, SIZE_T, DWORD, void*);
|
||||||
|
typedef HCUSTOMMODULE (*CustomLoadLibraryFunc)(LPCSTR, void *);
|
||||||
|
typedef FARPROC (*CustomGetProcAddressFunc)(HCUSTOMMODULE, LPCSTR, void *);
|
||||||
|
typedef void (*CustomFreeLibraryFunc)(HCUSTOMMODULE, void *);
|
||||||
|
|
||||||
FARPROC MemoryGetProcAddress(HMEMORYMODULE, const char *);
|
/**
|
||||||
|
* Load EXE/DLL from memory location with the given size.
|
||||||
|
*
|
||||||
|
* All dependencies are resolved using default LoadLibrary/GetProcAddress
|
||||||
|
* calls through the Windows API.
|
||||||
|
*/
|
||||||
|
HMEMORYMODULE MemoryLoadLibrary(const void *, size_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load EXE/DLL from memory location with the given size using custom dependency
|
||||||
|
* resolvers.
|
||||||
|
*
|
||||||
|
* Dependencies will be resolved using passed callback methods.
|
||||||
|
*/
|
||||||
|
HMEMORYMODULE MemoryLoadLibraryEx(const void *, size_t,
|
||||||
|
CustomAllocFunc,
|
||||||
|
CustomFreeFunc,
|
||||||
|
CustomLoadLibraryFunc,
|
||||||
|
CustomGetProcAddressFunc,
|
||||||
|
CustomFreeLibraryFunc,
|
||||||
|
void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get address of exported method. Supports loading both by name and by
|
||||||
|
* ordinal value.
|
||||||
|
*/
|
||||||
|
FARPROC MemoryGetProcAddress(HMEMORYMODULE, LPCSTR);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the code base address of loading module to store it above.
|
||||||
|
* On load dynamic library it used as a handle of library instance.
|
||||||
|
*/
|
||||||
|
LPVOID MemoryGetCodeAddress(HMEMORYMODULE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free previously loaded EXE/DLL.
|
||||||
|
*/
|
||||||
void MemoryFreeLibrary(HMEMORYMODULE);
|
void MemoryFreeLibrary(HMEMORYMODULE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute entry point (EXE only). The entry point can only be executed
|
||||||
|
* if the EXE has been loaded to the correct base address or it could
|
||||||
|
* be relocated (i.e. relocation information have not been stripped by
|
||||||
|
* the linker).
|
||||||
|
*
|
||||||
|
* Important: calling this function will not return, i.e. once the loaded
|
||||||
|
* EXE finished running, the process will terminate.
|
||||||
|
*
|
||||||
|
* Returns a negative value if the entry point could not be executed.
|
||||||
|
*/
|
||||||
|
int MemoryCallEntryPoint(HMEMORYMODULE);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the location of a resource with the specified type and name.
|
||||||
|
*/
|
||||||
|
HMEMORYRSRC MemoryFindResource(HMEMORYMODULE, LPCTSTR, LPCTSTR);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the location of a resource with the specified type, name and language.
|
||||||
|
*/
|
||||||
|
HMEMORYRSRC MemoryFindResourceEx(HMEMORYMODULE, LPCTSTR, LPCTSTR, WORD);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the size of the resource in bytes.
|
||||||
|
*/
|
||||||
|
DWORD MemorySizeofResource(HMEMORYMODULE, HMEMORYRSRC);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a pointer to the contents of the resource.
|
||||||
|
*/
|
||||||
|
LPVOID MemoryLoadResource(HMEMORYMODULE, HMEMORYRSRC);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a string resource.
|
||||||
|
*/
|
||||||
|
int MemoryLoadString(HMEMORYMODULE, UINT, LPTSTR, int);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a string resource with a given language.
|
||||||
|
*/
|
||||||
|
int MemoryLoadStringEx(HMEMORYMODULE, UINT, LPTSTR, int, WORD);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of CustomAllocFunc that calls VirtualAlloc
|
||||||
|
* internally to allocate memory for a library
|
||||||
|
*
|
||||||
|
* This is the default as used by MemoryLoadLibrary.
|
||||||
|
*/
|
||||||
|
LPVOID MemoryDefaultAlloc(LPVOID, SIZE_T, DWORD, DWORD, void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of CustomFreeFunc that calls VirtualFree
|
||||||
|
* internally to free the memory used by a library
|
||||||
|
*
|
||||||
|
* This is the default as used by MemoryLoadLibrary.
|
||||||
|
*/
|
||||||
|
BOOL MemoryDefaultFree(LPVOID, SIZE_T, DWORD, void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of CustomLoadLibraryFunc that calls LoadLibraryA
|
||||||
|
* internally to load an additional libary.
|
||||||
|
*
|
||||||
|
* This is the default as used by MemoryLoadLibrary.
|
||||||
|
*/
|
||||||
|
HCUSTOMMODULE MemoryDefaultLoadLibrary(LPCSTR, void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of CustomGetProcAddressFunc that calls GetProcAddress
|
||||||
|
* internally to get the address of an exported function.
|
||||||
|
*
|
||||||
|
* This is the default as used by MemoryLoadLibrary.
|
||||||
|
*/
|
||||||
|
FARPROC MemoryDefaultGetProcAddress(HCUSTOMMODULE, LPCSTR, void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default implementation of CustomFreeLibraryFunc that calls FreeLibrary
|
||||||
|
* internally to release an additional libary.
|
||||||
|
*
|
||||||
|
* This is the default as used by MemoryLoadLibrary.
|
||||||
|
*/
|
||||||
|
void MemoryDefaultFreeLibrary(HCUSTOMMODULE, void *);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# Status available at
|
||||||
|
# https://ci.appveyor.com/project/fancycode/memorymodule
|
||||||
|
version: 1.0.{build}
|
||||||
|
|
||||||
|
os:
|
||||||
|
- Visual Studio 2015
|
||||||
|
|
||||||
|
environment:
|
||||||
|
matrix:
|
||||||
|
- GENERATOR: "Visual Studio 9 2008"
|
||||||
|
UNICODE: ON
|
||||||
|
- GENERATOR: "Visual Studio 9 2008"
|
||||||
|
UNICODE: OFF
|
||||||
|
- GENERATOR: "Visual Studio 10 2010"
|
||||||
|
UNICODE: ON
|
||||||
|
- GENERATOR: "Visual Studio 10 2010"
|
||||||
|
UNICODE: OFF
|
||||||
|
- GENERATOR: "Visual Studio 11 2012"
|
||||||
|
UNICODE: ON
|
||||||
|
- GENERATOR: "Visual Studio 11 2012"
|
||||||
|
UNICODE: OFF
|
||||||
|
- GENERATOR: "Visual Studio 12 2013"
|
||||||
|
UNICODE: ON
|
||||||
|
- GENERATOR: "Visual Studio 12 2013"
|
||||||
|
UNICODE: OFF
|
||||||
|
- GENERATOR: "Visual Studio 14 2015"
|
||||||
|
UNICODE: ON
|
||||||
|
- GENERATOR: "Visual Studio 14 2015"
|
||||||
|
UNICODE: OFF
|
||||||
|
|
||||||
|
platform:
|
||||||
|
- x86
|
||||||
|
- x64
|
||||||
|
|
||||||
|
configuration:
|
||||||
|
- Debug
|
||||||
|
|
||||||
|
install:
|
||||||
|
- call scripts\run-appveyor.bat
|
||||||
|
|
||||||
|
build: off
|
||||||
|
test: off
|
||||||
|
deploy: off
|
||||||
@@ -511,7 +511,7 @@ The interface is very similar to the standard methods for loading of libraries::
|
|||||||
|
|
||||||
typedef void *HMEMORYMODULE;
|
typedef void *HMEMORYMODULE;
|
||||||
|
|
||||||
HMEMORYMODULE MemoryLoadLibrary(const void *);
|
HMEMORYMODULE MemoryLoadLibrary(const void *, size_t);
|
||||||
FARPROC MemoryGetProcAddress(HMEMORYMODULE, const char *);
|
FARPROC MemoryGetProcAddress(HMEMORYMODULE, const char *);
|
||||||
void MemoryFreeLibrary(HMEMORYMODULE);
|
void MemoryFreeLibrary(HMEMORYMODULE);
|
||||||
|
|
||||||
@@ -543,4 +543,4 @@ Copyright
|
|||||||
==========
|
==========
|
||||||
|
|
||||||
The MemoryModule library and this tutorial are
|
The MemoryModule library and this tutorial are
|
||||||
Copyright (c) 2004-2012 by Joachim Bauch.
|
Copyright (c) 2004-2015 by Joachim Bauch.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
add_subdirectory (DllLoader)
|
||||||
|
add_subdirectory (SampleDLL)
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
set (sources_dllloader
|
||||||
|
DllLoader.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set (sources_dllloaderloader
|
||||||
|
DllLoaderLoader.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
if (NOT MSVC)
|
||||||
|
set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-static")
|
||||||
|
set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "-static")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_executable (DllLoader ${sources_dllloader})
|
||||||
|
target_link_libraries ("DllLoader" "MemoryModule")
|
||||||
|
if (NOT MSVC)
|
||||||
|
set_target_properties ("DllLoader" PROPERTIES SUFFIX ".exe")
|
||||||
|
set_target_properties ("DllLoader" PROPERTIES LINK_FLAGS "-Wl,--image-base -Wl,0x20000000")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_executable (DllLoaderLoader ${sources_dllloaderloader})
|
||||||
|
target_link_libraries ("DllLoaderLoader" "MemoryModule")
|
||||||
|
if (NOT MSVC)
|
||||||
|
set_target_properties ("DllLoaderLoader" PROPERTIES SUFFIX ".exe")
|
||||||
|
set_target_properties ("DllLoaderLoader" PROPERTIES LINK_FLAGS "-Wl,--image-base -Wl,0x10000000")
|
||||||
|
endif ()
|
||||||
+299
-26
@@ -1,6 +1,11 @@
|
|||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <tchar.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
|
||||||
@@ -8,63 +13,331 @@
|
|||||||
|
|
||||||
typedef int (*addNumberProc)(int, int);
|
typedef int (*addNumberProc)(int, int);
|
||||||
|
|
||||||
#define DLL_FILE "..\\SampleDLL\\SampleDLL.dll"
|
#define DLL_FILE TEXT("..\\SampleDLL\\SampleDLL.dll")
|
||||||
|
|
||||||
void LoadFromFile(void)
|
void LoadFromFile(void)
|
||||||
{
|
{
|
||||||
addNumberProc addNumber;
|
addNumberProc addNumber;
|
||||||
|
HRSRC resourceInfo;
|
||||||
|
DWORD resourceSize;
|
||||||
|
LPVOID resourceData;
|
||||||
|
TCHAR buffer[100];
|
||||||
|
|
||||||
HINSTANCE handle = LoadLibrary(DLL_FILE);
|
HINSTANCE handle = LoadLibrary(DLL_FILE);
|
||||||
if (handle == INVALID_HANDLE_VALUE)
|
if (handle == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
addNumber = (addNumberProc)GetProcAddress(handle, "addNumbers");
|
addNumber = (addNumberProc)GetProcAddress(handle, "addNumbers");
|
||||||
printf("From file: %d\n", addNumber(1, 2));
|
_tprintf(_T("From file: %d\n"), addNumber(1, 2));
|
||||||
|
|
||||||
|
resourceInfo = FindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
|
||||||
|
_tprintf(_T("FindResource returned 0x%p\n"), resourceInfo);
|
||||||
|
|
||||||
|
resourceSize = SizeofResource(handle, resourceInfo);
|
||||||
|
resourceData = LoadResource(handle, resourceInfo);
|
||||||
|
_tprintf(_T("Resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
|
||||||
|
|
||||||
|
LoadString(handle, 1, buffer, sizeof(buffer));
|
||||||
|
_tprintf(_T("String1: %s\n"), buffer);
|
||||||
|
|
||||||
|
LoadString(handle, 20, buffer, sizeof(buffer));
|
||||||
|
_tprintf(_T("String2: %s\n"), buffer);
|
||||||
|
|
||||||
FreeLibrary(handle);
|
FreeLibrary(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* ReadLibrary(size_t* pSize) {
|
||||||
|
size_t read;
|
||||||
|
void* result;
|
||||||
|
FILE* fp;
|
||||||
|
|
||||||
|
fp = _tfopen(DLL_FILE, _T("rb"));
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("Can't open DLL file \"%s\"."), DLL_FILE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
*pSize = static_cast<size_t>(ftell(fp));
|
||||||
|
if (*pSize == 0)
|
||||||
|
{
|
||||||
|
fclose(fp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = (unsigned char *)malloc(*pSize);
|
||||||
|
if (result == NULL)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
read = fread(result, 1, *pSize, fp);
|
||||||
|
fclose(fp);
|
||||||
|
if (read != *pSize)
|
||||||
|
{
|
||||||
|
free(result);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void LoadFromMemory(void)
|
void LoadFromMemory(void)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
void *data;
|
||||||
unsigned char *data=NULL;
|
|
||||||
size_t size;
|
size_t size;
|
||||||
HMEMORYMODULE module;
|
HMEMORYMODULE handle;
|
||||||
addNumberProc addNumber;
|
addNumberProc addNumber;
|
||||||
|
HMEMORYRSRC resourceInfo;
|
||||||
|
DWORD resourceSize;
|
||||||
|
LPVOID resourceData;
|
||||||
|
TCHAR buffer[100];
|
||||||
|
|
||||||
fp = fopen(DLL_FILE, "rb");
|
data = ReadLibrary(&size);
|
||||||
if (fp == NULL)
|
if (data == NULL)
|
||||||
{
|
{
|
||||||
printf("Can't open DLL file \"%s\".", DLL_FILE);
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
handle = MemoryLoadLibrary(data, size);
|
||||||
|
if (handle == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("Can't load library from memory.\n"));
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_END);
|
addNumber = (addNumberProc)MemoryGetProcAddress(handle, "addNumbers");
|
||||||
size = ftell(fp);
|
_tprintf(_T("From memory: %d\n"), addNumber(1, 2));
|
||||||
data = (unsigned char *)malloc(size);
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
fread(data, 1, size, fp);
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
module = MemoryLoadLibrary(data);
|
resourceInfo = MemoryFindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
|
||||||
if (module == NULL)
|
_tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
|
||||||
{
|
|
||||||
printf("Can't load library from memory.\n");
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
addNumber = (addNumberProc)MemoryGetProcAddress(module, "addNumbers");
|
resourceSize = MemorySizeofResource(handle, resourceInfo);
|
||||||
printf("From memory: %d\n", addNumber(1, 2));
|
resourceData = MemoryLoadResource(handle, resourceInfo);
|
||||||
MemoryFreeLibrary(module);
|
_tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
|
||||||
|
|
||||||
|
MemoryLoadString(handle, 1, buffer, sizeof(buffer));
|
||||||
|
_tprintf(_T("String1: %s\n"), buffer);
|
||||||
|
|
||||||
|
MemoryLoadString(handle, 20, buffer, sizeof(buffer));
|
||||||
|
_tprintf(_T("String2: %s\n"), buffer);
|
||||||
|
|
||||||
|
MemoryFreeLibrary(handle);
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (data)
|
|
||||||
free(data);
|
free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
#define MAX_CALLS 20
|
||||||
|
|
||||||
|
struct CallList {
|
||||||
|
int current_alloc_call, current_free_call;
|
||||||
|
CustomAllocFunc alloc_calls[MAX_CALLS];
|
||||||
|
CustomFreeFunc free_calls[MAX_CALLS];
|
||||||
|
};
|
||||||
|
|
||||||
|
LPVOID MemoryFailingAlloc(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect, void* userdata)
|
||||||
|
{
|
||||||
|
UNREFERENCED_PARAMETER(address);
|
||||||
|
UNREFERENCED_PARAMETER(size);
|
||||||
|
UNREFERENCED_PARAMETER(allocationType);
|
||||||
|
UNREFERENCED_PARAMETER(protect);
|
||||||
|
UNREFERENCED_PARAMETER(userdata);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPVOID MemoryMockAlloc(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect, void* userdata)
|
||||||
|
{
|
||||||
|
CallList* calls = (CallList*)userdata;
|
||||||
|
CustomAllocFunc current_func = calls->alloc_calls[calls->current_alloc_call++];
|
||||||
|
assert(current_func != NULL);
|
||||||
|
return current_func(address, size, allocationType, protect, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL MemoryMockFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType, void* userdata)
|
||||||
|
{
|
||||||
|
CallList* calls = (CallList*)userdata;
|
||||||
|
CustomFreeFunc current_func = calls->free_calls[calls->current_free_call++];
|
||||||
|
assert(current_func != NULL);
|
||||||
|
return current_func(lpAddress, dwSize, dwFreeType, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitFuncs(void** funcs, va_list args) {
|
||||||
|
for (int i = 0; ; i++) {
|
||||||
|
assert(i < MAX_CALLS);
|
||||||
|
funcs[i] = va_arg(args, void*);
|
||||||
|
if (funcs[i] == NULL) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitAllocFuncs(CallList* calls, ...) {
|
||||||
|
va_list args;
|
||||||
|
va_start(args, calls);
|
||||||
|
InitFuncs((void**)calls->alloc_calls, args);
|
||||||
|
va_end(args);
|
||||||
|
calls->current_alloc_call = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitFreeFuncs(CallList* calls, ...) {
|
||||||
|
va_list args;
|
||||||
|
va_start(args, calls);
|
||||||
|
InitFuncs((void**)calls->free_calls, args);
|
||||||
|
va_end(args);
|
||||||
|
calls->current_free_call = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitFreeFunc(CallList* calls, CustomFreeFunc freeFunc) {
|
||||||
|
for (int i = 0; i < MAX_CALLS; i++) {
|
||||||
|
calls->free_calls[i] = freeFunc;
|
||||||
|
}
|
||||||
|
calls->current_free_call = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestFailingAllocation(void *data, size_t size) {
|
||||||
|
CallList expected_calls;
|
||||||
|
HMEMORYMODULE handle;
|
||||||
|
|
||||||
|
InitAllocFuncs(&expected_calls, MemoryFailingAlloc, MemoryFailingAlloc, NULL);
|
||||||
|
InitFreeFuncs(&expected_calls, NULL);
|
||||||
|
|
||||||
|
handle = MemoryLoadLibraryEx(
|
||||||
|
data, size, MemoryMockAlloc, MemoryMockFree, MemoryDefaultLoadLibrary,
|
||||||
|
MemoryDefaultGetProcAddress, MemoryDefaultFreeLibrary, &expected_calls);
|
||||||
|
|
||||||
|
assert(handle == NULL);
|
||||||
|
assert(GetLastError() == ERROR_OUTOFMEMORY);
|
||||||
|
assert(expected_calls.current_free_call == 0);
|
||||||
|
|
||||||
|
MemoryFreeLibrary(handle);
|
||||||
|
assert(expected_calls.current_free_call == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestCleanupAfterFailingAllocation(void *data, size_t size) {
|
||||||
|
CallList expected_calls;
|
||||||
|
HMEMORYMODULE handle;
|
||||||
|
int free_calls_after_loading;
|
||||||
|
|
||||||
|
InitAllocFuncs(&expected_calls,
|
||||||
|
MemoryDefaultAlloc,
|
||||||
|
MemoryDefaultAlloc,
|
||||||
|
MemoryDefaultAlloc,
|
||||||
|
MemoryDefaultAlloc,
|
||||||
|
MemoryFailingAlloc,
|
||||||
|
NULL);
|
||||||
|
InitFreeFuncs(&expected_calls, MemoryDefaultFree, NULL);
|
||||||
|
|
||||||
|
handle = MemoryLoadLibraryEx(
|
||||||
|
data, size, MemoryMockAlloc, MemoryMockFree, MemoryDefaultLoadLibrary,
|
||||||
|
MemoryDefaultGetProcAddress, MemoryDefaultFreeLibrary, &expected_calls);
|
||||||
|
|
||||||
|
free_calls_after_loading = expected_calls.current_free_call;
|
||||||
|
|
||||||
|
MemoryFreeLibrary(handle);
|
||||||
|
assert(expected_calls.current_free_call == free_calls_after_loading);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestFreeAfterDefaultAlloc(void *data, size_t size) {
|
||||||
|
CallList expected_calls;
|
||||||
|
HMEMORYMODULE handle;
|
||||||
|
int free_calls_after_loading;
|
||||||
|
|
||||||
|
// Note: free might get called internally multiple times
|
||||||
|
InitFreeFunc(&expected_calls, MemoryDefaultFree);
|
||||||
|
|
||||||
|
handle = MemoryLoadLibraryEx(
|
||||||
|
data, size, MemoryDefaultAlloc, MemoryMockFree, MemoryDefaultLoadLibrary,
|
||||||
|
MemoryDefaultGetProcAddress, MemoryDefaultFreeLibrary, &expected_calls);
|
||||||
|
|
||||||
|
assert(handle != NULL);
|
||||||
|
free_calls_after_loading = expected_calls.current_free_call;
|
||||||
|
|
||||||
|
MemoryFreeLibrary(handle);
|
||||||
|
assert(expected_calls.current_free_call == free_calls_after_loading + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
|
||||||
|
LPVOID MemoryAllocHigh(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect, void* userdata)
|
||||||
|
{
|
||||||
|
int* counter = static_cast<int*>(userdata);
|
||||||
|
if (*counter == 0) {
|
||||||
|
// Make sure the image gets loaded to an address above 32bit.
|
||||||
|
uintptr_t offset = 0x10000000000;
|
||||||
|
address = (LPVOID) ((uintptr_t) address + offset);
|
||||||
|
}
|
||||||
|
(*counter)++;
|
||||||
|
return MemoryDefaultAlloc(address, size, allocationType, protect, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TestAllocHighMemory(void *data, size_t size) {
|
||||||
|
HMEMORYMODULE handle;
|
||||||
|
int counter = 0;
|
||||||
|
addNumberProc addNumber;
|
||||||
|
HMEMORYRSRC resourceInfo;
|
||||||
|
DWORD resourceSize;
|
||||||
|
LPVOID resourceData;
|
||||||
|
TCHAR buffer[100];
|
||||||
|
|
||||||
|
handle = MemoryLoadLibraryEx(
|
||||||
|
data, size, MemoryAllocHigh, MemoryDefaultFree, MemoryDefaultLoadLibrary,
|
||||||
|
MemoryDefaultGetProcAddress, MemoryDefaultFreeLibrary, &counter);
|
||||||
|
|
||||||
|
assert(handle != NULL);
|
||||||
|
|
||||||
|
addNumber = (addNumberProc)MemoryGetProcAddress(handle, "addNumbers");
|
||||||
|
_tprintf(_T("From memory: %d\n"), addNumber(1, 2));
|
||||||
|
|
||||||
|
resourceInfo = MemoryFindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
|
||||||
|
_tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
|
||||||
|
|
||||||
|
resourceSize = MemorySizeofResource(handle, resourceInfo);
|
||||||
|
resourceData = MemoryLoadResource(handle, resourceInfo);
|
||||||
|
_tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
|
||||||
|
|
||||||
|
MemoryLoadString(handle, 1, buffer, sizeof(buffer));
|
||||||
|
_tprintf(_T("String1: %s\n"), buffer);
|
||||||
|
|
||||||
|
MemoryLoadString(handle, 20, buffer, sizeof(buffer));
|
||||||
|
_tprintf(_T("String2: %s\n"), buffer);
|
||||||
|
|
||||||
|
MemoryFreeLibrary(handle);
|
||||||
|
}
|
||||||
|
#endif // _WIN64
|
||||||
|
|
||||||
|
void TestCustomAllocAndFree(void)
|
||||||
|
{
|
||||||
|
void *data;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
data = ReadLibrary(&size);
|
||||||
|
if (data == NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_tprintf(_T("Test MemoryLoadLibraryEx after initially failing allocation function\n"));
|
||||||
|
TestFailingAllocation(data, size);
|
||||||
|
_tprintf(_T("Test cleanup after MemoryLoadLibraryEx with failing allocation function\n"));
|
||||||
|
TestCleanupAfterFailingAllocation(data, size);
|
||||||
|
_tprintf(_T("Test custom free function after MemoryLoadLibraryEx\n"));
|
||||||
|
TestFreeAfterDefaultAlloc(data, size);
|
||||||
|
#ifdef _WIN64
|
||||||
|
_tprintf(_T("Test allocating in high memory\n"));
|
||||||
|
TestAllocHighMemory(data, size);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
free(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
{
|
{
|
||||||
LoadFromFile();
|
LoadFromFile();
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
LoadFromMemory();
|
LoadFromMemory();
|
||||||
|
printf("\n\n");
|
||||||
|
TestCustomAllocAndFree();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
#include "../../MemoryModule.h"
|
||||||
|
|
||||||
|
#define EXE_FILE TEXT("DllLoader.exe")
|
||||||
|
|
||||||
|
int RunFromMemory(void)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
unsigned char *data=NULL;
|
||||||
|
long size;
|
||||||
|
size_t read;
|
||||||
|
HMEMORYMODULE handle;
|
||||||
|
int result = -1;
|
||||||
|
|
||||||
|
fp = _tfopen(EXE_FILE, _T("rb"));
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("Can't open executable \"%s\"."), EXE_FILE);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
size = ftell(fp);
|
||||||
|
assert(size >= 0);
|
||||||
|
data = (unsigned char *)malloc(size);
|
||||||
|
assert(data != NULL);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
read = fread(data, 1, size, fp);
|
||||||
|
assert(read == static_cast<size_t>(size));
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
handle = MemoryLoadLibrary(data, size);
|
||||||
|
if (handle == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("Can't load library from memory.\n"));
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = MemoryCallEntryPoint(handle);
|
||||||
|
if (result < 0) {
|
||||||
|
_tprintf(_T("Could not execute entry point: %d\n"), result);
|
||||||
|
}
|
||||||
|
MemoryFreeLibrary(handle);
|
||||||
|
|
||||||
|
exit:
|
||||||
|
free(data);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return RunFromMemory();
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,16 +1,42 @@
|
|||||||
CC = gcc
|
UNAME := $(shell uname)
|
||||||
CPP = g++
|
|
||||||
|
ifeq ($(UNAME), Linux)
|
||||||
|
ifndef PLATFORM
|
||||||
|
PLATFORM = i686
|
||||||
|
endif
|
||||||
|
CC = $(PLATFORM)-w64-mingw32-g++
|
||||||
|
CXX = $(PLATFORM)-w64-mingw32-g++
|
||||||
|
LINK = $(PLATFORM)-w64-mingw32-ld
|
||||||
|
else
|
||||||
|
CC = g++
|
||||||
|
CXX = g++
|
||||||
LINK = ld
|
LINK = ld
|
||||||
|
endif
|
||||||
|
|
||||||
|
RM = rm
|
||||||
CFLAGS = -Wall -g
|
CFLAGS = -Wall -g
|
||||||
LDFLAGS =
|
LDFLAGS = -static
|
||||||
|
|
||||||
|
ifdef UNICODE
|
||||||
|
CFLAGS += -DUNICODE -D_UNICODE
|
||||||
|
endif
|
||||||
|
|
||||||
OBJ = DllLoader.o ../../MemoryModule.o
|
OBJ = DllLoader.o ../../MemoryModule.o
|
||||||
|
OBJ_LOADER = DllLoaderLoader.o ../../MemoryModule.o
|
||||||
|
|
||||||
|
all: DllLoader.exe DllLoaderLoader.exe
|
||||||
|
|
||||||
DllLoader.exe: $(OBJ)
|
DllLoader.exe: $(OBJ)
|
||||||
$(CC) $(LDFLAGS) -o DllLoader.exe $(OBJ)
|
$(CC) $(LDFLAGS) -Wl,--image-base -Wl,0x20000000 -o DllLoader.exe $(OBJ)
|
||||||
|
|
||||||
|
DllLoaderLoader.exe: $(OBJ_LOADER)
|
||||||
|
$(CC) $(LDFLAGS) -Wl,--image-base -Wl,0x10000000 -o DllLoaderLoader.exe $(OBJ_LOADER)
|
||||||
|
|
||||||
%.o: %.cpp
|
%.o: %.cpp
|
||||||
$(CPP) $(CFLAGS) -c $<
|
$(CXX) $(CFLAGS) -c $<
|
||||||
|
|
||||||
%.o: %.cc
|
%.o: %.cc
|
||||||
$(CC) $(CFLAGS) -c $<
|
$(CC) $(CFLAGS) -c $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) -rf $(OBJ) $(OBJ_LOADER) DllLoader.exe DllLoaderLoader.exe
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
SUBDIRS = DllLoader SampleDLL
|
||||||
|
|
||||||
|
.PHONY: subdirs $(SUBDIRS)
|
||||||
|
|
||||||
|
subdirs: $(SUBDIRS)
|
||||||
|
|
||||||
|
$(SUBDIRS):
|
||||||
|
$(MAKE) -C $@
|
||||||
|
|
||||||
|
CLEANDIRS = $(SUBDIRS:%=clean-%)
|
||||||
|
|
||||||
|
clean: $(CLEANDIRS)
|
||||||
|
$(CLEANDIRS):
|
||||||
|
$(MAKE) -C $(@:clean-%=%) clean
|
||||||
|
|
||||||
|
.PHONY: subdirs $(INSTALLDIRS)
|
||||||
|
.PHONY: clean
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
*.o
|
*.o
|
||||||
*.dll
|
*.dll
|
||||||
|
*.res
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
set (sources
|
||||||
|
SampleDLL.cpp
|
||||||
|
SampleDLL.h
|
||||||
|
SampleDLL.rc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_definitions (-DSAMPLEDLL_EXPORTS)
|
||||||
|
add_library (SampleDLL MODULE ${sources})
|
||||||
|
if (NOT MSVC)
|
||||||
|
set_target_properties ("SampleDLL" PROPERTIES PREFIX "")
|
||||||
|
set_target_properties ("SampleDLL" PROPERTIES SUFFIX ".dll")
|
||||||
|
endif ()
|
||||||
@@ -1,11 +1,39 @@
|
|||||||
|
UNAME := $(shell uname)
|
||||||
|
|
||||||
|
ifeq ($(UNAME), Linux)
|
||||||
|
ifndef PLATFORM
|
||||||
|
PLATFORM = i686
|
||||||
|
endif
|
||||||
|
CC = $(PLATFORM)-w64-mingw32-g++
|
||||||
|
CXX = $(PLATFORM)-w64-mingw32-g++
|
||||||
|
LINK = $(PLATFORM)-w64-mingw32-g++
|
||||||
|
RC = $(PLATFORM)-w64-mingw32-windres
|
||||||
|
else
|
||||||
CC = g++
|
CC = g++
|
||||||
|
CXX = g++
|
||||||
|
LINK = ld
|
||||||
|
RC = rc
|
||||||
|
endif
|
||||||
|
|
||||||
|
RM = rm
|
||||||
CFLAGS = -Wall -g -DSAMPLEDLL_EXPORTS
|
CFLAGS = -Wall -g -DSAMPLEDLL_EXPORTS
|
||||||
LDFLAGS = -shared
|
LDFLAGS = -shared
|
||||||
|
RCFLAGS = -O coff
|
||||||
|
|
||||||
OBJ = SampleDLL.o
|
ifdef UNICODE
|
||||||
|
CFLAGS += -DUNICODE -D_UNICODE
|
||||||
|
endif
|
||||||
|
|
||||||
|
OBJ = SampleDLL.o SampleDLL.res
|
||||||
|
|
||||||
SampleDLL.dll: $(OBJ)
|
SampleDLL.dll: $(OBJ)
|
||||||
$(CC) $(LDFLAGS) -o SampleDLL.dll $(OBJ)
|
$(LINK) $(LDFLAGS) -o SampleDLL.dll $(OBJ)
|
||||||
|
|
||||||
%.o: %.cpp
|
%.o: %.cpp
|
||||||
$(CC) $(CFLAGS) -c $<
|
$(CXX) $(CFLAGS) -c $<
|
||||||
|
|
||||||
|
%.res: %.rc
|
||||||
|
$(RC) $(RCFLAGS) -o $*.res $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) -rf $(OBJ) SampleDLL.dll
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
1 VERSIONINFO
|
||||||
|
FILEVERSION 1,0,0,0
|
||||||
|
PRODUCTVERSION 1,0,0,0
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904E4"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "fancy.code"
|
||||||
|
VALUE "FileDescription", "SampleDLL"
|
||||||
|
VALUE "FileVersion", "1.0"
|
||||||
|
VALUE "InternalName", "SampleDLL"
|
||||||
|
VALUE "LegalCopyright", "Copyright (c) 2004-2015 Joachim Bauch"
|
||||||
|
VALUE "OriginalFilename", "SampleDLL.dll"
|
||||||
|
VALUE "ProductName", "MemoryModule"
|
||||||
|
VALUE "ProductVersion", "0.0.4"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x409, 1252
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
#define IDS_HELLO 1
|
||||||
|
#define IDS_WORLD 20
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
{
|
||||||
|
IDS_HELLO, "Hello"
|
||||||
|
IDS_WORLD, "World!"
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
MemoryModule
|
||||||
|
============
|
||||||
|
|
||||||
|
[](https://travis-ci.org/fancycode/MemoryModule)[](https://ci.appveyor.com/project/fancycode/memorymodule)
|
||||||
|
|
||||||
|
The default windows API functions to load external libraries into a program
|
||||||
|
(`LoadLibrary`, `LoadLibraryEx`) only work with files on the filesystem. It's
|
||||||
|
therefore impossible to load a DLL from memory.
|
||||||
|
|
||||||
|
But sometimes, you need exactly this functionality (e.g. you don't want to
|
||||||
|
distribute a lot of files or want to make disassembling harder). Common
|
||||||
|
workarounds for this problems are to write the DLL into a temporary file
|
||||||
|
first and import it from there. When the program terminates, the temporary
|
||||||
|
file gets deleted.
|
||||||
|
|
||||||
|
`MemoryModule` is a library that can be used to load a DLL completely from
|
||||||
|
memory - without storing on the disk first.
|
||||||
|
|
||||||
|
See `doc/readme.rst` for more informations about the format of a DLL file and
|
||||||
|
a tutorial how they can be loaded directly.
|
||||||
-15
@@ -1,15 +0,0 @@
|
|||||||
The default windows API functions to load external libraries into a program
|
|
||||||
(LoadLibrary, LoadLibraryEx) only work with files on the filesystem. It's
|
|
||||||
therefore impossible to load a DLL from memory.
|
|
||||||
|
|
||||||
But sometimes, you need exactly this functionality (e.g. you don't want to
|
|
||||||
distribute a lot of files or want to make disassembling harder). Common
|
|
||||||
workarounds for this problems are to write the DLL into a temporary file
|
|
||||||
first and import it from there. When the program terminates, the temporary
|
|
||||||
file gets deleted.
|
|
||||||
|
|
||||||
MemoryModule is a library that can be used to load a DLL completely from
|
|
||||||
memory - without storing on the disk first.
|
|
||||||
|
|
||||||
See doc/readme.txt for more informations about the format of a DLL file and
|
|
||||||
a tutorial how they can be loaded directly.
|
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal
|
||||||
|
|
||||||
|
if /I "%PLATFORM%" == "x64" (
|
||||||
|
set CMAKE_GEN_SUFFIX= Win64
|
||||||
|
if /I "%GENERATOR%" == "Visual Studio 9 2008" (
|
||||||
|
echo Skipping %CONFIGURATION% build using %GENERATOR%%CMAKE_GEN_SUFFIX% on %PLATFORM%
|
||||||
|
exit 0
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
set CMAKE_GEN_SUFFIX=
|
||||||
|
)
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Preparing %CONFIGURATION% build environment for %GENERATOR%%CMAKE_GEN_SUFFIX% ...
|
||||||
|
cmake "-G%GENERATOR%%CMAKE_GEN_SUFFIX%" -DPLATFORM=%PLATFORM% -DUNICODE=%UNICODE% -DTESTSUITE=ON -H. -Bbuild
|
||||||
|
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Building ...
|
||||||
|
cmake --build build --config %CONFIGURATION%
|
||||||
|
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Copying generated files ...
|
||||||
|
copy /y build\example\DllLoader\%CONFIGURATION%\DllLoader.exe build\example\DllLoader\ > NUL
|
||||||
|
copy /y build\example\DllLoader\%CONFIGURATION%\DllLoaderLoader.exe build\example\DllLoader\ > NUL
|
||||||
|
copy /y build\example\SampleDLL\%CONFIGURATION%\SampleDLL.dll build\example\SampleDLL\ > NUL
|
||||||
|
copy /y build\tests\%CONFIGURATION%\TestSuite.exe build\tests\ > NUL
|
||||||
|
|
||||||
|
cd build\example\DllLoader
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Running DllLoader.exe ...
|
||||||
|
DllLoader.exe
|
||||||
|
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Running DllLoaderLoader.exe ...
|
||||||
|
DllLoaderLoader.exe
|
||||||
|
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||||
|
|
||||||
|
cd ..\..\tests
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Running TestSuite.exe ...
|
||||||
|
TestSuite.exe
|
||||||
|
if %errorlevel% neq 0 exit /b %errorlevel%
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
set (sources_testsuite
|
||||||
|
TestSuite.c
|
||||||
|
)
|
||||||
|
|
||||||
|
if (NOT MSVC)
|
||||||
|
set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-static")
|
||||||
|
set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "-static")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_executable (TestSuite ${sources_testsuite})
|
||||||
|
target_link_libraries ("TestSuite" "MemoryModule")
|
||||||
|
if (NOT MSVC)
|
||||||
|
set_target_properties ("TestSuite" PROPERTIES SUFFIX ".exe")
|
||||||
|
endif ()
|
||||||
@@ -0,0 +1,304 @@
|
|||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <tchar.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
#include "../MemoryModule.h"
|
||||||
|
|
||||||
|
typedef int (*addProc)(int);
|
||||||
|
typedef int (*addNumberProc)(int, int);
|
||||||
|
|
||||||
|
// Thanks to Tim Cooper (from http://stackoverflow.com/a/8584708)
|
||||||
|
const char *sstrstr(const char *haystack, const char *needle, size_t length) {
|
||||||
|
size_t needle_length = strlen(needle);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < length; i++) {
|
||||||
|
if (i + needle_length > length) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncmp(&haystack[i], needle, needle_length) == 0) {
|
||||||
|
return &haystack[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const wchar_t *swcsstr(const wchar_t *haystack, const wchar_t *needle, size_t length) {
|
||||||
|
size_t needle_length = wcslen(needle);
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < length; i++) {
|
||||||
|
if (i + needle_length > length) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wcsncmp(&haystack[i], needle, needle_length) == 0) {
|
||||||
|
return &haystack[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL CheckResourceStrings(LPVOID data, DWORD size, const char *first, const wchar_t *second) {
|
||||||
|
const char *first_pos;
|
||||||
|
const wchar_t *second_pos;
|
||||||
|
const wchar_t *src;
|
||||||
|
|
||||||
|
if (data == NULL || size == 0) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
first_pos = sstrstr((const char *) data, first, size);
|
||||||
|
if (first_pos == NULL) {
|
||||||
|
fprintf(stderr, "ERROR: data doesn't start with %s\n", first);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
src = (const wchar_t *) (((const char *) data) + strlen(first) + 1);
|
||||||
|
second_pos = swcsstr(src, second, (size - strlen(first) - 1) / sizeof(wchar_t));
|
||||||
|
if (second_pos == NULL) {
|
||||||
|
fwprintf(stderr, L"ERROR: data doesn't continue with %s\n", second);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL LoadFromMemory(char *filename)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
unsigned char *data=NULL;
|
||||||
|
long size;
|
||||||
|
size_t read;
|
||||||
|
HMEMORYMODULE handle = NULL;
|
||||||
|
addNumberProc addNumber;
|
||||||
|
addNumberProc addNumber2;
|
||||||
|
HMEMORYRSRC resourceInfo;
|
||||||
|
DWORD resourceSize;
|
||||||
|
LPVOID resourceData;
|
||||||
|
TCHAR buffer[100];
|
||||||
|
BOOL result = TRUE;
|
||||||
|
|
||||||
|
fp = fopen(filename, "rb");
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
printf("Can't open DLL file \"%s\".", filename);
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
size = ftell(fp);
|
||||||
|
assert(size > 0);
|
||||||
|
data = (unsigned char *)malloc(size);
|
||||||
|
assert(data != NULL);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
read = fread(data, 1, size, fp);
|
||||||
|
assert(read == static_cast<size_t>(size));
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
handle = MemoryLoadLibrary(data, size);
|
||||||
|
if (handle == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("Can't load library from memory.\n"));
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
addNumber = (addNumberProc)MemoryGetProcAddress(handle, NULL);
|
||||||
|
if (addNumber != NULL) {
|
||||||
|
_tprintf(_T("MemoryGetProcAddress(NULL) returned %p\n"), addNumber);
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
addNumber = (addNumberProc)MemoryGetProcAddress(handle, reinterpret_cast<LPCSTR>(0xff));
|
||||||
|
if (addNumber != NULL) {
|
||||||
|
_tprintf(_T("MemoryGetProcAddress(0xff) returned %p\n"), addNumber);
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
addNumber = (addNumberProc)MemoryGetProcAddress(handle, "addNumbers");
|
||||||
|
if (!addNumber) {
|
||||||
|
_tprintf(_T("MemoryGetProcAddress(\"addNumber\") returned NULL\n"));
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
_tprintf(_T("From memory: %d\n"), addNumber(1, 2));
|
||||||
|
|
||||||
|
// the DLL only exports one function, try to load by ordinal value
|
||||||
|
addNumber2 = (addNumberProc)MemoryGetProcAddress(handle, reinterpret_cast<LPCSTR>(0x01));
|
||||||
|
if (addNumber != addNumber2) {
|
||||||
|
_tprintf(_T("MemoryGetProcAddress(0x01) returned %p (expected %p)\n"), addNumber2, addNumber);
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
resourceInfo = MemoryFindResource(handle, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION);
|
||||||
|
_tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
|
||||||
|
|
||||||
|
if (resourceInfo != NULL) {
|
||||||
|
resourceSize = MemorySizeofResource(handle, resourceInfo);
|
||||||
|
resourceData = MemoryLoadResource(handle, resourceInfo);
|
||||||
|
_tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
|
||||||
|
|
||||||
|
MemoryLoadString(handle, 1, buffer, sizeof(buffer));
|
||||||
|
_tprintf(_T("String1: %s\n"), buffer);
|
||||||
|
|
||||||
|
MemoryLoadString(handle, 20, buffer, sizeof(buffer));
|
||||||
|
_tprintf(_T("String2: %s\n"), buffer);
|
||||||
|
} else {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
resourceInfo = MemoryFindResource(handle, _T("stringres"), RT_RCDATA);
|
||||||
|
_tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
|
||||||
|
if (resourceInfo != NULL) {
|
||||||
|
resourceSize = MemorySizeofResource(handle, resourceInfo);
|
||||||
|
resourceData = MemoryLoadResource(handle, resourceInfo);
|
||||||
|
|
||||||
|
_tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
|
||||||
|
if (!CheckResourceStrings(resourceData, resourceSize, "This is a ANSI string", L"This is a UNICODE string")) {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
resourceInfo = MemoryFindResource(handle, _T("stringres1"), RT_RCDATA);
|
||||||
|
_tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
|
||||||
|
if (resourceInfo != NULL) {
|
||||||
|
resourceSize = MemorySizeofResource(handle, resourceInfo);
|
||||||
|
resourceData = MemoryLoadResource(handle, resourceInfo);
|
||||||
|
|
||||||
|
_tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
|
||||||
|
if (!CheckResourceStrings(resourceData, resourceSize, "This is ANSI string 1", L"This is UNICODE string 1")) {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resourceInfo = MemoryFindResource(handle, _T("stringres2"), RT_RCDATA);
|
||||||
|
_tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
|
||||||
|
if (resourceInfo != NULL) {
|
||||||
|
resourceSize = MemorySizeofResource(handle, resourceInfo);
|
||||||
|
resourceData = MemoryLoadResource(handle, resourceInfo);
|
||||||
|
|
||||||
|
_tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
|
||||||
|
if (!CheckResourceStrings(resourceData, resourceSize, "This is ANSI string 2", L"This is UNICODE string 2")) {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
resourceInfo = MemoryFindResource(handle, _T("stringres3"), RT_RCDATA);
|
||||||
|
_tprintf(_T("MemoryFindResource returned 0x%p\n"), resourceInfo);
|
||||||
|
if (resourceInfo != NULL) {
|
||||||
|
resourceSize = MemorySizeofResource(handle, resourceInfo);
|
||||||
|
resourceData = MemoryLoadResource(handle, resourceInfo);
|
||||||
|
|
||||||
|
_tprintf(_T("Memory resource data: %ld bytes at 0x%p\n"), resourceSize, resourceData);
|
||||||
|
if (!CheckResourceStrings(resourceData, resourceSize, "This is ANSI string 3", L"This is UNICODE string 3")) {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
exit:
|
||||||
|
MemoryFreeLibrary(handle);
|
||||||
|
free(data);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL LoadExportsFromMemory(char *filename)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
unsigned char *data=NULL;
|
||||||
|
long size;
|
||||||
|
size_t read;
|
||||||
|
HMEMORYMODULE handle = NULL;
|
||||||
|
int i;
|
||||||
|
BOOL result = TRUE;
|
||||||
|
|
||||||
|
fp = fopen(filename, "rb");
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
printf("Can't open DLL file \"%s\".", filename);
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(fp, 0, SEEK_END);
|
||||||
|
size = ftell(fp);
|
||||||
|
assert(size > 0);
|
||||||
|
data = (unsigned char *)malloc(size);
|
||||||
|
assert(data != NULL);
|
||||||
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
read = fread(data, 1, size, fp);
|
||||||
|
assert(read == static_cast<size_t>(size));
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
handle = MemoryLoadLibrary(data, size);
|
||||||
|
if (handle == NULL)
|
||||||
|
{
|
||||||
|
_tprintf(_T("Can't load library from memory.\n"));
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i <= 100; i++) {
|
||||||
|
char name[100];
|
||||||
|
sprintf(name, "add%d", i);
|
||||||
|
addProc addNumber = (addProc)MemoryGetProcAddress(handle, name);
|
||||||
|
if (!addNumber) {
|
||||||
|
_tprintf(_T("MemoryGetProcAddress(\"%s\") returned NULL\n"), name);
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
int result = addNumber(1);
|
||||||
|
if (result != 1 + i) {
|
||||||
|
_tprintf(_T("(\"%s\") returned %d, expected %d\n"), name, result, 1 + i);
|
||||||
|
result = FALSE;
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
_tprintf(_T("%s: %d\n"), name, result);
|
||||||
|
}
|
||||||
|
exit:
|
||||||
|
MemoryFreeLibrary(handle);
|
||||||
|
free(data);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
if (argc < 2) {
|
||||||
|
fprintf(stderr, "USAGE: %s <filename.dll>\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strstr((const char *) argv[1], "exports")) {
|
||||||
|
if (!LoadFromMemory(argv[1])) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!LoadExportsFromMemory(argv[1])) {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
UNAME := $(shell uname)
|
||||||
|
|
||||||
|
ifeq ($(UNAME), Linux)
|
||||||
|
ifndef PLATFORM
|
||||||
|
PLATFORM = i686
|
||||||
|
endif
|
||||||
|
CC = $(PLATFORM)-w64-mingw32-g++
|
||||||
|
CXX = $(PLATFORM)-w64-mingw32-g++
|
||||||
|
LD = $(PLATFORM)-w64-mingw32-ld
|
||||||
|
RC = $(PLATFORM)-w64-mingw32-windres
|
||||||
|
else
|
||||||
|
CC = g++
|
||||||
|
CXX = g++
|
||||||
|
LD = ld
|
||||||
|
RC = rc
|
||||||
|
endif
|
||||||
|
|
||||||
|
RM = rm
|
||||||
|
CFLAGS = -Wall -g -DTESTSUITE
|
||||||
|
LDFLAGS =
|
||||||
|
RCFLAGS = -O coff
|
||||||
|
|
||||||
|
ifdef UNICODE
|
||||||
|
CFLAGS += -DUNICODE -D_UNICODE
|
||||||
|
endif
|
||||||
|
|
||||||
|
CFLAGS_DLL = -DSAMPLEDLL_EXPORTS
|
||||||
|
CFLAGS_EXE =
|
||||||
|
LDFLAGS_DLL = -shared
|
||||||
|
LDFLAGS_EXE = -static
|
||||||
|
|
||||||
|
TEST_DLLS = \
|
||||||
|
test-align-128.dll \
|
||||||
|
test-align-256.dll \
|
||||||
|
test-align-512.dll \
|
||||||
|
test-align-768.dll \
|
||||||
|
test-align-1024.dll \
|
||||||
|
test-align-2048.dll \
|
||||||
|
test-align-3072.dll \
|
||||||
|
test-align-4096.dll \
|
||||||
|
test-align-100.dll \
|
||||||
|
test-align-200.dll \
|
||||||
|
test-align-300.dll \
|
||||||
|
test-align-400.dll \
|
||||||
|
test-align-500.dll \
|
||||||
|
test-align-600.dll \
|
||||||
|
test-align-800.dll \
|
||||||
|
test-align-900.dll \
|
||||||
|
test-relocate.dll \
|
||||||
|
test-exports.dll
|
||||||
|
|
||||||
|
LOADDLL_OBJ = LoadDll.o ../MemoryModule.o
|
||||||
|
TESTSUITE_OBJ = TestSuite.o ../MemoryModule.o
|
||||||
|
DLL_OBJ = SampleDLL.o SampleDLL.res
|
||||||
|
|
||||||
|
all: prepare_testsuite LoadDll.exe TestSuite.exe $(TEST_DLLS)
|
||||||
|
|
||||||
|
prepare_testsuite:
|
||||||
|
rm -f $(TESTSUITE_OBJ)
|
||||||
|
|
||||||
|
LoadDll.exe: $(LOADDLL_OBJ)
|
||||||
|
$(CC) $(LDFLAGS_EXE) $(LDFLAGS) -Wl,--image-base -Wl,0x20000000 -o LoadDll.exe $(LOADDLL_OBJ)
|
||||||
|
|
||||||
|
TestSuite.exe: $(TESTSUITE_OBJ)
|
||||||
|
$(CC) $(LDFLAGS_EXE) $(LDFLAGS) -o TestSuite.exe $(TESTSUITE_OBJ)
|
||||||
|
|
||||||
|
LoadDll.o: LoadDll.cpp
|
||||||
|
$(CXX) $(CFLAGS) $(CFLAGS_EXE) -c $<
|
||||||
|
|
||||||
|
test-align-%.dll: $(DLL_OBJ)
|
||||||
|
$(LD) $(LDFLAGS_DLL) $(LDFLAGS) --file-alignment $* --section-alignment $* -o $@ $(DLL_OBJ)
|
||||||
|
|
||||||
|
test-relocate.dll: $(DLL_OBJ)
|
||||||
|
$(CXX) $(LDFLAGS_DLL) $(LDFLAGS) -Wl,--image-base -Wl,0x20000000 -o $@ $(DLL_OBJ)
|
||||||
|
|
||||||
|
test-exports.dll: SampleExports.o
|
||||||
|
$(CXX) $(LDFLAGS_DLL) $(LDFLAGS) -o $@ SampleExports.o
|
||||||
|
|
||||||
|
SampleExports.cpp: generate-exports.sh
|
||||||
|
./generate-exports.sh
|
||||||
|
|
||||||
|
%.o: %.cpp
|
||||||
|
$(CXX) $(CFLAGS) $(CFLAGS_DLL) -c $<
|
||||||
|
|
||||||
|
%.o: %.cc
|
||||||
|
$(CC) $(CFLAGS) $(CFLAGS_DLL) -c $<
|
||||||
|
|
||||||
|
%.res: %.rc
|
||||||
|
$(RC) $(RCFLAGS) -o $*.res $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
$(RM) -rf LoadDll.exe $(TEST_DLLS) $(LOADDLL_OBJ) $(DLL_OBJ) $(TESTSUITE_OBJ) SampleExports.o
|
||||||
|
|
||||||
|
test: all
|
||||||
|
./runwine.sh $(PLATFORM) TestSuite.exe
|
||||||
|
./runtests.sh $(PLATFORM) "$(TEST_DLLS)"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#include "SampleDLL.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
SAMPLEDLL_API int addNumbers(int a, int b)
|
||||||
|
{
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
extern "C" {
|
||||||
|
|
||||||
|
#ifdef SAMPLEDLL_EXPORTS
|
||||||
|
#define SAMPLEDLL_API __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define SAMPLEDLL_API __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
SAMPLEDLL_API int addNumbers(int a, int b);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
1 VERSIONINFO
|
||||||
|
FILEVERSION 1,0,0,0
|
||||||
|
PRODUCTVERSION 1,0,0,0
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904E4"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "fancy.code"
|
||||||
|
VALUE "FileDescription", "SampleDLL"
|
||||||
|
VALUE "FileVersion", "1.0"
|
||||||
|
VALUE "InternalName", "SampleDLL"
|
||||||
|
VALUE "LegalCopyright", "Copyright (c) 2004-2015 Joachim Bauch"
|
||||||
|
VALUE "OriginalFilename", "SampleDLL.dll"
|
||||||
|
VALUE "ProductName", "MemoryModule"
|
||||||
|
VALUE "ProductVersion", "0.0.4"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x409, 1252
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
#define IDS_HELLO 1
|
||||||
|
#define IDS_WORLD 20
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
{
|
||||||
|
IDS_HELLO, "Hello"
|
||||||
|
IDS_WORLD, "World!"
|
||||||
|
}
|
||||||
|
|
||||||
|
STRINGRES RCDATA
|
||||||
|
{
|
||||||
|
"This is a ANSI string\0",
|
||||||
|
L"This is a UNICODE string\0",
|
||||||
|
}
|
||||||
|
|
||||||
|
STRINGRES1 RCDATA
|
||||||
|
{
|
||||||
|
"This is ANSI string 1\0",
|
||||||
|
L"This is UNICODE string 1\0",
|
||||||
|
}
|
||||||
|
|
||||||
|
STRINGRES2 RCDATA
|
||||||
|
{
|
||||||
|
"This is ANSI string 2\0",
|
||||||
|
L"This is UNICODE string 2\0",
|
||||||
|
}
|
||||||
|
|
||||||
|
STRINGRES3 RCDATA
|
||||||
|
{
|
||||||
|
"This is ANSI string 3\0",
|
||||||
|
L"This is UNICODE string 3\0",
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#ifndef _CRT_SECURE_NO_WARNINGS
|
||||||
|
#define _CRT_SECURE_NO_WARNINGS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
extern BOOL MemoryModuleTestsuite();
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
UNREFERENCED_PARAMETER(argc);
|
||||||
|
UNREFERENCED_PARAMETER(argv);
|
||||||
|
if (!MemoryModuleTestsuite()) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Executable
+52
@@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
##
|
||||||
|
## Generate header file.
|
||||||
|
##
|
||||||
|
|
||||||
|
cat > SampleExports.h << EOF
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
#ifdef SAMPLEDLL_EXPORTS
|
||||||
|
#define SAMPLEDLL_API __declspec(dllexport)
|
||||||
|
#else
|
||||||
|
#define SAMPLEDLL_API __declspec(dllimport)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
for i in `seq 1 100`;
|
||||||
|
do
|
||||||
|
cat >> SampleExports.h << EOF
|
||||||
|
SAMPLEDLL_API int add$i(int a);
|
||||||
|
EOF
|
||||||
|
done
|
||||||
|
|
||||||
|
cat >> SampleExports.h << EOF
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
##
|
||||||
|
## Generate source file.
|
||||||
|
##
|
||||||
|
|
||||||
|
cat > SampleExports.cpp << EOF
|
||||||
|
#include "SampleExports.h"
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
EOF
|
||||||
|
|
||||||
|
for i in `seq 1 100 | sort -R`;
|
||||||
|
do
|
||||||
|
cat >> SampleExports.cpp << EOF
|
||||||
|
SAMPLEDLL_API int add$i(int a)
|
||||||
|
{
|
||||||
|
return a + $i;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
done
|
||||||
|
|
||||||
|
cat >> SampleExports.cpp << EOF
|
||||||
|
}
|
||||||
|
EOF
|
||||||
Executable
+16
@@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
PLATFORM=$1
|
||||||
|
|
||||||
|
read -a TEST_DLLS <<< $2
|
||||||
|
|
||||||
|
for filename in "${TEST_DLLS[@]}"
|
||||||
|
do
|
||||||
|
:
|
||||||
|
echo "Testing $filename"
|
||||||
|
./runwine.sh "${PLATFORM}" ./LoadDll.exe $filename
|
||||||
|
if [ "$?" != "0" ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "${#TEST_DLLS[@]} tests completed successfully"
|
||||||
Executable
+15
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -eu
|
||||||
|
PLATFORM=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
if [ "${PLATFORM}" = "x86_64" ]; then
|
||||||
|
export WINEPREFIX=${HOME}/.wine64/
|
||||||
|
WINE=wine64
|
||||||
|
else
|
||||||
|
export WINEPREFIX=${HOME}/.wine/
|
||||||
|
WINE=wine
|
||||||
|
fi
|
||||||
|
export WINEPATH=/usr/lib/gcc/${PLATFORM}-w64-mingw32/4.8/:/usr/${PLATFORM}-w64-mingw32/lib
|
||||||
|
|
||||||
|
exec ${WINE} $@
|
||||||
Reference in New Issue
Block a user