Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddress() (https://www.delphipraxis.net/8871-kleine-nachhilfe-c-erbeten-ldrgetprocedureaddress.html)

Assarbad 14. Sep 2003 10:19


Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddress()
 
Ich habe einen Funktionstypen:
Code:
typedef PKBDTABLES (*KBDLAYERDESCRIPTOR)(VOID);
... eine Funktion um eine Adresse zu einer Funktion zu bekommen:
Code:
NTSYSAPI
NTSTATUS
NTAPI
LdrGetProcedureAddress(
   IN HANDLE          ModuleHandle,
   IN PANSI_STRING    FunctionName OPTIONAL,
   IN WORD            Ordinal OPTIONAL,
   OUT PVOID         *FunctionAddress
   );
... sowie eine Variable des obigen Funktionstypen:
Code:
KBDLAYERDESCRIPTOR KbdLayerDescriptor;
Ich habe folgendes versucht (funktioniert aber nicht):
Code:
LdrGetProcedureAddress(hModule, &asFunction, 0, (KBDLAYERDESCRIPTOR)KbdLayerDescriptor);
Ich habe nun im letzten Codestück schon probiert den Indirector an alle möglichen und unmöglichen Stellen zu setzen. Leider hat bisher nix geholfen. Hat jemand hier einen Schimmer wie das geht?

Nachtrag:
Mit GetProcAddress() aus der Win32 API ginge das relativ simpel. Steht mir aber nicht zur Verfügung!
Code:
KbdLayerDescriptor = (KBDLAYERDESCRIPTOR)GetProcAddress((HMODULE)hModule, "KbdLayerDescriptor");
Ich komme wohl irgendwo mit Pointer referenzieren und dereferenzieren durcheinander.

Luckie 14. Sep 2003 10:22

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Eventuell können dir die hier helfen: http://www.c-plusplus.de/ubb/cgi-bin/ultimatebb.cgi . Kannst auch als Gast posten. Allerdings wird da ziemlich schnell geflammt.

Assarbad 14. Sep 2003 11:45

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Zumindest gab es noch keine schnelle Antwort. Ich suche also bisher immernoch nach der Antwort ;)

Luckie 14. Sep 2003 11:53

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Spotlight schon nmal probiert?

Assarbad 14. Sep 2003 11:55

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Habe jetzt ein wenig rumgeschweinert und es zumindest zum Laufen gebracht.
Allerdings würde mich die korrekte Schreibweise noch stark interessieren.
Ich habe jetzt einfach einen Pointer auf einen Pointer deklariert.
Dann rufe ich diesen Pointer als Funktion gecastet auf:

Code:
typedef PKBDTABLES (*KBDLAYERDESCRIPTOR)(VOID);

int mymain(int argc, char* argv[])
{
   UNICODE_STRING usBla;
   ANSI_STRING asFunction;
   HANDLE hModule;
   KBDLAYERDESCRIPTOR KbdLayerDescriptor;
   PVOID *X;
   PKBDTABLES Desc;

   RtlInitUnicodeString(&usBla, L"kbdus.dll");
   LdrLoadDll(NULL, 0, &usBla, &hModule);

   RtlInitAnsiString(&asFunction, "KbdLayerDescriptor");
   LdrGetProcedureAddress(hModule, &asFunction, 0, X);
   printf("%8.8X\n", (DWORD)*X);
   Desc = ((KBDLAYERDESCRIPTOR)*X)();
   printf("%4.4X\n", *Desc->pusVSCtoVK);
   printf("%2.2X\n", Desc->bMaxVSCtoVK);
   printf("%8.8X\n", (DWORD)Desc);
}
Wie kann ich aber sofort nen korrekten Cast hinbekommen, so daß ich die
Variable "KbdLayerDescriptor" benutzen kann???

jbg 14. Sep 2003 12:08

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Zitat:

OUT PVOID *FunctionAddress
Hier möchte die Funktion die Adresse einer Variable, die den Zeiger aufnehmen soll. Du übergibst aber die Adresse, auf die KbdLayerDescriptor zeigt.

So müsste es funktionieren:
Code:
LdrGetProcedureAddress(hModule, &asFunction, 0, &KbdLayerDescriptor);

Assarbad 14. Sep 2003 12:14

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
@jbg: Funzt leider nicht. Gleicher Fehler ...
Code:
E:\1\smss__\test\test.cpp(110) : error C2664: 'LdrGetProcedureAddress' : cannot convert parameter 4 from 'struct tagKbdLayer *(__cdecl ** )(void)' to 'void ** '
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.
Diese Fehlermeldung stammt von dem Code, den du vorschlugst.

Die folgenden Casts laufen auch nicht:
Code:
LdrGetProcedureAddress(hModule, &asFunction, 0, (PVOID)&KbdLayerDescriptor);
LdrGetProcedureAddress(hModule, &asFunction, 0, (KBDLAYERDESCRIPTOR)&KbdLayerDescriptor);
LdrGetProcedureAddress(hModule, &asFunction, 0, &(PVOID)KbdLayerDescriptor);
@Luckie: Habe jetzt auch mal in SL nachgefragt.

Luckie 14. Sep 2003 12:16

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Code:
LdrGetProcedureAddress(hModule, &asFunction, 0, (KBDLAYERDESCRIPTOR)KbdLayerDescriptor);
Ohne das "&" vor dem KbdLayerDescriptor. Ein "&" vor einem Cast habe ich noch nie gesehen. Soll aber nichts heißen, ich habe viles wohl noch nicht gesehen. :gruebel:

Assarbad 14. Sep 2003 12:20

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Hehe ... geht auch nicht. Hatte ich schon bevor ich die Fragen gestellt habe. Wenn ich hier alle aufführen würde, die nicht gehen, wäre das etwas viel ;)

NicoDE 14. Sep 2003 12:48

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
C++
Code:
static_cast<void **>(&KbdLayerDescriptor)
mit Gewalt: reinterpret_cast<void **>(&KbdLayerDescriptor)
C
Code:
(void **)&KbdLayerDescriptor
edit: beziehungsweise void** = PVOID* zwecks Typsicherheit :)
edit2: Du solltest Dir (falls nicht vorhanden) einen Pointer-Typen auf den Funktions-Typen deklarieren

anku 14. Sep 2003 13:00

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Probier vielleicht mal etwas der Art:
Code:
  KBDLAYERDESCRIPTOR* KbdLayerDescriptor;
und
Code:
LdrGetProcedureAddress(hModule, &asFunction, 0, KbdLayerDescriptor);
Desc = (*KbdLayerDescriptor)();
mfg

anku

Assarbad 14. Sep 2003 13:07

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Pointertypen auf die Funktion hatte ich auch schon probiert ... klappte bei mir zumindest nicht. Dafür klappt es aber mit deinem Vorschlag:

Code:
typedef PKBDTABLES (*KBDLAYERDESCRIPTOR)(VOID);

int mymain(int argc, char* argv[])
{
   UNICODE_STRING usBla;
   ANSI_STRING asFunction;
   HANDLE hModule;
   KBDLAYERDESCRIPTOR KbdLayerDescriptor;
   PVOID *X;
   PKBDTABLES Desc;

   RtlInitUnicodeString(&usBla, L"kbdus.dll");
   LdrLoadDll(NULL, 0, &usBla, &hModule);
   printf("HMODULE %8.8X\n", hModule);
   
   RtlInitAnsiString(&asFunction, "KbdLayerDescriptor");
   status=LdrGetProcedureAddress(hModule, &asFunction, 0, (void **)&KbdLayerDescriptor);

   printf("Status %8.8X\n", status);
   printf("Entrypoint %8.8X\n", (DWORD)KbdLayerDescriptor);
   Desc = (KbdLayerDescriptor)();
   printf("%4.4X\n", *Desc->pusVSCtoVK);
   printf("%2.2X\n", Desc->bMaxVSCtoVK);
   printf("%8.8X\n", (DWORD)Desc);

   LdrUnloadDll(hModule);
   return 0;
}
Danke euch allen (und natürlich besonders Nico ;))

@anku: Bei deinem Vorschlag gibt es auch Fehler :-/ ... leider ;)

Dezipaitor 14. Sep 2003 15:37

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
OUT PVOID *FunctionAddress

das ist wohl gleichbedeutend mit
void *&FunctionAddress (c++)
oder
void **FunctionAddress (c)
weil PVOID ein void* ist.


out sieht nach Borland C++ aus oder?
und ist damit ein initialisiertes var - also per referenz.

daher muss man
zuerst auf (void**) oder (PVOID*) casten,
und dann mit & die Addresse der Funktion übergeben

NicoDE 14. Sep 2003 15:50

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
Zitat:

Zitat von Dezipaitor
out sieht nach Borland C++ aus oder?
und ist damit ein initialisiertes var - also per referenz.

OUT ist in ein leeres Macro und dient nur als Hint (dass die Variable vor der Übergabe nicht initialisiert werden muss). Es erzeugt auch keine 'automatische' Referenz (wie var/out in Delphi Language).

Gruss Nico

Dezipaitor 15. Sep 2003 21:48

Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
 
sowas ist ja cool:)
THX


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz