Bagikan melalui


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. DLL loader adalah bagian dari sistem operasi (OS) yang memuat DLL dan/atau menyelesaikan referensi ke DLL.

Ujung

Untuk definisi paket dan aplikasi yang tidak dikemas, lihat Keuntungan dan kekurangan kemasan 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 untuk memberi mereka nama yang akan kita gunakan untuk merujuknya nanti dalam topik.

  • pengalihan DLL. Untuk detailnya, lihat pengalihan pustaka Dynamic-link.
  • 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 registri HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs.

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—file .dll) dengan memanggil fungsiLoadPackagedLibrary, 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 kemasan

Sistem mencari dalam urutan ini:

  1. Pengalihan DLL.
  2. Set API.
  3. aplikasi Desktop saja (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 sebagai <PackageDependency> di bagian <Dependencies> manifes paket aplikasi. Dependensi dicari dalam urutan muncul dalam manifes.
  7. Folder tempat proses panggilan dimuat (folder yang dapat dieksekusi).
  8. Folder sistem (%SystemRoot%\system32).

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

Urutan pencarian alternatif untuk aplikasi kemasan

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 di langkah 7 sistem mencari folder tempat modul yang ditentukan dimuat dari (folder modul pemuatan teratas) alih-alih folder yang dapat dieksekusi.

Pesanan pencarian untuk aplikasi yang tidak dikemas

Saat aplikasi yang tidak dipaket 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 DLL berbahaya di folder tersebut. Untuk cara membantu mencegah serangan tersebut, lihat keamanan pustaka Dynamic-link.

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 nilai registri HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode, 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. Set API.
  3. Pengalihan manifes SxS.
  4. Daftar modul yang dimuat.
  5. DLL yang diketahui.
  6. Windows 11, versi 21H2 (10.0; Bangun 22000), dan yang lebih baru. Grafik dependensi paket proses. Ini adalah paket aplikasi ditambah dependensi apa pun yang ditentukan sebagai <PackageDependency> di bagian <Dependencies> manifes paket aplikasi. Dependensi dicari dalam urutan muncul dalam manifes.
  7. Folder tempat aplikasi dimuat.
  8. Folder sistem. Gunakan fungsiGetSystemDirectory untuk mengambil jalur folder ini.
  9. Folder sistem 16-bit. Tidak ada fungsi yang mendapatkan jalur folder ini, tetapi dicari.
  10. Folder Windows. Gunakan fungsiGetWindowsDirectory untuk mendapatkan jalur folder ini.
  11. Folder saat ini.
  12. Direktori yang tercantum dalam variabel lingkungan PATH. 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 fungsiLoadLibraryEx dengan LOAD_WITH_ALTERED_SEARCH_PATH. Anda juga dapat mengubah urutan pencarian standar dengan memanggil fungsiSetDllDirectory.

Nota

Urutan pencarian standar proses juga akan terpengaruh dengan memanggil fungsisetDllDirectorydalam 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.

FungsiLoadLibraryEx 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 loadLibraryEx dimuat.

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. Folder sistem. Gunakan fungsiGetSystemDirectory untuk mengambil jalur folder ini.
  3. Folder sistem 16-bit. Tidak ada fungsi yang mendapatkan jalur folder ini, tetapi dicari.
  4. Folder Windows. Gunakan fungsiGetWindowsDirectory untuk mendapatkan jalur folder ini.
  5. Folder saat ini.
  6. Direktori yang tercantum dalam variabel lingkungan PATH. 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 folder saat ini berpindah dari posisi 11 ke posisi 8 dalam urutan (segera setelah langkah 7. Folder yang ditentukan oleh lpFileName).

FungsiSetDllDirectory 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 variabel lingkungan PATH.

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 pulihkan 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 fungsiSetDefaultDllDirectories untuk membuat urutan pencarian DLL untuk proses. Anda dapat menentukan direktori tambahan untuk urutan pencarian DLL proses dengan menggunakan fungsiAddDllDirectory atauSetDllDirectory.

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 yang secara eksplisit ditambahkan dengan fungsiAddDllDirectory 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.