
- •1.1 Основы программирования в операционной системе Windows
- •1.1.1 Вызов функций api
- •1.1.2 Структура программы
- •1.2 Вопросы системного программирования в Windows
- •1.2.1 Страничная и сегментная адресация.
- •1.2.2 Адресное пространство процесса.
- •2.1 Управление процессами
- •2.2 Процессы и потоки в Windows
- •2.3 Создание процессов
- •2.4 Определение исполняемого образа и командной строки
- •2.5 Идентификация процессов
- •3.1 Создание потока. Функция CreateThread
- •3.2. Завершение потока
- •3.3 Другие функции работы с потоками
- •3.4 Структура context
- •3.5 Приоритеты потоков
- •4.1 Объект critical_section
- •4.2 Мьютексы
- •4.3 Семафоры
- •5.1 События
- •7.1 Кучи
- •7.2 Управление памятью кучи
- •Другие функции для работы с кучей
- •Резюме по управлению кучей
- •Отображение адресного пространства процесса в объекты отображения
- •Что такое импорт
- •Явная загрузка dll
- •Явное подключение экспортируемого идентификатора
- •10.1 Управление файлами и каталогами Создание и открытие файлов
- •10.2 Управление каталогами
- •10.3 Другие методы получения атрибутов файлов и каталогов
- •11.1 Блокировка файлов
- •11.2 Реестр
- •12.1 Стандартные устройства и консольный ввод-вывод
- •12.2 Асинхронный ввод-вывод и порты завершения
- •Параметры
- •Цели системы безопасности
- •Параметры
- •Аварийное завершение
- •Использование именованных каналов
- •Параметры
- •Наблюдение за сообщениями в именованном канале
- •Параметры
Наблюдение за сообщениями в именованном канале
Кроме чтения именованного канала с помощью ReadFile, можно также определять, присутствует ли в нем сообщение, которое можно считать. Для этого служит функция PeekNamedPipe.
BOOL PeekNamedPipe ( HANDLE hPipe, LPVOID lpvBuffer,
DWORD cbBuffer, LPDWQRD lpcbRead, LPDWORD lpcbAvail,
LPDWORD lpcbMessage)
Функция PeekNamedPipe читает все байты или сообщения в канале, не разрушая их; она не блокируется и завершается немедленно.
Чтобы узнать, есть ли данные в канале, проверьте значение *lpcbAvail; если есть, *lpcbAvail будет больше нуля. В этом случае lpvBuffer и lpcbRead могут иметь значение NULL. Если буфер задан параметрами lpvBuffer и cbBuffer, то *lpcbMessage сообщает, есть ли оставшиеся байты сообщения, которые не вписываются в буфер, что позволяет выделить большой буфер перед чтением из именованного канала. В байтовом режиме канала это значение нулевое.
Еще раз подчеркнем, что PeekNamedPipe не уничтожает сообщения, так что для удаления сообщений или байтов из канала нужен дополнительный вызов ReadFile.
Безопасность именованного канала
Ниже приведены важные права безопасности для именованных каналов.
GENERIC_READ.
GENERIC_WRITE.
SYNCHRONIZE (разрешает ожидание потока).
Соответствующие права устанавливаются в зависимости от режима доступа (дуплексный, входящий или исходящий). Для всех трех режимов требуется право SYNCHRONIZE.
Почтовые ячейки
Почтовая ячейка Win32 имеет имя. Почтовые ячейки представляют собой широковещательный механизм и ведут себя иначе, чем именованные каналы, что делает их полезными в некоторых весьма важных, но довольно редких ситуациях. Ниже приведены основные характеристики почтовых ячеек.
Почтовая ячейка является однонаправленной.
Почтовая ячейка может иметь несколько отправителей и несколько получателей, но чаще встречается форма с одним отправителем и несколькими получателями или наоборот.
Отправитель, или клиент, не знает наверняка, получили ли на самом деле сообщение все, некоторые либо хотя бы один получатель, или сервер.
Почтовые ячейки можно находить в пределах домена сети.
Длина сообщения ограниченна.
Для использования почтовой ячейки нужно выполнить ряд операций.
• Каждый сервер (получатель) создает дескриптор почтовой ячейки, используя CreateMailslot.
Сервер ожидает приема сообщения из почтовой ячейки, вызвав ReadFile.
Клиент, не обладающий возможностью чтения, должен открывать почтовую ячейку функцией CreateFile и посылать сообщения с помощью WriteFile. Операция открытия завершится неудачно (имя не будет найдено), если ожидающих получателей нет.
Сообщение клиента может читаться всеми серверами; все они получают одно и то же сообщение.
Существует еще одна возможность. Клиент, вызывая CreateFile, может указать имя почтовой ячейки в форме: \\*\maiIslot\имя_почтовой_ячейки
Таким образом, символ * играет роль подстановочного знака, и клиент может найти каждый сервер в домене имен — объединенной в сеть группе систем, которой сетевой администратор присвоил общее имя.
Создание и открытие почтовой ячейки
Серверы почтовой ячейки (получатели) с помощью функции CreateMailslot создают почтовую ячейку и получают дескриптор для применения в ReadFile. На отдельной машине может быть только одна почтовая ячейка с данным именем, однако несколько систем в сети могут использовать одно и то же имя, что позволяет воспользоваться преимуществами почтовых ячеек в ситуации с несколькими получателями.
HANDLE CreateMailslot ( LPCTSTR lpszName, DWORD cbMaxMsg,
DWORD dwReadTimeout, LPSECURITY__ATTRIBUTES lpsa)