使用C#和EasyHook在DX11游戏(CryEngine)中绘制叠加

时间:2014-05-25 18:13:07

标签: c# overlay directx-11 dll-injection easyhook

我想做什么:

我有一个基于CrySDK的游戏,它是DirectX11,我想绘制一个像蒸汽覆盖一样的游戏覆盖。

- >我写C#,因为我不知道任何C ++,所以我正在寻找在C#中做到这一点的方法。

- >我使用EasyHook和SharpDX Libaries,因为这似乎是最好的方法。

- >我发现reference project显然是SC2的某种黑客攻击,但我只对叠加部分感兴趣。

- >我使用Visual Studio 2013

- >现在,如果我能在游戏中随机抽取东西,我会很高兴

到目前为止我做了什么:

我正在浏览google和SO搜索结果,问题是,这些内容是在C ++,C还是其他内容,结果是从2010年开始,并不是最新的当前dx11,包含死链接或无法使用任何其他原因。这涵盖了我自己出现的95%,我的代码中包含了一些可用的提示。

我设法创建一个Injector.dll并将其注入游戏中(至少我认为它是注入的,到目前为止还没有任何可用的结果)

我有什么:

执行注入的文件:

...                
// Try inject thingy

            EasyHook.Config.Register("Star Citizen Noise.sc Client Overlay",
                                    //         "Direct3D9Hook.dll",
                                             "SharpDX.dll",
                                             "SharpDX.Direct3D11.dll",
                                             "Injector.dll");

            // Do the inject
            RemoteHooking.Inject(scProcess.Id, InjectionOptions.DoNotRequireStrongName, "Injector.dll", "Injector.dll", "Star Citizen Noise.sc Injector.dll");
            Console.WriteLine("DLL Injected.");
...

injector.dll本身由这个文件组成,名为Hooks / Graphics / Direct3D11Hook.cs(我试图保持结构类似于oter sc2参考项目)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Runtime.InteropServices;
using EasyHook;
using SharpDX;
using SharpDX.Direct3D11;
using Rectangle = SharpDX.Rectangle;

namespace Injector.Hooks.Graphics
{
    public class Direct3D11Hook : HookBase
    {

        private Device device = null;

        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
        private delegate Result EndSceneDelegate(IntPtr devicePointer);

        public delegate void EndSceneEventDelegate(ref IntPtr devicePointer);
        public event EndSceneEventDelegate OnEndScene;

        private Result EndScene(IntPtr devicePointer)
        {
            try
            {
                //this.Log.LogMethodSignatureTypesAndValues(devicePointer);

                //GetOrCreateDevice
                if (this.device == null)
                    this.device = Device.FromPointer<Device>(devicePointer);

                if (this.OnEndScene != null)
                    this.OnEndScene(ref devicePointer);

                System.Drawing.Graphics g = System.Drawing.Graphics.FromHdc(devicePointer);
                //System.Drawing.Graphics g = System.Drawing.Graphics.FromHwndInternal(devicePointer);

                // lets try to draw something
                Pen myPen = new Pen(System.Drawing.Color.Pink, 4);
                System.Drawing.Point P1 = new System.Drawing.Point(50, 50);
                System.Drawing.Point P2 = new System.Drawing.Point(500, 500);
                g.DrawLine(myPen, P1, P2);
                g.Dispose();
                //this.device.EndScene();

                return Result.Ok;
            }
            catch (SharpDXException ex)
            {
                //Log.Warn(ex);
                Console.WriteLine(ex);
                return ex.ResultCode;
            }
            catch (Exception ex)
            {
                //this.Log.Fatal(ex);
                Console.WriteLine(ex);
                return Result.UnexpectedFailure;
            }
        }

        public override void Install()
        {
            try
            {
                EndSceneDelegate esd = new EndSceneDelegate(this.EndScene);

            }
            catch (Exception)
            {

                throw;
            }
        }

        public override void Uninstall()
        {

        }

    }
}

这里我尝试为EndScene函数提供覆盖函数,因为我认为这是我需要的地方。毋庸置疑,似乎没有任何内容。

委托定义有点像copypaste from the reference project但是我还没有找到如何将我的函数实际挂钩到渲染管道和/或对可能有助于我的事业的事件作出反应。

还有这个巨大的文件[https://github.com/jasonpang/Starcraft2Hook/blob/master/Game/Hooks/Graphics/Direct3D9.cs]定义了似乎适用于DX9的函数地址,我认为它不能只是复制粘贴并用于DX11,所以可能有新的DX11中的功能地址?我怎么能找到那些?我需要在哪里看? SharpDX可以帮助我吗?

TL; DR

想要为DX11游戏创建类似蒸汽的叠加层,需要挂入D3D的东西和魔法和狗屎,得到dll注入工作,需要管道注入的帮助

1 个答案:

答案 0 :(得分:1)