AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Critical Sections im eigenen Prozess auflisten
Thema durchsuchen
Ansicht
Themen-Optionen

Critical Sections im eigenen Prozess auflisten

Ein Thema von sahimba · begonnen am 21. Sep 2012 · letzter Beitrag vom 21. Sep 2012
Antwort Antwort
sahimba

Registriert seit: 14. Nov 2011
Ort: Berlin, Hauptstadt der DDR
137 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Critical Sections im eigenen Prozess auflisten

  Alt 21. Sep 2012, 09:37
Hallo und guten Morgen,

ich versuche gerade, innerhalb eines Prozesses eine Liste der Critical Sections zu ermitteln. Lt. SDK steht mir hierzu insbesondere die PRTLCriticalSectionDebug-Struktur zur Verfügung, welche mittels einer doppelt verketten Liste innerhalb dieser verweist.

Hier aber mühe ich mich erfolglos ab, der folgende Code macht Probleme:

Delphi-Quellcode:
var
  LDebugInfo: PRTLCriticalSectionDebug;
  LCritical: PRTLCriticalSection;

  LDebugInfo := TCriticalSectionAccess(GCriticalSection).FSection.DebugInfo;
  while Assigned(LDebugInfo) do begin
    LCritical := LDebugInfo.CriticalSection;
    Assert(LDebugInfo = LCritical.DebugInfo);
    if Assigned(LDebugInfo.ProcessLocksList.FLink) then
      LDebugInfo := Pointer(Cardinal(LDebugInfo.ProcessLocksList.FLink) -8)
    else
      LDebugInfo := nil;
  end;
Grundsätzlich scheint er zwar zu funktionieren, die Assertion ist zumindest ein gutes Indiz dafür, es gibt aber Probleme, so dass ich wohl annehme, im SDK irgendetwas übersehen zu haben. Zum einen hätte ich nach lesen des SDK erwartet, dass das letzte Listenelement (LDebugInfo.ProcessLocksList.FLink) auf nil verweist, dem ist tatsächlich jedoch nicht der Fall, so dass obiger Code in einer Endlosschleife landet. Den Code habe ich somit (zunächst) wie folgt geändert:

Delphi-Quellcode:
var
  LFirstInfo,
  LDebugInfo: PRTLCriticalSectionDebug;
  LCritical: PRTLCriticalSection;

  LFirstInfo := TCriticalSectionAccess(GCriticalSection).FSection.DebugInfo;
  LDebugInfo := LFirstInfo;
  while Assigned(LDebugInfo) do begin
    LCritical := LDebugInfo.CriticalSection;
    Assert(LDebugInfo = LCritical.DebugInfo);
    if Assigned(LDebugInfo.ProcessLocksList.FLink) then
      LDebugInfo := PRTLCriticalSectionDebug(Cardinal(LDebugInfo.ProcessLocksList.FLink) -8)
    else
      LDebugInfo := nil;
    if LDebugInfo = LFirstInfo then
      Break;
  end;
So weit, so gut. Leider sind wir nun beim nächsten Problem angelangt. Es werden "zu viele" Critical Sections gefunden. In dem Sinne "zu viele" als dass ich mir doch relativ sicher bin, dass in meinem Projekt keine rund 240 Critical Sections verwendet werden .

Ideen, Hinweise, Lösungen?

Danke und viele Grüße,
sahimba
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Critical Sections im eigenen Prozess auflisten

  Alt 21. Sep 2012, 10:24
Die Delphi-VCL verwendet Welche, die RTL nutzt auch ein paar, Fremdkomponenten (Indy nd Co.) nutzen Welche und die vielen geladenen System-DLLs benutzen auch noch die eine oder andere CS und dann gibt es noch weitere DLLs, welche z.B. von Virenscannern oder Maustreibern reingehackt wurden.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Critical Sections im eigenen Prozess auflisten

  Alt 21. Sep 2012, 12:02
CriticalSections sind ja auf unterer Ebene eine Systemstruktur, welche durch die WinAPI zur Verfügung gestellt wird. Diese Linked List, die du da parst, befindet sich im PEB (Process Environment Block) jedes Prozesses. TCriticalSections ist nur die von Delphi gekapselte Variante. Intern wird MSDN-Library durchsuchenInitializeCriticalSection aufgerufen, was zur Folge hat, dass die CS automatisch auch in der besagten LinkedList im PEB eingetragen wird. Natürlich landen in dieser Liste folglich auch alle die CriticalSections, die nicht über die gekapselte Delphi Klasse erzeugt werden.

Wenn du wirklich alle von dir selbst erstellten CriticalSections ermitteln willst, solltest du dein Programmkonzept überdenken und am bessten eine globale Liste oder sowas in der Art anlegen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
sahimba

Registriert seit: 14. Nov 2011
Ort: Berlin, Hauptstadt der DDR
137 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: Critical Sections im eigenen Prozess auflisten

  Alt 21. Sep 2012, 12:17
Hallo Ihr Beiden und Danke für Eure Anworten. An die Critical Sections (selbstredend nicht nur jene, welche mittels Delphi gekapselt sind) der in den Prozess geladenen DLLs habe ich gar nicht gedacht . Klar "eigentlich", dass da so einige zusammen kommen. Danke, das Brett vor meinem Kopf ist weg
  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 21:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz