Beispiel #1
0
        public override void Hook()
        {
            this.DebugMessage("Hook: Begin");

            // Determine method addresses in Direct3D10.Device, and DXGI.SwapChain
            if (_d3d10VTblAddresses == null)
            {
                _d3d10VTblAddresses         = new List <IntPtr>();
                _dxgiSwapChainVTblAddresses = new List <IntPtr>();
                this.DebugMessage("Hook: Before device creation");
                using (SlimDX.DXGI.Factory factory = new SlimDX.DXGI.Factory())
                {
                    using (SlimDX.Direct3D10.Device device = new Device(factory.GetAdapter(0), DriverType.Hardware, DeviceCreationFlags.None))
                    {
                        this.DebugMessage("Hook: Device created");
                        _d3d10VTblAddresses.AddRange(GetVTblAddresses(device.ComPointer, D3D10_DEVICE_METHOD_COUNT));

                        using (SlimDX.Windows.RenderForm renderForm = new SlimDX.Windows.RenderForm())
                        {
                            using (SlimDX.DXGI.SwapChain sc = new SlimDX.DXGI.SwapChain(factory, device, DXGI.CreateSwapChainDescription(renderForm.Handle)))
                            {
                                _dxgiSwapChainVTblAddresses.AddRange(GetVTblAddresses(sc.ComPointer, DXGI.DXGI_SWAPCHAIN_METHOD_COUNT));
                            }
                        }
                    }
                }
            }

            // We will capture the backbuffer here
            DXGISwapChain_PresentHook = LocalHook.Create(
                _dxgiSwapChainVTblAddresses[(int)DXGI.DXGISwapChainVTbl.Present],
                new DXGISwapChain_PresentDelegate(PresentHook),
                this);

            // We will capture target/window resizes here
            DXGISwapChain_ResizeTargetHook = LocalHook.Create(
                _dxgiSwapChainVTblAddresses[(int)DXGI.DXGISwapChainVTbl.ResizeTarget],
                new DXGISwapChain_ResizeTargetDelegate(ResizeTargetHook),
                this);

            /*
             * Don't forget that all hooks will start deactivated...
             * The following ensures that all threads are intercepted:
             * Note: you must do this for each hook.
             */
            DXGISwapChain_PresentHook.ThreadACL.SetExclusiveACL(new Int32[1]);

            DXGISwapChain_ResizeTargetHook.ThreadACL.SetExclusiveACL(new Int32[1]);
        }
Beispiel #2
0
        public override void Create(IntPtr handle)
        {
            var desc = new SlimDX.DXGI.SwapChainDescription()
            {
                BufferCount     = 1,
                ModeDescription = new SlimDX.DXGI.ModeDescription(View.ClientSize.Width,
                                                                  View.ClientSize.Height, new Rational(60, 1), SlimDX.DXGI.Format.R8G8B8A8_UNorm),
                IsWindowed        = true,
                OutputHandle      = handle,
                SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0),
                SwapEffect        = SlimDX.DXGI.SwapEffect.Discard,
                Usage             = SlimDX.DXGI.Usage.RenderTargetOutput,
                Flags             = SlimDX.DXGI.SwapChainFlags.AllowModeSwitch
            };

            SlimDX.Direct3D10.Device.CreateWithSwapChain(null, SlimDX.Direct3D10.DriverType.Hardware,
                                                         SlimDX.Direct3D10.DeviceCreationFlags.Debug, desc, out Device10, out SwapChain);
            backBuffer = SlimDX.Direct3D10.Texture2D.FromSwapChain <SlimDX.Direct3D10.Texture2D>(SwapChain, 0);
            RenderView = new SlimDX.Direct3D10.RenderTargetView(Device10, backBuffer);

            SlimDX.Direct3D10.Texture2DDescription depthStencilDesc = new SlimDX.Direct3D10.Texture2DDescription
            {
                Width             = View.Width,
                Height            = View.Height,
                MipLevels         = 1,
                ArraySize         = 1,
                Format            = SlimDX.DXGI.Format.D32_Float,
                SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0),
                Usage             = SlimDX.Direct3D10.ResourceUsage.Default,
                BindFlags         = SlimDX.Direct3D10.BindFlags.DepthStencil,
                CpuAccessFlags    = SlimDX.Direct3D10.CpuAccessFlags.None,
                OptionFlags       = SlimDX.Direct3D10.ResourceOptionFlags.None
            };
            depthStencil     = new SlimDX.Direct3D10.Texture2D(Device10, depthStencilDesc);
            DepthStencilView = new SlimDX.Direct3D10.DepthStencilView(Device10, depthStencil,
                                                                      new SlimDX.Direct3D10.DepthStencilViewDescription
            {
                Format          = SlimDX.DXGI.Format.D32_Float,
                FirstArraySlice = 0,
                ArraySize       = 1,
                MipSlice        = 0,
                Dimension       = SlimDX.Direct3D10.DepthStencilViewDimension.Texture2D
            });

            SlimDX.Direct3D10.DepthStencilStateDescription dssd = new SlimDX.Direct3D10.DepthStencilStateDescription
            {
                IsDepthEnabled   = true,
                DepthWriteMask   = SlimDX.Direct3D10.DepthWriteMask.All,
                DepthComparison  = SlimDX.Direct3D10.Comparison.Less,
                IsStencilEnabled = true,
                StencilReadMask  = 0xFF,
                StencilWriteMask = 0xFF,
                FrontFace        = new SlimDX.Direct3D10.DepthStencilOperationDescription
                {
                    FailOperation      = SlimDX.Direct3D10.StencilOperation.Keep,
                    DepthFailOperation = SlimDX.Direct3D10.StencilOperation.Increment,
                    PassOperation      = SlimDX.Direct3D10.StencilOperation.Keep,
                    Comparison         = SlimDX.Direct3D10.Comparison.Always
                },
                BackFace = new SlimDX.Direct3D10.DepthStencilOperationDescription
                {
                    FailOperation      = SlimDX.Direct3D10.StencilOperation.Keep,
                    DepthFailOperation = SlimDX.Direct3D10.StencilOperation.Decrement,
                    PassOperation      = SlimDX.Direct3D10.StencilOperation.Keep,
                    Comparison         = SlimDX.Direct3D10.Comparison.Always
                }
            };

            depthStencilState = SlimDX.Direct3D10.DepthStencilState.FromDescription(Device10, dssd);
            Device10.OutputMerger.DepthStencilState = depthStencilState;
            Device10.OutputMerger.SetTargets(DepthStencilView, RenderView);
            Viewport10 = new SlimDX.Direct3D10.Viewport(0, 0, View.ClientSize.Width, View.ClientSize.Height, 0.0f, 1.0f);
            Device10.Rasterizer.SetViewports(Viewport10);

            //Stops Alt+enter from causing fullscreen skrewiness.
            factory = SwapChain.GetParent <SlimDX.DXGI.Factory>();
            factory.SetWindowAssociation(View.Handle, SlimDX.DXGI.WindowAssociationFlags.IgnoreAll);
        }
Beispiel #3
0
        public override void Hook()
        {
            this.DebugMessage("Hook: Begin");

            // Determine method addresses in Direct3D10.Device, and DXGI.SwapChain
            if (_d3d10VTblAddresses == null)
            {
                _d3d10VTblAddresses = new List<IntPtr>();
                _dxgiSwapChainVTblAddresses = new List<IntPtr>();
                this.DebugMessage("Hook: Before device creation");
                using (SlimDX.DXGI.Factory factory = new SlimDX.DXGI.Factory())
                {
                    using (SlimDX.Direct3D10.Device device = new Device(factory.GetAdapter(0), DriverType.Hardware, DeviceCreationFlags.None ))
                    {
                        this.DebugMessage("Hook: Device created");
                        _d3d10VTblAddresses.AddRange(GetVTblAddresses(device.ComPointer, D3D10_DEVICE_METHOD_COUNT));

                        using (SlimDX.Windows.RenderForm renderForm = new SlimDX.Windows.RenderForm())
                        {
                            using (SlimDX.DXGI.SwapChain sc = new SlimDX.DXGI.SwapChain(factory, device, DXGI.CreateSwapChainDescription(renderForm.Handle)))
                            {
                                _dxgiSwapChainVTblAddresses.AddRange(GetVTblAddresses(sc.ComPointer, DXGI.DXGI_SWAPCHAIN_METHOD_COUNT));
                            }
                        }
                    }
                }
            }

            // We will capture the backbuffer here
            DXGISwapChain_PresentHook = LocalHook.Create(
                _dxgiSwapChainVTblAddresses[(int)DXGI.DXGISwapChainVTbl.Present],
                new DXGISwapChain_PresentDelegate(PresentHook),
                this);

            // We will capture target/window resizes here
            DXGISwapChain_ResizeTargetHook = LocalHook.Create(
                _dxgiSwapChainVTblAddresses[(int)DXGI.DXGISwapChainVTbl.ResizeTarget],
                new DXGISwapChain_ResizeTargetDelegate(ResizeTargetHook),
                this);

            /*
             * Don't forget that all hooks will start deactivated...
             * The following ensures that all threads are intercepted:
             * Note: you must do this for each hook.
             */
            DXGISwapChain_PresentHook.ThreadACL.SetExclusiveACL(new Int32[1]);

            DXGISwapChain_ResizeTargetHook.ThreadACL.SetExclusiveACL(new Int32[1]);
        }
        public override void Create(IntPtr handle)
        {
            var desc = new SlimDX.DXGI.SwapChainDescription()
            {
                BufferCount = 1,
                ModeDescription = new SlimDX.DXGI.ModeDescription(View.ClientSize.Width,
                    View.ClientSize.Height, new Rational(60, 1), SlimDX.DXGI.Format.R8G8B8A8_UNorm),
                IsWindowed = true,
                OutputHandle = handle,
                SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0),
                SwapEffect = SlimDX.DXGI.SwapEffect.Discard,
                Usage = SlimDX.DXGI.Usage.RenderTargetOutput,
                Flags = SlimDX.DXGI.SwapChainFlags.AllowModeSwitch
            };

            SlimDX.Direct3D10.Device.CreateWithSwapChain(null, SlimDX.Direct3D10.DriverType.Hardware,
                SlimDX.Direct3D10.DeviceCreationFlags.Debug, desc, out Device10, out SwapChain);
            backBuffer = SlimDX.Direct3D10.Texture2D.FromSwapChain<SlimDX.Direct3D10.Texture2D>(SwapChain, 0);
            RenderView = new SlimDX.Direct3D10.RenderTargetView(Device10, backBuffer);

            SlimDX.Direct3D10.Texture2DDescription depthStencilDesc = new SlimDX.Direct3D10.Texture2DDescription
            {
                Width = View.Width,
                Height = View.Height,
                MipLevels = 1,
                ArraySize = 1,
                Format = SlimDX.DXGI.Format.D32_Float,
                SampleDescription = new SlimDX.DXGI.SampleDescription(1, 0),
                Usage = SlimDX.Direct3D10.ResourceUsage.Default,
                BindFlags = SlimDX.Direct3D10.BindFlags.DepthStencil,
                CpuAccessFlags = SlimDX.Direct3D10.CpuAccessFlags.None,
                OptionFlags = SlimDX.Direct3D10.ResourceOptionFlags.None
            };
            depthStencil = new SlimDX.Direct3D10.Texture2D(Device10, depthStencilDesc);
            DepthStencilView = new SlimDX.Direct3D10.DepthStencilView(Device10, depthStencil,
                new SlimDX.Direct3D10.DepthStencilViewDescription
                {
                    Format = SlimDX.DXGI.Format.D32_Float,
                    FirstArraySlice = 0,
                    ArraySize = 1,
                    MipSlice = 0,
                    Dimension = SlimDX.Direct3D10.DepthStencilViewDimension.Texture2D
                });

            SlimDX.Direct3D10.DepthStencilStateDescription dssd = new SlimDX.Direct3D10.DepthStencilStateDescription
            {
                IsDepthEnabled = true,
                DepthWriteMask = SlimDX.Direct3D10.DepthWriteMask.All,
                DepthComparison = SlimDX.Direct3D10.Comparison.Less,
                IsStencilEnabled = true,
                StencilReadMask = 0xFF,
                StencilWriteMask = 0xFF,
                FrontFace = new SlimDX.Direct3D10.DepthStencilOperationDescription
                {
                    FailOperation = SlimDX.Direct3D10.StencilOperation.Keep,
                    DepthFailOperation = SlimDX.Direct3D10.StencilOperation.Increment,
                    PassOperation = SlimDX.Direct3D10.StencilOperation.Keep,
                    Comparison = SlimDX.Direct3D10.Comparison.Always
                },
                BackFace = new SlimDX.Direct3D10.DepthStencilOperationDescription
                {
                    FailOperation = SlimDX.Direct3D10.StencilOperation.Keep,
                    DepthFailOperation = SlimDX.Direct3D10.StencilOperation.Decrement,
                    PassOperation = SlimDX.Direct3D10.StencilOperation.Keep,
                    Comparison = SlimDX.Direct3D10.Comparison.Always
                }
            };

            depthStencilState = SlimDX.Direct3D10.DepthStencilState.FromDescription(Device10, dssd);
            Device10.OutputMerger.DepthStencilState = depthStencilState;
            Device10.OutputMerger.SetTargets(DepthStencilView, RenderView);
            Viewport10 = new SlimDX.Direct3D10.Viewport(0, 0, View.ClientSize.Width, View.ClientSize.Height, 0.0f, 1.0f);
            Device10.Rasterizer.SetViewports(Viewport10);

            //Stops Alt+enter from causing fullscreen skrewiness.
            factory = SwapChain.GetParent<SlimDX.DXGI.Factory>();
            factory.SetWindowAssociation(View.Handle, SlimDX.DXGI.WindowAssociationFlags.IgnoreAll);
        }