Джонсон Харт - Системное программирование в среде Windows

Тут можно читать онлайн Джонсон Харт - Системное программирование в среде Windows - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Издательский дом Вильямс, год 2005. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Системное программирование в среде Windows
  • Автор:
  • Жанр:
  • Издательство:
    Издательский дом Вильямс
  • Год:
    2005
  • Город:
    Москва • Санкт-Петербург • Киев
  • ISBN:
    5-8459-0879-5
  • Рейтинг:
    4.22/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Джонсон Харт - Системное программирование в среде Windows краткое содержание

Системное программирование в среде Windows - описание и краткое содержание, автор Джонсон Харт, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Эта книга посвящена вопросам разработки приложений с использованием интерфейса прикладного программирования операционных систем компании Microsoft (Windows 9х, Windows XP, Windows 2000 и Windows Server 2003). Основное внимание уделяется базовым системным службам, включая управление файловой системой, процессами и потоками, взаимодействие между процессами, сетевое программирование и синхронизацию. Рассматривается методика переноса приложений, написанных в среде Win32, в среду Win64. Подробно описываются все аспекты системы безопасности Windows и ее практического применения. Изобилие реальных примеров, доступных также и на Web-сайте книги, существенно упрощает усвоение материала.

Книга ориентирована на разработчиков и программистов, как высокой квалификации, так и начинающих, а также будет полезна для студентов соответствующих специальностей.

Системное программирование в среде Windows - читать онлайн бесплатно полную версию (весь текст целиком)

Системное программирование в среде Windows - читать книгу онлайн бесплатно, автор Джонсон Харт
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать
Программа 13.3. ServiceShell: программа управления службами

/* Глава 13. */

/* ServiceShell.с. Программа командной оболочки управления службами Windows.

Эта программа является видоизмененным вариантом программы управления задачами из главы 6, но только управляет службами, а не задачами. */

/* Поддерживаемые команды:

create — создание службы

delete – удаление службы

start – запуск службы

control – управление службой */

#include "EvryThng.h"

static SC_HANDLE hScm;

static BOOL Debug;

int _tmain(int argc, LPTSTR argv[]) {

BOOL Exit = FALSE;

TCHAR Command[MAX_COMMAND_LINE + 10], *pc;

DWORD i, LocArgc; /* Локальный параметр argc. */

TCHAR argstr[MAX_ARG][MAX_COMMAND_LINE];

LPTSTR pArgs[MAX_ARG];

/* Подготовить локальный массив "argv" в виде указателей на строки. */

for (i = 0; i < MAX_ARG; i++) pArgs[i] = argstr[i];

/* Открыть диспетчер управления службами на локальной машине. */

hScm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

/* Главный цикл обработки команд. */

_tprintf(_T("\nУправление службами Windows Services"));

while (!Exit) {

_tprintf(_T ("\nSM$"));

_fgetts(Command, MAX_COMMAND_LINE, stdin);

… Как для JobShell …

if (_tcscmp(argstr [0], _T("create")) == 0) {

Create(LocArgc, pArgs, Command);

}

… Аналогичным образом для всех команд …

}

CloseServiceHandle(hScm);

return 0;

}

int Create(int argc, LPTSTR argv[], LPTSTR Command) {

/* Создание новой службы в виде службы, запускаемой "по требованию":

argv[1]: имя службы

argv[2]: отображаемое имя службы

argv[3]: название исполняемого файла */

SC_HANDLE hSc;

TCHAR CurrentDir[MAX_PATH +1], Executable[MAX_PATH + 1];

hSc = CreateService(hScm, argv[1], argv[2], SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, Executable, NULL, NULL, NULL, NULL, NULL);

return 0;

}

/* Удаление службы – argv [1]: имя удаляемой службы. */

int Delete(int argc, LPTSTR argv[], LPTSTR Command) {

SC_HANDLE hSc;

hSc = OpenService(hScm, argv[1], DELETE);

DeleteService(hSc);

CloseServiceHandle(hSc);

return 0;

}

/* Запуск именованной службы - argv [1] : имя запускаемой службы. */

int Start(int argc, LPTSTR argv[], LPTSTR Command) {

SC_HANDLE hSc;

TCHAR WorkingDir[MAX_PATH + 1];

LPTSTR pWorkingDir = WorkingDir;

LPTSTR argvStart[] = {argv[1], WorkingDir};

GetCurrentDirectory(MAX_PATH + 1, WorkingDir);

hSc = OpenService(hScm, argv[1], SERVICE_ALL_ACCESS);

/* Запустить службу с одним аргументом — именем рабочего каталога. */

/* Примечание: по умолчанию имя службы совпадает с именем, */

/* связанным с дескриптором hSc посредством функции OpenService. */

/* Вместе с тем, функция ServiceMain это не проверяет. */

StartService(hSc, 2, argvStart);

CloseServiceHandle(hSc);

return 0;

}

/* Управление именованной службой.

argv[1]: имя управляемой службы.

argv[2]: управляющая команда: stop (остановка), pause (пауза), resume (возобновление), interrogate (опрос). */

static LPCTSTR Commands[] = {"stop," "pause," "resume," "interrogate," "user"};

static DWORD Controls[] = {

SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE,

SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_INTERROGATE, 128

};

int Control(int argc, LPTSTR argv[], LPTSTR Command) {

SC_HANDLE hSc;

SERVICE_STATUS ServiceStatus;

DWORD dwControl, i;

BOOL Found = FALSE;

for (i= 0; i < sizeof(Controls)/sizeof(DWORD) && !Found; i++) Found = (_tcscmp(Commands [i], argv[2]) == 0);

if (!Found) {

_tprintf(_T("\nНесуществующая команда управления %s"), argv[1]);

return 1;

}

dwControl = Controls[i – 1];

hSc = OpenService(hScm, argv[1], SERVICE_INTERROGATE | SERVICE_PAUSE_CONTINUE | SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL | SERVICE_QUERY_STATUS);

ControlService(hSc, dwControl, &ServiceStatus);

if (dwControl == SERVICE_CONTROL_INTERROGATE) {

QueryServiceStatus (hSc, &ServiceStatus);

printf(_T("Состояние, полученное при помощи QueryServiceStatus\n"));

printf(_T("Состояние службы\n"));

… Вывести всю остальную информацию о состоянии …

}

if (hSc != NULL) CloseServiceHandle(hSc);

return 0;

}

Совместное использование объектов ядра приложениями и службами

Возможны ситуации, в которых служба и приложения разделяют объект ядра. Например, служба может использовать именованный мьютекс для защиты разделяемой области памяти, используемой для обмена данными с приложениями. Более того, в нашем примере также будет применяться разделяемый объект ядра, которым в данном случае является отображение файла.

Существует одна трудность, связанная с тем, что контекст безопасности приложений отличается от контекста безопасности служб, выполняющихся от имени системной учетной записи. Даже если защита не требуется, было бы нелогично создавать и (или) открывать разделяемые объекты ядра с указателем атрибутов безопасности, установленным в NULL (см. глава 15). Вместо этого необходим, по крайней мере, нулевой список разграничительного контроля доступа (см. главу 15), то есть приложения и служба должны использовать ненулевую структуру атрибутов защиты. В общем случае вы захотите защитить объекты, и этот вопрос также будет рассмотрен в главе 15.

Следует обратить ваше внимание также на то, что если служба выполняется от имени системной учетной записи, то могут возникать трудности с доступом службы к таким ресурсам, как разделяемые файлы, находящиеся на других машинах.

Регистрация событий

Службы часто выполняются, внешне ничем себя не проявляя, без диалогового взаимодействия с пользователем. Некоторые службы создают консоль, окно сообщений [34] Если служба вызывает функцию MessageBox, то в качестве типа окна сообщения следует указать MB_SERVICE_NOTIFICATION. Тогда сообщения будут отображаться на активном рабочем столе, даже если ни один из пользователей еще не успел войти в систему на данном компьютере. или окно для взаимодействия с пользователем, но лучше всего записывать информацию о событиях в файл регистрации событий или использовать соответствующие функциональные возможности, предоставляемые Windows. Такая информация сохраняется в реестре, и ее можно просматривать с помощью специальной программы просмотра событий, предоставляемой группой инструментов Administrative Tools, пиктограмма которой находится в панели управления.

В доступных на Web-сайте книги программах ServiceSK.c и SimpleService.c показано, как организовать регистрацию заслуживающих внимания событий и ошибок в регистрационном файле, а в комментариях к текстам упомянутых программ рассказано о том, как используется регистрация событий. Для этого имеются три функции, описанные в оперативной справочной документации.

1. RegisterEventSource — позволяет получить дескриптор регистрационного файла.

2. ReportEvent — используется для внесения записи в регистрационный файл.

3. DeregisterEventSource — закрывает дескриптор регистрационного файла.

Замечания по отладке службы

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Джонсон Харт читать все книги автора по порядку

Джонсон Харт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Системное программирование в среде Windows отзывы


Отзывы читателей о книге Системное программирование в среде Windows, автор: Джонсон Харт. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x