Ignore:
Timestamp:
Jul 16, 2014, 7:36:46 PM (10 years ago)
Author:
alloc
Message:

fixes

Location:
binary-improvements/assembly-patcher
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements/assembly-patcher/Assembly-Patcher.userprefs

    r74 r75  
    33  <MonoDevelop.Ide.Workbench ActiveDocument="Main.cs">
    44    <Files>
    5       <File FileName="Main.cs" Line="19" Column="4" />
     5      <File FileName="Main.cs" Line="35" Column="161" />
    66      <File FileName="AssemblyInfo.cs" Line="7" Column="36" />
    77    </Files>
  • binary-improvements/assembly-patcher/Main.cs

    r73 r75  
    1212                        ModuleDefinition module = ModuleDefinition.ReadModule ("Assembly-CSharp.dll");
    1313                        telnetPatch (module);
     14                        connectLogPatch(module);
    1415                        module.Write ("Assembly-CSharp.dll");
    1516                        Console.WriteLine ("Done");
     17                }
     18
     19                private static void connectLogPatch (ModuleDefinition module)
     20                {
     21                        TypeDefinition type = module.GetType ("GameManager");
     22
     23                        if (isPatched (type)) {
     24                                return;
     25                        }
     26
     27                        markTypePatched (module, type);
     28                        addHook (type, "RequestToSpawnPlayer", true, 5, typeof(AllocsRequestToSpawnPlayer).GetMethod ("RequestToSpawnPlayer"));
    1629                }
    1730
     
    2538
    2639                        markTypePatched (module, type);
    27                         patchMethod (type, ".ctor", 1, typeof(AllocsNetTelnetServer).GetMethod ("init"));
    28                         patchMethod (type, "Disconnect", 0, typeof(AllocsNetTelnetServer).GetMethod ("Disconnect"));
    29                         patchMethod (type, "SetConsole", 1, typeof(AllocsNetTelnetServer).GetMethod ("SetConsole"));
    30                         patchMethod (type, "WriteToClient", 1, typeof(AllocsNetTelnetServer).GetMethod ("WriteToClient"));
     40                        replaceMethod (type, ".ctor", 1, typeof(AllocsNetTelnetServer).GetMethod ("init"));
     41                        replaceMethod (type, "Disconnect", 0, typeof(AllocsNetTelnetServer).GetMethod ("Disconnect"));
     42                        replaceMethod (type, "SetConsole", 1, typeof(AllocsNetTelnetServer).GetMethod ("SetConsole"));
     43                        replaceMethod (type, "WriteToClient", 1, typeof(AllocsNetTelnetServer).GetMethod ("WriteToClient"));
    3144                }
    3245
     
    3649                }
    3750
    38                 private static void patchMethod (TypeDefinition type, string methodName, int opCount, MethodBase targetMethod)
     51                private static void addHook (TypeDefinition type, string methodName, bool addThisRef, int opCount, MethodBase targetMethod)
     52                {
     53                        foreach (MethodDefinition method in type.Methods) {
     54                                if (method.Name.Equals (methodName)) {
     55                                        Console.WriteLine ("Patching " + methodName);
     56                                        var il = method.Body.GetILProcessor ();
     57                                        var call = il.Create (OpCodes.Call, method.Module.Import (targetMethod));
     58                                        var i = 0;
     59                                        if (addThisRef)
     60                                                il.InsertBefore (method.Body.Instructions [i++], il.Create (OpCodes.Ldarg, 0));
     61                                        for (int op = 0; op < opCount; op++) {
     62                                                il.InsertBefore (method.Body.Instructions [i++], il.Create (OpCodes.Ldarg, op + 1));
     63                                        }
     64                                        il.InsertBefore (method.Body.Instructions [i++], call);
     65                                }
     66                        }
     67                }
     68
     69                private static void replaceMethod (TypeDefinition type, string methodName, int opCount, MethodBase targetMethod)
    3970                {
    4071                        foreach (MethodDefinition method in type.Methods) {
Note: See TracChangeset for help on using the changeset viewer.