AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WINAPI-Funktionen Windows Versionsabhängig
Thema durchsuchen
Ansicht
Themen-Optionen

WINAPI-Funktionen Windows Versionsabhängig

Ein Thema von RWarnecke · begonnen am 19. Jan 2008 · letzter Beitrag vom 22. Jan 2008
Antwort Antwort
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#1

Re: WINAPI-Funktionen Windows Versionsabhängig

  Alt 22. Jan 2008, 20:48
Und wenn wir bei optimieren sind: Jedesmal getprocaddress neu anstoßen, bedeutet ja auch jedesmal die Tabelle mit den Exporteinträgen von vorne durchwühlen, bis die strings übereinstimmen. Da kann man natürlich auch einmal durchgehen. Hier allerdings bis zum bitteren Ende, ob das Vorteile bringt

Delphi-Quellcode:
function getProcList(libs:array of hModule;const FunctionNames:TStringlist):boolean;
var Exp:PImageExportDirectory;
    i,a:integer;
    name:string;
    addr:pointer;
    index:integer;
    listfilled:integer;
    lib:integer;
begin

  try

    listfilled:=0;


    for a:=0 to high(libs) do
    begin

      lib:=libs[a]; //a-te Library aus libs lesen

      if (lib=0)or
         (PWord(pointer(lib))^<>$5A4D)or
         (PImageNTHeaders(PImageDosHeader(pointer(lib))^._lfanew+lib)^.Signature<>$4550)
         then continue; //ist keine Win-DLL/EXE


      //ExportTabelle finden
      Exp:=pointer(PInteger(@PImageNTHeaders(PImageDosHeader(pointer(lib))^._lfanew+lib)^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT])^+lib);

      //alle Export-Einträge durchlaufen
      for i:=0 to exp^.NumberOfNames-1 do
      begin
        //Name der i-ten Export-Funktion
        name:=pchar(pinteger(integer(exp^.AddressOfNames)+lib+i*4)^+lib);

        //Name in Liste suchen
        index:=Functionnames.IndexOfName(name);
        if index>=0 then
        begin
          //Adresse der i-ten Export-Funktion
          addr:=pointer(pinteger(integer(exp^.AddressOffunctions)+lib+i*4)^+lib);
          //Adresse in Liste speichern
          Functionnames.ValueFromIndex[index]:=inttostr(integer(addr));

          inc(listfilled);
        end;
      end;
    end;

    result:=listfilled=Functionnames.Count;

  except
    result:=false; //was auch immer
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var list:TStringlist;
begin
  list:=TStringlist.create;
  list.Add('CreateWindowExA=');
  list.Add('CreateWindowExW=');
  list.add('GetProcAddress=');
  if getProcList([getmodulehandle('user32.dll'),
                  getmodulehandle('kernel32.dll')],
                  list) then memo1.lines.addstrings(list);
end;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:51 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