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); }
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); }