- 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 टिप्पणियां
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
Connect-PnPOnline दस्तावेज़
/usr/share/ca-certificatesया/etc/ssl/certsके माध्यम से certificates को file के रूप में access किया जा सकता हैहालांकि यह Windows Registry जितना integrated नहीं है
यह Windows पर भी काम करता है
ReactOS NT Object Browser उदाहरण
/etc/ca-certificates/extracted/cadirके नीचे PEM files को सीधे देखा जा सकता हैWindows में partition को drive letter के बिना भी access किया जा सकता है
Linux की तरह इसे किसी directory के नीचे mount किया जा सकता है, और PowerShell के
Add-PartitionAccessPathcommand से इसे set किया जा सकता हैreboot के बाद भी यह बना रहता है
installer SD card को reject करता है, लेकिन NTFS mount point का उपयोग करके उसे trick किया जा सकता है
हालांकि कुछ installers parent disk की free space जांचते हैं, जिससे वे confuse हो जाते हैं
permanent mount के लिए symbolic link अधिक उपयोगी है
अलग-अलग performance policy वाली VM disks को एक ही path में जोड़ा जा सकता है
GUI में partition बनाते समय “assign drive letter” की जगह “mount as path” चुना जा सकता है
“€:\” जैसा drive letter शापित लेकिन शानदार उदाहरण है
NT kernel, user को दिखने वाली चीज़ों से कहीं अधिक flexible है
अंदर GUID mapping पर आधारित एक जटिल संरचना छिपी है
उदाहरण के लिए
{GUID}नाम का shortcut बनाने पर वह किसी hidden feature से जुड़ सकता हैइसी तरह की संरचना की वजह से Windows, malware का अड्डा भी बन जाता है
File Explorer, A~Z के अलावा किसी और drive letter को पहचानता नहीं है
इसलिए सभी drive letters को emoji में बदलने का सपना संभव नहीं है
उसकी जगह
autorun.infसे drive icon को emoji में बदलना बेहतर है, और label में भी emoji डाला जा सकता हैWin9x दौर में
ALT + 255trick से Explorer से access न होने वाला folder बनाया जा सकता थाXbox 360 development environment में drive letters string form में थे
उदाहरण:
Game:\foo,Hdd0:\fooXenia 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 किया जा सकता है
जब कई disk images mount करनी हों, तो drive letters बहुत उलझाऊ हो जाते हैं
उदाहरण के लिए 36 DVD ISO mount कर दिए जाएँ तो command-line quoting hell का अनुभव होता है
पुराने DOS में, शायद 3.3 version में, Z के बाद अगला drive letter AA होता था
यह बात कई छोटे RAM drives बनाकर जांची गई थी