Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Assembler ::  Strukturen und die Pointer auf die Pointer :)     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
supernicky
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.11.2011
Beiträge: 122
Beitrag supernicky Mitglied 21:51:13 06.07.2012   Titel:   Strukturen und die Pointer auf die Pointer :)            Zitieren

Hallo zusammen,

Ich habe eine Frage im Umgang mit den Strukturen und Pointern.
Was ich machen möchte ist, alle IP's meines PC'S auslesen und anzeigen lassen.

Das ganze wie folgt:
Assembler:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
hostent STRUCT
  h_name      DWORD      ?
  h_alias     DWORD      ?
  h_addr      WORD       ?
  h_len       WORD       ?
  h_list      DWORD      ?
hostent ENDS
 
.DATA
 
hos hostent <>
dnsname db "meinpc",0
 
.Code
 
invoke gethostbyname, addr dnsname
     mov esi, eax           ;Pointer der HOSTENT Struc nach ESI
    mov edi, offset hos     ;EDI zeigt auf unsere HOSTENT Struc
    xor ecx, ecx
    mov ecx, sizeof hos
    rep movsb                  ;Struktur mit Daten füllen
 
       xor eax, eax
        mov eax, hos.h_list
        mov eax, [eax]
        mov eax, [eax]
 
        call ip_to_ascii
       
        invoke MessageBox, NULL, eax, addr szCaption, MB_OK


Die Funktion ip_to_ascii habe ich selbst erstellt, da ich die Funktion inet_ntoa (Netzwerk IP to ASCIIZ) nicht zum laufen bewegen kann.

Jedenfalls tut meine Funktion auch ihren Dienst und meine IP (sowie diverser Inet-Seiten) wird korrekt angezeigt.

Nun kommen wir endlich zu meinen Fragen.
Folgendes steht über HOSTENT in der MSDN
C++:
1
2
3
4
5
6
7
8
9
typedef struct hostent {
   char FAR      *h_name;
   char FAR FAR **h_aliases;
   short         h_addrtype;
   short         h_length;
   char FAR FAR **h_addr_list;
 } HOSTENT, *PHOSTENT, FAR *LPHOSTENT;
 
**h_addr_list = A NULL -terminated list of addresses for the host


h_name ist ein FAR Pointer, den ich aber direkt der MessageBox() übergeben kann.
h_aliases ist ein FAR FAR Pointer genau wie h_addr_list.

Wie man in Zeile 25 und 26 erkennen kann, muss ich zweimal die Speicherstelle auf die EAX zeigt nach EAX laden um an die IP zu kommen. :confused:
Da h_addr_list aber eine NULL terminierte Liste sein soll, wie komme ich an die
anderen Einträge ran und wie sehe ich das Ende der Liste?
Null-terminiert heißt das irgendwann EAX = 0 ist, aber den Weg dahin?

Kann mir jemand erklären wie das "verkettet" ist und wie ich an eine (falls
vorhanden) zweite IP käme?

Was ich mir denke ist folgendes:
Einen Pointer kann ich direkt übergeben, während ein FAR Pointer einmal

Assembler:
mov eax, [eax]


und FAR FAR Pointer zweimal

Assembler:
mov eax, [eax]
mov eax, [eax]


muss???

h_aliases = A NULL -terminated array of alternate names
Liegen hier mehrere DWORD's hintereinander im Speicher die jeweils auf einen String
zeigen und das letzte hat den Wert NULL?

Hoffentlich weiß jemand was ich meine und kann mir das erklären :idea:

Danke und Gruß, Nicky
masm
Unregistrierter




Beitrag masm Unregistrierter 22:27:03 06.07.2012   Titel:              Zitieren

Das sind Pointer-Arrays, bei denen, wie du schon erkannt hast, der letzte Eintrag ein Null-Pointer ist. Wie immer führen sehr viele Wege nach Rom:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
esi = h_list
;1.
xor ecx,ecx
.while PVOID ptr [esi+ecx*4]
    mov edx,PVOID ptr [esi+ecx*4]
    ; edx = *pp = Zeiger aus Array
    ; ...
    add ecx,1
.endw
 
;2.
@1: mov edx,PVOID ptr [esi]
    test edx,edx
    jz @2:
    ; edx = *pp
    ;...
    add esi,4
    jmp @1
 
3. ...

BTE: Das "FAR" hat keine Bedeutung mehr – es steht nur aus historische Gründen da.
supernicky2
Unregistrierter




Beitrag supernicky2 Unregistrierter 22:57:43 06.07.2012   Titel:   pointer            Zitieren

Hallo masm,

mov esi, hos.h_list

speichert also die Nummer der Speicherstelle an der das Array beginnt?

Dann kann ich immer mit (esi + 4) (esi + 8) usw. auf die Elemente
des Arrays zugreifen? Das versuche ich dann mal. (Hab am Handy keine eckigen Klammern)

Kannst du mir nochwas zu Zeile 25 und 26 sagen, wieso ich
zweimal machen musste mit den Speicherstellen?

Gruss und Danke, Nicky :live:
masm
Unregistrierter




Beitrag masm Unregistrierter 23:10:47 06.07.2012   Titel:              Zitieren

Du solltest dir dringen ein C-Tutorial durcharbeiten damit du:
1. Pointer und arrays verstehst!
2. danach Funktionsdeklaration, insbesondere der WinAPI verstehst (ich ahne warum du "Netzwerk IP to ASCIIZ" nicht zum Laufen gebracht hast)

Danach sollte es dann auch mit Assembler klappen.

masm
wazzup
Unregistrierter




Beitrag wazzup Unregistrierter 16:38:12 27.07.2012   Titel:              Zitieren

Schau mal dir mal hier den Post an:

http://www.tutorials.de/c ....... ausgeben.html#post1184996

Demnach ist h_addr_list ein Pointer auf ein Array von Pointern. Diese Pointer zeigen auf die Bytes der jeweiligen IP-Adresse. Sagen wir mal hier 4 Byte wegen IPv4.

Ein Zugriff dürfte demnach so aussehen (ungetestet, bin anner Arbeit):

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Test proc pArray: Dword
    LOCAL ipAddr: Dword ;Die IP-Adresse des aktuellen Eintrages
    push eax ;Enthält den Pointer auf den aktuellen Listeneintrag
    push ebx ;Enthält den Pointer des aktuellen Listeneintrages auf die IP-Adr
 
    mov eax, pArray ;Kopiere Start-Adresse auf das Pointer-Array nach EAX
fl:
    mov ebx, dword ptr[eax] ;Kopiere aktuellen Listeneintrag (Ptr) nach EBX
    cmp ebx, 0 ;Check ob Ende der Liste erreicht (NULL-Pointer)
    je fle ;Wenn EBX 0 dann den weiteren Schleifencode überspringen
    mov ipAddr, dword ptr[ebx] ;Kopiere die 4 Byte auf die EBX zeigt nach lokale Stackvariable
    ... ;Mache irgendwas
    add eax, 4 ;Addiere 4 auf EAX um zum nächsten Pointer-Eintrag zu zeigen
    jmp fl ;Springe zum Anfang der Schleife und mache mit nächstem Eintrag weiter
fle:
    pop ebx //EBX wiederherstellen
    pop eax //EAX wiederherstellen
 
    ret ;4 //Rücksprungadresse wiederherstellen und DWORD argument freigeben
Test endp


Ich hoffe, dass ich helfen konnte. ^^
supernicky
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.11.2011
Beiträge: 122
Beitrag supernicky Mitglied 21:07:46 27.07.2012   Titel:              Zitieren

wazzup schrieb:
Schau mal dir mal hier den Post an:

http://www.tutorials.de/c ....... ausgeben.html#post1184996

Demnach ist h_addr_list ein Pointer auf ein Array von Pointern. Diese Pointer zeigen auf die Bytes der jeweiligen IP-Adresse. Sagen wir mal hier 4 Byte wegen IPv4.

Ein Zugriff dürfte demnach so aussehen (ungetestet, bin anner Arbeit):

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Test proc pArray: Dword
    LOCAL ipAddr: Dword ;Die IP-Adresse des aktuellen Eintrages
    push eax ;Enthält den Pointer auf den aktuellen Listeneintrag
    push ebx ;Enthält den Pointer des aktuellen Listeneintrages auf die IP-Adr
 
    mov eax, pArray ;Kopiere Start-Adresse auf das Pointer-Array nach EAX
fl:
    mov ebx, dword ptr[eax] ;Kopiere aktuellen Listeneintrag (Ptr) nach EBX
    cmp ebx, 0 ;Check ob Ende der Liste erreicht (NULL-Pointer)
    je fle ;Wenn EBX 0 dann den weiteren Schleifencode überspringen
    mov ipAddr, dword ptr[ebx] ;Kopiere die 4 Byte auf die EBX zeigt nach lokale Stackvariable
    ... ;Mache irgendwas
    add eax, 4 ;Addiere 4 auf EAX um zum nächsten Pointer-Eintrag zu zeigen
    jmp fl ;Springe zum Anfang der Schleife und mache mit nächstem Eintrag weiter
fle:
    pop ebx //EBX wiederherstellen
    pop eax //EAX wiederherstellen
 
    ret ;4 //Rücksprungadresse wiederherstellen und DWORD argument freigeben
Test endp


Ich hoffe, dass ich helfen konnte. ^^


Hallo,

habe es hinbekommen...

;)
c++.de :: Assembler ::  Strukturen und die Pointer auf die Pointer :)   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.