AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Woher weiß ich die Puffergröße für einen Aufruf?
Thema durchsuchen
Ansicht
Themen-Optionen

Woher weiß ich die Puffergröße für einen Aufruf?

Ein Thema von Der schöne Günther · begonnen am 8. Nov 2016 · letzter Beitrag vom 8. Nov 2016
 
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#5

AW: Woher weiß ich die Puffergröße für einen Aufruf?

  Alt 8. Nov 2016, 10:16
Ich nehme einfach 32 KB, die (momentan) maximale Pfadgröße
Dazu noch einen kleinen Exkurs. Es ist in der Tat die absolut größte Pfadlänge im Moment.

Die Obergrenze stammt daher, daß MSDN-Library durchsuchenUNICODE_STRING einen 16-bittigen vorzeichenlosen Integertyp (in Delphi: Word) benutzt um die Puffergröße in Bytes zu hinterlegen.

Während ehemals Windows NT UCS2 meinte wenn Unicode draufstand (also exakt ein WideChar pro Codepunkt), erweitern moderne Windowsversionen dies auf UTF-16, wodurch Zeichen außerhalb des Unicode BMP zum kodieren eines Codepunkts mehr als ein WideChar brauchen.

Ein Pfadname kann also durchaus kürzer sein als es die Länge in WideChar vermuten lassen würde.

Das eigentliche Thema ist aber die Erweiterung der Pfadnamen im Kernelmodus.

Haste beispielsweise die Datei C:\bootmgr, wird das bei der Benutzung von langen Pfadnamen laut MSDN-Library durchsuchenNaming Files ("Naming Files, Paths, and Namespaces") zu \\?\C:\bootmgr, welches für die nativen Schnittstellen schwuppdiwupp in \??\C:\bootmgr verwandelt wird. Wobei \?? auf modernen Systemen (alle mit eingebauten TS) ein Alias für \GLOBAL?? ist, worin die "DOS"-Gerätenamen abgelegt werden. Es gibt dann noch sitzungsspezifische Alternativen zu \GLOBAL?? (falls dich das interessiert kannste mein kleines Tool hier benutzen - .exe ist AuthentiCode-signiert [1]). Einerlei, in \GLOBAL?? gibt es dann bspw. einen symbolischen Link namens C: der bei mir auf \Device\HarddiskVolume6 zeigt, wodurch aus deinem Pfad \Device\HarddiskVolume6\bootmgr wird. Aus diesem Grund ist die echte Obergrenze für die Pfadlänge unterhalb der 32k anzusiedeln. In Windows ist sie auf 0xFFF0 (dann in Bytes) festgelegt und der Rückgabewert für diesen Fehlerfall ist ERROR_FILENAME_EXCED_RANGE (bzw. intern STATUS_NAME_TOO_LONG). Aber einen exakten Wert für den Benutzermodus kann man so dennoch nicht angeben. Nur das absolute Maximum, bedingt durch die gezählten Strings (MSDN-Library durchsuchenUNICODE_STRING) im Kernelmodus.

Die eigentliche Obergrenze ist also etwas schwammig, weil sie davon abhängt die lang der Gerätename im Namensraum des Objektmanagers ist.

MSDN weist auch drauf hin:

Zitat:
Note The maximum path of 32,767 characters is approximate, because the "\\?\" prefix may be expanded to a longer string by the system at run time, and this expansion applies to the total length.
[1] Als Alternative zu vorgenanntem Programm kann ich noch das hier anbieten. Ich hoffe es kompiliert auf modernem Delphi, ansonsten schickt nen Pull-Request, den ich dann auf einen alternativen Zweig schieben würde. Das ist ein Programm welches Marcel van Brakel und ich 2005 für die Märzausgabe 2006 von The Delphi Magazine entwickelt hatten und zu dem es auch noch einen Artikel mit Erklärungen gab. Auch freue ich mich über Rückmeldungen/Fehlermeldungen zu ntobjx.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
 


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 19:54 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