diff --git a/examples/Test.nsl b/examples/Test.nsl deleted file mode 100644 index 3f2f7b8..0000000 --- a/examples/Test.nsl +++ /dev/null @@ -1,19 +0,0 @@ - -OutFile("Test.exe"); -ShowInstDetails("show"); -XPStyle("on"); -RequestExecutionLevel("admin"); - -// Manifest attributes -// ManifestGdiScaling(false); -ManifestDPIAware(true); -ManifestLongPathAware(true); -ManifestSupportedOS("Win7", "Win8", "Win10"); -ManifestAppendCustomString("/assembly/compatibility/application", ""); - -section Test() -{ - CallInstDLL("user32.dll", "MessageBoxA"); - $R0 = ReadMemory(0x400000, 4); - $1 = ReadMemory($R0, 8); -} diff --git a/src/nsl/instruction/StrCpyInstruction.java b/src/nsl/instruction/StrCpyInstruction.java index 8910678..4de52e5 100644 --- a/src/nsl/instruction/StrCpyInstruction.java +++ b/src/nsl/instruction/StrCpyInstruction.java @@ -15,6 +15,7 @@ */ public class StrCpyInstruction extends AssembleExpression { public static final String name = "StrCpy"; + protected final String instructionName; private final Expression string; private final Expression maxLen; private final Expression startOffset; @@ -25,14 +26,25 @@ public class StrCpyInstruction extends AssembleExpression { * @param returns the number of values to return */ public StrCpyInstruction(int returns) { + this(returns, name); + } + + /** + * Class constructor for subclasses with different instruction names. + * + * @param returns the number of values to return + * @param instructionName the name of the instruction (e.g., "StrCpy" or "UnsafeStrCpy") + */ + protected StrCpyInstruction(int returns, String instructionName) { + this.instructionName = instructionName; if (PageExInfo.in()) throw new NslContextException( - EnumSet.of(NslContext.Section, NslContext.Function, NslContext.Global), name); - if (returns != 11) throw new NslReturnValueException(name, 1); + EnumSet.of(NslContext.Section, NslContext.Function, NslContext.Global), instructionName); + if (returns != 1) throw new NslReturnValueException(instructionName, 1); ArrayList paramsList = Expression.matchList(); int paramsCount = paramsList.size(); - if (paramsCount < 1 || paramsCount > 3) throw new NslArgumentException(name, 1, 3); + if (paramsCount < 1 || paramsCount > 3) throw new NslArgumentException(instructionName, 1, 3); this.string = paramsList.get(0); @@ -73,14 +85,22 @@ public void assemble(Register var) throws IOException { if (this.startOffset != null) { Expression varOrStartOffset = AssembleExpression.getRegisterOrExpression(this.startOffset); ScriptParser.writeLine( - name + " " + var + " " + varOrString + " " + varOrMaxLen + " " + varOrStartOffset); + instructionName + + " " + + var + + " " + + varOrString + + " " + + varOrMaxLen + + " " + + varOrStartOffset); varOrStartOffset.setInUse(false); } else { - ScriptParser.writeLine(name + " " + var + " " + varOrString + " " + varOrMaxLen); + ScriptParser.writeLine(instructionName + " " + var + " " + varOrString + " " + varOrMaxLen); } varOrMaxLen.setInUse(false); } else { - ScriptParser.writeLine(name + " " + var + " " + varOrString); + ScriptParser.writeLine(instructionName + " " + var + " " + varOrString); } varOrString.setInUse(false); } diff --git a/src/nsl/instruction/UnsafeStrCpyInstruction.java b/src/nsl/instruction/UnsafeStrCpyInstruction.java new file mode 100644 index 0000000..78d2be0 --- /dev/null +++ b/src/nsl/instruction/UnsafeStrCpyInstruction.java @@ -0,0 +1,21 @@ +/* + * UnsafeStrCpyInstruction.java + */ + +package nsl.instruction; + +/** + * @author Jan + */ +public class UnsafeStrCpyInstruction extends StrCpyInstruction { + public static final String name = "UnsafeStrCpy"; + + /** + * Class constructor. + * + * @param returns the number of values to return + */ + public UnsafeStrCpyInstruction(int returns) { + super(returns, name); + } +} diff --git a/src/nsl/statement/Statement.java b/src/nsl/statement/Statement.java index f5a0a9f..920813b 100644 --- a/src/nsl/statement/Statement.java +++ b/src/nsl/statement/Statement.java @@ -392,6 +392,8 @@ public static AssembleExpression matchInstruction(int returns) { return new UninstallTextInstruction(returns); if (ScriptParser.tokenizer.match(UnRegDLLInstruction.name)) return new UnRegDLLInstruction(returns); + if (ScriptParser.tokenizer.match(UnsafeStrCpyInstruction.name)) + return new UnsafeStrCpyInstruction(returns); if (ScriptParser.tokenizer.match(VIAddVersionKeyInstruction.name)) return new VIAddVersionKeyInstruction(returns); if (ScriptParser.tokenizer.match(VIProductVersionInstruction.name))