2 पॉइंट द्वारा GN⁺ 2025-12-01 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Windows में A~Z के अलावा किसी अन्य symbol या non-ASCII character को भी ड्राइव लेटर के रूप में इस्तेमाल किया जा सकता है
  • अंदरूनी तौर पर Win32 path (C:\\foo) को NT namespace path (\\??\\C:\\foo) में बदलकर process किया जाता है
  • यह संरचना Object Manager द्वारा manage की जाती है, और C: जैसे ड्राइव लेटर सिर्फ एक symbolic link object के रूप में मौजूद होते हैं
  • subst command से +: या €: जैसे गैर-मानक ड्राइव लेटर बनाना संभव है, लेकिन Explorer या PowerShell इसे पहचान नहीं पाते
  • यह behavior Windows path handling की अंदरूनी संरचना और encoding पद्धति (WTF-16 आदि) को समझने में एक महत्वपूर्ण संकेत देता है

ड्राइव लेटर की अंदरूनी संरचना

  • Windows का सामान्य path (C:\\foo) एक Win32 namespace path है, और API call के दौरान इसे NT namespace path में बदल दिया जाता है
    • उदाहरण: CreateFileW("C:\\foo") call के दौरान अंदरूनी रूप से NtCreateFile("\\??\\C:\\foo") में रूपांतरण होता है
  • \\?? Object Manager की एक virtual folder है, जो \\GLOBAL?? और उपयोगकर्ता-विशिष्ट DosDevices folders का संयोजन रूप है
  • C: object \\GLOBAL?? में मौजूद एक symbolic link के रूप में रहता है और वास्तविक device path \\Device\\HarddiskVolume4 से जुड़ा होता है
  • इसलिए C: को कोई विशेष आरक्षित character नहीं बल्कि एक साधारण symbolic लिंक नाम माना जाता है

ड्राइव लेटर की परिभाषा

  • ड्राइव लेटर असल में Win32 path को NT path में बदलने की प्रक्रिया का परिणाम हैं
    • कन्वर्जन फंक्शन RtlDosPathNameToNtPathName_U C:\\foo को \\??\\C:\\foo में बदलता है
  • यह फंक्शन +: जैसे गैर-मानक characters को भी समान तरीके से हैंडल करता है, इसलिए यदि +: object मौजूद हो तो +:\\ path भी सही काम करेगा
  • subst +: C:\\foo command से बना +: object उपयोगकर्ता-विशिष्ट DosDevices folder में store होता है

गैर-मानक ड्राइव लेटर का व्यवहार

  • Explorer.exe केवल A~Z रेंज ही scan करता है, इसलिए +: ड्राइव दिखती नहीं है
  • PowerShell भी non-ASCII ड्राइव को पहचान नहीं पाता और error लौटाता है
  • जबकि cmd.exe में +: या €: जैसे ड्राइव सामान्यतः काम करते हैं

गैर-ASCII और यूनिकोड ड्राइव लेटर

  • subst €: C:\\foo command से Euro symbol (€) वाला ड्राइव बनाया जा सकता है
    • case-insensitive काम करता है (Λ: और λ: समान माने जाते हैं)
  • ड्राइव लेटर केवल एक single WTF-16 code unit (U+FFFF या उससे नीचे) तक सीमित हैं
    • 𤭢: जैसे characters, जिनका कोड U+FFFF से ऊपर है, subst में error देते हैं
    • MountPointManager को सीधे call करने पर निर्माण संभव है, लेकिन Win32 path conversion फेल होने से access नहीं हो पाता
  • यह दिखाता है कि Windows UTF-16 surrogate pairs को पूर्णतः सपोर्ट नहीं करता

पाथ डिटेक्शन और encoding की समस्या

  • भाषा/रनटाइम path-handling implementation में RtlDosPathNameToNtPathName_U से अलग व्यवहार हो सकता है
    • उदाहरण: Rust केवल A-Z को absolute path मानता है (C:\\ true, +:\\ false)
  • encoding विधि (WTF-8 बनाम WTF-16) बदलने पर path[0], path[1] जैसे index अलग दिख सकते हैं, जिससे absolute path detection का परिणाम बदल सकता है
  • Zig standard library ने इस फर्क को handle करने के लिए <= U+FFFF रेंज तक पहचानने के अनुसार implement किया है

SetVolumeMountPointW का non-ASCII हैंडलिंग बग

  • SetVolumeMountPointW("€:\\", volume) call सफल होने पर भी वास्तविक बने लिंक ¬: के रूप में दिखाई देता है
  • अनुमान है कि 0x20AC(€) को 0xAC के रूप में truncate करके store किया गया है
  • यह API limitations का उदाहरण है जो non-ASCII ड्राइव लेटर को सही तरीके से handle नहीं कर पाते

निष्कर्ष

  • Windows अपने अंदरूनी स्तर पर ड्राइव लेटर को A~Z तक सीमित नहीं करता
  • यह सीमा मुख्यतः Explorer, PowerShell जैसे top-level tools के अलग implementations से आती है
  • यदि Win32 और NT namespace conversion structure, encoding handling और Object Manager की गतिविधि समझी जाए तो
    Windows file system के अंदरूनी mechanism को बेहतर तरीके से समझा जा सकता है

1 टिप्पणियां

 
GN⁺ 2025-12-01
Hacker News राय
  • NT path वह तरीका है जिससे Object Manager resources को reference करता है
    उदाहरण के लिए HKEY_LOCAL_MACHINE, \Registry\Machine का alias है
    NT इस मायने में Unix जैसा है कि यह global VFS namespace का उपयोग करता है
    drive letter से शुरू होने वाले path, DOS compatibility के लिए “DOSPath” हैं, और kernel mode में भी कुछ subsystems अब भी इन्हें उपयोग करते हैं
    PowerShell में विभिन्न resources को “drive” के रूप में expose किया जाता है, और hklm:\ जैसे default drives के अलावा custom drives भी बनाए जा सकते हैं
    संबंधित दस्तावेज़: PowerShell Drive प्रबंधन सैंपल
    Linux/Bash में certificates को file path के रूप में access नहीं किया जा सकता, लेकिन PowerShell/Windows में यह संभव है
    NtObjectManager PowerShell module install करके ls NtObject:\ से explore करने की सिफारिश है
    module link

    • 30 साल बाद भी Windows का अब भी 80s-style directory structure से बंधा होना हैरान करता है। जबकि floppy drive भी नहीं रहे
    • PnP PowerShell के PSDrive provider का उपयोग करने पर SharePoint Online को भी drive की तरह browse किया जा सकता है
      Connect-PnPOnline दस्तावेज़
    • Linux में भी /usr/share/ca-certificates या /etc/ssl/certs के माध्यम से certificates को file के रूप में access किया जा सकता है
      हालांकि यह Windows Registry जितना integrated नहीं है
    • ReactOS में NT Object browser है, जिससे पूरी Registry hierarchy को GUI में browse किया जा सकता है
      यह Windows पर भी काम करता है
      ReactOS NT Object Browser उदाहरण
    • Linux में भी certificates को साधारण file रूप में access किया जा सकता है
      /etc/ca-certificates/extracted/cadir के नीचे PEM files को सीधे देखा जा सकता है
  • Windows में partition को drive letter के बिना भी access किया जा सकता है
    Linux की तरह इसे किसी directory के नीचे mount किया जा सकता है, और PowerShell के Add-PartitionAccessPath command से इसे set किया जा सकता है
    reboot के बाद भी यह बना रहता है

    • इस feature का उपयोग करके game install path को SD card पर reroute किया गया था
      installer SD card को reject करता है, लेकिन NTFS mount point का उपयोग करके उसे trick किया जा सकता है
      हालांकि कुछ installers parent disk की free space जांचते हैं, जिससे वे confuse हो जाते हैं
      permanent mount के लिए symbolic link अधिक उपयोगी है
    • PowerShell के बिना भी Disk Management tool में “drive letter and path change” menu से इसे set किया जा सकता है
    • NTFS mount point ऐसे software को bypass करने में उपयोगी है जो path को customize नहीं करने देता
      अलग-अलग performance policy वाली VM disks को एक ही path में जोड़ा जा सकता है
    • लेकिन यह केवल NTFS के बीच ही संभव है। exFAT या ReFS समर्थित नहीं हैं
      GUI में partition बनाते समय “assign drive letter” की जगह “mount as path” चुना जा सकता है
    • कुछ programs, जैसे Steam, parent disk की free space जांचकर install से मना कर सकते हैं
  • “€:\” जैसा drive letter शापित लेकिन शानदार उदाहरण है
    NT kernel, user को दिखने वाली चीज़ों से कहीं अधिक flexible है

    • ज़्यादातर लोग Windows NT की केवल DOS outer shell को ही जानते हैं
      अंदर GUID mapping पर आधारित एक जटिल संरचना छिपी है
      उदाहरण के लिए {GUID} नाम का shortcut बनाने पर वह किसी hidden feature से जुड़ सकता है
      इसी तरह की संरचना की वजह से Windows, malware का अड्डा भी बन जाता है
    • codepage के अनुसार ऐसे drive letters तक पहुंचना भी असंभव हो सकता है
    • सच में flexible होना है तो drive letters को emoji के रूप में इस्तेमाल किया जा सके
  • File Explorer, A~Z के अलावा किसी और drive letter को पहचानता नहीं है
    इसलिए सभी drive letters को emoji में बदलने का सपना संभव नहीं है

    • ज़्यादातर emoji UTF-16 के एक code unit में represent नहीं होते, इसलिए सीमाएँ हैं
    • कुछ smiley emoji codepage के हिसाब से संभव हो सकते हैं
      उसकी जगह autorun.inf से drive icon को emoji में बदलना बेहतर है, और label में भी emoji डाला जा सकता है
    • computer name में emoji इस्तेमाल किए जा सकते हैं
  • Win9x दौर में ALT + 255 trick से Explorer से access न होने वाला folder बनाया जा सकता था

  • Xbox 360 development environment में drive letters string form में थे
    उदाहरण: Game:\foo, Hdd0:\foo

    • हाँ, यह वास्तव में मौजूद था
      Xenia emulator इसे symbolic link based virtual file system के रूप में handle करता है
      Xenia code उदाहरण
  • Linux में इसी तरह की एक अवधारणा Abstract Domain Socket है
    यह ऐसा Unix domain socket है जिसका पहला अक्षर NUL(\0) होता है, और यह permission constraints को bypass कर सकता है
    game server में प्रत्येक player के resources को अलग रखते हुए भी communication बनाए रखने के लिए इसका उपयोग किया जा रहा है

    • /proc/net/unix में ऐसे socket को खोजा भी जा सकता है
  • ऐसी सुविधाएँ malware बनाने के लिए अच्छा माहौल लगती हैं
    hidden mount या अजीब drive names से system को confuse किया जा सकता है

    • लेकिन व्यवहार में NT path को किसी वास्तविक volume से map होना पड़ता है, इसलिए इसे पूरी तरह छिपाना कठिन है
    • Alternate Data Streams के बारे में जानेंगे तो और चौंकेंगे
    • drive में हेरफेर करने के लिए administrator privileges चाहिए
  • जब कई disk images mount करनी हों, तो drive letters बहुत उलझाऊ हो जाते हैं
    उदाहरण के लिए 36 DVD ISO mount कर दिए जाएँ तो command-line quoting hell का अनुभव होता है

  • पुराने DOS में, शायद 3.3 version में, Z के बाद अगला drive letter AA होता था
    यह बात कई छोटे RAM drives बनाकर जांची गई थी

    • याद है कि Netware में भी Z से आगे drive mapping संभव थी