Skip to content

Instantly share code, notes, and snippets.

@airbreather
Last active January 4, 2017 13:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save airbreather/0146c9d13d20e44b91e7737e128c871b to your computer and use it in GitHub Desktop.
Save airbreather/0146c9d13d20e44b91e7737e128c871b to your computer and use it in GitHub Desktop.
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace StepperUpper
{
internal static class Playground
{
internal static void Main()
{
IntPtr xEditLibHandle = SafeNativeMethods.LoadLibrary("XEditLib.dll");
try
{
SafeNativeMethods.Initialize();
SafeNativeMethods.SetGameMode(3);
SafeNativeMethods.LoadPlugins(@"Skyrim.esm,Update.esm");
StringBuilder sb = new StringBuilder(4000);
while (!SafeNativeMethods.GetLoaderDone())
{
SafeNativeMethods.GetBuffer(sb);
SafeNativeMethods.FlushBuffer();
if (sb.Length != 0)
{
Console.Write(sb.ToString());
sb.Clear();
}
Thread.Sleep(100);
}
uint skyrim, armo;
IntPtr elements;
SafeNativeMethods.GetElement(0, "Skyrim.esm", out skyrim);
SafeNativeMethods.GetElement(skyrim, "ARMO", out armo);
SafeNativeMethods.GetElements(armo, out elements);
int cnt = SafeNativeMethods.ElementCount(armo);
for (int i = 0; i < cnt; i++)
{
SafeNativeMethods.SortKey(unchecked((uint)Marshal.ReadInt32(elements, i * 4)), sb);
Console.WriteLine("[ARMO:{0}]", sb.ToString());
sb.Clear();
}
}
finally
{
SafeNativeMethods._Finalize();
SafeNativeMethods.FreeLibrary(xEditLibHandle);
SafeNativeMethods.FreeLibrary(xEditLibHandle);
}
}
}
}
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace StepperUpper
{
internal static class SafeNativeMethods
{
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
internal static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string fileName);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern bool FreeLibrary(IntPtr module);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl)]
internal static extern void Initialize();
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Finalize")]
internal static extern void _Finalize();
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl)]
internal static extern void SetGameMode(int mode);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
internal static extern bool LoadPlugins(string str);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl)]
internal static extern bool GetLoaderDone();
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
internal static extern void GetBuffer(StringBuilder buffer);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl)]
internal static extern uint FileByIndex(int index);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern uint FileByName(string name);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
internal static extern bool ElementType(uint h, StringBuilder buffer);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl)]
internal static extern int ElementCount(uint h);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
internal static extern bool GetElement(uint h, string key, out uint res);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl)]
internal static extern bool GetElements(uint h, out IntPtr res);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
internal static extern bool Name(uint h, StringBuilder buffer);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
internal static extern bool Signature(uint h, StringBuilder buffer);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
internal static extern bool SortKey(uint h, StringBuilder buffer);
[DllImport("XEditLib", CallingConvention = CallingConvention.Cdecl)]
internal static extern void FlushBuffer();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment