![]() |
Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddress()
Ich habe einen Funktionstypen:
Code:
... eine Funktion um eine Adresse zu einer Funktion zu bekommen:
typedef PKBDTABLES (*KBDLAYERDESCRIPTOR)(VOID);
Code:
... sowie eine Variable des obigen Funktionstypen:
NTSYSAPI
NTSTATUS NTAPI LdrGetProcedureAddress( IN HANDLE ModuleHandle, IN PANSI_STRING FunctionName OPTIONAL, IN WORD Ordinal OPTIONAL, OUT PVOID *FunctionAddress );
Code:
Ich habe folgendes versucht (funktioniert aber nicht):
KBDLAYERDESCRIPTOR KbdLayerDescriptor;
Code:
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?
LdrGetProcedureAddress(hModule, &asFunction, 0, (KBDLAYERDESCRIPTOR)KbdLayerDescriptor);
Nachtrag: Mit GetProcAddress() aus der Win32 API ginge das relativ simpel. Steht mir aber nicht zur Verfügung!
Code:
Ich komme wohl irgendwo mit Pointer referenzieren und dereferenzieren durcheinander.
KbdLayerDescriptor = (KBDLAYERDESCRIPTOR)GetProcAddress((HMODULE)hModule, "KbdLayerDescriptor");
|
Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
Eventuell können dir die hier helfen:
![]() |
Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
Zumindest gab es noch keine schnelle Antwort. Ich suche also bisher immernoch nach der Antwort ;)
|
Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
Spotlight schon nmal probiert?
|
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:
Wie kann ich aber sofort nen korrekten Cast hinbekommen, so daß ich die
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); } Variable "KbdLayerDescriptor" benutzen kann??? |
Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
Zitat:
So müsste es funktionieren:
Code:
LdrGetProcedureAddress(hModule, &asFunction, 0, &KbdLayerDescriptor);
|
Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
@jbg: Funzt leider nicht. Gleicher Fehler ...
Code:
Diese Fehlermeldung stammt von dem Code, den du vorschlugst.
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. Die folgenden Casts laufen auch nicht:
Code:
@Luckie: Habe jetzt auch mal in SL nachgefragt.
LdrGetProcedureAddress(hModule, &asFunction, 0, (PVOID)&KbdLayerDescriptor);
LdrGetProcedureAddress(hModule, &asFunction, 0, (KBDLAYERDESCRIPTOR)&KbdLayerDescriptor); LdrGetProcedureAddress(hModule, &asFunction, 0, &(PVOID)KbdLayerDescriptor); |
Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
Code:
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:
LdrGetProcedureAddress(hModule, &asFunction, 0, (KBDLAYERDESCRIPTOR)KbdLayerDescriptor);
|
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 ;)
|
Re: Kleine Nachhilfe in C erbeten -> LdrGetProcedureAddre
C++
Code:
C
static_cast<void **>(&KbdLayerDescriptor)
mit Gewalt: reinterpret_cast<void **>(&KbdLayerDescriptor)
Code:
edit: beziehungsweise void** = PVOID* zwecks Typsicherheit :)
(void **)&KbdLayerDescriptor
edit2: Du solltest Dir (falls nicht vorhanden) einen Pointer-Typen auf den Funktions-Typen deklarieren |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 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