2014-04-13 5 views
16

Was ist der Unterschied zwischen den Pfaden mit \??\ und diejenigen mit dem Präfix \\?\Pfad Präfixe ?? und \

Bei Windows 7 CMD-Line

  • DIR ergibt Präfix ist: \??\Volume{00000000-0000-0000-0000-000000000000}\
  • WMIC VOLUME LIST gibt \\?\Volume{00000000-0000-0000-0000-000000000000}\

Dank

Zusätzliche Informationen:
Ich habe ein Verzeichnis auf meinem Systemlaufwerk erstellt, in dem ich alle meine Mount-Punkte platziert habe. Also habe ich zuerst eine MD C:\HDDs, dann eine MD C:\HDD\Drive1, MD C:\HDD\Drive2 ... für alle meine Laufwerke. Nach dem Einhängen der Laufwerke in diese leeren Verzeichnisse kann ich die GUID sehen, indem ich mit CD /D C:\HDDs zu diesem Verzeichnis wechsle und einen DIR Befehl ausstelle. Vielleicht muß ich ein DIR /ah Ausgabe versteckt Sachen zeigen, nur für den Fall, dass die Bereitstellungspunkte Verzeichnisse versteckt ...

+3

Nicht außerhalb des Themas. Nur für Programmierer interessant. –

+0

Was ist der Kontext? \ ?? ist ein NT-Objekt-Manager-Pfad und \\? ist die rohe Pfadnotation zur Umgehung von Pfadlängenbeschränkungen/Erweiterung –

+0

@AlexK .: Ich glaube, das ist '\\. \' nicht '\\? \'? –

Antwort

7

\?? ist das virtuelle Objektverzeichnis des Kernels, in dem der Objektmanager nach symbolischen lokalen und globalen DOS-Geräten sucht. Zuerst überprüft es die lokalen DOS-Gerätelinks für die Anmeldesitzung des Benutzers in \Sessions\0\DosDevices\[Logon_AuthenticationId]. Dann überprüft es die globalen DOS-Gerätelinks in \Global??. Früher verwendete NT ein einziges Verzeichnis \DosDevices. Heutzutage ist \DosDevices ein Link zu \??. Außerdem verfügt jedes lokale DOS-Geräteverzeichnis über eine "Globale" Verknüpfung, um den Zugriff auf globale Geräte zu ermöglichen, wenn ein lokales Gerät die globale beschattet (z. B. \\?\Global\Z:) oder einem Gerätetreiber zu ermöglichen, ein globales Gerät zu erstellen, wenn es nicht in einem Systemthread ausgeführt wird.

Im User-Modus verwandelt sich die Laufzeitbibliothek in ntdll.dll einen vollständig qualifizierten DOS/Windows-Pfad zu einem NT-Pfad entweder durch \??\ für einen Laufwerksbuchstaben vorangestellt oder die führende \\ eines UNC-Pfad mit \??\UNC\ ersetzen - außer \\?\ und \\.\ Local-Device-Pfade werden einfach durch \??\ ersetzt. Aber zuerst wird ein \\.\ Gerätepfad einer Vorverarbeitung unterzogen, z. B. "." und ".." Komponenten, während \\?\ umgeht alle Benutzer-Modus-Vorverarbeitung.

Zum Beispiel wird typischerweise \\?\C:\Windows in \??\C:\Windows umgewandelt, was in \Global??\C:\Windows aufgelöst wird. Das DOS-Laufwerk "C:" Laufwerksbuchstabe ist eine symbolische Verbindung zu dem NT-Datenträger-Gerät. Das endgültige Ziel hängt vom System ab. Beispielsweise kann der letzte NT-Pfad zu \Device\HarddiskVolume2\Windows aufgelöst werden.

DOS-Gerätelinks wie Volume{00000000-0000-0000-0000-000000000000} werden vom Mount-Point-Manager erstellt. Sie sind der Klebstoff zwischen persistenten Laufwerkbuchstaben, NTFS-Bereitstellungspunkten und dem derzeit verwendeten NT-Volume-Gerät, z. B. \Device\HarddiskVolume2.

5

So nahe, wie ich herausfinden kann, sowohl \\?\ und \??\ beziehen sich auf dem lokalen DOS-Geräte-Namensraum, sondern sind gültig in verschiedenen Kontexten.

\\?\ ist nur für Win32 sinnvoll, nicht für den Kernel, außer dass in bestimmten speziellen Fällen (z. B. bei der Verarbeitung von Junctionpunkten) der Kernel Win32-Pfade nach Bedarf in Kernelpfade zurückübersetzt.

\??\ ist sowohl für den Kernel als auch für Win32 sinnvoll, jedoch verstehen die meisten Win32-Anwendungen (einschließlich cmd.exe) es nicht.

In den OPs besondere Beispiele: Verzweigungspunkte und Mount-Punkte können entweder Win32- oder Kernel-Pfade enthalten, enthalten aber normalerweise Kernel-Pfade, und dir präsentiert einfach den unbearbeiteten Inhalt ohne Änderung. WMIC konvertiert den Kernelpfad absichtlich in einen Win32-Pfad oder erhält die Daten von einer API-Funktion, die dies tut.

Verwandte Themen