Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607) (https://www.delphipraxis.net/206733-unc-pfade-%5C%5C-%5C-max_math-usw-win-ver-1607-a.html)

MicMic 23. Jan 2021 17:05

UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607)
 
Hallo,
habe ich das richtig verstanden?
Bei längeren Pfaden (260) gibt man "\\?\" mit an.

Zum Beispiel:

"\\?\c:\huhu\ich\bin\der\boss\usw...\" und ich glaube bei Root aber nicht (falsch="\\?\c:\")

Beispiel für normales UNC:
weniger als 260 = "\\SERVER\huhu\ich\bin\der\boss\"
mehr als 260 = \\?\UNC\SERVER\huhu\ich\bin\der\boss\usw...\"

Bis hier korrekt?

Ab Windows 10 - 1607 benötigt man bei einigen Funktionen das "\\?\" nicht mehr. Also bedeutet das, dass ich bei UNC-Pfaden mit mehr als 260 Zeichen dann hier ebenfalls nicht mehr "\\?\UNC\" angeben muss?

Das 1607 Update wird z.B. bei "FindFirstFileW" angegeben. Zum Beispiel bei "GetFinalPathNameByHandleW" nicht. Ich dachte ja erst, dass alle Funktionen mit "W" am Schluss, dieses Update bekommen haben. Wenn das nicht so ist (also nicht alle Funktionen), gibt es da irgendwo eine Info-Liste von Microsoft? Ich kann mir nämlich vorstellen, dass auf den "docs.microsoft.com" Seiten (wo jede Funktion beschrieben wird) evtl. die Info zu den 1607Update nicht immer angegeben wurde, die Funktion es aber dann doch kann.

DieDolly 23. Jan 2021 18:39

AW: UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607)
 
Zitat:

und ich glaube bei Root aber nicht
Du kannst überall \\?\ angeben. Egal ob root oder nicht und egal ob mehr oder weniger als 260 Zeichen.

Dalai 23. Jan 2021 18:40

AW: UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607)
 
Zitat:

Zitat von MicMic (Beitrag 1481451)
Bis hier korrekt?

Bislang hab ich das auch so verstanden.

Zitat:

Ab Windows 10 - 1607 benötigt man bei einigen Funktionen das "\\?\" nicht mehr.
Ja, mit einem großen Aber: Man kann das Long Path Prefix nur dann weglassen, wenn das im System aktiviert ist und die Anwendung ein Manifest enthält, das angibt, dass die Anwendung Long Path Aware ist!

Siehe auch den zugehörigen MS-Artikel:
Zitat:

Zitat von Microsoft
Starting in Windows 10, version 1607, MAX_PATH limitations have been removed from common Win32 file and directory functions. However, you must opt-in to the new behavior.

(Hervorhebung von mir.) Also mit "ab Windows 1607 geht das automatisch" wird das nichts, denn Anwendungen müssen in jedem Fall mit entsprechendem Manifest neu kompiliert werden.

Zitat:

Also bedeutet das, dass ich bei UNC-Pfaden mit mehr als 260 Zeichen dann hier ebenfalls nicht mehr "\\?\UNC\" angeben muss?
Das wird auch auf UNC-Pfade zutreffen, sofern diese an die "unlimitierten" Funktionen gegeben werden, die in oben verlinktem Artikel angegeben sind.

Zitat:

Das 1607 Update wird z.B. bei "FindFirstFileW" angegeben. Zum Beispiel bei "GetFinalPathNameByHandleW" nicht.
Doch, siehe Liste in oben verlinktem Artikel.

Grüße
Dalai

generic 23. Jan 2021 18:56

AW: UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607)
 
Die MaxPath Sache erkläre ich in diesem Video ab ca. 5m40s.

Ich muss aber gestehen, dass ich nicht auf die UNC Sache eingehe.

Dateipfade - ein Einstieg, Vorstellung von nützlichen Funktionen und das MAX_PATH Limit brechen
https://www.youtube.com/watch?v=pTEJxX3SFFU

himitsu 24. Jan 2021 00:21

AW: UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607)
 
Jupp, seit Win10 1607 ist die MAX_PATH-Grenze bei vielen APIs inzwischen aufgehoben, auch ohne mit UNC rumspielen zu müssen,
allerdings muß es in der Registry erst aktiviert werden, zusätzlich zum Manifest.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem > LongPathsEnabled

Und nein, neu kompiliert muß nichts werden.
Das Manifest liegt in den Resourcen und Diese lassen sich auch nachträglich noch editieren.
Eventuell muß man noch neu signieren, jedenfalls wenn die EXE signiert war.

MicMic 24. Jan 2021 12:59

AW: UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607)
 
Danke für Eure Anregungen und Infos.
Also wenn das alles erst aktiviert werden muss bzw. ab und zu (wenn es halt noch nicht ist beim Endbenutzer), dann ist der alte Weg ("\\?\" und "\\?\UNC\") wohl besser. Blöd ist aber echt, wenn man vor doofen Problemen steht, die sowieso immer vorhanden sind. Zum Beispiel das laden eines Icons aus EXE-Dateien in so einem langen Pfad. Da geht halt nicht SHGetFileInfo und andere Icon-Routinen wegen MAX_PATH. Die Umwandlung zu einem kurzen Pfad gibt es zwar auch aber es wird beschrieben, dass dies auch nicht immer geht. Bei dem Icon-Beispiel, wäre man wohl nur auf der sicheren Seite, wenn man aus der Exe-Datei den Icon-Header sucht und direkt das Icon mit CreateFile herausliest.

himitsu 25. Jan 2021 10:37

AW: UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607)
 
Ja, ganz früher gab es nur Kurz,
dann wurde Optional zusätzlich noch Lang angehängt (in FAT: in mehreren speziellen "Kurz"-Einträgen auf den originalen Eintrag folgend)

Später wurden im NTFS standardmäßig keine Kurzen Einträge mehr erzeugt, (oder man muß in der Registry die Einstellungen den NTFS-Treiber anpassen und diese Funktion wieder aktivieren)
außer man erstellte die Datei mit der ANSI-API (CreateFileA), bzw. wenn man mit gewissen ANSI-APIs nach Dateien suchte (FindFirstFileA), dann wurde auch noch der Kurzname angelegt (falls nötig)
und aktuell, oder war's zukünftig, soll auch dieses Verhalten entfernt werden (dann nur noch lang).


Und trotzt UNC hat man auch keine Garantie, dass es funktioniert.
* so habe ich in einem ältenen Programm (im Manifest nichts zur Windowskompatibilität) auch mit UNC keinen Zugriff auf längere Pfade

* und selbst im Explorer hatte ich "manchmal" Probleme -> beim Kopieren von NTFS via SMB auf ein Linux, da wurden im Linux alle längeren Pfade ohne Fehlermeldung abgeschnitten
* * geknallt hatte es nur, wenn zufällig ein \ bzw. / als letztes im Datei-Pfad zurück blieb
* * ich weiß aber nicht wer genau es Abschnitt (Windows, SMB oder Linux) ... hatte es versucht rauszubekommen, aber absichtlich zu lange Pfade erzeugt und damit rumgespielt, da ging zufällig immer alles

Dalai 25. Jan 2021 11:17

AW: UNC Pfade + \\?\ MAX_MATH usw. (Win Ver. 1607)
 
Zitat:

Zitat von himitsu (Beitrag 1481465)
Und nein, neu kompiliert muß nichts werden.
Das Manifest liegt in den Resourcen und Diese lassen sich auch nachträglich noch editieren.
Eventuell muß man noch neu signieren, jedenfalls wenn die EXE signiert war.

OK, ich formulier's anders: Der Autor einer Software muss (sowieso) eingreifen, ob nun beim Manifest oder im Code. Wenn die Software bisher keine überlangen Pfade unterstützt hat (z.B. weil man überall MAX_PATH genutzt hat), muss die Software neu kompiliert werden, wenn man sicherstellen will, dass sie mit überlangen Pfaden zurechtkommt. Der Weg per Manifest hat den Nachteil, dass dieser Schalter allein nicht ausreicht, weil im System noch ein weiterer umgelegt werden muss, und auch auf älteren Windows-Versionen nicht funktioniert. Das Long Path Prefix funktioniert aber immer und überall (wenn man es richtig nutzt).

Grüße
Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:29 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