Fungsi CreateRemoteThread (processthreadsapi.h)
Membuat utas yang berjalan di ruang alamat virtual proses lain.
Gunakan fungsi CreateRemoteThreadEx untuk membuat utas yang berjalan di ruang alamat virtual proses lain dan secara opsional menentukan atribut yang diperluas.
Sintaks
HANDLE CreateRemoteThread(
[in] HANDLE hProcess,
[in] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in] LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out] LPDWORD lpThreadId
);
Parameter
[in] hProcess
Handel ke proses di mana utas akan dibuat. Handel harus memiliki hak akses PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE, dan PROCESS_VM_READ , dan mungkin gagal tanpa hak ini pada platform tertentu. Untuk informasi selengkapnya, lihat Keamanan Proses dan Hak Akses.
[in] lpThreadAttributes
Penunjuk ke struktur SECURITY_ATTRIBUTES yang menentukan pendeskripsi keamanan untuk utas baru dan menentukan apakah proses anak dapat mewarisi handel yang dikembalikan. Jika lpThreadAttributes adalah NULL, utas mendapatkan deskriptor keamanan default dan handel tidak dapat diwariskan. Daftar kontrol akses (ACL) di deskriptor keamanan default untuk utas berasal dari token utama pembuat.
Windows XP: ACL dalam deskriptor keamanan default untuk utas berasal dari token utama atau peniruan dari pembuat. Perilaku ini berubah dengan Windows XP dengan SP2 dan Windows Server 2003.
[in] dwStackSize
Ukuran awal tumpukan, dalam byte. Sistem membulatkan nilai ini ke halaman terdekat. Jika parameter ini adalah 0 (nol), utas baru menggunakan ukuran default untuk yang dapat dieksekusi. Untuk informasi selengkapnya, lihat Ukuran Tumpukan Utas.
[in] lpStartAddress
Penunjuk ke fungsi jenis yang ditentukan aplikasi LPTHREAD_START_ROUTINE untuk dijalankan oleh utas dan mewakili alamat awal utas dalam proses jarak jauh. Fungsi harus ada dalam proses jarak jauh. Untuk informasi selengkapnya, lihat ThreadProc.
[in] lpParameter
Penunjuk ke variabel yang akan diteruskan ke fungsi utas.
[in] dwCreationFlags
Bendera yang mengontrol pembuatan utas.
Nilai | Makna |
---|---|
|
Utas berjalan segera setelah pembuatan. |
|
Utas dibuat dalam status ditangguhkan, dan tidak berjalan hingga fungsi ResumeThread dipanggil. |
|
Parameter dwStackSize menentukan ukuran cadangan awal tumpukan. Jika bendera ini tidak ditentukan, dwStackSize menentukan ukuran penerapan. |
[out] lpThreadId
Penunjuk ke variabel yang menerima pengidentifikasi utas.
Jika parameter ini NULL, pengidentifikasi utas tidak dikembalikan.
Nilai kembali
Jika fungsi berhasil, nilai yang dikembalikan adalah handel ke utas baru.
Jika fungsi gagal, nilai yang dikembalikan adalah NULL. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.
Perhatikan bahwa CreateRemoteThread dapat berhasil meskipun lpStartAddress menunjuk ke data, kode, atau tidak dapat diakses. Jika alamat awal tidak valid saat utas berjalan, pengecualian terjadi, dan utas berakhir. Penghentian utas karena alamat mulai yang tidak valid ditangani sebagai keluarnya kesalahan untuk proses utas. Perilaku ini mirip dengan sifat asinkron CreateProcess, di mana proses dibuat bahkan jika mengacu pada pustaka tautan dinamis (DLL) yang tidak valid atau hilang.
Keterangan
Fungsi CreateRemoteThread menyebabkan utas eksekusi baru dimulai di ruang alamat proses yang ditentukan. Utas memiliki akses ke semua objek yang dibuka prosesnya.
Sebelum Windows 8, Layanan Terminal mengisolasi setiap sesi terminal berdasarkan desain. Oleh karena itu, CreateRemoteThread gagal jika proses target berada dalam sesi yang berbeda dari proses panggilan.
Handel utas baru dibuat dengan akses penuh ke utas baru. Jika deskriptor keamanan tidak disediakan, handel dapat digunakan dalam fungsi apa pun yang memerlukan handel objek utas. Ketika pendeskripsi keamanan disediakan, pemeriksaan akses dilakukan pada semua penggunaan handel berikutnya sebelum akses diberikan. Jika pemeriksaan akses menolak akses, proses yang meminta tidak dapat menggunakan handel untuk mendapatkan akses ke utas.
Jika utas dibuat dalam status dapat dijalankan (yaitu, jika bendera CREATE_SUSPENDED tidak digunakan), utas dapat mulai berjalan sebelum CreateThread mengembalikan dan, khususnya, sebelum pemanggil menerima handel dan pengidentifikasi utas yang dibuat.
Utas dibuat dengan prioritas utas THREAD_PRIORITY_NORMAL. Gunakan fungsi GetThreadPriority dan SetThreadPriority untuk mendapatkan dan mengatur nilai prioritas utas.
Ketika utas berakhir, objek utas mencapai status bersinyalis, yang memenuhi utas yang menunggu objek.
Objek utas tetap berada dalam sistem sampai utas dihentikan dan semua handel ke dalamnya ditutup melalui panggilan ke CloseHandle.
Fungsi ExitProcess, ExitThread, CreateThread, CreateRemoteThread , dan proses yang dimulai (sebagai hasil dari panggilan CreateProcess ) diserialisasikan antara satu sama lain dalam proses. Hanya salah satu peristiwa ini yang terjadi di ruang alamat pada satu waktu. Ini berarti pembatasan berikut berlaku:
- Selama rutinitas startup proses dan inisialisasi DLL, utas baru dapat dibuat, tetapi tidak memulai eksekusi sampai inisialisasi DLL dilakukan untuk proses tersebut.
- Hanya satu utas dalam proses yang dapat berada dalam inisialisasi DLL atau melepaskan rutinitas pada satu waktu.
- ExitProcess kembali setelah semua utas menyelesaikan inisialisasi DLL atau melepaskan rutinitas.
- Ini mengonversi aplikasi utas tunggal menjadi aplikasi multithreaded.
- Ini mengubah pengaturan waktu dan tata letak memori proses.
- Ini menghasilkan panggilan ke titik masuk setiap DLL dalam proses.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows XP [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2003 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | processthreadsapi.h (termasuk Windows.h pada Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
Pustaka | Kernel32.lib |
DLL | Kernel32.dll |
Lihat juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk