Urutan pencarian pustaka tautan dinamis

Umum untuk beberapa versi pustaka tautan dinamis (DLL) yang sama untuk ada di lokasi sistem file yang berbeda dalam sistem operasi (OS). Anda dapat mengontrol lokasi tertentu tempat DLL tertentu dimuat dengan menentukan jalur lengkap. Tetapi jika Anda tidak menggunakan metode itu, maka sistem mencari DLL pada waktu pemuatan seperti yang dijelaskan dalam topik ini. Loader DLL adalah bagian dari sistem operasi (OS) yang memuat DLL dan/atau menyelesaikan referensi ke DLL.

Tip

Untuk definisi aplikasi yang dikemas dan tidak dikemas, lihat Keuntungan dan kekurangan pengemasan aplikasi Anda.

Faktor-faktor yang memengaruhi pencarian

Berikut adalah beberapa faktor pencarian khusus yang dibahas dalam topik ini—Anda dapat menganggapnya sebagai bagian dari urutan pencarian DLL. Bagian selanjutnya dalam topik ini mencantumkan faktor-faktor ini dalam urutan pencarian yang sesuai untuk jenis aplikasi tertentu, bersama dengan lokasi pencarian lainnya. Bagian ini hanya untuk memperkenalkan konsep, dan memberi mereka nama yang akan kita gunakan untuk merujuknya nanti dalam topik.

  • Pengalihan DLL. Untuk detailnya, lihat Pengalihan pustaka tautan dinamis.
  • Set API. Untuk detailnya, lihat Set WINDOWS API.
  • Pengalihan manifes berdampingan (SxS) —hanya aplikasi desktop (bukan aplikasi UWP). Anda dapat mengalihkan dengan menggunakan manifes aplikasi (juga dikenal sebagai manifes aplikasi berdampingan, atau manifes fusi). Untuk detailnya, lihat Manifes.
  • Daftar modul yang dimuat. Sistem dapat memeriksa untuk melihat apakah DLL dengan nama modul yang sama sudah dimuat ke dalam memori (tidak peduli folder mana asalnya dimuat).
  • DLL yang diketahui. Jika DLL ada dalam daftar DLL yang diketahui untuk versi Windows tempat aplikasi berjalan, maka sistem menggunakan salinan DLL yang diketahui (dan DLL dependen DLL yang diketahui, jika ada). Untuk daftar DLL yang diketahui pada sistem saat ini, lihat kunci HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsregistri .

Jika DLL memiliki dependensi, maka sistem mencari DLL dependen seolah-olah dimuat hanya dengan menggunakan nama modul mereka. Itu benar bahkan jika DLL pertama dimuat dengan menentukan jalur lengkap.

Pesanan pencarian untuk aplikasi kemasan

Saat aplikasi paket memuat modul yang dikemas (khususnya, modul pustaka— .dll file) dengan memanggil fungsi LoadPackagedLibrary , DLL harus berada dalam grafik dependensi paket proses. Untuk informasi selengkapnya, lihat LoadPackagedLibrary. Saat aplikasi paket memuat modul dengan cara lain, dan tidak menentukan jalur lengkap, sistem mencari DLL dan dependensinya pada waktu pemuatan seperti yang dijelaskan di bagian ini.

Ketika sistem mencari modul atau dependensinya, sistem selalu menggunakan urutan pencarian untuk aplikasi paket; bahkan jika dependensi bukan kode aplikasi yang dipaketkan.

Urutan pencarian standar untuk aplikasi paket

Sistem mencari dalam urutan ini:

  1. Pengalihan DLL.
  2. Set API.
  3. Hanya aplikasi desktop (bukan aplikasi UWP). Pengalihan manifes SxS.
  4. Daftar modul yang dimuat.
  5. DLL yang diketahui.
  6. Grafik dependensi paket proses. Ini adalah paket aplikasi ditambah dependensi apa pun yang ditentukan seperti <PackageDependency> di bagian <Dependencies> manifes paket aplikasi. Dependensi dicari dalam urutan muncul dalam manifes.
  7. Folder tempat proses panggilan dimuat dari (folder yang dapat dieksekusi).
  8. Folder sistem (%SystemRoot%\system32).

Jika DLL memiliki dependensi, maka sistem mencari DLL dependen seolah-olah dimuat hanya dengan nama modul mereka (bahkan jika DLL pertama dimuat dengan menentukan jalur lengkap).

Urutan pencarian alternatif untuk aplikasi paket

Jika modul mengubah urutan pencarian standar dengan memanggil fungsi LoadLibraryEx dengan LOAD_WITH_ALTERED_SEARCH_PATH, maka urutan pencarian sama dengan urutan pencarian standar kecuali bahwa pada langkah 7 sistem mencari folder tempat modul yang ditentukan dimuat (folder modul pemuatan teratas) alih-alih folder yang dapat dieksekusi.

Pesanan pencarian untuk aplikasi yang tidak dikemas

Saat aplikasi yang tidak dikemas memuat modul dan tidak menentukan jalur lengkap, sistem mencari DLL pada waktu pemuatan seperti yang dijelaskan di bagian ini.

Penting

Jika penyerang mendapatkan kontrol atas salah satu direktori yang dicari, maka penyerang dapat menempatkan salinan BERBAHAYA DLL di folder tersebut. Untuk cara membantu mencegah serangan tersebut, lihat Keamanan pustaka tautan dinamis.

Urutan pencarian standar untuk aplikasi yang tidak dikemas

Urutan pencarian DLL standar yang digunakan oleh sistem bergantung pada apakah mode pencarian DLL aman diaktifkan atau tidak.

Mode pencarian DLL aman (yang diaktifkan secara default) memindahkan folder pengguna saat ini nanti dalam urutan pencarian. Untuk menonaktifkan mode pencarian DLL aman, buat HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode nilai registri, dan atur ke 0. Memanggil fungsi SetDllDirectory secara efektif menonaktifkan mode pencarian DLL aman (saat folder yang ditentukan berada di jalur pencarian), dan mengubah urutan pencarian seperti yang dijelaskan dalam topik ini.

Jika mode pencarian DLL aman diaktifkan, maka urutan pencarian adalah sebagai berikut:

  1. Pengalihan DLL.
  2. API sets.
  3. SxS manifest redirection.
  4. Loaded-module list.
  5. Known DLLs.
  6. Windows 11, versi 21H2 (10.0; Bangun 22000), dan yang lebih baru. The package dependency graph of the process. This is the application's package plus any dependencies specified as <PackageDependency> in the <Dependencies> section of the application's package manifest. Dependencies are searched in the order they appear in the manifest.
  7. Folder tempat aplikasi dimuat.
  8. Folder sistem. Gunakan fungsi GetSystemDirectory untuk mengambil jalur folder ini.
  9. Folder sistem 16-bit. Tidak ada fungsi yang mendapatkan jalur folder ini, tetapi dicari.
  10. Folder Windows. Gunakan fungsi GetWindowsDirectory untuk mendapatkan jalur folder ini.
  11. Folder saat ini.
  12. Direktori yang tercantum dalam PATH variabel lingkungan. Ini tidak termasuk jalur per aplikasi yang ditentukan oleh kunci registri Jalur Aplikasi . Kunci Jalur Aplikasi tidak digunakan saat menghitung jalur pencarian DLL.

Jika mode pencarian DLL aman dinonaktifkan, maka urutan pencarian sama kecuali bahwa folder saat ini berpindah dari posisi 11 ke posisi 8 dalam urutan (segera setelah langkah 7. Folder tempat aplikasi dimuat).

Urutan pencarian alternatif untuk aplikasi yang tidak dikemas

Untuk mengubah urutan pencarian standar yang digunakan oleh sistem, Anda dapat memanggil fungsi LoadLibraryEx dengan LOAD_WITH_ALTERED_SEARCH_PATH. Anda juga dapat mengubah urutan pencarian standar dengan memanggil fungsi SetDllDirectory .

Catatan

Urutan pencarian standar proses juga akan terpengaruh dengan memanggil fungsi SetDllDirectory dalam proses induk sebelum dimulainya proses saat ini.

Jika Anda menentukan strategi pencarian alternatif, maka perilakunya berlanjut hingga semua modul yang dapat dieksekusi terkait telah ditemukan. Setelah sistem mulai memproses rutinitas inisialisasi DLL, sistem kembali ke strategi pencarian standar.

Fungsi LoadLibraryEx mendukung urutan pencarian alternatif jika panggilan menentukan LOAD_WITH_ALTERED_SEARCH_PATH, dan parameter lpFileName menentukan jalur absolut.

  • Strategi pencarian standar dimulai (setelah langkah-langkah awal) di folder aplikasi panggilan.
  • Strategi pencarian alternatif yang ditentukan oleh LoadLibraryEx dengan LOAD_WITH_ALTERED_SEARCH_PATH dimulai (setelah langkah-langkah awal) di folder modul yang dapat dieksekusi yang dimuat LoadLibraryEx .

Itulah satu-satunya cara di mana mereka berbeda.

Jika mode pencarian DLL aman diaktifkan, maka urutan pencarian alternatif adalah sebagai berikut:

Langkah 1-6 sama dengan urutan pencarian standar.

  1. Folder yang ditentukan oleh lpFileName.
  2. The system folder. Use the GetSystemDirectory function to retrieve the path of this folder.
  3. The 16-bit system folder. There's no function that obtains the path of this folder, but it is searched.
  4. The Windows folder. Gunakan fungsi GetWindowsDirectory untuk mendapatkan jalur folder ini.
  5. Folder saat ini.
  6. Direktori yang tercantum dalam PATH variabel lingkungan. Ini tidak termasuk jalur per aplikasi yang ditentukan oleh kunci registri Jalur Aplikasi . Kunci Jalur Aplikasi tidak digunakan saat menghitung jalur pencarian DLL.

Jika mode pencarian DLL aman dinonaktifkan, maka urutan pencarian alternatif sama kecuali bahwa folder saat ini berpindah dari posisi 11 ke posisi 8 dalam urutan (segera setelah langkah 7. Folder yang ditentukan oleh lpFileName).

Fungsi SetDllDirectory mendukung urutan pencarian alternatif jika parameter lpPathName menentukan jalur. Urutan pencarian alternatif adalah sebagai berikut:

Langkah 1-6 sama dengan urutan pencarian standar.

  1. Folder tempat aplikasi dimuat.
  2. Folder yang ditentukan oleh parameter lpPathName dari SetDllDirectory.
  3. Folder sistem.
  4. Folder sistem 16-bit.
  5. Folder Windows.
  6. Direktori yang tercantum dalam PATH variabel lingkungan.

Jika parameter lpPathName adalah string kosong, maka panggilan akan menghapus folder saat ini dari urutan pencarian.

SetDllDirectory secara efektif menonaktifkan mode pencarian DLL aman saat folder yang ditentukan berada di jalur pencarian. Untuk memulihkan mode pencarian DLL aman berdasarkan nilai registri SafeDllSearchMode , dan memulihkan folder saat ini ke urutan pencarian, panggil SetDllDirectory dengan lpPathName sebagai NULL.

Urutan pencarian menggunakan bendera LOAD_LIBRARY_SEARCH

Anda dapat menentukan urutan pencarian dengan menggunakan satu atau beberapa bendera LOAD_LIBRARY_SEARCH dengan fungsi LoadLibraryEx . Anda juga dapat menggunakan bendera LOAD_LIBRARY_SEARCH dengan fungsi SetDefaultDllDirectories untuk membuat urutan pencarian DLL untuk proses. Anda dapat menentukan direktori tambahan untuk urutan pencarian DLL proses dengan menggunakan fungsi AddDllDirectory atau SetDllDirectory .

Direktori yang dicari bergantung pada bendera yang ditentukan dengan SetDefaultDllDirectories atau LoadLibraryEx. Jika Anda menggunakan lebih dari satu bendera, maka direktori yang sesuai akan dicari dalam urutan ini:

  1. LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR. Folder yang berisi DLL dicari. Folder ini hanya dicari untuk dependensi DLL yang akan dimuat.
  2. LOAD_LIBRARY_SEARCH_APPLICATION_DIR. Folder aplikasi dicari.
  3. LOAD_LIBRARY_SEARCH_USER_DIRS. Jalur secara eksplisit ditambahkan dengan fungsi AddDllDirectory atau fungsi SetDllDirectory dicari. Jika Anda menambahkan lebih dari satu jalur, maka urutan di mana jalur dicari tidak ditentukan.
  4. LOAD_LIBRARY_SEARCH_SYSTEM32. Folder Sistem dicari.

Jika Anda memanggil LoadLibraryEx tanpa bendera LOAD_LIBRARY_SEARCH , atau Anda membuat urutan pencarian DLL untuk proses tersebut, maka sistem mencari DLL menggunakan urutan pencarian standar atau urutan pencarian alternatif.