Bagikan melalui


Layanan Win32 berinteraksi dengan perangkat

Layanan Win32 ideal yang diinstal melalui INF AddService yang berinteraksi dengan perangkat berakibat mirip dengan cara driver berinteraksi dengan perangkat. Driver dimuat dan dibongkar tergantung pada keberadaan perangkat, dan layanan Win32 yang berinteraksi dengan perangkat harus mengikuti pola memulai dan berhenti yang sama ini tergantung pada keberadaan perangkat.

Layanan harus dimulai hanya ketika antarmuka perangkat ada dan diaktifkan untuk berinteraksi dengan dan berhenti ketika antarmuka perangkat tidak lagi diaktifkan. Pola desain ini memastikan layanan kuat yang meminimalkan perilaku yang tidak diinginkan dan tidak terdefinisi. Kami akan menelusuri bagaimana layanan harus dirancang untuk mengikuti pola ini.

Penginstalan layanan

Untuk menginstal layanan, gunakan arahan INF AddService . Ini akan memungkinkan Anda untuk membuat dan memulai layanan.

Tambahkan pengaturan yang membuat permintaan layanan dimulai. Ini dapat dicapai dengan mengatur StartType=0x3 yang membuat pemicu layanan dimulai.

Langkah terakhir di bagian ini adalah menggunakan direktif AddTrigger untuk membuat layanan dimulai ketika antarmuka perangkat tiba (lihat AddService untuk detail selengkapnya mengenai AddTrigger). Di bawah ini adalah contoh bagaimana AddTrigger harus digunakan:

[UserSvc_Install]
ServiceType   = 0x10 ; SERVICE_WIN32_OWN_PROCESS
StartType     = 3    ; SERVICE_DEMAND_START
ErrorControl  = 0    ; SERVICE_ERROR_IGNORE
ServiceBinary = %13%\oemsvc.exe
AddTrigger    = UserSvc_AddTrigger

[UserSvc_AddTrigger]
TriggerType = 1                           ; SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL
Action      = 1                           ; SERVICE_TRIGGER_ACTION_SERVICE_START
SubType     = %GUID_DEVINTERFACE_OSRFX2%  ; Interface class GUID
DataItem    = 2, "USB\VID_0547&PID_1002"  ; SERVICE_TRIGGER_DATA_TYPE_STRING

Perhatikan bahwa HardwareId yang ditentukan dalam DataItem bersifat opsional dan umumnya hanya diperlukan saat menggunakan antarmuka kelas generik untuk mencakup pemicu ke perangkat yang lebih spesifik.

Waktu proses layanan

Dari perspektif runtime, langkah pertama untuk layanan Anda adalah mendaftar untuk pemberitahuan antarmuka perangkat. Panduan preskriptif tentang cara mencapai hal ini dapat ditemukan di halaman ini: Mendaftar untuk Pemberitahuan Kedatangan Antarmuka Perangkat dan Penghapusan Perangkat.

Secara khusus, Anda harus menggunakan CM_Register_Notification dengan bendera CM_NOTIFY_FILTERY_TYPE_DEVICEINTERFACE untuk menyelesaikan pendaftaran pemberitahuan antarmuka perangkat yang sesuai.

Catatan

Ketika layanan dimulai, Anda tidak dapat mengandalkan fakta bahwa Anda akan menerima pemberitahuan antarmuka perangkat karena pemberitahuan kedatangan mungkin telah berlalu, terutama jika kedatangan antarmuka perangkat adalah penyebab layanan dimulai. Sebagai gantinya, Anda harus mendapatkan daftar antarmuka perangkat untuk memeriksa apakah sudah ada antarmuka.

Setelah Anda mendaftar untuk pemberitahuan untuk antarmuka perangkat, Anda akan diberi tahu tentang antarmuka perangkat baru yang diaktifkan atau antarmuka perangkat yang ada dinonaktifkan. Anda dapat menemukan jalur antarmuka perangkat dari panggilan balik pemberitahuan. Untuk mengkueri daftar antarmuka perangkat yang ada untuk memeriksa antarmuka perangkat yang ada sebelum layanan dimulai dan terdaftar untuk pemberitahuan, Anda bisa mendapatkan daftar antarmuka perangkat melalui API seperti CM_Get_Device_Interface_List.

Catatan

Ada kemungkinan bahwa antarmuka perangkat tiba antara mendaftar untuk pemberitahuan dan mengambil daftar antarmuka perangkat yang sudah ada di sistem. Dalam hal ini, antarmuka perangkat akan tercantum dalam panggilan balik pemberitahuan dan daftar antarmuka perangkat.

Jika Anda ingin berinteraksi dengan antarmuka perangkat dengan API I/O, setelah Anda menemukan antarmuka perangkat yang diinginkan, buka handel ke antarmuka melalui CreateFile.

Langkah selanjutnya adalah mendaftar pemberitahuan per handel sekunder untuk mendapatkan pemberitahuan tentang perubahan status pada perangkat seperti upaya untuk mengkueri menghapus perangkat atau perangkat akan hilang. Ini dapat dilakukan menggunakan CM_Register_Notification dengan bendera CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE . Mengikuti panduan mendaftar untuk Pemberitahuan Kedatangan Antarmuka Perangkat dan Penghapusan Perangkat akan memastikan bahwa ketika perangkat akan hilang, handel dapat dirilis sesuai.

Kedatangan dan penghapusan antarmuka perangkat harus dilacak sehingga penghapusan antarmuka perangkat terakhir yang mungkin ingin berinteraksi dengan layanan berarti layanan dapat dihentikan. Setelah antarmuka terakhir dihapus, hentikan layanan Anda (informasi terperinci dapat ditemukan di halaman ini). Ini dapat dicapai dengan mengikuti langkah-langkah berikut:

  1. Posting status SERVICE_STOP_PENDING ke SCM untuk menunjukkan bahwa layanan tidak berfungsi

  2. Batalkan menginisialisasi/membersihkan semua yang digunakan layanan

  3. Memposting status SERVICE_STOP ke SCM untuk menyelesaikan operasi penghentian

Jika layanan dihentikan, pastikan untuk memeriksa dan melalui semua handel terbuka yang ada ke antarmuka perangkat (mungkin tidak ada) dan bersihkan.

Antarmuka perangkat dapat kembali baik selama penginstalan perangkat, perangkat aktif/nonaktifkan, enumerasi ulang perangkat, boot ulang sistem, atau selama skenario lain yang tidak tercantum. Ketika antarmuka perangkat kembali, layanan akan dipicu dimulai berdasarkan pendaftaran mulai pemicunya.

Alur ini akan memastikan bahwa layanan dimulai pada kedatangan antarmuka perangkat dan berhenti ketika antarmuka perangkat terakhir tidak lagi ada.

Ada sampel di GitHub yang berjalan melalui bagaimana layanan dapat memanfaatkan alur peristiwa ini. Sampel dapat ditemukan di sini: Sampel Layanan Win32.

Selain itu, Anda dapat menemukan dokumentasi yang berguna mengenai AddTrigger di halaman AddService .