Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.
Seite 1 von 2  1 2      

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