Compare commits

..

No commits in common. "d435282a8baf427da2fc301340e18b50883cb0d5" and "0922356a40e7a804f38ce50742a33e1a3d3555fe" have entirely different histories.

10 changed files with 40 additions and 121 deletions

View file

@ -31,19 +31,17 @@ src/JSRF/Jet2.exe: $(OBJ) $(LIB)
LIB.EXE /NOLOGO /MACHINE:X86 /DEF:$< /OUT:$@ LIB.EXE /NOLOGO /MACHINE:X86 /DEF:$< /OUT:$@
# Compile object files from source # Compile object files from source
.c.obj:
CL.EXE /nologo /Wall /W4 /Ogityb0 /GfX /Fo$@ /c $<
.cpp.obj: .cpp.obj:
CL.EXE /nologo /Wall /W4 /Ogityb0 /GfX /Fo$@ /c $< CL.EXE /nologo /Wall /W4 /Ogityb0 /GfX /Fo$@ /c $<
# Header files used for each object # Header files used for each object
src/JSRF/Jet2.obj: src/JSRF/Core.hpp src/Std.hpp src/XDK/D3D.h\ src/JSRF/Jet2.obj: src/JSRF/Core.hpp src/Std.hpp src/XDK/D3D.hpp\
src/XDK/Win32.h src/XDK/Win32.hpp
src/JSRF/Core.obj: src/JSRF/Core.hpp src/Smilebit/MMatrix.hpp src/Std.hpp\ src/JSRF/Core.obj: src/JSRF/Core.hpp src/Smilebit/MMatrix.hpp src/Std.hpp\
src/XDK/D3D.h src/XDK/Win32.h src/XDK/D3D.hpp src/XDK/Win32.hpp
src/JSRF/GameData.obj: src/JSRF/GameData.hpp src/JSRF/GameData.obj: src/JSRF/GameData.hpp
src/XDK/CRT/CRT0.obj: src/XDK/Win32.h src/XDK/CRT/CRT0.obj: src/XDK/Win32.hpp

View file

@ -7,8 +7,8 @@ Game and GameObj classes that form the foundation of the JSRF game code.
#include "../Smilebit/MMatrix.hpp" #include "../Smilebit/MMatrix.hpp"
#include "../Std.hpp" #include "../Std.hpp"
#include "../XDK/D3D.h" #include "../XDK/D3D.hpp"
#include "../XDK/Win32.h" #include "../XDK/Win32.hpp"
// TODO; move to header for Graphics COM object in Smilebit libraries // TODO; move to header for Graphics COM object in Smilebit libraries

View file

@ -4,7 +4,7 @@ Save data and closely-related runtime data.
#pragma bss_seg(".data") #pragma bss_seg(".data")
#include "../XDK/Win32.h" #include "../XDK/Win32.hpp"
#include "GameData.hpp" #include "GameData.hpp"

View file

@ -5,7 +5,7 @@ Save data and closely-related runtime data.
#ifndef GAMEDATA_HPP #ifndef GAMEDATA_HPP
#define GAMEDATA_HPP #define GAMEDATA_HPP
#include "../XDK/Win32.h" #include "../XDK/Win32.hpp"
// Data structure actually saved to disk // Data structure actually saved to disk

View file

@ -7,7 +7,7 @@ Smilebit's stack-based matrix math library.
#include "../Std.hpp" #include "../Std.hpp"
#include "../XDK/Win32.h" #include "../XDK/Win32.hpp"
#include "MMatrix.hpp" #include "MMatrix.hpp"

View file

@ -5,7 +5,7 @@ Smilebit's stack-based matrix math library.
#ifndef MMATRIX_HPP #ifndef MMATRIX_HPP
#define MMATRIX_HPP #define MMATRIX_HPP
#include "../XDK/D3D.h" #include "../XDK/D3D.hpp"
// 4x4 matrix type // 4x4 matrix type

View file

@ -1,24 +1,24 @@
/* JSRF Decompilation: XDK/CRT0.c /* JSRF Decompilation: XDK/CRT0.cpp
C runtime initialization. C runtime initialization.
Like other CRT code, there's some magic here with symbols that get special Like other CRT code, there's some magic here with symbols that get special
treatment from the compiler and linker. treatment from the compiler and linker.
*/ */
#include "../Win32.h" #include "../Win32.hpp"
// Every program is supposed to have a main(), so we can just assume its // Every program is supposed to have a main(), so we can just assume its
// existence with a declaration here // existence with a declaration here
int main(void); int main();
void __cdecl mainCRTStartup (void); void __stdcall mainCRTStartup ();
DWORD __stdcall mainXapiStartup(LPVOID lpThreadParameter); static DWORD _mainXapiStartup(LPVOID lpThreadParameter);
// Address: 0x00148023 // Address: 0x00148023
// Matching: no // Matching: no
void __cdecl mainCRTStartup(void) { void __stdcall mainCRTStartup() {
/* The true entrypoint of the game, spawning a thread for the rest to run in /* The true entrypoint of the game, spawning a thread for the rest to run in
The linker automatically sets this function to the entrypoint. The linker automatically sets this function to the entrypoint.
*/ */
@ -26,7 +26,7 @@ The linker automatically sets this function to the entrypoint.
// Address: 0x00147FB4 // Address: 0x00147FB4
// Matching: no // Matching: no
DWORD __stdcall mainXapiStartup(LPVOID const lpThreadParameter) { DWORD _mainXapiStartup(LPVOID const lpThreadParameter) {
/* Runs some initialization and then calls main() */ /* Runs some initialization and then calls main() */
main(); main();
return 0; return 0;

View file

@ -1,16 +1,11 @@
/* JSRF Decompilation: XDK/D3D.h /* JSRF Decompilation: XDK/D3D.hpp
Direct3D8 declarations. Direct3D8 declarations.
*/ */
#ifndef D3D_H #ifndef D3D_HPP
#define D3D_H #define D3D_HPP
#include "Win32.h" #include "Win32.hpp"
#ifdef __cplusplus
extern "C" {
#endif
typedef DWORD D3DCOLOR; typedef DWORD D3DCOLOR;
@ -26,10 +21,4 @@ struct D3DRECT {
LONG x1, y1, x2, y2; LONG x1, y1, x2, y2;
}; };
#ifdef __cplusplus
}
#endif
#endif #endif

View file

@ -1,15 +1,9 @@
/* JSRF Decompilation: XDK/Win32.h /* JSRF Decompilation: XDK/Win32.hpp
Definitions normally provided by Windows headers. Definitions normally provided by Windows headers.
*/ */
#ifndef WIN32_H #ifndef WIN32_HPP
#define WIN32_H #define WIN32_HPP
#ifdef __cplusplus
extern "C" {
#endif
// The famous Win32 typedefs // The famous Win32 typedefs
typedef unsigned char UCHAR; typedef unsigned char UCHAR;
@ -61,10 +55,4 @@ LPVOID __stdcall VirtualAlloc(
DWORD flProtect DWORD flProtect
); );
#ifdef __cplusplus
}
#endif
#endif #endif

View file

@ -5,20 +5,15 @@
import ghidra.app.script.GhidraScript; import ghidra.app.script.GhidraScript;
import ghidra.app.services.DataTypeQueryService; import ghidra.app.services.DataTypeQueryService;
import ghidra.program.model.address.Address; import ghidra.program.model.address.Address;
import ghidra.program.model.data.ArrayDataType;
import ghidra.program.model.data.DataType; import ghidra.program.model.data.DataType;
import ghidra.program.model.data.PointerDataType;
import ghidra.program.model.listing.Data; import ghidra.program.model.listing.Data;
import ghidra.program.model.listing.Function; import ghidra.program.model.listing.Function;
import ghidra.program.model.symbol.Namespace; import ghidra.program.model.symbol.Namespace;
import ghidra.program.model.symbol.SourceType; import ghidra.program.model.symbol.SourceType;
import ghidra.program.model.symbol.Symbol; import ghidra.program.model.symbol.Symbol;
import ghidra.util.StringUtilities;
import java.io.FileReader; import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -39,7 +34,7 @@ public class EnhancedImport extends GhidraScript{
case "func": importFunc(addr, parts); break; case "func": importFunc(addr, parts); break;
default: throw new Exception( default: throw new Exception(
"Symbol type \"" + parts[1] + "Symbol type \"" + parts[1] +
"\" on line " + String.valueOf(i) + "\" on line " + Integer.toString(i) +
" is not \"data\" or \"func\"" " is not \"data\" or \"func\""
); );
} }
@ -50,7 +45,7 @@ public class EnhancedImport extends GhidraScript{
final Address addr, final Address addr,
final String[] parts final String[] parts
) throws Exception { ) throws Exception {
final String name = unqualified(parts[3]); final String name = unqualified(parts[3]);
print("Importing data symbol \"" + parts[3] + "\"..."); print("Importing data symbol \"" + parts[3] + "\"...");
@ -59,14 +54,21 @@ public class EnhancedImport extends GhidraScript{
final Symbol s = Optional.ofNullable(getSymbolAt(addr)) final Symbol s = Optional.ofNullable(getSymbolAt(addr))
.orElse(createLabel(addr, name, ns, true, SourceType.USER_DEFINED)); .orElse(createLabel(addr, name, ns, true, SourceType.USER_DEFINED));
// Create data // Create data (TODO: parse type name to get base name, then pass base type to PointerDataType and ArrayDataType constructors to create final type)
final Optional<DataType> t_maybe = makeType(parts[2]); final List<DataType> foundTypes = state.getTool()
if (t_maybe.orElse(null) instanceof DataType t) { .getService(DataTypeQueryService.class)
clearListing(addr, addr.add(Math.max(t.getLength(), 1) - 1)); .findDataTypes(parts[2], null);
currentProgram.getListing().createData(addr, t); if (foundTypes.size() == 0) {
println(" can't find data type \"" + parts[2] + "\", skipping.");
return;
}
println(" done."); final DataType t = foundTypes.get(0); // Boldly assume first is right
} else println(", skipping.");
clearListing(addr, addr.add(Math.max(t.getLength(), 1) - 1));
currentProgram.getListing().createData(addr, t);
println(" done.");
} }
private static String unqualified(final String qualifiedName) { private static String unqualified(final String qualifiedName) {
@ -91,64 +93,6 @@ public class EnhancedImport extends GhidraScript{
return ns; return ns;
} }
private Optional<DataType> makeType(final String type) throws Exception {
/* Attempt to create the described type from a known base type */
final String baseName = StringUtilities.findWord(type, 0);
final List<DataType> foundTypes = state.getTool()
.getService(DataTypeQueryService.class)
.findDataTypes(baseName, null);
if (foundTypes.size() == 0) {
print(" can't find data type \"" + baseName + "\"");
return Optional.empty();
}
return Optional.of(derivedType(
foundTypes.get(0), // Boldly assume first is right
type.substring(baseName.length())
));
}
private static DataType derivedType(
final DataType t,
final String modifiers
) throws Exception {
/* Return the given datatype with given pointer/array modifiers */
DataType ret = t;
for (int i = 0; i < modifiers.length(); i++) switch (modifiers.charAt(i)) {
case '*':
ret = new PointerDataType(ret);
continue;
case '[':
// Read array dimensions
final ArrayList<Integer> dims = new ArrayList<>();
do {
final String n = StringUtilities.findWord(modifiers, i+1);
i += n.length() + 1;
dims.add(Integer.valueOf(n));
} while (modifiers.charAt(i) == '[');
// Apply array
Collections.reverse(dims);
for (int dim : dims) ret = new ArrayDataType(ret, dim);
continue;
case ' ':
continue;
default:
throw new Exception(
"Unexpected character \"" +
String.valueOf(modifiers.charAt(i)) +
"\" in type modifiers"
);
}
return ret;
}
private void importFunc( private void importFunc(
final Address addr, final Address addr,
final String[] parts final String[] parts