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


Авторские права

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

Здесь можно скачать бесплатно "Джонсон Харт - Системное программирование в среде Windows" в формате fb2, epub, txt, doc, pdf. Жанр: Программирование, издательство Издательский дом "Вильямс", год 2005. Так же Вы можете читать книгу онлайн без регистрации и SMS на сайте LibFox.Ru (ЛибФокс) или прочесть описание и ознакомиться с отзывами.
Джонсон Харт - Системное программирование в среде Windows
Рейтинг:
Название:
Системное программирование в среде Windows
Издательство:
Издательский дом "Вильямс"
Год:
2005
ISBN:
5-8459-0879-5
Скачать:

99Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания...

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.

Как получить книгу?
Оплатили, но не знаете что делать дальше? Инструкция.

Описание книги "Системное программирование в среде Windows"

Описание и краткое содержание "Системное программирование в среде Windows" читать бесплатно онлайн.



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

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






Наконец, lpContext — пользовательские данные, передаваемые в функцию RegisterServiceCtrlHandlerEx во время регистрации обработчика.

Обработчик активизируется SCM в том же потоке, что и основная программа, и обычно содержит ряд операторов switch, как будет показано в приведенных ниже примерах.

Пример: "интерфейсная оболочка" службы

Программа 13.2 реализует преобразованный вариант программы serverSK, который мы перед этим обсуждали. Преобразование сервера в службу сопряжено с решением всех ранее описанных задач. После внесения незначительных изменений существующий код сервера помещается в функцию ServiceSpecific. Поэтому представленный ниже код, по сути, является оболочкой (wrapper) существующей программы сервера, точка входа которой main заменена на ServiceSpecifiс.

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

Программа 13.2. SimpleService: оболочка службы 

/* Глава 13. serviceSK.c

   Преобразование сервера serverSK в службу Windows.

   Несмотря на рассмотрение частного случая, оболочка имеет универсальный характер. */


#include "EvryThng.h"

#include "ClntSrvr.h"

#define UPDATE_TIME 1000 /* Интервал обновления – 1 секунда. */


VOID LogEvent(LPCTSTR, DWORD, BOOL);

void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]);

VOID WINAPI ServerCtrlHandlerEx(DWORD; DWORD, LPVOID, LPVOID);

void UpdateStatus (int, int); /* Вызывает, функцию SetServiceStatus. */

int ServiceSpecific (int, LPTSTR *); /* Ранее программа main. */

volatile static BOOL ShutDown = FALSE, PauseFlag = FALSE;

static SERVICE_STATUS hServStatus;

static SERVICE_STATUS_HANDLE hSStat; /* Дескриптор, используемый при установке состояния. */


static LPTSTR ServiceName = _T("SocketCommandLineService");

static LPTSTR LogFileName = _T("CommandLineServiceLog.txt");


/* Основная процедура, запускающая диспетчер управления службой. */

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

 SERVICE_TABLE_ENTRY DispatchTable[] = {

  { ServiceName, ServiceMain }, { NULL, NULL }

 };

 StartServiceCtrlDispatcher(DispatchTable);

 return 0;

}


/* Точка входа ServiceMain, вызываемая при создании службы. */

void WINAPI ServiceMain(DWORD argc, LPTSTR argv[]) {

 DWORD i, Context = 1;

 /* Установить текущий каталог и открыть файл журнала, присоединяемый к существующему файлу. */

 /* Определить все элементы структуры состояния сервера. */

 hServStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;

 hServStatus.dwCurrentState = SERVICE_START_PENDING;

 hServStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_PAUSE_CONTINUE;

 hServStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIF0C_ERROR;

 hServStatus.dwServiceSpecificExitCode = 0;

 hServStatus.dwCheckPoint = 0;

 hServStatus.dwWaitHint = 2 * CS_TIMEOUT;

 hSStat = RegisterServiceCtrlHandlerEx(ServiceName, ServerCtrlHandler, &Context); 

 SetServiceStatus(hSStat, &hServStatus);

 /* Запустить специфическую для службы обработку; выполнение типового участка кода завершено. */

 if (ServiceSpecific(argc, argv) != 0) {

  hServStatus.dwCurrentState = SERVICE_STOPPED;

  hServStatus.dwServiceSpecificExitCode = 1;

  /* Ошибка при инициализации сервера. */

  SetServiceStatus(hSStat, &hServStatus);

  return;

 }

 /* Возврат сюда будет осуществлен лишь после завершения функции ServiceSpecific, указывающего на прекращение работы системы. */

 UpdateStatus(SERVICE_STOPPED, 0);

 return;

}


void UpdateStatus(int NewStatus, int Check)

/* Определить новое состояние и контрольную точку — задается либо истинное значение, либо приращение. */

{

 if (Check < 0) hServStatus.dwCheckPoint++;

 else hServStatus.dwCheckPoint = Check;

 if (NewStatus >= 0) hServStatus.dwCurrentState = NewStatus;

 SetServiceStatus(hSStat, &hServStatus);

 return;

}


/* Функция обработчика, активизируемая SCM для выполнения в том же */

/* потоке, что и основная программа. */

/* Последние три параметра не используются, так что обработчики, написанные*/

/* для версий Windows младше NT5, в этом примере также будут работать. */

VOID WINAPI ServerCtrlHandlerEx(DWORD Control, DWORD EventType, LPVOID lpEventData, LPVOID lpContext) {

 switch (Control) {

 case SERVICE_CONTROL_SHUTDOWN:

 case SERVICE_CONTROL_STOP:

  ShutDown = TRUE; /* Установить глобальный флаг завершения. */

  UpdateStatus(SERVICE_STOP_PENDING, –1);

  break;

 case SERVICE_CONTROL_PAUSE:

  PauseFlag = TRUE; /* Периодический опрос. */

  break;

 case SERVICE_CONTROL_CONTINUE:

  PauseFlag = FALSE;

  break;

 case SERVICE_CONTROL_INTERROGATE:

  break;

 default:

  if (Control > 127 && Control < 256) /*Пользовательские сигналы.*/ 

   break;

 }

 UpdateStatus(-1, –1); /* Инкрементировать контрольную точку. */

 return;

}


/* Эта специфическая для службы функция играет роль функции "main" и вызывается из более общей функции ServiceMain. Вообще говоря, вы можете взять любой сервер, например ServerNP.c, и поместить его код прямо сюда, переименовав функцию "main" в "ServiceSpecific". Однако для кода обновления состояния потребуются некоторые изменения. */

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

 UpdateStatus(-1, –1); /* Инкрементировать контрольную точку. */

 /* … Инициализация системы … */

 /* Обеспечьте периодическое обновление контрольной точки. */

 return 0;

Управление службами Windows

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

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

Открытие SCM

Для создания службы требуется отдельный процесс, выступающий в качестве "администратора" и играющий во многом ту же роль, что и программа JobShell, которая использовалась в главе 6 для запуска задач. Первый шаг состоит в открытии SCM и получении дескриптора, который впоследствии будет использован для создания службы.

SC_HANDLE OpenSCManager(LPCTSTR lpMachineName, LPCTSTR lpDatabaseName, DWORD dwDesiredAccess) 

Параметры

lpMachineName — указатель на строку с именем сетевого компьютера, на котором установлен SCM, или NULL, если SCM установлен на локальном компьютере.

lpDatabaseName — обычно принимает значение NULL.

dwDesiredAccess — обычно указывается значение SC_MANAGER_ALL_ACCESS, соответствующее полным правам доступа, но можно задать и ограничить эти права, о чем более подробно говорится в оперативной справочной системе.

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

Для регистрации службы следует вызвать функцию CreateService: 

SC_HANDLE CreateService(SC_HANDLE hSCManager, LPCTSTR lpServiceName, LPCTSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, LPCTSTR lpBinaryPathName, LPCTSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCTSTR lpDependencies, LPCTSTR lpServiceStartName, LPCTSTR lpPassword); 

Информация о новых службах записывается в следующий раздел реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

Параметры

hSCManager — дескриптор типа SC_HANDLE, полученный через функцию OpenSCManager.

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

lpDisplayName — имя, которое будет отображаться в реестре в качестве его раздела, а также в административной утилите Services (доступ к которой открывается через пиктограмму Administrative Tools в панели управления). Это имя появится в указанных местах сразу же после успешного завершения функции CreateService. 

dwDesiredAccess — может принимать значение SERVICE_ALL_ACCESS или комбинацию значений GENERIC_READ, GENERIC_WRITE и GENERIC_EXECUTE. Дополнительную информацию вы можете получить, ознакомившись с оперативной справочной документацией.

dwServiceType — возможные значения перечислены в табл. 13.1.

dwStartType — указывает способ запуска службы. В наших примерах используется значение SERVICE_DEMAND_START, соответствующее запуску по требованию, тогда как другие значения (SERVICE_BOOT_START и SERVICE_SYSTEM_START) обеспечивают запуск служб драйверов устройств на стадии начальной загрузки или во время загрузки системы, а значение SERVICE_AUTO_START указывает на то, что служба должна быть запущена во время запуска системы.


На Facebook В Твиттере В Instagram В Одноклассниках Мы Вконтакте
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!

Похожие книги на "Системное программирование в среде Windows"

Книги похожие на "Системное программирование в среде Windows" читать онлайн или скачать бесплатно полные версии.


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

Все книги автора Джонсон Харт

Джонсон Харт - все книги автора в одном месте на сайте онлайн библиотеки LibFox.

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

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

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

А что Вы думаете о книге? Оставьте Ваш отзыв.