| |
|
|
| Wie kann ich in MASM Funktionen aus einer fremden DLL aufrufen? |
|
|
| |
|
|
|
Frank Abbing | Call und mittels des Macros Scall. |
|
|
| |
|
|
|
| Zu Call benötige ich eine Adresse - richtig? Mmmh... GetProcAdress kann ich in einem Treiber nicht benutzen, zur Not könnte ich aber die benötigten Adressen im Usermode ermitteln un an den Treiber über geben... |
|
|
| |
|
|
|
Frank Abbing | Wenn du zu der Dll keine Libray besitzt, musst du GetProcAdress() benutzen, richtig. Es gibt auch Tools, die aus einer Dll eine Library erzeugen. Vielleicht solltest du mal in dieser Richtung ermitteln. |
|
|
| |
|
|
|
| Es geht um eine Funktion aus der NTDLL. Die LIB und INC habe ich - da ich aber gleichzeitig die LIB und INC der NTOSKRNL.EXE benutzen muß und damit dann einige Sachen doppelt deklariert werden, weiß ich nicht genau, ob es irgendwo vielleicht crasht. Sollte es Probleme geben, bräuchte ich einen Workarround ohne LIB und INC. Da die NTDLL in jedem Prozess an die selbe Adresse geladen wird, müßte es über CALL und die Ermittlung der Adresse im Usermode eigentlich funktionieren. |
|
|
| |
|
|
|
Frank Abbing | Das muss du testen, ob deine beiden Incs kollidieren. Es gibt auch eine Möglichkeit per Extern-Definition. Damit kannst du die Libraries wie gewohnt einbinden. Anstelle der herkömmlichen Inc-Datei kannst du dir eine neue Inc-Datei basteln, die so aussieht:
externdef _imp__Funktionname@0TR pr4 Funktionname equ <_imp__Funktionname@0>
So verfährst du mit allen Funktionen, die du in deinem Programm aufrufen willst, wobei PTR pr4 die Anzahl der Parameter angibt, welche die Funktion benötigt. In diesem Beispiel also 4. Funktionen, die so deklariert werden, kannst du ganz normal mit Invoke aufrufen. |
|
|
| |
|
|
|
| Hallo Frank...
So, ich muß call verwenden, das steht jetzt fest. Hast du mal ein kleines Beispiel für call, bei dem eine API mit mehreren Funktionen aufgerufen wird (z.B. Messagebox erzeugen)?
Gruß
Andreas |
|
|
| |
|
|
|
| Params einfach umgekehrt auf den Stack packen. MessageBoxApi hat 4 Parameter?
|
|
|
| |
|
|
|
| Moin... genau verstanden, was ich wissen wollte. Der erste Parameter muß also zuletzt draufgepackt werde, damit er zuerst wieder heruntergeholt werden kann - richtig?
Als Kind hat es mir immer am meisten Spaß gemacht, die Bauklötze von unten aus dem Turm zu ziehen - aber hier ist das irgendwie wohl nicht angebracht .
|
|
|
| |
|
|
|
RGH | [quote:95081de37f=Andreas Hötker]Als Kind hat es mir immer am meisten Spaß gemacht, die Bauklötze von unten aus dem Turm zu ziehen - aber hier ist das irgendwie wohl nicht angebracht . [/quote:95081de37f] Ich denke, das hat schon damals zu wunderbaren Abstürzen geführt! ;)
Gruß 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.11.2006 ▲ |
|
|
|
|
Frank Abbing | Zu Call gibt es ein Macro, SCall. Damit kannst du die Parameter wie bei Invoke angeben. Mit nur leichten Einschränkungen:
Scall MACRO name:REQ,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22
FOR arg,<p22,p21,p20,p19,p18,p17,p16,p15,p14,p13,p12,p11,p10,p9,p8,p7,p6,p5,p4,p3,p2,p1>
IFNB <arg>
push arg
ENDIF
ENDM
call name
ENDM
Scall Messagebox, a, b, c, d |
|
|
| |
|
|
|
| Hab call und push genommen, geht wunderbar. Die Adresse habe ich dem Treiber aus der Usermode Komponente übergeben.
Besten Dank
Andreas |
|
|
| |
|
|