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:$@
# Compile object files from source
.c.obj:
CL.EXE /nologo /Wall /W4 /Ogityb0 /GfX /Fo$@ /c $<
.cpp.obj:
CL.EXE /nologo /Wall /W4 /Ogityb0 /GfX /Fo$@ /c $<
# Header files used for each object
src/JSRF/Jet2.obj: src/JSRF/Core.hpp src/Std.hpp src/XDK/D3D.h\
src/XDK/Win32.h
src/JSRF/Jet2.obj: src/JSRF/Core.hpp src/Std.hpp src/XDK/D3D.hpp\
src/XDK/Win32.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/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 "../Std.hpp"
#include "../XDK/D3D.h"
#include "../XDK/Win32.h"
#include "../XDK/D3D.hpp"
#include "../XDK/Win32.hpp"
// 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")
#include "../XDK/Win32.h"
#include "../XDK/Win32.hpp"
#include "GameData.hpp"

View file

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

View file

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

View file

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

View file

@ -1,24 +1,24 @@
/* JSRF Decompilation: XDK/CRT0.c
/* JSRF Decompilation: XDK/CRT0.cpp
C runtime initialization.
Like other CRT code, there's some magic here with symbols that get special
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
// existence with a declaration here
int main(void);
int main();
void __cdecl mainCRTStartup (void);
DWORD __stdcall mainXapiStartup(LPVOID lpThreadParameter);
void __stdcall mainCRTStartup ();
static DWORD _mainXapiStartup(LPVOID lpThreadParameter);
// Address: 0x00148023
// 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 linker automatically sets this function to the entrypoint.
*/
@ -26,7 +26,7 @@ The linker automatically sets this function to the entrypoint.
// Address: 0x00147FB4
// Matching: no
DWORD __stdcall mainXapiStartup(LPVOID const lpThreadParameter) {
DWORD _mainXapiStartup(LPVOID const lpThreadParameter) {
/* Runs some initialization and then calls main() */
main();
return 0;

View file

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

View file

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

View file

@ -5,20 +5,15 @@
import ghidra.app.script.GhidraScript;
import ghidra.app.services.DataTypeQueryService;
import ghidra.program.model.address.Address;
import ghidra.program.model.data.ArrayDataType;
import ghidra.program.model.data.DataType;
import ghidra.program.model.data.PointerDataType;
import ghidra.program.model.listing.Data;
import ghidra.program.model.listing.Function;
import ghidra.program.model.symbol.Namespace;
import ghidra.program.model.symbol.SourceType;
import ghidra.program.model.symbol.Symbol;
import ghidra.util.StringUtilities;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@ -39,7 +34,7 @@ public class EnhancedImport extends GhidraScript{
case "func": importFunc(addr, parts); break;
default: throw new Exception(
"Symbol type \"" + parts[1] +
"\" on line " + String.valueOf(i) +
"\" on line " + Integer.toString(i) +
" is not \"data\" or \"func\""
);
}
@ -59,14 +54,21 @@ public class EnhancedImport extends GhidraScript{
final Symbol s = Optional.ofNullable(getSymbolAt(addr))
.orElse(createLabel(addr, name, ns, true, SourceType.USER_DEFINED));
// Create data
final Optional<DataType> t_maybe = makeType(parts[2]);
if (t_maybe.orElse(null) instanceof DataType t) {
// Create data (TODO: parse type name to get base name, then pass base type to PointerDataType and ArrayDataType constructors to create final type)
final List<DataType> foundTypes = state.getTool()
.getService(DataTypeQueryService.class)
.findDataTypes(parts[2], null);
if (foundTypes.size() == 0) {
println(" can't find data type \"" + parts[2] + "\", skipping.");
return;
}
final DataType t = foundTypes.get(0); // Boldly assume first is right
clearListing(addr, addr.add(Math.max(t.getLength(), 1) - 1));
currentProgram.getListing().createData(addr, t);
println(" done.");
} else println(", skipping.");
}
private static String unqualified(final String qualifiedName) {
@ -91,64 +93,6 @@ public class EnhancedImport extends GhidraScript{
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(
final Address addr,
final String[] parts