Bagikan melalui


Fungsi CreateRemoteThreadEx (processthreadsapi.h)

Membuat utas yang berjalan di ruang alamat virtual proses lain dan secara opsional menentukan atribut yang diperluas seperti afinitas grup prosesor.

Sintaks

HANDLE CreateRemoteThreadEx(
  [in]            HANDLE                       hProcess,
  [in, optional]  LPSECURITY_ATTRIBUTES        lpThreadAttributes,
  [in]            SIZE_T                       dwStackSize,
  [in]            LPTHREAD_START_ROUTINE       lpStartAddress,
  [in, optional]  LPVOID                       lpParameter,
  [in]            DWORD                        dwCreationFlags,
  [in, optional]  LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
  [out, optional] 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. Dalam Windows 10, versi 1607, kode Anda harus mendapatkan hak akses ini untuk handel baru. Namun, mulai dari Windows 10, versi 1703, jika handel baru berhak atas hak akses ini, sistem mendapatkannya untuk Anda. Untuk informasi selengkapnya, lihat Keamanan Proses dan Hak Akses.

[in, optional] lpThreadAttributes

Penunjuk ke struktur SECURITY_ATTRIBUTES yang menentukan deskriptor 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.

[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, optional] lpParameter

Penunjuk ke variabel yang akan diteruskan ke fungsi utas yang ditunjukkan oleh lpStartAddress. Parameter ini bisa NULL.

[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.

[in, optional] lpAttributeList

Daftar atribut yang berisi parameter tambahan untuk utas baru. Daftar ini dibuat oleh fungsi InitializeProcThreadAttributeList .

[out, optional] 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.

Keterangan

Fungsi CreateRemoteThreadEx menyebabkan utas eksekusi baru dimulai di ruang alamat proses yang ditentukan. Utas memiliki akses ke semua objek yang dibuka prosesnya. Parameter lpAttribute dapat digunakan untuk menentukan atribut yang diperluas seperti afinitas grup prosesor untuk utas baru. Jika lpAttribute ADALAH NULL, perilaku fungsinya sama dengan CreateRemoteThread.

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 deskriptor keamanan disediakan, pemeriksaan akses dilakukan pada semua penggunaan handel berikutnya sebelum akses diberikan. Jika pemeriksaan akses menolak akses, proses permintaan 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 kembali dan, khususnya, sebelum pemanggil menerima handel dan pengidentifikasi utas yang dibuat.

Utas dibuat dengan prioritas utas THREAD_PRIORITY_NORMAL. Untuk mendapatkan dan mengatur nilai prioritas utas, gunakan fungsi GetThreadPriority dan SetThreadPriority .

Ketika utas berakhir, objek utas mencapai status bersinyali, 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 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 timbunan atau informasi proses lainnya. Ini dapat menyebabkan efek samping yang sama yang disebutkan dalam 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 7 [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2008 R2 [hanya aplikasi desktop]
Target Platform Windows
Header processthreadsapi.h (termasuk Windows.h pada Windows Server 2008 Windows Server 2008 R2)
Pustaka Kernel32.lib
DLL Kernel32.dll

Lihat juga

CreateRemoteThread