2 poin oleh GN⁺ 2025-12-01 | Belum ada komentar. | Bagikan ke WhatsApp
  • 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 menjadi NtCreateFile("\??\C:\foo")
  • \?? adalah folder virtual milik Object Manager, berupa gabungan \GLOBAL?? dan folder DosDevices per 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_U mengubah C:\foo menjadi \??\C:\foo
  • Fungsi ini juga menangani karakter nonstandar seperti +: dengan cara yang sama, jadi jika objek +: ada, path +:\ juga akan berfungsi normal
  • Objek +: yang dibuat dengan perintah subst +: C:\foo disimpan di folder DosDevices per 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)
  • Huruf drive dibatasi pada satu unit kode WTF-16 tunggal (U+FFFF ke bawah)
    • Karakter seperti 𤭢: yang melampaui U+FFFF akan memicu error di subst
    • Jika MountPointManager dipanggil langsung, pembuatan memang bisa berhasil, tetapi tidak bisa diakses karena konversi path Win32 gagal
  • 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-Z sebagai path absolut (C:\ = true, +:\ = false)
  • 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 sebagai 0xAC
  • 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

Belum ada komentar.

Belum ada komentar.