Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подписка представлена как уникальный открытый дескриптор в драйвере. Подписка активируется, открыв дескриптор в пространстве имен устройства Subs\. Тип подписки определяется как все, что следует за префиксом "Subs\".
Обратный вызов при получении сообщения осуществляется через завершённую команду IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE.
Подписку можно временно отключить с помощью IOCTL_NFP_DISABLE.
Подписку можно повторно включить с помощью IOCTL_NFP_ENABLE.
Ручки
Клиент, который хочет подписаться на тип сообщения, сначала откроет новый дескриптор для драйвера. Нельзя повторно использовать дескрипторы из предыдущих публикаций, подписок и т. д. Если они больше не нужны, они будут закрыты добросовестным клиентом.
При открытии дескриптора клиент задает тип подписки на сообщение. Это тот же механизм, что и для публикации, за исключением того, что тип имеет префикс "Subs\" вместо "Pubs\".
Нет возможности обратного чтения типа.
Обязательные действия
- Драйвер ДОЛЖЕН проанализировать компонент протокола (перед первым "."). Любой нераспознанный протокол ДОЛЖЕН завершаться с STATUS_OBJECT_PATH_NOT_FOUND
- Если строка не завершается значением NULL в пределах длины буфера, драйвер должен завершить IOCTL с STATUS_INVALID_PARAMETER.
- Если протокол требует подтипа и длина компонента подтипа буфера строки составляет менее одного символа или превышает 250 символов, драйвер ОБЯЗАН завершить IOCTL с STATUS_INVALID_PARAMETER.
- Если компонент протокола буфера строки длиннее 250 символов, драйвер ДОЛЖЕН завершить IOCTL с STATUS_INVALID_PARAMETER.
- Драйвер ДОЛЖЕН интерпретировать первый NULL как конец строки.
- Драйвер МОЖЕТ распознать тип "Сопряжение:Bluetooth" для соединений по подписке.
- Драйвер ДОЛЖЕН распознать тип WindowsUri.
- Драйвер ДОЛЖЕН распознать только тип DeviceArrived для подписок.
- Драйвер ДОЛЖЕН распознать только тип DeviceDeparted для подписок.
- Драйвер должен распознать только тип WindowsMime для подписок.
- Драйвер ДОЛЖЕН распознать тип WindowsMime.
- Если протокол должен быть распознан только для подписок, а IOCTL указывает "Pubs\", драйвер ДОЛЖЕН завершить IOCTL с STATUS_OBJECT_PATH_NOT_FOUND.
- Если протокол должен быть распознан только для публикаций, а IOCTL указывает "Subs\", драйвер ДОЛЖЕН завершить IOCTL с STATUS_OBJECT_PATH_NOT_FOUND.
- Некоторые протоколы (пространства имен) зарезервированы. Если в этом документе явно не указано, драйвер не должен распознавать все протоколы, начинающиеся с:
- "Windows"
- "Устройство"
- Сопряжение
- "NDEF"
- Два открытых дескриптора для одного типа ДОЛЖНЫ представлять две отдельные сущности.
- Если CreateFile выполнен успешно, дескриптор теперь является дескриптором подписки и не должен быть изменен в любой другой тип дескриптора.
- После успешного завершения этого протокола IOCTL и перед закрытием дескриптора каждый раз, когда сообщение получено через технологию близкого взаимодействия, соответствующую типу этой подписки, данные сообщения должны быть присоединены к дескриптору файла для доставки клиенту.
Unsubscribe
Клиент закроет дескриптор подписки, чтобы прекратить получение сообщений. Если процесс клиента завершается, система закроет все открытые дескрипторы файлов от имени клиента.
Обязательные действия
При закрытии хэндла драйвер ДОЛЖЕН освободить всю память, используемую подпиской:
- Драйвер ДОЛЖЕН восстановить строковые данные типа.
- Полученная очередь должна быть удалена и восстановлена.
- Любой заготовленный IOCTL обязательно должен быть завершен с STATUS_CANCELLED.
Вредоносные пиры
Если вредоносное одноранговое устройство пытается атаковать отказ в обслуживании (DOS) через технологию близкого взаимодействия, возможно, клиент может быть не в состоянии слить очередь "Получено" достаточно быстро, чтобы предотвратить чрезмерное использование памяти драйвером.
Обязательные действия
Драйвер НЕ ДОЛЖЕН ставить в очередь или доставлять заданное сообщение клиенту, если это сообщение получено, когда в очереди "Получено" уже находятся 50 сообщений (новейшие сообщения будут удалены).
Неответственное или неправильное поведение клиентов
Если клиент перестает освобождать очередь "Получено", не отправляя необходимый запрос IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE в течение 10–20 секунд, драйвер должен считать, что клиент исчез. В обычных условиях клиенты должны обновлять свои запросы в течение одной секунды [1s]. Если это происходит, драйвер должен задать счетчик "CompleteEventImmediately" равным нулю и не должен увеличивать счетчик до тех пор, пока клиент не проснется и не отправит необходимый IRP.
Обязательные действия
Драйвер должен задать счетчик "CompleteEventImmediately" равным нулю и не должен увеличивать счетчик, если клиент не отправил замену IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE в течение 10 –20 секунд после завершения IOCTL.
Неправильно сформированные сообщения
Клиент, скорее всего, будет удалять или игнорировать все ошибки (кроме STATUS_BUFFER_OVERFLOW), возвращенные из IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE. Таким образом, драйвер не должен завершать эти операции с ошибками лишь потому, что было получено неправильно сформированное сообщение.
Обязательные действия
Драйвер НЕ ДОЛЖЕН доставлять сообщения, превышающие максимальный допустимый размер сообщения клиенту.
Драйвер НЕ ДОЛЖЕН доставлять сообщения нулевой длины клиенту.
Драйвер НЕ ДОЛЖЕН доставлять частичные сообщения подписчикам.
Драйвер НЕ ДОЛЖЕН доставлять сообщения клиенту, которые не смогли получить сильный CRC.
Заметка Сертификация ФОРУМА NFC гарантирует это для поставщиков NFP с поддержкой NFC.
Драйвер ДОЛЖЕН использовать строго надежный транспорт и/или попытаться повторно передать сообщения, которые завершаются сбоем строгой проверки CRC.
Заметка Сертификация ФОРУМА NFC гарантирует это для поставщиков NFP с поддержкой NFC.
Повторяющиеся подписки
Драйвер должен предположить, что если клиент подписывается на тип сообщения дважды, это связано с тем, что клиент хочет получить сообщение дважды при получении сообщения.
Обязательные действия
Драйвер должен принимать и сообщать о повторяющихся подписках, даже если они оформлены одним и тем же клиентом.