Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 01.07.03 17:10 
Die Frage stelle ich mir eigentlich schon lange und dieses mal stelle ich sie hier. Gemeint ist natürlich der Kommentarkopf einer Prozedur (nicht der Unit).

Mir ist klar, daß jeder es so gestallten kann wie er es Lustig findet. Für die meisten Prozeduren findet man überhaupt keine Beschreibung oder es ist nur eine Kommentarzeile. Ok, eine professionale Prozedur erkennt man daran, daß die selbsterklärend ist und keine Kommentare benötigt ;) (kleiner Insiderwitz). Ich gebe zu, daß man es bei den Borland-Units noch entschuldigen kann, da jede Prozedur in der Hilfe beschreiben wird. Allerdings geht es hier um normale Units für normale Programme. Ich sehe es ein, daß nicht jede Prozedur in jedem Programm eine derartige Aufmerksamkeit braucht, aber es gibt nun mal Units die allgemein sind und in vielen Programmen verwendet werden. Da bringt es schon was, wenn man die Prozeduren/Funktionen etwas besser beschreibt.

Also zeigt mal welche Prozedurköpfe ihr so kennt. Gemeint sind natürlich Köpfe die alle Informationen enthalten, also z.B. was die Prozedur/Funktion tut, welche Parameter sie hat usw. Natürlich kenne ich auch zwei oder drei Köpfe, die sind aber derart unterschiedlich, daß sie fast nichts gemeinsames haben. Deshalb gehe ich davon aus, daß es zig verschiedene Arten gibt die auch verschiede Menge an Informationen liefern. So gibt es welche, die zwar die Parameter beschreiben, aber sonst nichts, bei anderen gibt es dafür eine Versionsnummer und sogar eine History der Prozedur.

Also, ich bitte um Beteidigung. Würde mich wirklich interesieren was es da gibt.

_________________
Popov
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 01.07.03 17:50 
Procedur-Header:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{-----------------------------------------------------------------------------
  Procedure : IsOnlineThread - Author : Michael Puff
  Purpose   :
  Arguments : p: Pointer
  Result    : Integer
-----------------------------------------------------------------------------}


Header der Hauptunit:
ausblenden volle Höhe Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
{*******************************************************************************
 Project   : InternetMonitor
 Filename  : InternetMonitor.dpr
 Date      : 2003-07-01
 Version   : 0.2.1         Last modified:
 Author    : Michael Puff
 URL       : www.luckie-online.de
 Copyright : Copyright (c) 2003 Michael Puff

           When I die I want 'Hello, world' carved on my headstone.

*******************************************************************************}


{*******************************************************************************
                               -= LIZENZ =-

Copyright (c) 2003 by Michael Puff

LIZENZ [v2.0 2003-01-29]

DIESES PROGRAMM / DIESER QUELLCODE IST KOSTENLOS.

1. Lizenz
DIESE SOFTWARE WIRD "SO WIE SIE IST" ZUR VERFÜGUNG GESTELLT, OHNE GEWÄHRLEISTUNG
IRGENDEINER ART. SIE HABEN DAS RECHT ES WEITER ZU VERTEILEN ODER DEN QUELLCODE ZU
MODIFIZIEREN.

DIESE SOFTWARE DARF NUR FÜR NICHT KOMMERZIELLE ZWECKE EINGESETZT WERDEN.

2. Haftung
IN KEINEM FALL KANN DER AUTOR HAFTBAR GEMACHT WERDEN FÜR IRGENDWELCHE SCHÄDEN,
GLEICH WELCHER ART.

3. COPYRIGHT
Die Software wird sowohl durch Urheberrechtsgesetze und internationale
Urheberrechtsverträge geschützt, als auch durch andere Gesetze und Vereinbarungen
über geistiges Eigentum.

4. Weitergabe
Die Software darf und soll in der hier angebotenen Form weitergegeben werden.
Alle Rechte verbleiben aber beim Autor.

5. Modifizierung des Quellcodes
Der Quellcode darf verändert / modifiziert werden unter folgenden Bedingungen:
1.) Modifizierter Quellcode ist zu kennzeichen.
2.) Der Copyrightvermerk aus dem Dateikopf muß erhalten bleiben.
3.) Der Ursprung des original Quellcodes darf nicht verfälscht werden.
4.) Wurde der Code geändert und / oder modifiziert bin ich darüber zu informieren
    und eine Kopie des geänderten und / oder modifiziertenm Quellcodes ist mir
    zu zusenden. Danke.

*******************************************************************************}


{ TODO:
  + Einstellungen speichern und laden
  + Always on top (Checked item)
  + in den Autostart (Checked item)
  + standard Fensterposition
  + Logdatei zurücksetzen
  + Traffic
  - gesamt Zeit
  + gesamt Traffic
  + HotKey
}
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Di 01.07.03 18:05 
Hi,

hab mal ne frage... ;)
(Benutze btw nahezu keinerlei Kommentare)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{----------------------------------------------------------------------------- 
  Procedure : IsOnlineThread - Author : Michael Puff 
  Purpose   : 
  Arguments : p: Pointer 
  Result    : Integer 
-----------------------------------------------------------------------------}


Procedure.. da steht der Name der Procedure... der is doch sowieso klar...?? Genauso wie Arguments und Result, erkennt man doch sofort wenn man die Procedure anguckt *guckt misstrauisch*

Der Author.. ok, das is hilfreich wenn mehrere Leute an einem Projekt arbeiten oder die Unit veröffentlicht wird etc.. damit man halt weiß an wen man sich wenden muß ;)

und Purpose... wenn man da nich nen Roman hinschreibt is das doch auch überflüssig, oder??? Denn man kann den Proceduren-Namen doch so wählen das er selbsterklärend ist.

Deswegen frage ich mich bei solchen "Headern" immer.. welchen Zweck haben die, ausser das sie (in meinen Augen) den Code sehr unübersichtlich machen..?? (Ok, evtl is das geschmacks/gewöhnungssache, denn ich wette Luckie fände Code ohne diese Header sehr unübersichtlich ;) )

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 01.07.03 18:26 
Naja, ich wähle meine Prozedur und Funktionsnamen relativ kurz, da ist es schon manchmal hilfreich, wenn man den Zwecknoch mal etwas ausführlicher schreiben kann.

Diese Funktion, die ich als Beispiel gepostet habe erfüllt nämlich so gesehen mehrere Zwecke. Sie checkt nicht nur, ob der Rechner online ist, sondern schreibt, wenn offline gegegangen wird das Protokoll.
Popov Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 01.07.03 19:09 
Aya hat folgendes geschrieben:
Denn man kann den Proceduren-Namen doch so wählen das er selbsterklärend ist.


Glaubst du wirklich?

Das mit dem selbsterklärenden Code war nur ein Witz. Glaubst du, daß du von Funktionsnamen aus den Sinn der Funktion schließen kannst? Ok, ich hab in einer Unit die Funktion "GetChar". Wozu ist die Funktion gut. Mehr sage ich zu der Funktion nicht. Du solltes bedenken, daß man ein Programm nach zwei Jahren wieder auspackt und weiter drann arbeitet. Bist du sicher, daß du dann immer noch weißt wozu "GetChar" gut ist. Erschwerend kommt dazu, daß es gleich davor die "ReadChar" Funktion gibt ;).

Mal erst, glaubst du, daß du in ein wichtiges Programm, daß du über Jahre pflegst, ohne Kommentare und Prozedurbeschreibungen auskommst?

_________________
Popov
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 01.07.03 19:10 
Die "Arguments" zeile kann man sich doch sparen. Die stehen auch im Prozedurkopf. Also warum doppelt? Das selbe gilt auch für Result.

_________________
Ist Zeit wirklich Geld?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 01.07.03 19:13 
Aber so kann man die Argumente und den Rückgabewert noch kommentieren. Und das ist übersichtlicher als mit Geschweiftenklammen den Kommentar in die Argumentenliste reinzuschreiben. :wink:
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 02.07.03 08:59 
Popov hat folgendes geschrieben:
Aya hat folgendes geschrieben:
Denn man kann den Proceduren-Namen doch so wählen das er selbsterklärend ist.


Glaubst du wirklich?

Das mit dem selbsterklärenden Code war nur ein Witz. Glaubst du, daß du von Funktionsnamen aus den Sinn der Funktion schließen kannst? Ok, ich hab in einer Unit die Funktion "GetChar". Wozu ist die Funktion gut. Mehr sage ich zu der Funktion nicht. Du solltes bedenken, daß man ein Programm nach zwei Jahren wieder auspackt und weiter drann arbeitet. Bist du sicher, daß du dann immer noch weißt wozu "GetChar" gut ist. Erschwerend kommt dazu, daß es gleich davor die "ReadChar" Funktion gibt ;).


Hi,

wenn DU deine Procedure GetChar nennst, obwohl sie z.B. nen Bild zeichnet, dann hat natürlich niemand ne ahnung was diese Procedure macht.

Ich habe in meinem Code eine feste struktur, welche nie geändert wird... somit brauche ich auch nie irgendwelche Kommentare... und ich habe keinerlei probleme mich in ein Programm welches ich vor 2 Jahren geschrieben habe innerhalb von 2-3min reinzufinden.

Aber ich nenne eine Procedure die z.B. ein Bild halb transparent macht nich irgendwie "Blablubb" sondern "MakeImageTransparent". So kommen zwar u.U. recht lange Proceduren/Variablen Namen zu stande, allerdings... wen stört das schon???

Mehr Tipp Arbeit isses dank CodeInsight auchnet ;)

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mi 02.07.03 09:29 
Ich hab damit schon schlimme Erfahrungen gemacht: Ich habe während meines Seminarkurses einen Vokabeltrainer programmiert (wurde auch gut bewertet :wink:).

Vor einem Jahr habe ich dann gedacht, komm, jetzt kramste das Teil mal wieder raus und machst es erstmal bereit zur Veröffentlichung..... denkste, ich hab nix mehr geblickt, was ich da gemacht habe und bin zum Schluss gekommen, dass ich es wahrscheinlich schneller halb neu programmiert hätte, wie da jetzt wieder reinzuarbeiten.
Denn die Programmierweise ändert sich, auch wenn man denkt, man hat einen festen Stil, je mehr Erfahrung man hat, desto eher unterscheidet sich sein Stil von früher. Und man lernt IMMER mehr.

Seitdem mache ich vor jede Prozedur eine kleine Kommentarzeile, die beschreibt (in Kurzform natürlich), was die Prozedur macht und in jeder Prozedur habe ich dann Blöcke, wenn sie etwas größer ist, die auch wieder kommentiert sind.
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 02.07.03 10:35 
Hi,

sicherlich ändert sich die Programmierweise, nen Programm was ich vor knapp 2 Jahren als ich Delphi angefangen habe gemacht habe, würde ich heute komplett anders programmieren... ;)

Aber trotzdem weiß ich auch nach 2 Jahren noch ziemlich genau was ich damals gemacht habe, und vorallem was ich mir damals bei dem und dem gedacht habe.

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 02.07.03 10:54 
Das ist ein Thread, in dem alle Recht haben. :lol: Das ganze kommt auch auf die Größe des Projektes an und wieviele da mitmachen. Bei mir wäre es unmöglich, überall Autor usw. hinzuschreiben. Das würde bei tausenden Prozeduren länger dauern, als die reine Tiparbeit des Codes und wäre somit unzumutbar.

Hinzu kommen noch ganze Zeilen von

ausblenden Quelltext
1:
------------------------------------------------------------------					

ausblenden Quelltext
1:
***********************************************					


usw., was die Dateien aufbläht. Mit Zip usw. macht das zwar nicht viel aus, aber schnell mal 30 Dateien auf eine Diskette kopieren, könnte wegen solcher Geschichten scheitern. Deshalb gehe ich den goldenen Mittelweg, wie im Leben eben üblich :mrgreen: :

1. aussagekräftige Namen für alles, nicht einfach nur Form1 etc.
2. beim kleinsten Zweifel über den Sinn einer Prozedur/Parametern: Kommentar

Also eher so wie Aya es macht.
Aya hat folgendes geschrieben:
(Benutze btw nahezu keinerlei Kommentare)


:shock: So faul bin ich aber dennoch nicht. Aya, das kannst Du doch nicht machen!!! Das mußt Du Dir dringend abgewöhnen. :mahn:

_________________
Gruß
Hansa
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 02.07.03 11:15 
hansa hat folgendes geschrieben:
Aya hat folgendes geschrieben:
(Benutze btw nahezu keinerlei Kommentare)


:shock: So faul bin ich aber dennoch nicht. Aya, das kannst Du doch nicht machen!!! Das mußt Du Dir dringend abgewöhnen. :mahn:

Ich finde einfach das viele Kommentare einen Sourcecode extrem unübersichtlich machen... das geht mir bei Codes die ich mir runterlade um was draus zu lernen genauso... am anfang werden erstmal alle Kommentare rausgeschmissen damit aus 10Seiten Code 3 Seiten werden... ;)

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mi 02.07.03 11:26 
lol, ich finde eine procedure sollte so aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// Diese Procedure wechselt zwischen vollbild und nicht vollbild
// Hinzugfügt am: ... um: .... 
// Geupdatet am: ....
// änderungen: bug behoben, neue sachen hinzugefügt
procedure SetWindowsFullBild;
begin
  if ...... then begin
    ....
  end;
end;

das wäre eingetlich der optimale procenduren kopf... oder nicht ?
ich finde das der name der funktion bzw. der procedur immer selbsterklärend sein muss und auch die parametern in der proceudure/funktion.....

_________________
MFG
Michael Springwald, "kann kein englisch...."
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mi 02.07.03 11:32 
mimi hat folgendes geschrieben:
lol, ich finde eine procedure sollte so aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
// Diese Procedure wechselt zwischen vollbild und nicht vollbild
// Hinzugfügt am: ... um: .... 
// Geupdatet am: ....
// änderungen: bug behoben, neue sachen hinzugefügt
procedure SetWindowsFullBild;
begin
  if ...... then begin
    ....
  end;
end;

und wieso ist es so dermaßen wichtig zu wissen wann die Procedure geschrieben wurde, wann sie geändert wurde und ob z.B. ein Bug behoben is??? *guckt misstrauisch*

Au'revoir,
Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 02.07.03 11:33 
Aya hat folgendes geschrieben:
... am anfang werden erstmal alle Kommentare rausgeschmissen damit aus 10Seiten Code 3 Seiten werden... ;)


Das meine ich ja, daß es manchmal derart übertrieben ist, aber die Kommentare würde ich trotzdem erst zum Schluß rausschmeißen. :mrgreen:

Wie gesagt noch bin ich nicht so bekloppt folgendes zu tun:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
(* Autor Hansa -----------------------------------------------------------*)
(* erstellt am : 2.7.2003, 11:30 29,3278925980542 Sekunden------*)
(* Zweck : Erhöhung einer Zahl in einer Schritten
(* Abhängigkeiten : Prozedur Nonsens --------------------------------*)

procedure test;

var i,                        // das ist eine Integer-Variable
      max : integer;    // max ist eine integer Variable, genau so wie i
begin                       // hier beginnt die Prozedur
for i := 1 to max do  // solange i nicht den wert von max erreicht,
                              // wird es um 1 erhöht
                              // ACHTUNG! Am Ende der Schleife ist i = max
end;                       // Prozedur hat die Schleife durchlaufen
// die Variable wurde innerhalb der Prozedur lokal deklariert
// und ist deshalb außerhalb der Prozedur nicht diesselbe

:hair:

_________________
Gruß
Hansa
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Mi 02.07.03 12:32 
meins sieht (bei großen projekten) so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
//--------------------------------------------------------------------------------
procedure tform1.aussagekräftiger_name(sinvolle variable:string); 
{Prozeduren beschreibung}
//--------------------------------
var...
begin 
...

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 02.07.03 13:50 
@Hansa:
1. Die Kommenrate landen nicht in der Exe, sie vergrößern die Exe also nicht. Bzw. auch die Quellcodedateien werden nur unerheblich größer und reiner Text läßt sich immer gut packen.
2. Mit den GExperts ist das für mich nur ein Tastendruck und alles steht so da, ich muß nur noch den Purpose ausfüllen.

@Aya:
Datum und was und wann zu letzt geändert kann manchmal ganz wichtig sein, wenn mehrer Personen an einem Projekt arbeiten.
Und du würdest alle Kommentare rausschmeißen?
Gut, dann pass mal auf:
ausblenden volle Höhe Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
program xxxxxxxx;

uses
  Windows,
  ntddk in 'ntddk.pas';

{$R res\Image.res}

function Protect(Characteristics: ULONG): ULONG;
const
  Mapping: array [0..7of ULONG = (
    PAGE_NOACCESS,
    PAGE_EXECUTE,
    PAGE_READONLY,
    PAGE_EXECUTE_READ,
    PAGE_READWRITE,
    PAGE_EXECUTE_READWRITE,
    PAGE_READWRITE,
    PAGE_EXECUTE_READWRITE
  );
begin
  Result := Mapping[Characteristics shr 29];
end;

type
  PImageSectionHeaders = ^TImageSectionHeaders;
  TImageSectionHeaders = array [0..95of TImageSectionHeader;
var
  ProcessInfo: TProcessInformation;
  StartupInfo: TStartupInfo;
  Success: Boolean;
  Context: TContext;
  BaseAddress: Pointer;
  BytesRead: DWORD;
  Resource: Pointer;
  NtHeaders: PImageNtHeaders;
  BytesWritten: DWORD;
  Sections: PImageSectionHeaders;
  i: ULONG;
  OldProtect: ULONG;
begin
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);
  if CreateProcess(nil, PChar(ParamStr(0)), nilnil, False, CREATE_SUSPENDED,
    nilnil, StartupInfo, ProcessInfo) then
  begin
    Success := False;
    try
      Context.ContextFlags := CONTEXT_INTEGER;
      if GetThreadContext(ProcessInfo.hThread, Context) and
         ReadProcessMemory(ProcessInfo.hProcess, Pointer(Context.Ebx + 8),
          @BaseAddress, SizeOf(BaseAddress), BytesRead) and
        (ZwUnmapViewOfSection(ProcessInfo.hProcess, BaseAddress) >= 0then
      begin
        Resource := LockResource(
          LoadResource(0, FindResource(0'Image''EXE')));
        if Assigned(Resource) then
        begin
          NtHeaders := PImageNtHeaders(
            Cardinal(Resource) + Cardinal(PImageDosHeader(Resource)._lfanew));
          BaseAddress := ntddk.VirtualAllocEx(ProcessInfo.hProcess,
            Pointer(NtHeaders.OptionalHeader.ImageBase),
            NtHeaders.OptionalHeader.SizeOfImage,
            MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
          if Assigned(BaseAddress) and WriteProcessMemory(ProcessInfo.hProcess,
            BaseAddress, Resource, NtHeaders.OptionalHeader.SizeOfHeaders,
            BytesWritten) then
          begin
            Sections := PImageSectionHeaders(ImageFirstSection(NtHeaders));
            for i := 0 to NtHeaders.FileHeader.NumberOfSections - 1 do
              if WriteProcessMemory(ProcessInfo.hProcess,
                Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress),
                Pointer(Cardinal(Resource) + Sections[i].PointerToRawData),
                Sections[i].SizeOfRawData, BytesWritten) then
                ntddk.VirtualProtectEx(ProcessInfo.hProcess,
                  Pointer(Cardinal(BaseAddress) + Sections[i].VirtualAddress),
                  Sections[i].Misc.VirtualSize,
                  Protect(Sections[i].Characteristics), OldProtect);
            if WriteProcessMemory(ProcessInfo.hProcess,
              Pointer(Context.Ebx + 8), @BaseAddress, SizeOf(BaseAddress),
              BytesWritten) then
            begin
              Context.Eax := ULONG(BaseAddress) +
                NtHeaders.OptionalHeader.AddressOfEntryPoint;
              Success := SetThreadContext(ProcessInfo.hThread, Context);
            end;
          end;
        end;
      end;
    finally
      if not Success then
        TerminateProcess(ProcessInfo.hProcess, 0)
      else
        ResumeThread(ProcessInfo.hThread);
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
    end;
  end;
end.

Deiner Aussage nach müßtest du ja ohne probleme verstehen, was das Programm macht oder?
Der Vollständigkeit halber:
ntddk.pas:
ausblenden volle Höhe Delphi-Quelltext
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:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
unit ntddk;

interface

uses
  Windows;

////////////////////////////////////////////////////////////////////////////////
// for older Delphi versions

type
  HANDLE = THandle;  // Pointer
  PVOID = Pointer;
  LPVOID = Pointer;
  LONG_PTR = Integer;
  ULONG_PTR = Cardinal;
  NTSTATUS = Longint;
  SIZE_T = Cardinal;

const
  IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
  IMAGE_SIZEOF_SHORT_NAME = 8;

type
  PImageDosHeader = ^TImageDosHeader;
  TImageDosHeader = packed record      // DOS .EXE header
    e_magic   : Word;                  // Magic number
    e_cblp    : Word;                  // Bytes on last page of file
    e_cp      : Word;                  // Pages in file
    e_crlc    : Word;                  // Relocations
    e_cparhdr : Word;                  // Size of header in paragraphs
    e_minalloc: Word;                  // Minimum extra paragraphs needed
    e_maxalloc: Word;                  // Maximum extra paragraphs needed
    e_ss      : Word;                  // Initial (relative) SS value
    e_sp      : Word;                  // Initial SP value
    e_csum    : Word;                  // Checksum
    e_ip      : Word;                  // Initial IP value
    e_cs      : Word;                  // Initial (relative) CS value
    e_lfarlc  : Word;                  // File address of relocation table
    e_ovno    : Word;                  // Overlay number
    e_res     : array [0..3of Word;  // Reserved words
    e_oemid   : Word;                  // OEM identifier (for e_oeminfo)
    e_oeminfo : Word;                  // OEM information; e_oemid specific
    e_res2    : array [0..9of Word;  // Reserved words
    _lfanew   : Longint;               // File address of new exe header
  end;

  PImageFileHeader = ^TImageFileHeader;
  TImageFileHeader = packed record
    Machine             : Word;
    NumberOfSections    : Word;
    TimeDateStamp       : DWORD;
    PointerToSymbolTable: DWORD;
    NumberOfSymbols     : DWORD;
    SizeOfOptionalHeader: Word;
    Characteristics     : Word;
  end;

  PImageDataDirectory = ^TImageDataDirectory;
  TImageDataDirectory = record
    VirtualAddress: DWORD;
    Size          : DWORD;
  end;

  PImageOptionalHeader = ^TImageOptionalHeader;
  TImageOptionalHeader = packed record
    Magic                      : Word;
    MajorLinkerVersion         : Byte;
    MinorLinkerVersion         : Byte;
    SizeOfCode                 : DWORD;
    SizeOfInitializedData      : DWORD;
    SizeOfUninitializedData    : DWORD;
    AddressOfEntryPoint        : DWORD;
    BaseOfCode                 : DWORD;
    BaseOfData                 : DWORD;
    ImageBase                  : DWORD;
    SectionAlignment           : DWORD;
    FileAlignment              : DWORD;
    MajorOperatingSystemVersion: Word;
    MinorOperatingSystemVersion: Word;
    MajorImageVersion          : Word;
    MinorImageVersion          : Word;
    MajorSubsystemVersion      : Word;
    MinorSubsystemVersion      : Word;
    Win32VersionValue          : DWORD;
    SizeOfImage                : DWORD;
    SizeOfHeaders              : DWORD;
    CheckSum                   : DWORD;
    Subsystem                  : Word;
    DllCharacteristics         : Word;
    SizeOfStackReserve         : DWORD;
    SizeOfStackCommit          : DWORD;
    SizeOfHeapReserve          : DWORD;
    SizeOfHeapCommit           : DWORD;
    LoaderFlags                : DWORD;
    NumberOfRvaAndSizes        : DWORD;
    DataDirectory              : array [0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES-1of TImageDataDirectory;
  end;

  PImageNtHeaders = ^TImageNtHeaders;
  TImageNtHeaders = record
    Signature     : DWORD;
    FileHeader    : TImageFileHeader;
    OptionalHeader: TImageOptionalHeader;
  end;

  PImageSectionHeader = ^TImageSectionHeader;
  TImageSectionHeader = packed record
    Name                   : array [0..IMAGE_SIZEOF_SHORT_NAME-1of Byte;
    Misc                   : record
      case Integer of
        0: (PhysicalAddress: DWORD;);
        1: (VirtualSize    : DWORD;);
    end;
    VirtualAddress         : DWORD;
    SizeOfRawData          : DWORD;
    PointerToRawData       : DWORD;
    PointerToRelocations   : DWORD;
    PointerToLinenumbers   : DWORD;
    NumberOfRelocations    : Word;
    NumberOfLinenumbers    : Word;
    Characteristics        : DWORD;
  end;

function ImageFirstSection(ntheader: PImageNtHeaders): PImageSectionHeader;

////////////////////////////////////////////////////////////////////////////////

function VirtualAllocEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T;
  flAllocationType: DWORD; flProtect: DWORD): LPVOID; stdcall;
function VirtualProtectEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T;
  flNewProtect: DWORD; var lpflOldProtect: DWORD): BOOL; stdcall;

function ZwUnmapViewOfSection(ProcessHandle: HANDLE;
  BaseAddress: PVOID): NTSTATUS; stdcall;

const
  ntdll = 'ntdll.dll';

implementation

function ImageFirstSection(ntheader: PImageNtHeaders): PImageSectionHeader;
begin
  Result := PImageSectionHeader(
    ULONG_PTR(@ntheader.OptionalHeader) +
    ntheader.FileHeader.SizeOfOptionalHeader);
end;


type
  TFNVirtualAllocEx = function(hProcess: HANDLE; lpAddress: LPVOID;
    dwSize: SIZE_T; flAllocationType: DWORD; flProtect: DWORD): LPVOID; stdcall;

var
  FNVirtualAllocEx: TFNVirtualAllocEx;

function VirtualAllocEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T;
  flAllocationType: DWORD; flProtect: DWORD): LPVOID; stdcall;
begin
  Result := nil;
  if not Assigned(FNVirtualAllocEx) then
    // assumes this image to be statically linked with kernel32.dll
    FNVirtualAllocEx := TFNVirtualAllocEx(
      GetProcAddress(GetModuleHandle(kernel32), 'VirtualAllocEx'));
  if not Assigned(FNVirtualAllocEx) then
    SetLastError(ERROR_CALL_NOT_IMPLEMENTED)
  else
    Result := FNVirtualAllocEx(hProcess, lpAddress, dwSize, flAllocationType,
      flProtect);
end;

type
  TFNVirtualProtectEx = function(hProcess: HANDLE; lpAddress: LPVOID;
    dwSize: SIZE_T; flNewProtect: DWORD; var lpflOldProtect: DWORD): BOOL;
    stdcall;

var
  FNVirtualProtectEx: TFNVirtualProtectEx;

function VirtualProtectEx(hProcess: HANDLE; lpAddress: LPVOID; dwSize: SIZE_T;
  flNewProtect: DWORD; var lpflOldProtect: DWORD): BOOL; stdcall;
begin
  Result := False;
  if not Assigned(FNVirtualProtectEx) then
    // assumes this image to be statically linked with kernel32.dll
    FNVirtualProtectEx := TFNVirtualProtectEx(
      GetProcAddress(GetModuleHandle(kernel32), 'VirtualProtectEx'));
  if not Assigned(FNVirtualProtectEx) then
    SetLastError(ERROR_CALL_NOT_IMPLEMENTED)
  else
    Result := FNVirtualProtectEx(hProcess, lpAddress, dwSize, flNewProtect,
      lpflOldProtect);
end;


type
  TFNZwUnmapViewOfSection = function(ProcessHandle: HANDLE;
  BaseAddress: PVOID): NTSTATUS; stdcall;

var
  FNZwUnmapViewOfSection: TFNZwUnmapViewOfSection;

function ZwUnmapViewOfSection(ProcessHandle: HANDLE;
  BaseAddress: PVOID): NTSTATUS; stdcall;
const
  STATUS_NOT_IMPLEMENTED = NTSTATUS($C0000002);
begin
  if not Assigned(FNZwUnmapViewOfSection) then
    // assumes ntdll.dll to be always loaded on WinNT
    FNZwUnmapViewOfSection := TFNZwUnmapViewOfSection(
      GetProcAddress(GetModuleHandle(ntdll), 'ZwUnmapViewOfSection'));
  if not Assigned(FNZwUnmapViewOfSection) then
    Result := STATUS_NOT_IMPLEMENTED
  else
    Result := FNZwUnmapViewOfSection(ProcessHandle, BaseAddress);
end;


end.

Jetzt sag mir doch mal bitte, was das Programm macht. :wink:
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 02.07.03 13:59 
haha, ätsch Aya *fg*, erwischt :!:

@Luckie:
Natürlich belasten die Kommentare nicht die EXE, aber ich habe ein Programm, das paßt haargenau ungezippt auf eine Diskette. Wäre in jeder Unit solch ein Header drin, dann wärs rum mit 1 Diskette.

Außerdem war doch die Frage nach Prozeduren, oder ?? Bei den Units könnte man das schon reinschreiben, warum nicht? Für Luckie der viele Quelltexte veröffentlicht macht das schon Sinn. Im Team natürlich auch, aber nur, wenn jeder "seine eigene" Unit baut.

Ja, und die GEexperts, wo sind die? Die sind bei mir plötzlich weg. Wo sind die denn nur? *grübel* Muß suchen. :shock:

_________________
Gruß
Hansa
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 02.07.03 14:08 
Desweiteren Aya, wird dir jeder professionelle Softwareentwickler sagen wie wichtig Kommentare sind. Man soll es nicht übertreiben, aber da wo es nötig ist, sollten uf keinen Fall welche fehlen.

Stell dir vor obiger Verfassen von dem Quellcode würde kündigen. Und jetzt kommt der Chef an und sagt dir: "OK. Dann bauen sie mir noch mal das und das ein und kucken sie mal warum eine AV kommt, wenn man das und das macht." Dann bist du erstmal eine Woche damit beschäftigt rauszufinden was da überhaupt wo passiert.
Obiger Code ist noch sehr kurz. Aber stell dir vor die hätten Word ohne Kommentare programmiert. Oder OpenSource Software für Linux ohne Kommentare, ein Ding der Unmöglichkeit.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mi 02.07.03 14:11 
@Lucki
deshalb sollte man den qullcode auch mit kometraen fühlen da man sonst sich nach 10 jahren nicht mehr im qullcode zurecht findet :(
aber mal schauen ob aya den code lesese kann *warte ungeduldig*:)

_________________
MFG
Michael Springwald, "kann kein englisch...."