Bagikan melalui


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
0
Utas berjalan segera setelah pembuatan.
CREATE_SUSPENDED
0x00000004
Utas dibuat dalam status ditangguhkan, dan tidak berjalan hingga fungsi ResumeThread dipanggil.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
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.
Penggunaan umum fungsi ini adalah menyuntikkan utas ke dalam proses yang sedang di-debug untuk mengeluarkan jeda. Namun, penggunaan ini tidak disarankan, karena utas tambahan membingungkan orang yang men-debug aplikasi dan ada beberapa efek samping untuk menggunakan teknik ini:
  • 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.
Penggunaan umum lain dari fungsi ini adalah menyuntikkan utas ke dalam proses untuk meminta tumpukan atau informasi proses lainnya. Hal ini dapat menyebabkan efek samping yang sama seperti yang disebutkan pada paragraf sebelumnya. Selain itu, aplikasi dapat kebuntuan jika utas mencoba mendapatkan kepemilikan kunci yang digunakan utas lain.

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

CloseHandle

CreateProcess

CreateRemoteThreadEx

CreateThread

ExitProcess

ExitThread

GetThreadPriority

Fungsi Proses dan Utas

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

ThreadProc

Threads