Huruf drive Windows tidak terbatas pada A-Z
(ryanliptak.com)- Di Windows, simbol atau karakter non-ASCII selain A~Z juga bisa digunakan sebagai huruf drive
- Secara internal, path Win32 (
C:\foo) diproses setelah diubah menjadi path namespace NT (\??\C:\foo) - Struktur ini dikelola oleh Object Manager, dan huruf drive seperti
C:hanya ada sebagai objek symbolic link biasa - Dengan perintah
subst, kita bisa membuat huruf drive nonstandar seperti+:atau€:, tetapi Explorer dan PowerShell tidak dapat mengenalinya - Perilaku ini menjadi petunjuk penting untuk memahami struktur internal pemrosesan path Windows dan cara encoding-nya (WTF-16, dll.)
Struktur internal huruf drive
- Path biasa Windows (
C:\foo) adalah path namespace Win32, dan saat API dipanggil akan diubah menjadi path namespace NT- Contoh: saat memanggil
CreateFileW("C:\foo"), secara internal diubah menjadiNtCreateFile("\??\C:\foo")
- Contoh: saat memanggil
\??adalah folder virtual milik Object Manager, berupa gabungan\GLOBAL??dan folderDosDevicesper pengguna- Objek
C:ada sebagai symbolic link di dalam\GLOBAL??, dan terhubung ke path perangkat nyata\Device\HarddiskVolume4 - Karena itu,
C:bukan karakter khusus yang dicadangkan, melainkan diperlakukan sebagai nama symbolic link biasa
Definisi huruf drive
- Huruf drive adalah hasil dari proses konversi path Win32 menjadi path NT
- Fungsi konversi
RtlDosPathNameToNtPathName_UmengubahC:\foomenjadi\??\C:\foo
- Fungsi konversi
- Fungsi ini juga menangani karakter nonstandar seperti
+:dengan cara yang sama, jadi jika objek+:ada, path+:\juga akan berfungsi normal - Objek
+:yang dibuat dengan perintahsubst +: C:\foodisimpan di folderDosDevicesper pengguna
Perilaku huruf drive nonstandar
- Explorer.exe hanya memindai rentang A~Z, jadi drive
+:tidak akan ditampilkan - PowerShell juga tidak bisa mengenali drive non-ASCII dan akan mengembalikan error
- Namun di cmd.exe, drive seperti
+:atau€:berfungsi normal
Huruf drive non-ASCII dan Unicode
- Dengan perintah
subst €: C:\foo, kita bisa membuat drive dengan simbol euro (€)- Bekerja tanpa membedakan huruf besar/kecil (
Λ:danλ:dikenali sama)
- Bekerja tanpa membedakan huruf besar/kecil (
- Huruf drive dibatasi pada satu unit kode WTF-16 tunggal (U+FFFF ke bawah)
- Karakter seperti
𤭢:yang melampaui U+FFFF akan memicu error disubst - Jika
MountPointManagerdipanggil langsung, pembuatan memang bisa berhasil, tetapi tidak bisa diakses karena konversi path Win32 gagal
- Karakter seperti
- Ini menunjukkan bahwa Windows tidak sepenuhnya mendukung pasangan surrogate UTF-16
Masalah penentuan path dan encoding
- Implementasi penanganan path di tiap bahasa bisa berbeda dari
RtlDosPathNameToNtPathName_U- Contoh: Rust hanya mengenali
A-Zsebagai path absolut (C:\= true,+:\= false)
- Contoh: Rust hanya mengenali
- Bergantung pada cara encoding (WTF-8 vs WTF-16), indeks seperti
path[0],path[1], dan seterusnya bisa berbeda, sehingga hasil penentuan path absolut juga bisa berbeda - Standard library Zig mempertimbangkan perbedaan ini dan diimplementasikan agar mengenali hingga rentang
<= U+FFFF
Bug penanganan non-ASCII di SetVolumeMountPointW
- Saat memanggil
SetVolumeMountPointW("€:\", volume), pemanggilan berhasil, tetapi link yang benar-benar dibuat muncul sebagai¬: - Hal ini diduga karena
0x20AC(€) terpotong dan disimpan sebagai0xAC - Ini adalah contoh yang menunjukkan keterbatasan API dalam menangani huruf drive non-ASCII
Kesimpulan
- Secara internal, Windows tidak membatasi huruf drive pada A~Z
- Pembatasan muncul karena perbedaan implementasi pada alat level lebih tinggi seperti Explorer dan PowerShell
- Dengan memahami struktur konversi antara namespace Win32 dan NT, pemrosesan encoding, serta cara kerja Object Manager, kita bisa memahami mekanisme internal sistem file Windows dengan lebih dalam
1 komentar
Komentar Hacker News
Path NT adalah cara Object Manager mereferensikan resource
Misalnya
HKEY_LOCAL_MACHINEadalah alias dari\\Registry\\MachineNT mirip Unix karena menggunakan namespace VFS global
Path yang diawali huruf drive adalah “DOSPath” untuk kompatibilitas DOS, dan beberapa subsistem masih memakainya bahkan di mode kernel
Di PowerShell, berbagai resource dapat diekspos sebagai “drive”, dan selain drive bawaan seperti
hklm:\, Anda juga bisa membuat drive kustomDokumentasi terkait: sampel pengelolaan PowerShell Drive
Di Linux/Bash, sertifikat tidak bisa diakses sebagai path file, tetapi di PowerShell/Windows hal itu memungkinkan
Disarankan memasang modul PowerShell NtObjectManager lalu menjelajah dengan
ls NtObject:\tautan modul
dokumentasi Connect-PnPOnline
/usr/share/ca-certificatesatau/etc/ssl/certsHanya saja tidak seintegrasi Windows Registry
Itu juga berjalan di Windows
contoh ReactOS NT Object Browser
Anda dapat langsung melihat file PEM di bawah
/etc/ca-certificates/extracted/cadirWindows bisa mengakses partisi tanpa huruf drive
Seperti Linux, partisi bisa di-mount di bawah direktori, dan dapat diatur dengan perintah PowerShell
Add-PartitionAccessPathTetap bertahan setelah reboot
Installer menolak kartu SD, tetapi bisa dikelabui dengan NTFS mount point
Namun beberapa installer memeriksa ruang kosong pada disk induk sehingga jadi bingung
Untuk mount permanen, symbolic link lebih berguna
Disk VM dengan kebijakan performa berbeda bisa digabung ke dalam satu path
Saat membuat partisi di GUI, Anda dapat memilih “mount ke path” alih-alih “tetapkan huruf drive”
Huruf drive seperti
€:\adalah contoh yang terkutuk tapi kerenKernel NT jauh lebih fleksibel daripada yang terlihat oleh pengguna
Di dalamnya tersembunyi struktur kompleks berbasis pemetaan GUID
Misalnya, jika membuat shortcut bernama
{GUID}, itu kadang tersambung ke fungsi tersembunyiStruktur seperti ini juga membuat Windows bisa menjadi sarang malware
File Explorer tidak mengenali huruf drive selain A~Z
Karena itu mimpi untuk mengganti semua huruf drive menjadi emoji tidak mungkin terwujud
Namun lebih baik mengganti ikon drive menjadi emoji lewat
autorun.inf, dan labelnya juga bisa diberi emojiDi era Win9x, trik
ALT + 255bisa dipakai untuk membuat folder yang tidak bisa diakses dari ExplorerDi lingkungan pengembangan Xbox 360, huruf drive berbentuk string
Contoh:
Game:\foo,Hdd0:\fooEmulator Xenia menanganinya sebagai virtual file system berbasis symbolic link
contoh kode Xenia
Di Linux ada konsep serupa berupa Abstract Domain Socket
Ini adalah Unix domain socket yang karakter pertamanya NUL(
\0), sehingga bisa melewati batasan izinIni dipakai di game server untuk memisahkan resource tiap pemain sambil tetap menjaga komunikasi
/proc/net/unixFitur seperti ini terdengar seperti lingkungan yang cocok untuk membuat malware
Sepertinya sistem bisa dikacaukan dengan mount tersembunyi atau nama drive aneh
Jika harus me-mount banyak image disk, huruf drive jadi sangat membingungkan
Misalnya, jika me-mount 36 ISO DVD, Anda akan mengalami neraka tanda kutip command line
Di DOS lama (mungkin versi 3.3), huruf drive setelah Z adalah AA
Saya pernah memastikannya dengan membuat beberapa RAM drive kecil