Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Системное программирование. Учебное пособие-1

.pdf
Скачиваний:
1
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Ʉɨɝɞɚ ɫɥɭɠɛɚ ɩɨɥɭɱɚɟɬ ɤɨɦɚɧɞɭ SERVICE_CONTROL_INTERROGATE, ɨɧɚ ɞɨɥɠɧɚ ɧɟɦɟɞɥɟɧɧɨ ɨɛɧɨɜɢɬɶ ɢɧɮɨɪɦɚɰɢɸ ɨ ɫɬɚɬɭɫɟ ɫɥɭɠɛɵ, ɢɫɩɨɥɶɡɭɟɦɨɣ SCM.
Ɏɭɧɤɰɢɹ SetSomeServiceStatus() ɢɡɦɟɧɹɟɬ ɫɨɞɟɪɠɢɦɨɟ ɫɬɪɭɤɬɭɪɵ ss, ɤɨɬɨɪɨɟ ɢɫɩɨɥɶɡɭɟɬ SCM ɞɥɹ ɩɨɥɭɱɟɧɢɹ ɢɧɮɨɪɦɚɰɢɢ ɨ ɫɬɚɬɭɫɟ ɫɥɭɠɛɵ.
Ɋɚɫɫɦɨɬɪɢɦ ɪɟɚɥɢɡɚɰɢɸ ɮɭɧɤɰɢɢ ɩɨɥɭɱɟɧɢɹ ɫɬɚɬɭɫɚ ɫɥɭɠɛɵ.
ɉɪɢɦɟɪ 4.5. Ɏɭɧɤɰɢɹ ɞɥɹ ɩɨɥɭɱɟɧɢɹ ɫɬɚɬɭɫɚ ɫɥɭɠɛɵ Windows.
void SetSomeServiceStatus(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint) {
// ɫɱɟɬɱɢɤ ɲɚɝɨɜ ɞɥɢɬɟɥɶɧɵɯ ɨɩɟɪɚɰɢɣ static DWORD dwCheckPoint = 1;
// ɟɫɥɢ ɫɥɭɠɛɚ ɧɟ ɧɚɯɨɞɢɬɫɹ
ɜ ɩɪɨɰɟɫɫɟ ɡɚɩɭɫɤɚ, // ɟɺ ɦɨɠɧɨ ɨɫɬɚɧɨɜɢɬɶ if (dwCurrentState == SERVICE_START_PENDING)
ss.dwControlsAccepted = 0;
else
ss.dwControlsAccepted = SERVICE_ACCEPT_STOP; ss.dwCurrentState = dwCurrentState; ss.dwWin32ExitCode = dwWin32ExitCode; // ɡɚɞɚɟɦ ɜɪɟɦɹ ɨɠɢɞɚɧɢɹ ɡɚɩɭɫɤɚ ɫɥɭɠɛɵ
ss.dwWaitHint = dwWaitHint; // ɟɫɥɢ ɫɥɭɠɛɚ ɧɟ ɪɚɛɨɬɚɟɬ ɢ ɧɟ ɨɫɬɚɧɨɜɥɟɧɚ, // ɭɜɟɥɢɱɢɜɚɟɦ ɡɧɚɱɟɧɢɟ ɫɱɟɬɱɢɤɚ // ɲɚɝɨɜ ɞɥɢɬɟɥɶɧɵɯ ɨɩɟɪɚɰɢɣ if ((dwCurrentState == SERVICE_RUNNING( ||
(dwCurrentState == SERVICE_STOPPED)) ss.dwCheckPoint = 0;
else
ss.dwCheckPoint = dwCheckPoint++; // ɨɛɧɨɜɥɹɟɦ ɢɧɮɨɪɦɚɰɢɸ ɨ ɫɥɭɠɛɟ SetServiceStatus(ssHandle, &ss); }
Ɂɧɚɱɟɧɢɟ ɩɨɥɹ dwCheckPoint ɫɥɟɞɭɟɬ ɩɟɪɢɨɞɢɱɟɫɤɢ ɢɡɦɟɧɹɬɶ ɜɨ ɜɪɟɦɹ
ɞɥɢɬɟɥɶɧɨɝɨ ɡɚɩɭɫɤɚ ɢɥɢ ɨɫɬɚɧɨɜɚ. ɇɚɩɪɢɦɟɪ
,
ɟɫɥɢ ɩɪɢ ɡɚɩɭɫɤɟ ɫɥɭɠɛɵ ɢɧɢɰɢ­ɚɥɢɡɚɰɢɹ ɜɵɩɨɥɧɹɟɬɫɹ ɜ ɧɟɫɤɨɥɶɤɨ ɷɬɚɩɨɜ, ɬɨ ɧɭɠɧɨ ɭɜɟɥɢɱɢɜɚɬɶ ɡɧɚɱɟɧɢɟ dwCheckPoint ɩɨɫɥɟ ɤɚɠɞɨɝɨ ɷɬɚɩɚ. ɉɪɢ ɷɬɨɦ ɩɪɨɝɪɚɦɦɚ, ɤɨɬɨɪɚɹ ɡɚɩɪɨɫɢɥɚ ɭɫɥɭɝɢ ɫɥɭɠɛɵ, ɦɨɠɟɬ ɭɡɧɚɬɶ, ɤɚɤɨɣ ɨɛɴɟɦ ɪɚɛɨɬɵ ɭɠɟ ɜɵɩɨɥɧɟɧ ɫɥɭɠɛɨɣ. ɉɨ­ɥɟ dwCheckPoint ɞɨɥɠɧɨ ɛɵɬɶ ɪɚɜɧɨ ɧɭɥɸ, ɟɫɥɢ ɫɥɭɠɛɚ ɧɟ ɧɚɯɨɞɢɬɫɹ ɜ ɫɨ­ɫɬɨɹɧɢɢ ɡɚɩɭɫɤɚ, ɨɫɬɚɧɨɜɚ ɢɥɢ ɜɵɩɨɥɧɟɧɢɹ ɞɥɢɬɟɥɶɧɨɣ
ɨɩɟɪɚɰɢɢ.
ɉɨɥɟ dwControlsAccepted ɨɩɪɟɞɟɥɹɟɬ ɭɩɪɚɜɥɹɸɳɢɣ ɤɨɞ, ɤɨɬɨɪɵɣ ɫɥɭɠɛɚ ɦɨɠɟɬ ɩɪɢɧɢɦɚɬɶ ɢ ɨɛɪɚɛɚɬɵɜɚɬɶ. ɉɨ ɭɦɨɥɱɚɧɢɸ ɜɫɟ ɫɥɭɠɛɵ ɦɨɝɭɬ ɩɪɢɧɢɦɚɬɶ ɤɨɦɚɧɞɭ SERVICE_CONTROL_ INTERROGATE. ȿɫɥɢ ɷɬɨ ɩɨɥɟ ɢɦɟ­ɟɬ ɡɧɚɱɟɧɢɟ SERVICE_ACCEPT_ STOP, ɬɨ ɫɥɭɠɛɚ ɦɨɠɟɬ ɛɵɬɶ ɨɫɬɚɧɨɜɥɟɧɚ ɫ ɩɨɦɨɳɶɸ ɤɨɦɚɧɞɵ SERVICE_CONTROL_STOP.
151
Ɏɭɧɤɰɢɢ InitSomeServiceData() ɢ StopSomeService() ɩɪɨɢɡ­ɜɨɞɹɬ ɢɧɢɰɢɚɥɢɡɚɰɢɸ ɫɥɭɠɛɵ, ɚ ɬɚɤɠɟ ɞɟɣɫɬɜɢɹ, ɤɨɬɨɪɵɟ ɧɟɨɛɯɨɞɢɦɨ ɜɵɩɨɥ­ɧɢɬɶ ɩɟɪɟɞ ɨɫɬɚɧɨɜɨɦ ɫɥɭɠɛɵ. ɋɨɞɟɪɠɢɦɨɟ ɷɬɢɯ ɮɭɧɤɰɢɣ ɡɚɜɢɫɢɬ ɨɬ ɤɨɧɤɪɟɬ­ɧɨɣ ɫɥɭɠɛɵ.
ɉɪɢɦɟɪ 4.6. ɒɚɛɥɨɧɵ ɮɭɧɤɰɢɣ ɢɧɢɰɢɚɥɢɡɚɰɢɢ ɫɥɭɠɛɵ Windows.
BOOL InitSomeServiceData() { // ɩɪɨɝɪɚɦɦɧɵɣ ɤɨɞ
. . . . . .
return TRUE;
} BOOL StopSomeService() { // ɩɪɨɝɪɚɦɦɧɵɣ ɤɨɞ
. . . . . .
return TRUE;
}
Ɏɭɧɤɰɢɢ ServiceMain() ɹɜɥɹɸɬɫɹ ɭɫɨɜɟɪɲɟɧɫɬɜɨɜɚɧɧɵɦɢ ɜɟɪɫɢɹɦɢ
ɨɫɧɨɜɧɨɣ ɩɪɨɝɪɚɦɦɵ (ɥɨɝɢɱɟɫɤɢɦɢ ɫɥɭɠɛɚɦɢ), ɩɪɟɨɛɪɚɡɭɟɦɵɦɢ ɜ ɫɥɭɠɛɭ
,
ɩɪɢɱɟɦ ɤɚɠɞɚɹ ɥɨɝɢɱɟɫɤɚɹ ɫɥɭɠɛɚ ɛɭɞɟɬ ɚɤɬɢɜɢɡɢɪɨɜɚɬɶɫɹ ɜ ɟɟ ɫɨɛɫɬɜɟɧɧɨɦ ɩɨɬɨɤɟ SCM. ȼ ɫɜɨɸ ɨɱɟɪɟɞɶ, ɥɨɝɢɱɟɫɤɚɹ ɫɥɭɠɛɚ ɦɨɠɟɬ ɡɚɩɭɫɤɚɬɶ ɞɨɩɨɥɧɢ­ɬɟɥɶɧɵɟ ɩɨɬɨɤɢ, ɧɚɩɪɢɦɟɪ, ɪɚɛɨɱɢɟ ɩɨɬɨɤɢ ɫɟɪɜɟɪɚ. ɑɚɫɬɨ ɜɧɭɬɪɢ ɫɥɭɠɛɵ ɫɭ­ɳɟɫɬɜɭɟɬ ɬɨɥɶɤɨ ɨɞɧɚ ɥɨɝɢɱɟɫɤɚɹ ɫɥɭɠɛɚ. ȼ ɬɨ ɠɟ ɜɪɟɦɹ ɥɨɝɢɱɟɫɤɢɟ ɫɥɭɠɛɵ ɧɚ ɨɫɧɨɜɟ ɫɨɟɞɢɧɟɧɢɣ (sockets) ɢ ɢɦɟɧɨɜɚɧɧɵɯ ɤɚɧɚɥɨɜ ɦɨɝɭɬ ɜɵɩɨɥɧɹɬɶɫɹ ɜ ɪɚɦ­ɤɚɯ
ɨɞɧɨɣ ɢ ɬɨɣ ɠɟ ɫɥɭɠɛɵ Windows, ɱɬɨ ɩɨɬɪɟɛɭɟɬ ɩɪɟɞɨɫɬɚɜɥɟɧɢɹ ɨɫɧɨɜɧɵɯ
ɮɭɧɤɰɢɣ ɨɛɟɢɯ ɫɥɭɠɛ.
ɇɟɫɦɨɬɪɹ ɧɚ ɬɨ, ɱɬɨ ɮɭɧɤɰɢɹ ServiceMain() ɹɜɥɹɟɬɫɹ ɚɞɚɩɬɢɪɨɜɚɧɧɵɦ ɜɚɪɢɚɧɬɨɦ ɮɭɧɤɰɢɢ main() ɫ ɬɚɤɢɦɢ ɠɟ ɩɚɪɚɦɟɬɪɚɦɢ, ɦɟɠɞɭ ɧɢɦɢ ɢɦɟɟɬɫɹ ɨɞɧɨ ɧɟɡɧɚɱɢɬɟɥɶɧɨɟ ɨɬɥɢɱɢɟ: ɝɥɚɜɧɚɹ ɮɭɧɤɰɢɹ ɫɥɭɠɛɵ ɞɨɥɠɧɚ ɛɵɬɶ ɨɛɴɹɜɥɟɧɚ ɫ ɬɢɩɨɦ void, ɚ ɧɟ int, ɤɚɤ ɜ ɫɥɭɱɚɟ ɮɭɧɤɰɢɢ main().
Ⱦɥɹ ɪɟɝɢɫɬɪɚɰɢɢ
ɨɛɪɚɛɨɬɱɢɤɚ ɭɩɪɚɜɥɹɸɳɢɯ ɤɨɦɚɧɞ ɫɥɭɠɛɵ, ɤɨɬɨɪɵɣ ɩɪɟɞɫɬɚɜɥɹɟɬ ɫɨɛɨɣ ɮɭɧɤɰɢɸ, ɜɵɡɵɜɚɟɦɭɸ SCM ɞɥɹ ɨɫɭɳɟɫɬɜɥɟɧɢɹ ɭɩɪɚɜɥɟ­ɧɢɹ ɫɥɭɠɛɨɣ, ɬɪɟɛɭɟɬɫɹ ɞɨɩɨɥɧɢɬɟɥɶɧɵɣ ɩɪɨɝɪɚɦɦɧɵɣ ɤɨɞ.
4.1.2. Ɋɟɝɢɫɬɪɚɰɢɹ ɢ ɡɚɩɭɫɤ ɫɥɭɠɛɵ
Ɉɛɪɚɛɨɬɱɢɤ ɭɩɪɚɜɥɹɸɳɢɯ ɤɨɦɚɧɞ ɫɥɭɠɛɵ, ɜɵɡɵɜɚɟɦɵɣ SCM, ɞɨɥɠɟɧ ɨɛɟɫɩɟɱɢɜɚɬɶ ɭɩɪɚɜɥɟɧɢɟ ɫɨɨɬɜɟɬɫɬɜɭɸɳɟɣ ɥɨɝɢɱɟɫɤɨɣ ɫɥɭɠɛɨɣ, ɤɨɬɨɪɚɹ ɞɨɥɠɧɚ ɡɚɪɟɝɢɫɬɪɢɪɨɜɚɬɶ ɫɜɨɣ ɨɛɪɚɛɨɬɱɢɤ ɫ ɩɨɦɨɳɶɸ ɮɭɧɤɰɢɢ Register- ServiceCtrlHandlerEx. ȼɵɡɨɜ ɷɬɨɣ ɮɭɧɤɰɢɢ ɩɨɦɟɳɚɸɬ ɜ ɧɚɱɚɥɨ
ɮɭɧɤɰɢɢ ServiceMain() ɢ ɜɩɨɫɥɟɞɫɬɜɢɢ ɧɢɝɞɟ ɧɟ ɩɨɜɬɨɪɹɸɬ. ɋɚɦ ɨɛɪɚɛɨɬɱɢɤ ɜɵɡɵ­ɜɚɟɬɫɹ SCM ɩɨɫɥɟ ɩɨɥɭɱɟɧɢɹ ɡɚɩɪɨɫɚ ɫɥɭɠɛɵ.
ɋɢɧɬɚɤɫɢɫ ɮɭɧɤɰɢɢ ɪɟɝɢɫɬɪɚɰɢɢ ɫɥɭɠɛɵ ɫɥɟɞɭɸɳɢɣ: RegisterServ-
iceCtrlHandlerEx(LPCTSTR lpServiceName, LPHANDLER_FUNCTION _EX lpHandlerProc, LPVOID lpContext)
152
Ɏɭɧɤɰɢɹ ɩɪɢɧɢɦɚɟɬ ɫɥɟɞɭɸɳɢɟ ɮɨɪɦɚɥɶɧɵɟ ɩɚɪɚɦɟɬɪɵ:
lpServiceName – ɨɩɪɟɞɟɥɹɟɦɨɟ ɩɨɥɶɡɨɜɚɬɟɥɟɦ ɢɦɹ ɫɥɭɠɛɵ, ɤɨɬɨɪɨɟ ɩɨɞɫɬɚɜɥɹɟɬɫɹ ɜ ɫɨɨɬɜɟɬɫɬɜɭɸɳɟɦ ɩɨɥɟ ɬɚɛɥɢɰɵ ɞɢɫɩɟɬɱɟɪɢɡɚɰɢɢ, ɨɬɜɟɞɟɧɧɨɝɨ ɞɥɹ ɞɚɧɧɨɣ ɥɨɝɢɱɟɫɤɨɣ ɮɭɧɤɰɢɢ;
lpHandlerProc – ɚɞɪɟɫ ɮɭɧɤɰɢɢ ɪɚɫɲɢɪɟɧɧɨɝɨ ɨɛɪɚɛɨɬɱɢɤɚ;
lpContext – ɨɩɪɟɞɟɥɹɟɦɵɟ ɩɨɥɶɡɨɜɚɬɟɥɟɦ ɞɚɧɧɵɟ, ɩɟɪɟɞɚɜɚɟɦɵɟ ɨɛɪɚ-
ɛɨɬɱɢɤɭ, ɩɨɡɜɨɥɹɸɳɢɟ ɨɛɪɚɛɨɬɱɢɤɭ ɪɚɡɥɢɱɚɬɶ ɚɫɫɨɰɢɢɪɨɜɚɧɧɵɟ ɫ ɧɢɦ ɫɥɭɠɛɵ, ɤɨɬɨɪɵɯ ɦɨɠɟɬ ɛɵɬɶ ɧɟɫɤɨɥɶɤɨ.
ȼ ɫɥɭɱɚɟ ɜɨɡɧɢɤɧɨɜɟɧɢɹ ɨɲɢɛɤɢ ɜɨɡɜɪɚɳɚɟɦɨɟ ɮɭɧɤɰɢɟɣ
ɡɧɚɱɟɧɢɟ – ɨɛɴ-
ɟɤɬ SEPARARE_STATUS_HANDLE, ɪɚɜɧɨ 0.
4.1.3. ɇɚɫɬɪɨɣɤɚ ɫɨɫɬɨɹɧɢɹ ɫɥɭɠɛɵ
Ʉɨɝɞɚ ɭɩɪɚɜɥɹɸɳɚɹ ɩɪɨɝɪɚɦɦɚ ɡɚɪɟɝɢɫɬɪɢɪɨɜɚɧɚ, ɧɟɨɛɯɨɞɢɦɨ ɩɟɪɟɜɟɫɬɢ ɫɥɭɠɛɭ ɜ ɫɨɫɬɨɹɧɢɟ SERVICE_START_PENDING, ɜɨɫɩɨɥɶɡɨɜɚɜɲɢɫɶ ɞɥɹ ɷɬɨɝɨ ɮɭɧɤɰɢɟɣ SetServiceStatus. Ɏɭɧɤɰɢɹ SetServiceStatus ɢɧɮɨɪɦɢɪɭ­ɟɬ SCM ɨ ɬɟɤɭɳɟɦ ɫɨɫɬɨɹɧɢɢ ɫɥɭɠɛɵ. Ɉɩɢɫɚɧɢɹ ɞɪɭɝɢɯ ɜɨɡɦɨɠɧɵɯ ɫɨɫɬɨɹɧɢɣ ɫɥɭɠɛɵ, ɯɚɪɚɤɬɟɪɢɡɭɟɦɵɯ ɡɧɚɱɟɧɢɹɦɢ ɩɚɪɚɦɟɬɪɚ ɫɨɫɬɨɹɧɢɹ, ɨɬɥɢɱɧɵɦɢ ɨɬ SERVICE_STATUS_PENDING, ɩɪɢɜɟɞɟɧɵ ɧɢɠɟ.
Ɉɛɪɚɛɨɬɱɢɤ ɫɥɭɠɛɵ ɞɨɥɠɟɧ ɭɫɬɚɧɚɜɥɢɜɚɬɶ ɫɨɫɬɨɹɧɢɟ
ɫɥɭɠɛɵ ɩɪɢ ɤɚɠɞɨɦ
ɜɵɡɨɜɟ, ɞɚɠɟ ɟɫɥɢ ɟɟ ɫɨɫɬɨɹɧɢɟ ɧɟ ɦɟɧɹɥɨɫɶ.
Ʌɸɛɨɣ ɢɡ ɩɨɬɨɤɨɜ ɫɥɭɠɛɵ ɦɨɠɟɬ ɜ ɥɸɛɨɣ ɦɨɦɟɧɬ ɜɵɡɜɚɬɶ ɮɭɧɤɰɢɸ Set- ServiceStatus, ɱɬɨɛɵ ɫɨɨɛɳɢɬɶ ɫɜɟɞɟɧɢɹ ɨ ɫɬɟɩɟɧɢ ɜɵɩɨɥɧɟɧɢɹ ɡɚɞɚɱɢ, ɚ ɬɚɤɠɟ ɩɪɟɞɨɫɬɚɜɢɬɶ ɢɧɮɨɪɦɚɰɢɸ ɨɛ ɨɲɢɛɤɚɯ ɢɥɢ ɢɧɭɸ ɫɥɭɠɟɛɧɭɸ ɢɧɮɨɪɦɚ­ɰɢɸ, ɩɪɢɱɟɦ ɞɥɹ ɩɟɪɢɨɞɢɱɟɫɤɨɝɨ ɨɛɧɨɜɥɟɧɢɹ ɫɨɫɬɨɹɧɢɹ ɦɧɨɝɢɟ ɫɥɭɠɛɵ ɱɚɫɬɨ ɜɵɞɟɥɹɸɬ ɨɬɞɟɥɶɧɵɣ ɩɨɬɨɤ
. Ⱦɥɢɬɟɥɶɧɨɫɬɶ ɩɪɨɦɟɠɭɬɤɚ ɜɪɟɦɟɧɢ ɦɟɠɞɭ ɜɵɡɨɜɚ­ɦɢ ɨɛɧɨɜɥɟɧɢɹ ɫɨɫɬɨɹɧɢɹ ɭɤɚɡɵɜɚɟɬɫɹ ɜ ɨɞɧɨɦ ɢɡ ɩɨɥɟɣ ɫɬɪɭɤɬɭɪɵ ɞɚɧɧɵɯ, ɜɵ­ɫɬɭɩɚɸɳɟɣ ɜ ɤɚɱɟɫɬɜɟ ɩɚɪɚɦɟɬɪɚ. ȿɫɥɢ ɜ ɩɪɟɞɟɥɚɯ ɭɤɚɡɚɧɧɨɝɨ ɩɪɨɦɟɠɭɬɤɚ ɜɪɟ­ɦɟɧɢ ɫɨɫɬɨɹɧɢɟ ɧɟ ɨɛɧɨɜɥɹɥɨɫɶ, ɬɨ SCM ɦɨɠɟɬ ɩɪɟɞɩɨɥɨɠɢɬɶ, ɱɬɨ ɩɪɨɢɡɨɲɥɚ ɨɲɢɛɤɚ.
ɋɢɧɬɚɤɫɢɫ ɮɭɧɤɰɢɢ ɧɚɫɬɪɨɣɤɢ ɫɥɭɠɛɵ:
BOOL SetServiceStatus( SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE STA-
TUS lpServiceStatus)
Ɏɭɧɤɰɢɹ ɩɪɢɧɢɦɚɟɬ ɫɥɟɞɭɸɳɢɟ ɮɨɪɦɚɥɶɧɵɟ ɩɚɪɚɦɟɬɪɵ:
hServiceStatus – ɨɩɢɫɚɬɟɥɶ, ɜɨɡɜɪɚɳɟɧɧɵɣ ɮɭɧɤɰɢɟɣ
Regis-
terCtrlHandlerEx, ɤɨɬɨɪɚɹ ɛɵɥɚ ɜɵɡɜɚɧɚ ɪɚɧɟɟ;
lpServiceStatus – ɭɤɚɡɚɬɟɥɶ ɧɚ ɫɬɪɭɤɬɭɪɭ SERVICE_STATUS, ɫɨ-
ɞɟɪɠɚɳɭɸ ɨɩɢɫɚɧɢɟ ɫɜɨɣɫɬɜ, ɫɨɫɬɨɹɧɢɹ ɢ ɜɨɡɦɨɠɧɨɫɬɟɣ ɫɥɭɠɛɵ.
ɋɬɪɭɤɬɭɪɚ SERVICE_STATUS ɨɛɴɹɜɥɟɧɚ ɫɥɟɞɭɸɳɢɦ ɨɛɪɚɡɨɦ:
typedef struct _SERVICE_STATUS { DWORD dwServiceType; DWORD dwCurrentState;
153
DWORD dwControlsAccepted; DWORD dwWin32ExitCode; DWORD dwServiceSpecificExitCode; DWORD dwCheckPoint; DWORD dwWaitHint; } SERVICE_STATUS, *LPSERVICE_STATUS;
ɉɨɥɹ ɫɬɪɭɤɬɭɪɵ ɢɦɟɸɬ ɫɥɟɞɭɸɳɟɟ ɧɚɡɧɚɱɟɧɢɟ:
x dwWin32ExitCode – ɤɨɞ ɡɚɜɟɪɲɟɧɢɹ ɩɨɬɨɤɚ, ɢɫɩɨɥɶɡɭɟɦɵɣ ɥɨɝɢɱɟ-
ɫɤɨɣ ɫɥɭɠɛɨɣ. ɋɥɭɠɛɚ ɞɨɥɠɧɚ ɭɫɬɚɧɨɜɢɬɶ ɷɬɨɬ ɤɨɞ ɪɚɜɧɵɦ NO_ERROR ɜ ɩɪɨ­ɰɟɫɫɟ ɜɵɩɨɥɧɟɧɢɹ ɢ ɩɪɢ ɧɨɪɦɚɥɶɧɨɦ ɡɚɜɟɪɲɟɧɢɢ;
x dwServiceSpecificExitCode – ɦɨɠɟɬ ɢɫɩɨɥɶɡɨɜɚɬɶɫɹ ɜ ɤɚɱɟɫɬɜɟ
ɤɨɞɚ ɡɚɜɟɪɲɟɧɢɹ, ɟɫɥɢ ɨɲɢɛɤɚ ɜɨɡɧɢɤɚɟɬ ɩɪɢ ɡɚɩɭɫɤɟ ɢɥɢ ɨɫɬɚɧɨɜɤɟ ɫɥɭɠɛɵ. ɗɬɨ ɡɧɚɱɟɧɢɟ ɢɝɧɨɪɢɪɭɟɬɫɹ, ɟɫɥɢ ɡɧɚɱɟɧɢɟ ɩɚɪɚɦɟɬɪɚ dwWin32ExitCode ɧɟ ɛɵɥɨ ɭɫɬɚɧɨɜɥɟɧɨ ɪɚɜɧɵɦ ERROR_SERVICE_SPECIFIC_ERROR;
x dwCheckPoint – ɫɥɭɠɛɚ ɞɨɥɠɧɚ ɩɟɪɢɨɞɢɱɟɫɤɢ ɭɜɟɥɢɱɢɜɚɬɶ ɡɧɚɱɟɧɢɟ
ɷɬɨɝɨ ɩɚɪɚɦɟɬɪɚ ɞɥɹ ɢɧɞɢɤɚɰɢɢ ɜɵɩɨɥɧɟɧɢɹ ɧɚ ɜɫɟɯ ɫɬɚɞɢɹɯ, ɜɤɥɸɱɚɹ ɫɬɚɞɢɢ ɢɧɢɰɢɚɥɢɡɚɰɢɢ ɢ ɨɫɬɚɧɨɜɚ. ɗɬɨɬ ɩɚɪɚɦɟɬɪ ɧɟ ɞɟɣɫɬɜɭɟɬ ɢ ɞɨɥɠɟɧ ɭɫɬɚɧɚɜɥɢ­ɜɚɬɶɫɹ ɪɚɜɧɵɦ 0, ɟɫɥɢ ɫɥɭɠɛɚ ɧɟ ɧɚɯɨɞɢɬɫɹ ɜ ɫɨɫɬɨɹɧɢɢ ɡɚɩɭɫɤɚ, ɨɫɬɚɧɨɜɚ, ɩɚɭ­ɡɵ ɢ ɧɟ ɜɵɩɨɥɧɹɟɬ ɧɢɤɚɤɢɯ ɞɥɢɬɟɥɶɧɵɯ ɨɩɟɪɚɰɢɣ;
x dwWaitHint – ɨɠɢɞɚɟɦɚɹ ɞɥɢɬɟɥɶɧɨɫɬɶ ɢɧɬɟɪɜɚɥɨɜ ɜɪɟɦɟɧɢ (ɜ ɦɢɥ-
ɥɢɫɟɤɭɧɞɚɯ) ɦɟɠɞɭ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɵɦɢ ɜɵɡɨɜɚɦɢ ɮɭɧɤɰɢɢ SetServiceSta- tus, ɨɫɭɳɟɫɬɜɥɹɟɦɵɦɢ ɫ ɭɜɟɥɢɱɟɧɧɵɦ ɡɧɚɱɟɧɢɟɦ ɩɚɪɚɦɟɬɪɚ dwCheckPoint ɢɥɢ ɢɡɦɟɧɟɧɧɵɦ ɡɧɚɱɟɧɢɟɦ ɩɚɪɚɦɟɬɪɚ dwCurrentState. Ʉɚɤ ɨɬɦɟɱɚɥɨɫɶ ɪɚ­ɧɟɟ, ɟɫɥɢ ɧɚ ɩɪɨɬɹɠɟɧɢɢ ɷɬɨɝɨ ɩɪɨɦɟɠɭɬɤɚ ɜɪɟɦɟɧɢ ɜɵɡɨɜɚ ɮɭɧɤɰɢɢ Set- ServiceStatus ɧɟ ɩɪɨɢɫɯɨɞɢɬ, ɬɨ SCM ɩɪɟɞɩɨɥɚɝɚɟɬ, ɱɬɨ ɷɬɨ ɜɵɡɜɚɧɨ ɜɨɡ­ɧɢɤɧɨɜɟɧɢɟɦ ɨɲɢɛɤɢ;
x dwServiceType ɭɤɚɡɵɜɚɟɬ ɬɢɩ ɫɥɭɠɛɵ, ɢ ɞɨɥɠɟɧ ɢɦɟɬɶ ɨɞɧɨ ɢɡ ɡɧɚ-
ɱɟɧɢɣ, ɨɩɢɫɚɧɧɵɯ ɜ ɬɚɛɥɢɰɟ 4.1;
x dwCurrentState ɭɤɚɡɵɜɚɟɬ ɧɚ ɬɟɤɭɳɟɟ ɫɨɫɬɨɹɧɢɟ ɫɥɭɠɛɵ. ȼɨɡɦɨɠ-
ɧɵɟ ɡɧɚɱɟɧɢɹ ɷɬɨɝɨ ɩɚɪɚɦɟɬɪɚ ɩɟɪɟɱɢɫɥɟɧɵ ɜ ɬɚɛɥɢɰɟ 4.2;
x dwControlsAccepted ɨɩɪɟɞɟɥɹɟɬ ɭɩɪɚɜɥɹɸɳɢɟ ɤɨɞɵ, ɤɨɬɨɪɵɟ
ɫɥɭɠɛɚ ɛɭɞɟɬ ɜɨɫɩɪɢɧɢɦɚɬɶ ɢ ɨɛɪɚɛɚɬɵɜɚɬɶ ɫ ɩɨɦɨɳɶɸ ɫɜɨɟɝɨ ɨɛɪɚɛɨɬɱɢɤɚ (ɫɦ. ɫɥɟɞɭɸɳɢɣ ɪɚɡɞɟɥ). ȼ ɬɚɛɥɢɰɟ 4.3 ɭɤɚɡɚɧɵ ɱɟɬɵɪɟ ɜɨɡɦɨɠɧɵɯ ɡɧɚɱɟɧɢɹ, ɤɨɬɨɪɵɟ ɦɨɝɭɬ ɨɛɴɟɞɢɧɹɬɶɫɹ ɩɨɫɪɟɞɫɬɜɨɦ ɨɩɟɪɚɰɢɢ ɩɨɪɚɡɪɹɞɧɨɝɨ «ɂɅɂ».
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 4.1
Ɍɢɩɵ ɫɥɭɠɛ
Ɂɧɚɱɟɧɢɟ Ɉɩɢɫɚɧɢɟ
SERVICE_WIN32_OWN_PROCESS
154
ɍɤɚɡɵɜɚɟɬ ɧɚ ɫɥɭɠɛɭ Windows,
ɜɵɩɨɥɧɹɸɳɭɸɫɹ ɜ ɫɨɛɫɬɜɟɧɧɨɦ
ɩɪɨɰɟɫɫɟ ɫ ɫɨɛɫɬɜɟɧɧɵɦɢ
ɪɟɫɭɪɫɚɦɢ
Ɂɧɚɱɟɧɢɟ Ɉɩɢɫɚɧɢɟ
SERVICE_WIN32_SHARE_PROCESS
SERVICE_KERNEL_DRIVER
SERVICE_FILE_SYSTEM_DRIVER
SERVICE_INTERACTIVE_PROCESS
Ɂɧɚɱɟɧɢɹ ɩɚɪɚɦɟɬɪɚ ɫɨɫɬɨɹɧɢɹ ɫɥɭɠɛɵ
Ɂɧɚɱɟɧɢɟ Ɉɩɢɫɚɧɢɟ
SERVICE_STOPPED ɋɥɭɠɛɚ ɧɟ ɜɵɩɨɥɧɹɟɬɫɹ
Ɉ ɤ ɨ ɧ ɱ ɚ ɧ ɢ ɟ ɬ ɚ ɛ ɥ ɢ ɰ ɵ 4.1
ɍɤɚɡɵɜɚɟɬ ɧɚ ɫɥɭɠɛɭ Windows,
ɪɚɡɞɟɥɹɸɳɭɸ ɩɪɨɰɟɫɫ
ɫ ɞɪɭɝɢɦɢ ɫɥɭɠɛɚɦɢ,
ɜ ɪɟɡɭɥɶɬɚɬɟ ɱɟɝɨ ɧɟɫɤɨɥɶɤɨ
ɫɥɭɠɛ ɦɨɝɭɬ ɫɨɜɦɟɫɬɧɨ
ɢɫɩɨɥɶɡɨɜɚɬɶ ɨɞɧɢ ɢ ɬɟ ɠɟ
ɪɟɫɭɪɫɵ, ɩɟɪɟɦɟɧɧɵɟ
ɨɤɪɭɠɟɧɢɹ ɢ ɬɚɤ ɞɚɥɟɟ
ɍɤɚɡɵɜɚɟɬ ɧɚ ɞɪɚɣɜɟɪ
ɭɫɬɪɨɣɫɬɜɚ Windows
Ɉɩɪɟɞɟɥɹɟɬ ɞɪɚɣɜɟɪ ɮɚɣɥɨɜɨɣ
ɫɢɫɬɟɦɵ Windows
ɍɤɚɡɵɜɚɟɬ ɧɚ ɩɪɨɰɟɫɫ ɫɥɭɠɛɵ Windows, ɤɨɬɨɪɵɣ ɦɨɠɟɬ ɜɡɚ-
ɢɦɨɞɟɣɫɬɜɨɜɚɬɶ ɫ ɩɨɥɶɡɨɜɚɬɟɥɟɦ
ɱɟɪɟɡ ɪɚɛɨɱɢɣ ɫɬɨɥ
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 4.2
SERVICE_START_PENDING
SERVICE_STOP_PENDING
SERVICE_RUNNING ɋɥɭɠɛɚ ɜɵɩɨɥɧɹɟɬɫɹ
SERVICE CONTINUE_PENDING
ɋɥɭɠɛɚ ɧɚɯɨɞɢɬɫɹ ɧɚ ɫɬɚɞɢɢ
ɡɚɩɭɫɤɚ, ɧɨ ɩɨɤɚ ɧɟ ɝɨɬɨɜɚ ɨɬɜɟɱɚɬɶ
ɧɚ ɡɚɩɪɨɫɵ. ɇɚɩɪɢɦɟɪ, ɦɨɝɭɬ ɟɳɟ
ɧɟ ɛɵɬɶ ɡɚɩɭɳɟɧɵ ɪɚɛɨɱɢɟ ɩɨɬɨɤɢ
ɋɥɭɠɛɚ ɧɚɯɨɞɢɬɫɹ ɧɚ ɫɬɚɞɢɢ
ɨɫɬɚɧɨɜɚ, ɧɨ ɟɳɟ ɧɟ ɡɚɜɟɪɲɢɥɚ
ɫɜɨɟɝɨ ɜɵɩɨɥɧɟɧɢɹ. ɇɚɩɪɢɦɟɪ, ɦɨɝ
ɛɵɬɶ ɭɫɬɚɧɨɜɥɟɧ ɝɥɨɛɚɥɶɧɵɣ ɮɥɚɝ
ɡɚɜɟɪɲɟɧɢɹ, ɧɨ ɪɚɛɨɱɢɟ ɩɨɬɨɤɢ
ɟɳɟ ɧɟ ɭɫɩɟɥɢ
ɧɚ ɷɬɨ ɨɬɪɟɚɝɢɪɨɜɚɬɶ
ɋɥɭɠɛɚ ɩɟɪɟɯɨɞɢɬ ɜ ɫɨɫɬɨɹɧɢɟ ɜɵɩɨɥɧɟɧɢɹ ɩɨɫɥɟ ɧɚɯɨɠɞɟɧɢɹ
ɜ ɫɨɫɬɨɹɧɢɢ ɩɚɭɡɵ
155
Ɂɧɚɱɟɧɢɟ Ɉɩɢɫɚɧɢɟ
SERVICE_PAUSE_PENDING
SERVICE_PAUSED
ɇɟɤɨɬɨɪɵɟ ɤɨɞɵ, ɜɨɫɩɪɢɧɢɦɚɟɦɵɟ ɫɥɭɠɛɨɣ
Ɂɧɚɱɟɧɢɟ Ɉɩɢɫɚɧɢɟ
SERVICE_ACCEPT_STOP
SERVICE_ACCEPT_PAUSE_CONTINUE
SERVICE_ACCEPT_SHUTDOWN
Ɉ ɤ ɨ ɧ ɱ ɚ ɧ ɢ ɟ ɬ ɚ ɛ ɥ ɢ ɰ ɵ 4.2
ɋɥɭɠɛɚ ɩɟɪɟɯɨɞɢɬ ɜ ɫɨɫɬɨɹɧɢɟ
ɩɚɭɡɵ, ɧɨ ɟɟ ɛɟɡɨɩɚɫɧɨɟ
ɧɚɯɨɠɞɟɧɢɟ ɜ ɷɬɨɦ ɫɨɫɬɨɹɧɢɢ ɩɨɤɚ
ɧɟ ɨɛɟɫɩɟɱɟɧɨ
ɋɥɭɠɛɚ ɧɚɯɨɞɢɬɫɹ ɜ ɫɨɫɬɨɹɧɢɢ
ɩɚɭɡɵ
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 4.3
Ɋɚɡɪɟɲɚɟɬ ɩɨɫɵɥɤɭ
ɤɨɦɚɧɞɵ ɨɫɬɚɧɨɜɚ
Ɋɚɡɪɟɲɚɟɬ ɩɨɫɵɥɤɭ ɤɨɦɚɧɞ
ɩɚɭɡɵ ɢ ɩɪɨɞɨɥɠɟɧɢɹ
ɪɚɛɨɬɵ
ɍɜɟɞɨɦɥɹɟɬ ɫɥɭɠɛɭ
ɨ ɩɪɟɤɪɚɳɟɧɢɢ ɪɚɛɨɬɵ
ɫɢɫɬɟɦɵ. ɗɬɨ ɞɚɟɬ ɫɢɫɬɟɦɟ
ɜɨɡɦɨɠɧɨɫɬɶ ɩɨɫɥɚɬɶ
ɫɥɭɠɛɟ ɤɨɦɚɧɞɭ
ɜɵɤɥɸɱɟɧɢɹ
Ɍɪɟɛɭɟɬɫɹ ɫɢɫɬɟɦɚɦ NT5.
Ɉɛɟɫɩɟɱɢɜɚɟɬ ɢɡɦɟɧɟɧɢɟ
SERVICE_ACCEPT_PARAMCHANGE
ɩɚɪɚɦɟɬɪɨɜ ɡɚɩɭɫɤɚ
ɛɟɡ ɜɵɩɨɥɧɟɧɢɹ ɫɚɦɨɝɨ
ɩɟɪɟɡɚɩɭɫɤɚ
4.1.4. ɉɪɨɝɪɚɦɦɧɵɣ ɤɨɞ ɫɥɭɠɛɵ
ɉɨɫɥɟ ɬɨɝɨ ɤɚɤ ɨɛɪɚɛɨɬɱɢɤ ɡɚɪɟɝɢɫɬɪɢɪɨɜɚɧ, ɢ ɫɥɭɠɛɚ ɧɚɯɨɞɢɬɫɹ ɜ ɫɨɫɬɨɹ­ɧɢɢ SERVICE_START_PENDING, ɨɧɚ ɦɨɠɟɬ ɢɧɢɰɢɚɥɢɡɢɪɨɜɚɬɶ ɫɟɛɹ ɢ ɜɧɨɜɶ ɭɫɬɚɧɨɜɢɬɶ ɫɜɨɟ ɫɨɫɬɨɹɧɢɟ.
Ɉɛɪɚɛɨɬɱɢɤ ɭɩɪɚɜɥɹɸɳɢɯ ɤɨɦɚɧɞ ɫɥɭɠɛɵ, ɨɩɪɟɞɟɥɹɟɦɵɣ ɫ ɩɨɦɨɳɶɸ ɮɭɧɤɰɢɢ RegisterServiceCtrlHandlerEx, ɢɦɟɟɬ ɫɥɟɞɭɸɳɢɣ ɩɪɨɬɨɬɢɩ:
DWORD WINAPI HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext),
ɝɞɟ dwControl – ɭɩɪɚɜɥɹɸɳɚɹ ɤɨɦɚɧɞɚ, ɩɨɫɬɭɩɢɜɲɚɹ ɜ ɨɛɪɚɛɨɬɱɢɤ ɨɬ SCM (ɫɦ. ɬɚɛɥ. 4.4);
156
g
dwEventType – ɨɩɪɟɞɟɥɹɟɬ ɞɨɩɨɥɧɢɬɟɥɶɧɭɸ ɢɧɮɨɪɦɚɰɢɸ, ɤɨɬɨɪɚɹ ɬɪɟɛɭɟɬɫɹ ɫɨɨɬɜɟɬɫɬɜɭɸɳɢɦ ɫɨɛɵɬɢɹɦ (ɨɛɵɱɧɨ ɩɪɢɧɢɦɚɟɬ ɡɧɚɱɟɧɢɟ 0);
lpContext – ɩɨɥɶɡɨɜɚɬɟɥɶɫɤɢɟ ɞɚɧɧɵɟ, ɩɟɪɟɞɚɜɚɟɦɵɟ ɜ ɮɭɧɤɰɢɸ Regis­terServiceCtrlHandlerEx ɜɨ ɜɪɟɦɹ ɪɟɝɢɫɬɪɚɰɢɢ ɨɛɪɚɛɨɬɱɢɤɚ.
Ɍ ɚ ɛ ɥ ɢ ɰ ɚ 4.4 Ʉɨɧɫɬɚɧɬɵ ɞɥɹ ɩɚɪɚɦɟɬɪɚ dwControl Ʉɨɧɫɬɚɧɬɚ ɇɚɡɧɚɱɟɧɢɟ
ȼɪɟɦɟɧɧɨ ɨɫɬɚɧɨɜɥɟɧɧɚɹ
SERVICE_CONTROL_CONTINUE
ɫɥɭɠɛɚ ɞɨɥɠɧɚ
ɜɨɡɨɛɧɨɜɢɬɶ ɪɚɛɨɬɭ
ɋɥɭɠɛɚ ɞɨɥɠɧɚ ɫɨɨɛɳɢɬɶ
ɢɧɮɨɪɦɚɰɢɸ ɨ ɫɜɨɟɦ
SERVICE_CONTROL_INTERROGATE
ɬɟɤɭɳɟɦ ɫɨɫɬɨɹɧɢɢ
ɞɢɫɩɟɬɱɟɪɭ ɭɩɪɚɜɥɟɧɢɹ
ɫɥɭɠɛɚɦɢ (SCM)
ɍɜɟɞɨɦɥɹɟɬ ɫɟɬɟɜɭɸ
ɫɥɭɠɛɭ, ɱɬɨ ɟɫɬɶ ɧɨɜɵɣ
ɤɨɦɩɨɧɟɧɬ
ɞɥɹ ɫɨɟɞɢɧɟɧɢɹ ɢ ɫɥɭɠɛɚ
SERVICE_CONTROL_NETBINDADD
ɞɨɥɠɧɚ ɫɨɟɞɢɧɢɬɶɫɹ ɫ
ɧɢɦ. ɉɪɢɥɨɠɟɧɢɟ ɜɦɟɫɬɨ
ɧɟɝɨ ɞɨɥɠɧɨ
ɢɫɩɨɥɶɡɨɜɚɬɶ ɮɭɧɤɰɢ-
ɨɧɚɥɶɧɵɟ ɜɨɡɦɨɠɧɨɫɬɢ
Plu
and Play
ɍɜɟɞɨɦɥɹɟɬ ɫɟɬɟɜɭɸ
ɫɥɭɠɛɭ, ɱɬɨ ɨɞɧɚ ɢɡ ɟɝɨ
ɫɜɹɡɟɣ ɡɚɛɥɨɤɢɪɨɜɚɧɚ. ɋɥɭɠɛɚ ɨɛɧɨɜɥɹɟɬ ɢɧ-
SERVICE_CONTROL_NETBINDDISABLE
ɮɨɪɦɚɰɢɸ ɨ ɫɜɹɡɵɜɚɧɢɢ
ɢ ɭɞɚɥɹɟɬ ɷɬɭ ɫɜɹɡɶ. ɉɪɢ-
ɥɨɠɟɧɢɟ ɜɦɟɫɬɨ ɧɟɝɨ ɞɨɥɠɧɨ ɢɫɩɨɥɶɡɨɜɚɬɶ ɮɭɧɤɰɢɨɧɚɥɶɧɵɟ ɜɨɡ-
ɦɨɠɧɨɫɬɢ Plug and Play
157
Ʉɨɧɫɬɚɧɬɚ ɇɚɡɧɚɱɟɧɢɟ
SERVICE_CONTROL_NETBINDENABLE
SERVICE_CONTROL_NETBINDREMOVE
SERVICE_CONTROL_PARAMCHANGE
SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_SHUTDOWN
SERVICE_CONTROL_STOP
Ɉ ɤ ɨ ɧ ɱ ɚ ɧ ɢ ɟ ɬ ɚ ɛ ɥ ɢ ɰ ɵ 4.4
ɍɜɟɞɨɦɥɹɟɬ ɫɟɬɟɜɭɸ
ɫɥɭɠɛɭ, ɱɬɨ ɨɬɤɥɸɱɟɧɧɨɟ ɫɜɹɡɵɜɚɧɢɟ ɜɤɥɸɱɢɥɨɫɶ ɜ
ɪɚɛɨɬɭ. ɋɥɭɠɛɚ ɞɨɥɠɧɚ
ɨɛɧɨɜɢɬɶ ɢɧɮɨɪɦɚɰɢɸ ɨ
ɫɜɹɡɵɜɚɧɢɢ ɢ ɞɨɛɚɜɢɬɶ
ɧɨɜɨɟ ɫɜɹɡɵɜɚɧɢɟ.
ȼɦɟɫɬɨ ɧɟɝɨ ɩɪɢɥɨɠɟɧɢɟ
ɞɨɥɠɧɨ ɢɫɩɨɥɶɡɨɜɚɬɶ
ɮɭɧɤɰɢɨɧɚɥɶɧɵɟ ɜɨɡ-
ɦɨɠɧɨɫɬɢ Plug and Play
ɍɜɟɞɨɦɥɹɟɬ ɫɟɬɟɜɭɸ
ɫɥɭɠɛɭ, ɱɬɨ ɤɨɦɩɨɧɟɧɬ
ɞɥɹ ɫɜɹɡɵɜɚɧɢɹ ɛɵɥ ɭɞɚ-
ɥɟɧ. ɋɥɭɠɛɚ ɞɨɥɠɧɚ ɨɛ-
ɧɨɜɢɬɶ ɢɧɮɨɪɦɚɰɢɸ ɫɜɹ-
ɡɵɜɚɧɢɹ ɢ ɭɞɚɥɢɬɶ ɫɜɹɡɵ-
ɜɚɧɢɟ ɫ ɭɞɚɥɟɧɧɵɦ ɤɨɦ-
ɩɨɧɟɧɬɨɦ.
ȼɦɟɫɬɨ ɷɬɨɝɨ ɩɪɢɥɨɠɟɧɢɹ
ɞɨɥɠɧɵ ɢɫɩɨɥɶɡɨɜɚɬɶ
ɮɭɧɤɰɢɨɧɚɥɶɧɵɟ ɜɨɡɦɨɠ-
ɧɨɫɬɢ Plug and Play
ɍɜɟɞɨɦɥɹɟɬ ɫɥɭɠɛɭ, ɱɬɨ ɫɩɟɰɢɚɥɶɧɵɟ ɞɥɹ ɧɟɟ ɩɚ-
ɪɚɦɟɬɪɵ ɡɚɩɭɫɤɚ ɢɡɦɟ-
ɧɢɥɢɫɶ. ɋɥɭɠɛɚ ɞɨɥɠɧɚ
ɨɛɧɨɜɢɬɶ ɩɚɪɚɦɟɬɪɵ
ɡɚɩɭɫɤɚ
ɍɜɟɞɨɦɥɹɟɬ ɫɥɭɠɛɭ, ɱɬɨ
ɨɧɚ ɞɨɥɠɧɚ ɫɞɟɥɚɬɶ ɩɚɭɡɭ
ɍɜɟɞɨɦɥɹɟɬ ɫɥɭɠɛɭ ɨ ɬɨɦ,
ɱɬɨ ɫɢɫɬɟɦɚ ɡɚɤɪɵɜɚɟɬɫɹ
ɬɚɤɢɦ ɨɛɪɚɡɨɦ, ɱɬɨ
ɫɥɭɠɛɚ ɦɨɠɟɬ ɜɵɩɨɥɧɢɬɶ
ɡɚɞɚɱɢ ɨɱɢɫɬɤɢ
ɍɜɟɞɨɦɥɹɟɬ ɫɥɭɠɛɭ ɨ ɬɨɦ,
ɱɬɨ ɨɧɚ ɞɨɥɠɧɚ
ɨɫɬɚɧɨɜɢɬɶɫɹ
158
ȼɨɡɜɪɚɳɚɟɦɨɟ ɡɧɚɱɟɧɢɟ ɞɥɹ ɮɭɧɤɰɢɢ HandlerEx ɡɚɜɢɫɢɬ ɨɬ ɩɨ-
ɥɭɱɟɧɧɨɝɨ ɭɩɪɚɜɥɹɸɳɟɝɨ ɤɨɞɚ:
ɟɫɥɢ ɫɥɭɠɛɚ ɧɟ ɨɛɪɚɛɚɬɵɜɚɟɬ ɭɩɪɚɜɥɟɧɢɟ, ɮɭɧɤɰɢɹ ɜɨɡɜɪɚɬɢɬ ɡɧɚɱɟɧɢɟ
ERROR_CALL_NOT_IMPLEMENTED;
ɟɫɥɢ ɫɥɭɠɛɚ ɨɛɪɚɛɚɬɵɜɚɟɬ SERVICE_CONTROL_ DEVICEEVENT,
ɮɭɧɤɰɢɹ ɜɨɡɜɪɚɬɢɬ ɡɧɚɱɟɧɢɟ NO_ERROR, ɱɬɨɛɵ ɪɚɡɪɟɲɢɬɶ ɡɚɩɪɨɫ ɢ ɤɨɞ ɨɲɢɛ­ɤɢ, ɤɨɬɨɪɚɹ ɨɬɜɟɪɝɚɟɬ ɡɚɩɪɨɫ;
ɟɫɥɢ ɫɥɭɠɛɚ ɨɛɪɚɛɚɬɵɜɚɟɬ SERVICE_CONTROL_ HARDWAREPRO-
FILECHANGE, ɮɭɧɤɰɢɹ ɜɨɡɜɪɚɬɢɬ ɡɧɚɱɟɧɢɟ NO_ERROR, ɱɬɨɛɵ ɪɚɡɪɟɲɢɬɶ
ɡɚ-
ɩɪɨɫ ɢ ɤɨɞ ɨɲɢɛɤɢ, ɤɨɬɨɪɚɹ ɨɬɜɟɪɝɚɟɬ ɡɚɩɪɨɫ;
ɟɫɥɢ ɫɥɭɠɛɚ ɨɛɪɚɛɚɬɵɜɚɟɬ SERVICE_CONTROL_ POWEREVENT, ɮɭɧɤ-
ɰɢɹ ɜɨɡɜɪɚɬɢɬ ɡɧɚɱɟɧɢɟ NO_ERROR, ɱɬɨɛɵ ɪɚɡɪɟɲɢɬɶ ɡɚɩɪɨɫ ɢ ɤɨɞ ɨɲɢɛɤɢ, ɤɨ­ɬɨɪɚɹ ɨɬɜɟɪɝɚɟɬ ɡɚɩɪɨɫ.
Ⱦɥɹ ɜɫɟɯ ɞɪɭɝɢɯ ɭɩɪɚɜɥɹɸɳɢɯ ɤɨɞɨɜ, ɤɨɬɨɪɵɟ ɨɛɪɚɛɚɬɵɜɚɸɬ ɫɥɭɠɛɵ, ɜɨɡ-
ɜɪɚɳɚɸɬɫɹ ɡɧɚɱɟɧɢɹ NO_ERROR.
Ʉɨɝɞɚ ɫɥɭɠɛɚ ɡɚɩɭɫɤɚɟɬɫɹ, ɟɟ ɮɭɧɤɰɢɹ ServiceMain ɞɨɥɠɧɚ ɧɟ-
ɦɟɞɥɟɧɧɨ ɜɵɡɜɚɬɶ ɮɭɧɤɰɢɸ
RegisterServiceCtrlHandlerEx, ɱɬɨɛɵ ɨɩɪɟɞɟɥɢɬɶ ɮɭɧɤɰɢɸ HandlerEx, ɤɨɬɨɪɚɹ ɨɛɪɚɛɚɬɵɜɚɟɬ ɡɚɩɪɨɫɵ ɧɚ ɭɩɪɚɜɥɟ­ɧɢɟ. ɑɬɨɛɵ ɨɩɪɟɞɟɥɢɬɶ ɭɩɪɚɜɥɹɸɳɢɟ ɤɨɞɵ, ɤɨɬɨɪɵɟ ɛɭɞɭɬ ɩɪɢɧɹɬɵ, ɢɫɩɨɥɶ­ɡɭɣɬɟ ɮɭɧɤɰɢɢ SetServiceStatus ɢ RegisterDeviceNotification.
Ⱦɢɫɩɟɬɱɟɪ ɭɩɪɚɜɥɟɧɢɹ ɜ ɩɪɟɞɟɥɚɯ ɝɥɚɜɧɨɝɨ ɩɨɬɨɤɚ ɩɪɨɰɟɫɫɚ ɫɥɭɠɛɵ ɜɵɡɵ­ɜɚɟɬ ɮɭɧɤɰɢɸ ɨɛɪɚɛɨɬɤɢ ɭɩɪɚɜɥɟɧɢɹ ɞɥɹ ɭɤɚɡɚɧɧɨɣ ɫɥɭɠɛɵ ɜɫɹɤɢɣ ɪɚɡ, ɤɨɝɞɚ ɨɧ ɩɨɥɭɱɚɟɬ ɡɚɩɪɨɫ ɧɚ ɭɩɪɚɜɥɟɧɢɟ ɨɬ ɞɢɫɩɟɬɱɟɪɚ ɭɩɪɚɜɥɟɧɢɹ
ɫɥɭɠɛɚɦɢ. ɉɨɫɥɟ ɨɛɪɚɛɨɬɤɢ ɡɚɩɪɨɫɚ ɧɚ ɭɩɪɚɜɥɟɧɢɟ, ɨɛɪɚɛɚɬɵɜɚɸɳɚɹ ɩɪɨɝɪɚɦɦɚ ɭɩɪɚɜɥɟɧɢɹ ɞɨɥɠɧɚ ɜɵɡɜɚɬɶ ɮɭɧɤɰɢɸ SetServiceStatus, ɱɬɨɛɵ ɫɨɨɛɳɢɬɶ ɨ ɟɟ ɬɟɤɭɳɟɦ ɫɨɫɬɨɹɧɢɢ ɞɢɫɩɟɬɱɟɪɭ ɭɩɪɚɜɥɟɧɢɹ ɫɥɭɠɛɚɦɢ.
Ʉɨɝɞɚ ɞɢɫɩɟɬɱɟɪ ɭɩɪɚɜɥɟɧɢɹ ɫɥɭɠɛɚɦɢ ɨɬɩɪɚɜɥɹɟɬ ɭɩɪɚɜɥɹɸɳɢɣ ɤɨɞ ɫɥɭɠɛɟ, ɨɧ ɠɞɟɬ ɨɛɪɚɛɨɬɱɢɤɚ ɮɭɧɤɰɢɢ, ɱɬɨɛɵ ɜɨɡɜɪɚɬɢɬɶ ɡɧɚɱɟɧɢɟ ɩɟɪɟɞ ɨɬ­ɩɪɚɜɤɨɣ ɞɨɩɨɥɧɢɬɟɥɶɧɵɯ ɭɩɪɚɜɥɹɸɳɢɯ ɤɨɞɨɜ ɞɪɭɝɢɦ ɫɥɭɠɛɚɦ. ȿɫɥɢ ɨɛɪɚɛɨɬ­ɱɢɤ ɮɭɧɤɰɢɢ ɧɟ
ɜɨɡɜɪɚɳɚɟɬ ɡɧɚɱɟɧɢɟ ɛɵɫɬɪɨ, ɞɢɫɩɟɬɱɟɪ ɦɨɠɟɬ ɡɚɛɥɨɤɢɪɨɜɚɬɶ
ɞɪɭɝɢɟ ɫɥɭɠɛɵ, ɱɬɨɛɵ ɨɧɢ ɧɟ ɩɨɥɭɱɢɥɢ ɭɩɪɚɜɥɹɸɳɢɯ ɤɨɞɨɜ.
ɍɩɪɚɜɥɹɸɳɢɣ ɤɨɞ SERVICE_CONTROL_SHUTDOWN ɞɨɥɠɟɧ ɨɛɪɚɛɚɬɵ­ɜɚɬɶɫɹ ɬɨɥɶɤɨ ɫɥɭɠɛɚɦɢ, ɤɨɬɨɪɵɟ ɞɨɥɠɧɵ ɨɱɢɳɚɬɶɫɹ ɜ ɯɨɞɟ ɡɚɤɪɵɬɢɹ, ɩɨɬɨɦɭ ɢɦɟɟɬɫɹ ɬɨɥɶɤɨ ɨɝɪɚɧɢɱɟɧɧɨɟ ɜɪɟɦɹ (ɨɤɨɥɨ 20 ɫɟɤɭɧɞ), ɞɨɫɬɭɩɧɨɟ ɞɥɹ ɡɚɤɪɵɬɢɹ ɫɥɭɠɛɵ. ɉɨɫɥɟ ɬɨɝɨ, ɤɚɤ ɷɬɨ ɜɪɟɦɹ ɢɫɬɟɤɚɟɬ, ɫɢɫɬɟɦɚ ɜɨɡɨɛɧɨɜɥɹɟɬ ɩɪɨɰɟɫɫ ɡɚ­ɤɪɵɬɢɹ ɧɟɡɚɜɢɫɢɦɨ
ɨɬ ɬɨɝɨ, ɡɚɜɟɪɲɚɟɬɫɹ ɥɢ ɡɚɤɪɵɬɢɟ ɫɥɭɠɛɵ ɩɨɥɧɨɫɬɶɸ.
ȼɧɢɦɚɧɢɟ! ȿɫɥɢ ɫɢɫɬɟɦɭ ɨɫɬɚɜɢɬɶ ɜ ɫɨɫɬɨɹɧɢɢ ɡɚɤɪɵɬɢɹ (ɧɟ ɩɟɪɟɡɚɩɭ­ɫɬɢɬɶ ɢɥɢ ɧɟ ɜɵɤɥɸɱɢɬɶ ɩɢɬɚɧɢɟ), ɫɥɭɠɛɚ ɩɪɨɞɨɥɠɢɬ ɡɚɩɭɫɤɚɬɶɫɹ.
ȿɫɥɢ ɫɥɭɠɛɚ ɬɪɟɛɭɟɬ ɛɨɥɶɲɟɝɨ ɜɪɟɦɟɧɢ ɞɥɹ ɨɱɢɫɬɤɢ ɩɚɦɹɬɢ, ɨɧɚ ɞɨɥɠɧɚ ɨɬɩɪɚɜɢɬɶ ɫɨɨɛɳɟɧɢɹ ɨ ɫɨɫɬɨɹɧɢɢ STOP_PENDING, ɧɚɪɹɞɭ ɫ ɭɤɚɡɚɧɢɟɦ ɨɠɢɞɚ­ɧɢɹ. Ɍɚɤɢɦ ɨɛɪɚɡɨɦ, ɦɵ ɨɩɨɜɟɳɚɟɦ ɞɢɫɩɟɬɱɟɪ ɫɥɭɠɛɵ ɨ
ɬɨɦ, ɤɚɤ ɞɨɥɝɨ ɠɞɚɬɶ ɩɟɪɟɞ ɨɩɨɜɟɳɟɧɢɟɦ ɜ ɫɢɫɬɟɦɟ, ɱɬɨ ɡɚɤɪɵɬɢɟ ɫɥɭɠɛɵ ɡɚɜɟɪɲɟɧɨ ɩɨɥɧɨɫɬɶɸ. ɑɬɨɛɵ ɜɨɫɩɪɟɩɹɬɫɬɜɨɜɚɬɶ ɫɥɭɠɛɟ ɨɫɬɚɧɨɜɢɬɶ ɡɚɤɪɵɬɢɟ, ɡɚɞɚɣɬɟ ɥɢɦɢɬ ɜɪɟɦɟɧɢ
159
ɞɢɫɩɟɬɱɟɪɭ ɫɥɭɠɛɵ. ɑɬɨɛɵ ɢɡɦɟɧɹɬɶ ɷɬɨɬ ɢɧɬɟɪɜɚɥ, ɦɨɞɢɮɢɰɢɪɭɣɬɟ ɡɧɚɱɟɧɢɟ
WaitToKillServiceTimeout ɜ ɫɥɟɞɭɸɳɟɦ ɤɥɸɱɟ ɪɟɟɫɬɪɚ:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control
ɍɛɟɞɢɬɟɫɶ, ɱɬɨ ɨɛɪɚɛɨɬɤɚ ɫɨɛɵɬɢɣ ɭɫɬɪɨɣɫɬɜɚ «Plug and Play» ɩɪɨɢɫɯɨɞɢɬ ɧɚɫɤɨɥɶɤɨ ɦɨɠɧɨ ɛɵɫɬɪɟɟ, ɢɧɚɱɟ ɫɢɫɬɟɦɚ ɦɨɠɟɬ ɫɬɚɬɶ ɧɟɜɨɫɩɪɢɢɦɱɢɜɨɣ. ȿɫɥɢ ȼɚɲ ɨɛɪɚɛɨɬɱɢɤ ɫɨɛɵɬɢɣ ɞɨɥɠɟɧ ɜɵɩɨɥɧɢɬɶ ɨɩɟɪɚɰɢɸ, ɤɨɬɨɪɚɹ ɦɨɠɟɬ ɛɥɨɤɢ­ɪɨɜɚɬɶ ɜɵɩɨɥɧɟɧɢɟ (ɬɢɩɚ ɨɩɟɪɚɰɢɢ ɜɜɨɞɚ-ɜɵɜɨɞɚ), ɥɭɱɲɟ ɡɚɩɭɫɬɢɬɶ ɞɪɭɝɨɣ ɩɨ­ɬɨɤ, ɱɬɨɛɵ ɜɵɩɨɥɧɢɬɶ ɧɭɠɧɭɸ
ɨɩɟɪɚɰɢɸ ɚɫɢɧɯɪɨɧɧɨ.
Ɉɛɪɚɛɨɬɱɢɤ ɚɤɬɢɜɢɡɢɪɭɟɬɫɹ SCM ɜ ɬɨɦ ɠɟ ɩɨɬɨɤɟ, ɱɬɨ ɢ ɨɫɧɨɜɧɚɹ ɩɪɨ­ɝɪɚɦɦɚ, ɢ ɨɛɵɱɧɨ ɫɨɞɟɪɠɢɬ ɪɹɞ ɨɩɟɪɚɬɨɪɨɜ switch.
4.2. Ⱦɟɦɨɧɵ Linux [10]
4.2.1. Ȼɚɡɨɜɵɟ ɩɨɥɨɠɟɧɢɹ
ɉɨɫɥɟ ɡɚɩɭɫɤɚ ɞɟɦɨɧ ɜɵɩɨɥɧɹɟɬ ɩɨɞɝɨɬɨɜɢɬɟɥɶɧɵɟ ɞɟɣɫɬɜɢɹ ɜ ɫɥɟɞɭɸɳɟɣ ɩɨɫɥɟɞɨɜɚɬɟɥɶɧɨɫɬɢ:
ɨɬɞɟɥɟɧɢɟ ɨɬ ɪɨɞɢɬɟɥɶɫɤɨɝɨ ɩɪɨɰɟɫɫɚ – ɫɨɡɞɚɧɢɟ ɩɨɞɩɪɨɰɟɫɫɚ;  ɢɡɦɟɧɟɧɢɟ ɮɚɣɥɨɜɨɣ ɦɚɫɤɢ;  ɨɬɤɪɵɬɢɟ ɠɭɪɧɚɥɨɜ ɧɚ ɡɚɩɢɫɶ; ɫɨɡɞɚɧɢɟ ɭɧɢɤɚɥɶɧɨɝɨ ɢɞɟɧɬɢɮɢɤɚɬɨɪɚ ɫɟɚɧɫɚ (sid);  ɢɡɦɟɧɟɧɢɟ ɬɟɤɭɳɟɝɨ ɪɚɛɨɱɟɝɨ ɤɚɬɚɥɨɝɚ ɧɚ ɛɟɡɨɩɚɫɧɵɣ;  ɡɚɤɪɵɬɢɟ ɫɬɚɧɞɚɪɬɧɵɯ ɮɚɣɥɨɜɵɯ ɨɩɢɫɚɬɟɥɟɣ;  ɩɟɪɟɯɨɞ ɤ ɤɨɞɭ ɫɨɛɫɬɜɟɧɧɨ ɞɟɦɨɧɚ
.
Ⱦɟɦɨɧ ɡɚɩɭɫɤɚɟɬɫɹ ɫɚɦɨɣ ɫɢɫɬɟɦɨɣ, ɩɨɥɶɡɨɜɚɬɟɥɟɦ ɜ ɬɟɪɦɢɧɚɥɟ ɢɥɢ ɱɟɪɟɡ ɫɰɟɧɚɪɢɣ. ȼɨ ɜɪɟɦɹ ɡɚɩɭɫɤɚ ɟɝɨ ɩɪɨɰɟɫɫ ɧɢɱɟɦ ɧɟ ɨɬɥɢɱɚɟɬɫɹ ɨɬ ɥɸɛɨɝɨ ɞɪɭɝɨ­ɝɨ ɩɪɨɰɟɫɫɚ ɜ ɫɢɫɬɟɦɟ. ɑɬɨɛɵ ɫɞɟɥɚɬɶ ɟɝɨ ɩɨ-ɧɚɫɬɨɹɳɟɦɭ ɚɜɬɨɧɨɦɧɵɦ, ɧɭɠɧɨ ɫɨɡɞɚɬɶ ɞɨɱɟɪɧɢɣ ɩɪɨɰɟɫɫ, ɜ ɤɨɬɨɪɨɦ ɛɭɞɟɬ ɜɵɩɨɥɧɹɬɶɫɹ ɤɨɞ ɞɟɦɨɧɚ, ɞɥɹ ɱɟɝɨ ɢɫɩɨɥɶɡɭɟɬɫɹ ɮɭɧɤɰɢɹ fork().
Ɏɭɧɤɰɢɹ fork() ɜɨɡɜɪɚɳɚɟɬ ɥɢɛɨ ɢɞɟɧɬɢɮɢɤɚɬɨɪ
ɞɨɱɟɪɧɟɝɨ ɩɪɨɰɟɫɫɚ
PID, ɧɟ ɪɚɜɧɵɣ ɧɭɥɸ, ɥɢɛɨ –1 ɜ ɫɥɭɱɚɟ ɨɲɢɛɤɢ. ȿɫɥɢ ɩɨɥɭɱɟɧɢɟ PID ɨɬ fork() ɩɪɨɲɥɨ ɭɫɩɟɲɧɨ, ɬɨ ɪɨɞɢɬɟɥɶɫɤɢɣ ɩɪɨɰɟɫɫ ɞɨɥɠɟɧ ɡɚɜɟɪɲɢɬɶɫɹ.
ɉɪɢɦɟɪ 4.7. ɉɨɥɭɱɟɧɢɟ ɢɞɟɧɬɮɢɤɚɬɨɪɚ ɩɪɨɰɟɫɫɚ Linux ɢ ɨɬɞɟɥɟɧɢɟ ɨɬ ɪɨ­ɞɢɬɟɥɶɫɤɨɝɨ ɩɪɨɰɟɫɫɚ.
pid_t pid; /* ɨɬɞɟɥɟɧɢɟ ɨɬ ɪɨɞɢɬɟɥɶɫɤɨɝɨ ɩɪɨɰɟɫɫɚ */ pid = fork(); /* ȿɫɥɢ ɢɞɟɧɬɢɮɢɤɚɬɨɪ ɩɪɨɰɟɫɫɚ ɧɟ ɩɨɥɭɱɟɧ, ɬɨ ɜɵɯɨɞ
*/ if (pid < 0) exit(EXIT_FAILURE); /* ȿɫɥɢ ɢɞɟɧɬɢɮɢɤɚɬɨɪ ɩɪɨɰɟɫɫɚ ɩɨɥɭɱɟɧ, ɬɨ
ɪɨɞɢɬɟɥɶ-
ɫɤɢɣ ɩɪɨɰɟɫɫ ɦɨɠɧɨ ɡɚɜɟɪɲɚɬɶ. */
else exit(EXIT_SUCCESS);
160
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]