| |
|
|
- Página 1 - |
|
Frank Abbing | Ein kleines Tool de me en API-Hooking Base. In uno Listbox voluntad todos Dlls aufgelistest, el gerade de Programmen geladen fueron.
Einfach Exe starten y luego irgendwelche Programas starten. Deren Dlls debería ahora gelistet y ser lo pieps kurz. Bitte testet veces, si todavía irgendwo hakt. |
|
|
| |
|
|
| |
|
- Página 4 - |
|
|
RGH | He, he, Franco, el war en efecto más como Gag pensamiento.
Beides ha sólo seine Vorteile: dynamisches oder statisches Linken.
Und Yo widerspreche sí no, daß statisches Linken más rápido es. Der Hauptgrund dafür es aber, daß beim dynamischen Linken antes el Call eben una GetProcAdress notwendig es, daß beim statischen linken wegfällt. (Es en efecto una Grund, por qué, el OpenGL-DLL para el XProfan-propio OGL-Función en XProfan statisch gelinkt son. Das ging natürlich sólo, porque jede XProfan-fähige Windowsversion OpenGL unterstützt.)
Beides läßt se auch con XProfan programa: KompilierenMarcaSeparación $H Windows.ph WindowsHeaderdatei nutzen
Declare hDLL&, Time&, Text$
hDLL& = @UseDLL(USER32.DLL)
Print Dynamisches Linken mit DEF: ;
Def GetWText(3) !User32.dll, GetWindowTextA
Text$ = @Space$(40)
Time& = &GetTickCount
whileLoop 1, 100000
GetWText(%hWnd, @Addr(Text$), 40)
endwhile
print Int(&GetTickCount - Time&)
Print Dynamisches Linken mit EXTERNAL: ;
Text$ = @Space$(40)
Time& = &GetTickCount
whileLoop 1, 100000
External(User32.dll, GetWindowTextA, %hWnd, @Addr(Text$), 40)
endwhile
print Int(&GetTickCount - Time&)
Print Dynamisches Linken mit Header-Datei: ;
Text$ = @Space$(40)
Time& = &GetTickCount
whileLoop 1, 100000
~GetWindowText(%hWnd, @Addr(Text$), 40)
endwhile
print Int(&GetTickCount - Time&)
Print Statisches Linken: ;
Declare GetWText&
GetWText& = ~GetProcAddress(hDLL&, GetWindowTextA)
Text$ = @Space$(40)
Time& = &GetTickCount
whileLoop 1, 100000
@Call(GetWText&, %hWnd, @Addr(Text$), 40)
endwhile
print Int(&GetTickCount - Time&)
waitinput
/../funktionsreferenzen/XProfan/end/'>end
Um el statische Linken a vereinfachen, podría uno natürlich una zusätzliche Función einbauen, etwa:
GetWText& = GetLibAddr(User32.DLL, GetWindowTextA)
Saludo Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 27.03.2007 ▲ |
|
|
|
|
RGH | Andreas Hötker
Yo podría me vorstellen, dass como GetProcAdress bajo Umständen viel mehr Tiempo verbraucht.
Sag Todavía!
Zwei ..., una Gedanke!
Saludo Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 27.03.2007 ▲ |
|
|
|
|
| Was Yo así sagen quería: Wenn Yo el en el Augenblick correcto sehe, teilt Windows el Handles en verschiedene Kathegorien en - y speichert el auch unterschiedlich de (Kernel-, GDI-, Userhandles...). Handles en geladene DLL wirst du no bajo el Kernelhandles finden; el voluntad also (genau como Handles en Speicherbereiche) gesondert behandelt. Wenn Yo el correcto sehe, necesario pero en GetProcAdress bajo Umständen a a 1000 verschiedene Pointer durchgesehen voluntad... |
|
|
| |
|
|
|
RGH | |
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 27.03.2007 ▲ |
|
|
|
|
Frank Abbing |
Als Untermauerung el Vermutung, daß ~GetProcAdress mehr Tiempo kostet:
Oooch Roland. Hast pero no beachtet, el uno en el Programa GetProcAdress() pro Función sólo EINMAL benutzen muss. Zum Guardar el Adresse genügt entonces una simple Variable. Su Code va bastante al Thema vorbei, sodass dein Vergleich mächtig hinkt...
Wenn Yo el en el Augenblick correcto sehe, teilt Windows el Handles en verschiedene Kathegorien en - y speichert el auch unterschiedlich de (Kernel-, GDI-, Userhandles...). Handles en geladene DLL wirst du no bajo el Kernelhandles finden; el voluntad also (genau como Handles en Speicherbereiche) gesondert behandelt. Wenn Yo el correcto sehe, necesario pero en GetProcAdress bajo Umständen a a 1000 verschiedene Pointer durchgesehen voluntad...
Sí, si du lo correcto sehen würdest. Hast du dir el Quellcode veces angesehen? Yo reingesehen... Das ha así aber rein gar nichts a tun. Yo sagte ya, GetProcAdress es sólo una vez pro Función nötig. Mit dieser Technik es no nötig Daueraufrufe a produzieren, como Roland lo actualmente macht. Dass Profancodes effizienter ausgeführt voluntad puede, zeigt XPSE más que deutlich. Hast Si es usted el auch veces getestet, Roland? Yo denke - nein. Hab deinen Code una kleines bischen modifiziert y ahora funktioniert él así, como WhichDlls lo dargelegt ha. Como sieht lo rabenschwarz de para deine Technik. Der Geschwindigkeitszuwachs con statischer Adresse beträgt 100 Prozent, es also doppelt así rápidamente... KompilierenMarcaSeparación hehe |
|
|
| |
|
|
|
| Das erinnert mich doch muy a el xpse-Selbsttest: [...]
Yo finde el Espectáculos ya muy genau el Geschwindigkeitsunterschied.
Yo finde el XProfan de Haus de esta xpseTechnik mitbringen debería - y dar Franco bastante así si él meinte el XProfan aquí en el meisten Fällen völlig übertrieben y unnötig el Funktionsadresse cada vez neu ermittelt oder gar el DLL con LoadLibrary invitar voluntad. Wofür se el bien ser? |
|
|
| |
|
|
|
RGH | Frank Abbing
Oooch Roland. Hast pero no beachtet, el uno en el Programa GetProcAdress() pro Función sólo EINMAL benutzen muss. Zum Guardar el Adresse genügt entonces una simple Variable.
Oooch Franco, hast No beachtet, daß mein erstes Programa GetProcAdress() auch sólo una vez aufruft y el zweite sólo dazu dient, el Zeitaufwand zwischen GetProcAdress() y LoadLibrary() a vergleichen, para determinar, wer beim dynamischen Aufruf el Tiempo verbrät?
Wenn Yo en XProfan el dynamische Linken bevorzuge, entonces muß Yo el Adresse entonces bestimmen, si la Función el erste Tiempo verwandt se. Wenn ellos entonces a otro Punto en el Programa otra vez verwandt se, muß Yo ellos otra vez bestimmen oder Yo müßte en uno Tabla nachsehen, si el ya bekannt (y todavía gültig) es y ellos entonces uso. Das wäre zusätzlicher Verwaltungsaufwand.
El otro Alternative Es el Umwandlung en una statischen Aufruf, ya que el XPSE (y mein obiges Ejemplo) macht. Como en el zeitkritischen Dingen Sinn hacer kann, Yo sí ya vorgeschlagen, el en el nächste XProfan-Versión como Alternative einzubauen. Como ya he dicho: beide Varianten haben ihre Vor- y Nachteile.
Saludo Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 27.03.2007 ▲ |
|
|
|
|
Frank Abbing |
y el zweite sólo dazu dient, el Zeitaufwand zwischen GetProcAdress() y LoadLibrary() a vergleichen, para determinar, wer beim dynamischen Aufruf el Tiempo verbrät?
Como ya dijo - al Thema vorbei.
Lo liegt me fern dir algo vorschreiben a querer y yo mag solche Diskussionen auch nada. Usted hast hier una Möglichkeit el Effizienz de XProfan todavía a steigern. Was du letztendlich lo machst, y si y cómo du el Kritik deiner User umsetzt, es deine Sache. |
|
|
| |
|
|
|
| Hola Roland...
Tiempo a deinem Code: Kann lo ser, dass du como algo mogelst? Usedll es doch una statischer Aufruf y GetProcAdress - se el como no dynamisch aufgerufen??? |
|
|
| |
|
|
|
| ¡Hola Franco...
Hast du dir el Quellcode veces angesehen? Yo reingesehen... Das ha así aber rein gar nichts a tun.
Bin alles otro como una Experte para ASM. Was mach el Code de GetProcAdress porque genau? Durchsucht el no el Table después de el angegebenen Función? Lerne gerne qué dazu. |
|
|
| |
|
|
|
| Wo liegt el Denkfehler en folgendem Code: KompilierenMarcaSeparación $H Windows.ph WindowsHeaderdatei nutzen
Declare hDLL&, Time&, DLL$,LoadLibraryA&,GetProcAddress&,Funktion$,StringAddr&
LET DLL$=Kernel32.DLL
hDLL& = ~LoadLibraryA(@addr(DLL$))
LET Funktion$=GetProcAddress
LET GetProcAddress&=~GetProcAddress(hDLL&, @addr(Funktion$))
LET Funktion$=LoadLibraryA
LET LoadLibraryA&=~GetProcAddress(hDLL&, @addr(Funktion$))
LET DLL$=USER32.DLL
hDLL& = ~LoadLibraryA(@addr(DLL$))
Print Ohne irgendwas: ;
Time& = &GetTickCount
whileLoop 1, 100000
endwhile
print Int(&GetTickCount - Time&)
LET DLL$=$SYSPATH+USER32.DLL
Print LoadLibraryA +DLL$+ :;
StringAddr& = addr(DLL$)
Time& = &GetTickCount
whileLoop 1, 100000
call(LoadLibraryA&,StringAddr&)
endwhile
print Int(&GetTickCount - Time&)
LET DLL$=USER32
Print LoadLibraryA +DLL$+ :;
StringAddr& = addr(DLL$)
Time& = &GetTickCount
whileLoop 1, 100000
call(LoadLibraryA&,StringAddr&)
endwhile
print Int(&GetTickCount - Time&)
Print GetProcAdress ActivateKeyboardLayout: ;
Let Funktion$=ActivateKeyboardLayout
StringAddr& = addr(Funktion$)
Time& = &GetTickCount
whileLoop 1, 100000
call(GetProcAddress&,hDLL&, StringAddr&)
endwhile
print Int(&GetTickCount - Time&)
Print GetProcAdress wvsprintfW: ;
Let Funktion$=wvsprintfW
StringAddr& = addr(Funktion$)
Time& = &GetTickCount
whileLoop 1, 100000
call(GetProcAddress&,hDLL&, StringAddr&)
endwhile
print Int(&GetTickCount - Time&)
waitinput
ss=s4 href='./../../funktionsreferenzen/XProfan/end/'>end
|
|
|
| |
|
|
|
RGH | Andreas Hötker
Was mach el Code de GetProcAdress porque genau? Durchsucht el no el Table después de el angegebenen Función?
Es sólo una API-Función, el el absolute Adresse uno Función uno geladenen Moduls zurückgibt. Como ellos el macht, entzieht se meiner Kenntnis. Como Microsoft seine Quellcodes (weitestgehend C y C++ con ASM-Teilen) no veröffentlicht, es auch no bastante simplemente el herauszubekommen. (Außerdem sería el eh no weiterhelfen.) Yo vermute aber simplemente folgendes: Un DLL enthält en ihrem Encabezamiento una Liste el en ihr exportierten Características con el Einsprungadressen. Yo nehme por lo tanto a, daß GetProcAdress encima el Handle el DLL en esta Liste zugreift.
Saludo Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 28.03.2007 ▲ |
|
|
|