JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Fremd Framebuffer

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 17.10.2004, 18:56    Titel: Fremd Framebuffer Antworten mit Zitat

Hi,

kennt jemand ne Möglichkeit den Framebuffer von einer anderen Anwendung auszulesen und zu manipulieren als meiner eigenen ? Die Anwendung läuft auf DX Basis.

Bisher kenn ich nur das es ne Möglichkeit gibt über COM Keys aber damit kenn ich mich leider 0 aus.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 18.10.2004, 19:57    Titel: Antworten mit Zitat

Ich werde es vermutlich mit der Funktion GetFrameBufferData lösen können nun habe ich dazu eine Frage. In der Dikumentation steht das er die Daten von einem Frontbuffer holt. Aber von welchem ? Ich habe ein Beispiel gefunden da wird diese Funktion angewendet und man erhält nen Screenshot von dem Desktop.

Wie also funktioniert diese Funktion? Wird einfach nur der aktuell sichtbare Bereich in ein Surface kopiert oder steck ne andere Sache dahinter?
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 18.10.2004, 21:39    Titel: Antworten mit Zitat

Es kann doch nur einen Frontbuffer geben!?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 19.10.2004, 11:13    Titel: Antworten mit Zitat

Ich hab das schonmal versucht, aber um GetFrameBufferData nutzen zu können benötigst du ein DirectX-Objekt. Und du kommst NICHT an das DX-Obkjekt der Fremdanwendung ran - uns so hast du leider nur deinen eigenen Puffer, auf den du zugreifst.
_________________
CPP:
float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 19.10.2004, 11:16    Titel: Antworten mit Zitat

Das mit den GetFrame... habe ich fallen gelassen die Funktion ist zu extrem lahm 600ms sind ein bissl zu viel ums flüssig anwenden zu können. Aber ich hab wieder ne neue Idee. Ich will die DX Funktionen Hooken. Bisher weiss ich das man das erreichen kann indem man sich ne Eigene DLL schreibe welche die alte DX Dll ersetzt. Aber gibts da keine bessere möglichkeit ? Ich will das eigentlich schön erweiterbar halten.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.11.2004, 18:20    Titel: Antworten mit Zitat

Kennt sich jemand mit "DeTours" aus ?

http://research.microsoft.com/sn/detours/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 09.11.2004, 00:14    Titel: Antworten mit Zitat

FallenAngel84 hat Folgendes geschrieben:
Kennt sich jemand mit "DeTours" aus ?

http://research.microsoft.com/sn/detours/

Kenne ich nicht. Hört sich an wie ne Fluggesellschaft.
Danke für den Link... sieht sehr interessant aus. Smile *muuuhahahaha*
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 09.11.2004, 00:35    Titel: Antworten mit Zitat

Es gibt wirklich ne Fluggesellschaft namens DeTours ^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 09.11.2004, 06:55    Titel: Antworten mit Zitat

Ok Ich habe mir nun ne vorgefertigte WrapperDLL von DX9 geladen da es mit detours nicht wirklich funktioniert (scheiss virtuelle Methoden)

diese DLL werde ich dann nach dem Programmstart (Spiel) injezieren mit detours (nun isses doch zu was nutze).

Man das wird ne Arbeit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 12.11.2004, 18:31    Titel: Antworten mit Zitat

Zur Vollständigkeit halber hier nochmal der Code wie man den Aktuellen Backbuffer erhält (den eigenen):

Code:
...
LPDIRECT3DTEXTURE9      _ScreenMaskTexture=NULL;
LPDIRECT3DSURFACE9      _ScreenMaskSurface=NULL;
bool                    _bCreatedScreenTexture=NULL;
...


Code:
      if(!_bCreatedScreenTexture)
      {
         _ScreenMaskTexture=NULL;
         _bCreatedScreenTexture=true;
         IDirect3DSurface9* pRenderTarget=NULL;
         GetRenderTarget(0, &pRenderTarget);
         D3DSURFACE_DESC desc;
         pRenderTarget->GetDesc(&desc);
         pRenderTarget->Release();

         _SMaskX=desc.Width,_SMaskY=desc.Height;   

         PDIRECT3D9 d3d=NULL;
         GetDirect3D(&d3d);

         D3DDISPLAYMODE d3ddisplaymode;
         d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddisplaymode);

           
         CreateTexture(_SMaskX,_SMaskY,1,D3DUSAGE_DYNAMIC,d3ddisplaymode.Format,
                           D3DPOOL_DEFAULT,
                           &_ScreenMaskTexture,
                           NULL);

         CreateOffscreenPlainSurface(_SMaskX,_SMaskY,d3ddisplaymode.Format,D3DPOOL_SYSTEMMEM,
                           &_ScreenMaskSurface,
                           NULL);
      
      }
      if(_ScreenMaskTexture)
      {
         IDirect3DSurface9* pRenderTarget=NULL;
         IDirect3DSurface9* pScreenMaskSurface=NULL;         

         _ScreenMaskTexture->GetSurfaceLevel(0,&pScreenMaskSurface);

         GetRenderTarget(0, &pRenderTarget);
         GetRenderTargetData(pRenderTarget,   _ScreenMaskSurface);
         UpdateSurface(_ScreenMaskSurface,NULL,pScreenMaskSurface,NULL);         
         

         SAFE_RELEASE(pRenderTarget);
         SAFE_RELEASE(pScreenMaskSurface);
      }


Vieleicht kann das ja mal jemand optimieren.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 23.09.2005, 16:52    Titel: Antworten mit Zitat

Eventuell interessiert es ja noch jemanden, ich habe bei gamedev.net ein interessanten Thread gefunden der am Ende auf Detours aufsetzt, wenn ich das richtig deute kann man somit auf das schreiben einer Total Conversion der DX Dll verzichten. Evtl wird dann eine verbesserte Prometheus Version erscheinen die dann auch endlich anständig funktioniert:

http://www.gamedev.net/community/forums/topic.asp?topic_id=342920

Hier der wichtigste Auszug:

Zitat:
bjogio:

catch a function exported by a dll is trivial, for example we want to catch Direct3DCreate8 and obtain a pointer to a IDirect3D8:
the dll main of a project of mine (it uses detours lib from Ms but you can isolate it and take only the part you want:
CPP:
/*
The Fierce Gear project
Copyright (C) 2005 Francesco Bigiarini

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/


#define DBG_TRACE 0

#include "MemoryScanner.h"
#include "MemorySystem.h"
#include "Detours.h"
#include <dinput.h>
#include <mmreg.h>
#include <dsound.h>
#include <fstream>

extern "C"
{

DETOUR_TRAMPOLINE(HRESULT WINAPI Real_DirectInput8Create(
   HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut,
   LPUNKNOWN punkOuter), DirectInput8Create);

DETOUR_TRAMPOLINE(HRESULT WINAPI Real_DirectSoundCreate(
   LPCGUID pcGuidDevice, LPDIRECTSOUND *ppDS,
   LPUNKNOWN pUnkOuter), DirectSoundCreate);

DETOUR_TRAMPOLINE(HRESULT WINAPI Real_DirectSoundCreate8(
   LPCGUID pcGuidDevice, LPDIRECTSOUND8 *ppDS,
   LPUNKNOWN pUnkOuter), DirectSoundCreate8);

DETOUR_TRAMPOLINE(IDirect3D8* WINAPI Real_Direct3DCreate8(
   UINT SDKVersion), Direct3DCreate8);

HRESULT (WINAPI *Real_DirectInputCreateEx)(
   HINSTANCE hinst, DWORD dwVersion, REFIID riidltf,
   LPVOID *ppvOut, LPUNKNOWN punkOuter) = NULL;

IDirect3D8* WINAPI Direct3DCreate8Replace(UINT SDKVersion)
{
   IDirect3D8* dev = Real_Direct3DCreate8(SDKVersion);
   MemoryScanner::RealDirect3D8 = (IDirect3D8*)dev;

   if(gMemoryScanner.Init(MemoryScanner::DeviceDirect3D))
   {
      gMemoryScanner.Out << "Call(Direct3DCreate8) " << SDKVersion << std::endl;
      gMemoryScanner.COMAttack((void*)MemoryScanner::RealDirect3D8,
         &gMemoryScanner.Attack_Direct3D8_CreateDevice);
   }
   return dev;
}               

HRESULT WINAPI DirectInput8CreateReplace(HINSTANCE hinst,
   DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN pUnkOuter)
{
   HRESULT hr;

   hr = Real_DirectInput8Create(hinst, dwVersion, riidltf, ppvOut, pUnkOuter);
   MemoryScanner::RealDirectInput8 = (LPDIRECTINPUT8)*ppvOut;

   if(gMemoryScanner.Init(MemoryScanner::DeviceDirectInput))
   {
      gMemoryScanner.Out << "Call(DirectInput8Create) " << dwVersion << std::endl;
      gMemoryScanner.COMAttack((void*)MemoryScanner::RealDirectInput8,
         &gMemoryScanner.Attack_DirectInput_CreateDevice);
   }
    return hr;
}

HRESULT WINAPI DirectInputCreateExReplace(HINSTANCE hinst,
   DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN pUnkOuter)
{
   HRESULT hr;
   
   hr = Real_DirectInputCreateEx(hinst, dwVersion, riidltf, ppvOut, pUnkOuter);
   MemoryScanner::RealDirectInput7 = (LPDIRECTINPUT7)*ppvOut;

   if(gMemoryScanner.Init(MemoryScanner::DeviceDirectInput))
   {
      gMemoryScanner.Out << "Call(DirectInputCreateEx) " << dwVersion << std::endl;
      gMemoryScanner.COMAttack((void*)MemoryScanner::RealDirectInput7,
         &gMemoryScanner.Attack_DirectInput_CreateDeviceEx);
   }
    return hr;
}

HRESULT WINAPI DirectSoundCreateReplace(LPCGUID pcGuidDevice,
   LPDIRECTSOUND *ppDS, LPUNKNOWN pUnkOuter)
{
   HRESULT hr;
   hr = Real_DirectSoundCreate(pcGuidDevice, ppDS, pUnkOuter);
   MemoryScanner::RealDirectSound = (LPDIRECTSOUND)*ppDS;

   if(gMemoryScanner.Init(MemoryScanner::DeviceDirectSound))
   {
      gMemoryScanner.Out << "Call(DirectSoundCreate)" << std::endl;
      gMemoryScanner.COMAttack((void*)MemoryScanner::RealDirectSound,
         &gMemoryScanner.Attack_DirectSound_CreateSoundBuffer);
   }
   return hr;
}

HRESULT WINAPI DirectSoundCreate8Replace(LPCGUID pcGuidDevice,
   LPDIRECTSOUND8 *ppDS, LPUNKNOWN pUnkOuter)
{
   return DirectSoundCreateReplace(pcGuidDevice, (LPDIRECTSOUND*)ppDS, pUnkOuter);
}

static LONG TlsIndent = -1;
static LONG TlsThread = -1;
static LONG ThreadCnt = 0;

BOOL ThreadAttach(HMODULE hDll)
{
   if(TlsIndent >= 0) TlsSetValue(TlsIndent, (PVOID)0);
   if(TlsThread >= 0)
   {
      LONG Thread = InterlockedIncrement(&ThreadCnt);
      TlsSetValue(TlsThread, (PVOID)Thread);
   }
   return TRUE;
}

BOOL ThreadDetach(HMODULE hDll)
{
   if(TlsIndent >= 0) TlsSetValue(TlsIndent, (PVOID)0);
   if (TlsThread >= 0) TlsSetValue(TlsThread, (PVOID)0);
   return TRUE;
}

BOOL ProcessAttach(HMODULE hDll)
{
   TlsIndent = TlsAlloc();
   TlsThread = TlsAlloc();
   DetourFunctionWithTrampoline((PBYTE)Real_DirectSoundCreate,
                                 (PBYTE)DirectSoundCreateReplace);
   DetourFunctionWithTrampoline((PBYTE)Real_DirectSoundCreate8,
                                 (PBYTE)DirectSoundCreate8Replace);
   DetourFunctionWithTrampoline((PBYTE)Real_DirectInput8Create,
                                 (PBYTE)DirectInput8CreateReplace);
   DetourFunctionWithTrampoline((PBYTE)Real_Direct3DCreate8,
                                 (PBYTE)Direct3DCreate8Replace);

   HRESULT (WINAPI *DEx)(HINSTANCE, DWORD, REFIID, LPVOID*, LPUNKNOWN) =
      ((HRESULT(WINAPI*)(HINSTANCE, DWORD, REFIID, LPVOID*, LPUNKNOWN))
         DetourFindFunction("dinput.dll", "DirectInputCreateEx"));

   Real_DirectInputCreateEx =
      ((HRESULT(WINAPI*)(HINSTANCE, DWORD, REFIID, LPVOID*, LPUNKNOWN))
      DetourFunction((PBYTE)DEx, (PBYTE)DirectInputCreateExReplace));
   ThreadAttach(hDll);
   return TRUE;
}

BOOL ProcessDetach(HMODULE hDll)
{
   ThreadDetach(hDll);

   if(TlsIndent >= 0) TlsFree(TlsIndent);
   if(TlsThread >= 0) TlsFree(TlsThread);
   gMemoryScanner.Close();
   return TRUE;
}

BOOL APIENTRY DllMain(HINSTANCE Module, DWORD Reason, PVOID Reserved)
{
   switch(Reason)
   {
      case DLL_PROCESS_ATTACH: return ProcessAttach(Module);
      case DLL_PROCESS_DETACH: return ProcessDetach(Module);
      case DLL_THREAD_ATTACH: return ThreadAttach(Module);
      case DLL_THREAD_DETACH: return ThreadDetach(Module);
   }
   return TRUE;
}

}


as you can see from this source I catch DirectInput, Direct3D8 and DirectSound. When you have the interface pointer you can do what you want.

EDIT: don't be lamer guys. It is only for fun.



Fallen - kein gewöhnliches Katzenstreu
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum