Pointer Dereferenzierung
-
Es ist mir schon fast peinlich, aber ich kriege das in C nich wirklich hin.
Ich arbeite mehr in Delphi.Was ich machen möchte:
Ich habe zum Beispiel die Adresse 0x0044D008 so als DWORD Wert in meiner Funktion deklariert und möchte jetzt gucken was für ein Wert an dieser Adresse steht, wenn man diesen als DWORD Wert behandelt.In Delphi würde ich das so machen:
var addr: DWORD; begin addr := $0044D008; ShowMessage(IntToStr(DWORD(Pointer(addr)^)));
So jetzt möchte ich das in C machen.
Müsste das nicht so gehen?typedef unsigned long DWORD; typedef void *PVOID; ... DWORD addr1 = 0x0044D008; if ( (DWORD)(PVOID)addr1 == 0 ) return false; else return true;
Nun returned diese function, egal was an dieser Adresse steht immer True, auch bei 0.
So, brauch ich nun noch nen * als Derefernzierung oder nicht? Und wenn ja, dann wo? Egal wo ich das Sternchen hinpacke, ich bekomme immer "Illegal Indirection" als Compiler Fehlermeldung.
EDIT: Tut mir Leid, habe wohl den falschen Bereich erwischt. Bitte in ANSI-C verschieben. Danke.
-
Dr.Scarab schrieb:
Es ist mir schon fast peinlich, aber ich kriege das in C nich wirklich hin.
Ich arbeite mehr in Delphi.Was ich machen möchte:
Ich habe zum Beispiel die Adresse 0x0044D008 so als DWORD Wert in meiner Funktion deklariert und möchte jetzt gucken was für ein Wert an dieser Adresse steht, wenn man diesen als DWORD Wert behandelt.In Delphi würde ich das so machen:
var addr: DWORD; begin addr := $0044D008; ShowMessage(IntToStr(DWORD(Pointer(addr)^)));
So jetzt möchte ich das in C machen.
Müsste das nicht so gehen?typedef unsigned long DWORD; typedef void *PVOID; ... DWORD addr1 = 0x0044D008; if ( (DWORD)(PVOID)addr1 == 0 ) return false; else return true;
Nun returned diese function, egal was an dieser Adresse steht immer True, auch bei 0.
So, brauch ich nun noch nen * als Derefernzierung oder nicht? Und wenn ja, dann wo? Egal wo ich das Sternchen hinpacke, ich bekomme immer "Illegal Indirection" als Compiler Fehlermeldung.
typedef unsigned long dword; typedef void* voidptr; dataword a = 0x0044D008; voidptr ab = reinterpret_cast<voidptr>(a); if(reinterpret_cast<dataword>(ab) == 0) return true; else return false;
oder auch:
typedef unsigned int dword; typedef void* voidptr; dataword a = 0x0044D008; voidptr ab = reinterpret_cast<voidptr>(a); if(ab == reinterpret_cast<voidptr>(0)) return true; else return false;
-
Oh, dachte nich, dass man so CompilerMagic benutzen muss.
DankeschönEDIT:
Ahh, ich war etwas zu vorschnell.
Ich benutze das DDK und dieser Compiler sagt mir leider:basic.c(85) : error C2065: 'reinterpret_cast' : undeclared identifier
Keine Angst, ich kann auf diese Adressen zugreifen. Dafür habe ich mit KeAttachProcess gesorgt.
Aber gibt es ne Alternative zu reinterpret_cast?
-
Du schreibst oben von C und deine Quelldatei hat die Dateiendung c. Also scheinst du in C und nicht in C++ zu programmieren. Falls du Visual Studio benutzt, so kompiliert das eine Datei mit der Dateiendung .c, als C-Code und nicht als C++-Code. Außerdem, wieso postest du im C++ Forum, statt im C-Forum?
In C musst du natürlich auch einen entsprechenden Cast verwenden (den Typ in Runde Klammern packen), so sollte es gehen:
if((dataword)(ab) == 0)
Greetz
-
in C gibt es kein reinterpret_cast. das gibts nur in C++.
ich denke du willst sowas in der art:
if(*((DWORD*)0x0044D008)) return true; else return true;
-
Ja ich weiss, schau mal oben mein Edit:
EDIT: Tut mir Leid, habe wohl den falschen Bereich erwischt. Bitte in ANSI-C verschieben. Danke.
Ansonsten, Dankeschön, genau das wollte ich haben.