diff --git a/java/ghidra/re3lib/FunctionDumper.java b/java/ghidra/re3lib/FunctionDumper.java index b408b5b4..a1f2ba02 100644 --- a/java/ghidra/re3lib/FunctionDumper.java +++ b/java/ghidra/re3lib/FunctionDumper.java @@ -333,15 +333,48 @@ public class FunctionDumper { writer2.println("// with possible manualy fixes"); writer2.println(); writer2.println("#include "); + writer2.println("#include "); writer2.println("#include "); - writer2.println("#include "); writer2.println(); writer2.println("// " + externalFunction.getEntryPoint()); writer2.println("// " + externalFunction.getName()); - writer2.println("extern \"C\" " + externalFunction.getSignature().getPrototypeString(false) + " {"); - writer2.println(" // TODO: Implement this function"); - writer2 - .println(" throw GHStubException(\"Function not implemented: " + externalFunction.getName() + "\");"); + + // Parse function signature to extract calling convention, return type, and parameters + String signature = externalFunction.getSignature().getPrototypeString(false); + String callingConvention = externalFunction.getCallingConventionName(); + String returnType = externalFunction.getReturnType().toString(); + + // Generate function stub using appropriate forwarding function + writer2.println("extern \"C\" " + signature + " {"); + + // Determine which stub function to use based on calling convention + String stubFunction; + if (callingConvention != null && callingConvention.equals("__stdcall")) { + stubFunction = "gh_stub_impl_stdcall"; + } else { + // Default to cdecl for most cases + stubFunction = "gh_stub_impl_cdecl"; + } + + // Generate parameter list for the call + StringBuilder paramList = new StringBuilder(); + var params = externalFunction.getParameters(); + for (int i = 0; i < params.length; i++) { + if (i > 0) paramList.append(", "); + paramList.append(params[i].getName()); + } + + // Generate the stub call + if (returnType.equals("void")) { + writer2.println(" " + stubFunction + "((void*)0x" + + externalFunction.getEntryPoint().toString().replace("0x", "") + + (paramList.length() > 0 ? ", " + paramList.toString() : "") + ");"); + } else { + writer2.println(" return " + stubFunction + "<" + returnType + ">((void*)0x" + + externalFunction.getEntryPoint().toString().replace("0x", "") + + (paramList.length() > 0 ? ", " + paramList.toString() : "") + ");"); + } + writer2.println("}"); }