Внутренняя ошибка при межпроцессном взаимодействии

Форум КриптоПро
 » 
Средства криптографической защиты информации
 » 
КриптоПро PDF
 » 
Ошибка 0xFFFFFFFB при подписании документа в Adobe Acrobat Reader DC


Offline

AlexisSH

 


#1
Оставлено
:

27 мая 2020 г. 11:34:43(UTC)

AlexisSH

Статус: Новичок

Группы: Участники

Зарегистрирован: 27.05.2020(UTC)
Сообщений: 2
Российская Федерация

Никак не могу побороть ошибку, возникающую при подписании документа в Adobe Acrobat Reader DC на этапе записи в файл, т.е. после указания имени файла, нажатия кнопки «закрыть» и закрытия диалогового окна.

Прошу совета как исправить.
Переустановки и Reader DC и КриптоПРО PDF делал.
Ошибка так и появляется.

Ошибка 0xFFFFFFFB — «Внутренняя ошибка при межпроцессном взаимодействии».

См. подробности в принт-скринах:
Настройка подписи в Adobe Acrobat Reader DC,
Версия модуля КриптоПРО PDF,
Версия Adobe Acrobat Reader DC,
Сообщение об ошибке…

Versija Adobe Acrobat Reader DC.jpg (63kb) загружен 6 раз(а). Nastrojjka podpisi v Adobe Acrobat Reader DC.jpg (92kb) загружен 4 раз(а). Soobshchenie ob oshibke.jpg (22kb) загружен 3 раз(а). Versija modulja KriptoPRO PDF.jpg (26kb) загружен 3 раз(а).

И в дополнение…
Если попытаться повторить подписание файла, без его закрытия и перезапуска Acrobat Reader DC, то появляется сообщение об ошибке:
Ошибка 0xFFFFFFFС — «Лицензия на КриптоПРО отсутствует или истекла».
Однако, везде написано, что при подписании документа в Adobe Acrobat Reader DC с использованием модуля КриптоПРО PDF лицензия не требуется.

Oshibka 0xFFFFFFFC.jpg (18kb) загружен 2 раз(а).

Отредактировано пользователем 27 мая 2020 г. 11:47:11(UTC)
 | Причина: Не указана


Вверх


Offline

Михаил Селезнёв

 


#2
Оставлено
:

27 мая 2020 г. 12:33:57(UTC)

Михаил Селезнёв

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 05.04.2017(UTC)
Сообщений: 357
Мужчина
Российская Федерация

Сказал «Спасибо»: 3 раз
Поблагодарили: 49 раз в 49 постах

Добрый день!
Прошу описать после каких действий стала появляться ошибка, а так же приложить скриншоты папок C:Program Files (x86)AdobeAcrobat Reader DCReaderplug_ins и C:Program Files (x86)AdobeAcrobat Reader DCReaderplug_inspi_brokers


Вверх


Offline

AlexisSH

 


#3
Оставлено
:

27 мая 2020 г. 13:57:14(UTC)

AlexisSH

Статус: Новичок

Группы: Участники

Зарегистрирован: 27.05.2020(UTC)
Сообщений: 2
Российская Федерация

Какие действия произошли до этого, уже не понять.

Просто после длительного периода потребовалось подписать PDF документы и сначала процесс подписания зависал случайным образом после размещения прямоугольника вставки подписи в документе (затемнённое окно программы Adobe Acrobat Reader DC и отсутствие реакции на системные кнопки управления этим окном), а после переустановки Adobe Acrodat Reader DC + КриптоПРО PDF стала появляться упомянутая ошибка.

Сейчас:
1) удалил Adobe Acrodat Reader DC с использованием утилиты «AdobeAcroCleaner_DC2015.exe»,
2) удалил КриптоПРО PDF с помощью стандарных средств Windows,
3) установил Adobe Acrodat Reader XI,
4) установил КриптоПРО PDF,
5) отключил автоматическое обновление Adobe Acrodat Reader XI.

Пока всё работает.

Очевидно, была какая-то проблема в совместимости Adobe Acrodat Reader DC (версия 2020.009.20065) и КриптоПРО PDF (версия 2.0.1180).


Вверх

Пользователи, просматривающие эту тему

Guest

Форум КриптоПро
 » 
Средства криптографической защиты информации
 » 
КриптоПро PDF
 » 
Ошибка 0xFFFFFFFB при подписании документа в Adobe Acrobat Reader DC

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Последние 6 лет я работаю экспертом по информационной безопасности в Одноклассниках и отвечаю за безопасность приложений.

Мой доклад сегодня — о механизмах межпроцессного взаимодействия в Android и уязвимостях, связанных с их неверным использованием.

Но сначала пара слов о том, как появился этот доклад.

Наверное, вы уже заметили, что на каждом Heisenbug есть как минимум один доклад про безопасность, например про XSS или поиск уязвимостей в веб-приложениях. Тема мобильной безопасности осталась не охвачена, хотя мы живем в 2020 году, и аудитория мобильных приложений уже давно превысила аудиторию веба. Мне хотелось выбрать тему из мира мобильной безопасности — достаточно конкретную, чтобы выдержать формат технического доклада, но при этом достаточно распространенную.

Проблемы безопасности на мобилках

Единым местом концентрации всех знаний про безопасность приложений, и мобильных в частности, является проект OWASP (расшифровывается как Open Web Application Security Project), который раз в несколько лет публикует топ-10 самых распространенных рисков для мобильных приложений.

На картинке сверху последняя версия OWASP Mobile Top 10. Первое место в нем занимает категория «неправильное использование платформы». Это довольно общее определение, обратимся к пентест-отчетам за конкретными примерами.

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

Согласно этому отчёту,

  • 38% приложений на Android,
  • 22% приложений на iOS

содержат те или иные уязвимости, вызванные неверной реализацией межпроцессного взаимодействия.

38% — это каждое третье приложение!

Для мотивации заглянем в публичные данные из bug bounty программ: сколько было опубликовано похожих уязвимостей и сколько за них заплатили. Точной классификации категорий багов нет, но поискав по ключевым словам на HackerOne, видим что таких багов на Android находится много и оценивают их довольно высоко.

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

Начнем с определения!

Межпроцессное взаимодействие

Приложение на Android имеет компонентную модель и может состоять из компонентов нескольких типов.

  • Activity — компонент, отвечающий за UI приложения; один экран, который видит пользователь.
  • Service отвечает за выполнение операций в бэкграунде. Он может продолжать работу даже, когда приложение не отображается.
  • BroadcastReceiver обеспечивает обмен сообщениями между приложениями и операционной системой.
  • ContentProvider — компонент для доступа к данным, которые хранит приложение.

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

То, какие компоненты определены в приложении, доступны они или нет, какими свойствами обладают, описано в файле AndroidManifest. Это XML-файл, который поставляется вместе с приложением.

Таким образом приложения на устройстве предоставляют интерфейс, который позволяет им общаться друг с другом путем вызова компонентов, объявленных как публичные (их чаще называют экспортируемые). Это фундаментальная возможность платформы Android. Она позволяет организовать ту самую экосистему из приложений на телефоне, к которой мы так привыкли. К примеру, этой возможностью пользуется камера, когда вы отправляете фото сразу из камеры в мессенджер или в почту. На этой же функциональности построена возможность для приложения дожидаться смс и автоматически подставлять код подтверждения за вас, или возможность для одного приложения прочитать данные другого, например список телефонов с телефонной книжки.

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

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

Это не так.

Google, конечно, совершает феноменальные усилия, чтобы модерировать приложения и не допускать подозрительные или опасные в Стор. Но тем не менее, мы постоянно видим новости о том, что обнаружена очередная сеть приложений, которая признана вредоносной и удалена. До момента удаления такие приложения набирают миллионы установок. Быстрый поиск выдаёт нам десятки таких новостей за 2019 год, то есть проблема реальна, и вероятность того, что какой-то пользователь себе вирус установит, существует. Можно даже с уверенностью сказать, что у части из пользователей вашего приложения вирус установлен.

Механизмы безопасности IPC

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

Вспомним задачу: у нас есть приложение, которое выставляет наружу какую-то часть своей функциональности. Мы предполагаем, что рядом с этим приложением установлено вредоносное приложение, которое пытается злоупотребить нашей функциональностью.

Android предоставляет приложению возможность ограничить доступ к своим компонентам.

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

Если exported=true, то ваш компонент доступен для остальных приложений. Если exported=false, то компонент недоступен.

<activity 
        android:name = ".ViewStatement" 
        android:exported = "true" 
        android:label = "@string/title_activity_view_statement" > 
</activity>

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

Другим уровнем системы разграничения доступа для межпроцессных вызовов на Android является модель пермиссий. Приложение может определять какие другие приложения получат доступ к его функциям или данным несколькими способами:

  • Signature-based основан на подписи приложения, то есть все приложения, которые подписаны одним и тем же сертификатом, могут вызывать компоненты друг друга.
  • sharedUserId: два приложения могут в явном виде в манифесте указать, что они пользуются одним и тем же user ID, то они могут обращаться к данным друг друга
  • Custom permissions позволяют определять собственные permission для отдельных компонентов.

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

В чем же проблема? Чтобы разобраться, посмотрим, как вообще устроены эти самые вызовы между приложениями в Android.

Единицей межпроцессного взаимодействия является нечто под названием Intent.

Это некая абстракция, которая определяет намерение одного компонента вызвать другой. Intent характеризуется типом действия, который будет совершён и типом данных, с которыми эти действия будут совершаться. В Intent могут передаваться дополнительные данные и возвращаться результат исполнения.

Что вызывает путаницу? Intent-ы бывают явные (explicit) и неявные (implicit).

  • Явные — однозначно задан компонент, который будет его обрабатывать.

new Intent(getApplicationContext(), SecondActivity.class);

  • Неявные определяют только тип действий, который мы хотим совершить. Например, мы хотим отредактировать картинку и предоставляем Android возможность самому выбрать из имеющихся редакторов. То, что получатель интента не определен, вносит некоторые риски и накладывает ограничения при разработке приложений. О них чуть позже.

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(“https://ok.ru/“));

Intent-filter декларируется в манифесте и определяет, какие именно неявные интенты компонент может обрабатывать.

Добавление интент-фильтра автоматически делает компонент доступным другим приложениям (меняет значение по умолчанию атрибута exported на true). При этом доступным он становится для любых вызовов, в том числе и для явных интентов. Эта особенность часто становится причиной появления новых уязвимостей в приложении.

Требования безопасности для приложения

Мы выяснили, как устроены вызовы между приложениями на андроиде, и какие средства предоставляет платформа для контроля доступа к компонентам приложения. Самое время сформулировать требования безопасности для приложений. Первое, что мы узнали, — компоненты могут быть доступны извне и также они могут возвращать какие-то данные вызывающим компонентам. Из этого следует, что компоненты, возвращающие конфиденциальные данные, не должны быть экспортированы, то есть не должно быть возможности вызвать их из другого приложения.

Также мы узнали, что мы не можем гарантировать получателя неявных интентов или (если мы их обрабатываем) предсказать отправителя. Это значит, что мы не можем доверять данным, которые переданы в интент по умолчанию. Мы должны трактовать их как параметры, контролируемые атакующим, то есть возможно измененные, и предварительно проверять их.

И поскольку мы не знаем, кто получит наш неявный интент, мы не можем передавать в нем секретные данные.

Теперь обратимся к практике.

Примеры уязвимостей и их последствия

Тренироваться мы будем на специальном обучающем приложении — InsecureBankV2 — с небольшими дополнениями. Исходный код приложения и инструкции по поиску уязвимостей в нем доступны на гитхабе. Всем тем, кому будет интересно продолжить разбираться в этой теме по окончанию доклада, я советую его скачать и почитать.

Пример 1

Начнём с самого простого, а именно с того, как приложение хранит данные. Мы уже помним, что для того, чтобы обращаться к данным, приложения используют ContentProvider. Посмотрим в AndroidManifest InsecureBankV2 и попытаемся найти там определения провайдеров.

<provider 
     android:name =".TrackUserContentProvider" 
… 
     android:exported = "true" > 
</provider>

Там объявлен провайдер с явным указанием exported=true, то есть другое приложение может обратиться к этому провайдеру и прочитать или записать данные.

Давайте сначала проверим, действительно ли это так. Я в целях тестирования буду где возможно использовать adb — так нагляднее. Надо понимать, что те же действия может совершить любое приложение на том же устройстве.

Прочитаем содержимое ContentProvider.

$adb shell 
 content query --uri 
 content://<…>/trackerusers

Всегда ли такое поведение является уязвимостью? Конечно нет, зависит от того, какие данные предоставляет провайдер.

Как сделать правильно? Правильнее было бы определить кастомные пермиссии для доступа на чтение и запись в этот провайдер, что позволило бы контролировать какие приложения получают доступ к данным. Например:

<provider 
    android:name =".TrackUserContentProvider" 
… 
    android:exported = "true" 
    android:readPermission = “my.custom.read.permission” 
    android:writePermission = “my.custom.write.permission" 
> 
</provider>

Пример 2

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

<activity 
        android:name = ".PostLogin" 
        android:label = "@string/title_activity_post_login" > 
        <intent-filter> 
                <action android:name = "customAction" /> 
        </intent-filter> 
</activity>

Помните, я говорила, что добавление IntentFilter-а автоматически делает активность доступной извне? Это мы видим на примере активности PostLogin, для которой объявлен фильтр.

Проверим, что эта активность действительно может быть вызвана, причём не только в ответ на интент, который матчится с этим фильтром. Снова сделаем вызов через adb — попросим application manager запустить активность по полному имени. Выполним такую команду.

$adb shell 
       am start -n <…>/.PostLogin

Действительно видим, у нас на эмуляторе запустилась эта активность.

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

Последствия

Если какой-то из компонентов приложения не предназначался быть доступным, но может быть вызван извне, то существует возможность обойти логику работы приложения. Типичный пример — экраны с дополнительным подтверждением. Например, мессенджеры или интернет-банки требуют дополнительный пин-код для того, чтобы войти в приложение, даже если телефон разлочен. И если активность, которая показывается после этого дополнительного подтверждения, экспортируемая, то мы можем вызвать ее напрямую и таким образом обойти запрос пин-кода.

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

Частный случай такого привилегированного доступа — доступ в приватную папку приложения. Как вы знаете, приложения на Android выполняются в песочнице, и каждому приложению выделена область файловой системы, которая другим приложениям недоступна. Если путь, по которому приложение читает или пишет в файл, может быть изменен, то другое приложение на этом же устройстве получает возможность возможность доступа к приватной папке уязвимого приложения.

Типичным местом концентрации таких уязвимостей являются активности, которые реализуют возможность «поделиться» в приложении — как правило, они получают путь к тому, что надо отправить, в интенте. Занятные последствия таких ошибок связаны еще с особенностями Android NDK. Android позволяет использовать код на C/C++ при разработке приложения. Скомпилированные нативные библиотеки (.so) упаковываются в apk и после установки приложения размещаются в приватной папке рядом с данными. Это значит, если мы научились записывать произвольные файлы в приватную папку, то мы можем и переписать .so-файлы библиотек и выполнять произвольный код в контексте приложения. Фактически, это уязвимость типа RCE — Remote Code Execution, и предоставляет атакующему полный контроль над уязвимым приложением.

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

Давайте рассмотрим снова пример. Вернёмся к нашей активности post_login, которая, как мы уже выяснили, может быть вызвана извне. Посмотрим в код.

Intent result = new Intent(); 
result.putExtra("session", sessionToken); 
result.putExtra("uname", username); 
setResult(RESULT_OK, result);

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

Пример 3

И третья разновидность уязвимостей, которые можно встретить в Android-приложениях, связана с неверным использованием широковещательных рассылок. Помните, мы говорили про неявные интенты — для них не указывается явно компонент, который будет вызван. В случае с широковещательными рассылками это тоже работает, то есть можно не указывать в явном виде получателя, а предоставить андроиду разослать эти оповещения, основываясь на зарегистрированных получателях.

Посмотрим снова на InsecureBankV2 и найдём там такой кусочек кода.

private void broadcastChangePasswordSMS (String phoneNumber, String pass) {
...
Intent smsIntent = new Intent(); 
smsIntent.setAction("theBroadcast"); 
smsIntent.putExtra("phonenumber", phoneNumber); 
smsIntent.putExtra("newpass", pass); 
sendBroadcast(smsIntent); 

…
}

Что здесь происходит? Мы видим, что создается интент, при этом не указан компонент, который этот интент будет обрабатывать, то есть он является неявным. Мы добавляем номер телефона и пароль пользователя в дополнительные параметры интента. Опасность здесь в том, что другое приложение на устройстве пользователя может зарегистрировать соответствующий BroadcastReceiver и тоже получить эти данные. Для этого нужно зарегистрировать BroadcastReceiver и соответствующий фильтр.

Посмотрим, что это работает. Запустим в левой части экрана InsecureBankV2, а в правой части экрана наше зловредное приложение, которое подслушивает данные пользователя. Как только пользователь нажмет на Change Password, отправится этот неявный интент. И поскольку зловредное приложение зарегистрировало свой BroadcastReceiver, оно перехватит данные пользователя.

Автоматизация

Итого, мы рассмотрели три класса проблем, связанных с неправильной реализацией межпроцессных взаимодействий на Android, и поняли, что тестировать это все довольно трудоемко: требуется изучать манифест приложения и каждый объявленный компонент, иногда даже заглядывать в исходники. Поэтому попытаемся разобраться, есть ли возможность автоматизировать эту задачу.

Когда говорят про автоматизацию тестирования безопасности, то обычно делят инструменты на две группы: динамические и статические сканеры.

Динамические сканеры

Динамические сканеры тестируют работающее приложение, отправляя ему тестовые запросы и ожидая определённой реакции.

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

Среди всех динамических сканеров, которые вообще существуют для тестирования безопасности на Android, самым распространенным является Drozer. Drozer — проект с открытым исходным кодом, поддерживаемый F-Secure.

Сам сканер представляет собой клиент-серверное приложение. В качестве сервера выступает то, что в Drozer называется консоль — скрипт на питоне, запущенный у вас на компьютере. В качестве клиента — Drozer Agent, который устанавливается на устройство или эмулятор. Соответственно, консоль дает агенту команды, а агент эти команды передаёт тестируемому приложению и полученный ответ передаёт в консоль.

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

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

Статические сканеры

В другом углу ринга — статические анализаторы. И в этом смысле Android-разработчикам повезло. Во-первых, есть официальный Android Lint. Про Android Lint подробно написано в документации для разработчиков.

А я хотела бы подробнее рассказать про Find Security Bugs. Это проект с открытым исходным кодом, представляющий собой набор ориентированных на поиск уязвимостей правил для популярного статического анализатора SpotBugs (aka FindBugs). Find Security Bugs содержит в том числе специфичные для андроида проверки. Для того, чтобы интегрировать его в свой проект, нужно буквально добавить три строки в gradle скрипт, примерно как на слайде.

Итак, запустим Find Security Bugs на том же самом InsecureBankV2 и посмотрим, что он нашёл.

Мы видим сообщение о том, что broadcast может быть получен зловредным приложением. Смотрим код: строчка, на которую он ругается, это та же самая проблема, которую мы уже нашли в предыдущих примерах. То есть это рассылка данных пользователя с использованием неявного интента. Find Security Bugs объясняет, что пошло не так и как проблему нужно исправить.

На скриншоте GUI, который поставляется вместе с FindBugs, но, как я сказала, те же самые подсвеченные строчки с багами и рекомендациями по исправлению можно увидеть из IDE, например в Android Studio.

FindBugs позволяет также расширять набор правил, которые используются для обнаружения уязвимостей. Я рассказывала об этом на прошлом Heisenbug, доклад можно посмотреть на YouTube.

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

Подведем итоги

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

Также мы сформулировали требования безопасности для приложений, продиктованные особенностями платформы:

  1. Не экспортировать компоненты, возвращающие конфиденциальные данные.
  2. Не доверять данным, переданным с интентом в экспортируемые компоненты.
  3. Не передавать секретные данные в неявных интентах.

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

  • Mikl___

    Супермодератор
    Команда форума

    Публикаций:

    14

    Регистрация:
    25 июн 2008
    Сообщения:
    3.465

    Список кодов ошибок, которые возникают при вызове команды send:

    Код ошибки hex Описание
    WSANOTINITIALISED 276D Перед использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN 2742 Сбой в сети
    WSAEACCES 271D Указанный адрес является широковещательным (broadcast), однако перед вызовом функции не был установлен соответствующий флаг
    WSAEINTR 2714 Работа функции была отменена при помощи функции WSACancelBlockingCall
    WSAEINPROGRESS 2734 Выполняется блокирующая функция интерфейса Windows Sockets
    WSAEFAULT 271E Параметр buf указан неправильно (он не указывает на адресное пространство, принадлежащее приложению)
    WSAENETRESET 2744 Необходимо сбросить соединение
    WSAENOBUFS 2747 Возникла блокировка буфера
    WSAENOTCONN 2749 Сокет не подсоединен
    WSAENOTSOCK 2736 Указанный в параметре дескриптор не является сокетом
    WSAESHUTDOWN 274A Сокет был закрыт функцией shutdown
    WSAEWOULDBLOCK 2733 Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
    WSAEMSGSIZE 2738 Был использован сокет типа SOCK_DGRAM (предназначенный для передачи датаграмм). При этом размер пакета данных превышает максимально допустимый для данной реализации интерфейса Windows Sockets
    WSAEINVAL 2726 Сокет не был подключен функцией bind
    WSAECONNABORTED 2745 Сбой из-за слишком большой задержки или по другой причине
    WSAECONNRESET 2746 Сброс соединения удаленным узлом

    При выполнении функции recv могут возникать следующие ошибки:

    Код ошибки hex Описание
    WSANOTINITIALISED 276D Перед использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN 2742 Сбой в сети
    WSAENOTCONN 2749 Сокет не подсоединен
    WSAEINTR 2714 Работа функции была отменена при помощи функции WSACancelBlockingCall
    WSAEINPROGRESS 2734 Выполняется блокирующая функция интерфейса Windows Sockets
    WSAENOTSOCK 2736 Указанный в параметре дескриптор не является сокетом
    WSAESHUTDOWN 274A Сокет был закрыт функцией shutdown
    WSAEWOULDBLOCK 2733 Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
    WSAEMSGSIZE 2738 Размер пакета данных превышает размер буфера, в результате чего принятый пакет был обрезан
    WSAEINVAL 2726 Сокет не был подключен функцией bind
    WSAECONNABORTED 2745 Сбой из-за слишком большой задержки или по другой причине
    WSAECONNRESET 2746 Сброс соединения удаленным узлом

    Передача и прием данных в цикле может привести к блокировке работы приложения. Если это неприемлемо, следует воспользоваться асинхронным расширением интерфейса Windows Sockets.
    Приложение демонстрирует асинхронный прием данных.
    После установки канала связи оно вызывает функцию WSAAsyncSelect, указывая в качестве последнего параметра комбинацию констант FD_READ и FD_CLOSE. Функция главного окна приложения получает сообщение WSA_NETEVENT в тот момент времени, когда чтение данных не вызовет блокировки приложения:

    1. #define WSA_NETEVENT (WM_USER + 2)

    2. rc = WSAAsyncSelect (srv_socket, hWnd, WSA_NETEVENT, FD_READ | FD_CLOSE);

    При необходимости выполнения асинхронной посылки данных нужно указать функцию WSAAsyncSelect и параметр FD_WRITE.
    Если функция WSAAsyncSelect выполнилась успешно ― возвращается нулевое значение, при ошибке ― значение SOCKET_ERROR.
    В зависимости от значения последнего параметра могут возникать разные коды ошибки, которые можно получить при помощи функции WSAGetLastError. Следующие ошибки могут возникнуть при любом значении параметра:

    Код ошибки hex Описание
    WSANOTINITIALISED 276D Перед использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN 2742 Сбой в сети
    WSAEINVAL 2726 Сокет не был подключен функцией bind
    WSAEINPROGRESS 2734 Выполняется блокирующая функция интерфейса Windows Sockets

    Дополнительный код ошибки можно получить из параметра lParam при помощи макрокоманды WSAGETSELECTERROR.
    При использовании параметра FD_CONNECT возможно появление следующих ошибок:

    Код ошибки hex Описание
    WSAEADDRINUSE 2740 Указанный адрес уже используется
    WSAEADDRNOTAVAIL 2741 Указанный адрес не доступен
    WSAEAFNOSUPPORT 273F Для данного сокета нельзя использовать указанное семейство адресов
    WSAECONNREFUSED 274D Попытка установления канала связи была отвергнута
    WSAEDESTADDRREQ 2737 Необходимо указать адрес получателя пакета
    WSAEFAULT 271E Неправильно указан параметр namelen
    WSAEINVAL 2726 Сокет уже подключен к адресу
    WSAEISCONN 2748 Сокет уже подсоединен
    WSAEMFILE 2728 Больше нет доступных дескрипторов
    WSAENETUNREACH 2743 Из данного узла и в данное время невозможно получить доступ к сети
    WSAENOBUFS 2747 Нет места для размещения буфера
    WSAENOTCONN 2749 Сокет на подключен
    WSAENOTSOCK 2736 Указан дескриптор файла, а не сокета
    WSAETIMEDOUT 274C При попытке установления канала связи возникла задержка во времени

    Если используется параметр FD_CLOSE, может возникнуть одна из следующих ошибок:

    Код ошибки hex Описание
    WSAENETDOWN 2742 Сбой в сети
    WSAECONNRESET 2746 Сброс соединения удаленным узлом
    WSAECONNABORTED 2745 Сбой из-за слишком большой задержки или по другой причине

    В том случае, когда указаны параметры FD_READ, FD_WRITE, FD_OOB, или FD_ACCEPT, может возникнуть ошибка с кодом WSAENETDOWN.
    Обработчик сообщения WSA_NETEVENT должен выполнить анализ причины, по которой он был вызван, так как за один вызов функции WSAAsyncSelect можно задать несколько событий, вызывающих генерацию сообщения. Этот анализ проводится следующим образом:

    1. void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

    2. // Если на сокете выполняется передача данных,

    3. // прием и отображение этих данных в виде текстовой строки

    4. if(WSAGETSELECTEVENT(lParam) == FD_READ )

    5.     rc = recv ((SOCKET)wParam, szTemp, 256, 0);

    6.       MessageBox(NULL, szTemp, «Reсeived data», MB_OK);

    7. // Если соединение завершено — вывод сообщения

    8. else if(WSAGETSELECTEVENT(lParam) == FD_CLOSE )

    9.     MessageBox(NULL, «Connection closed», «Server», MB_OK);

    Параметр wParam содержит дескриптор сокета, на котором выполняется передача данных, параметр lParam ― код события, которое произошло в сети.


    12.jpg

    Текст приложения-сервера (12s.asm)

    1.   szDescription db (WSADESCRIPTION_LEN + 1) dup(?)

    2.   szSystemStatus db (WSASYS_STATUS_LEN + 1) dup(?)

    3.   sin_family    dw ?;is the same as af parameter in socket call. You must use AF_INET here.

    4.   sin_port      dw ?;is the port that the socket will use to communicate with the remote socket.

    5. ;This value depends on the higher level protocol that you want to use. If you want to connect to

    6. ;the remote socket for HTTP, use port 80 (decimal). However, note that the port value MUST be in

    7. ;network byte order that is big Endian. So you cannot use the port value per se but you must call

    8. ;htons to convert the value to network byte order first. This is one of the most common error the

    9. ;newcomers to winsock programming encounter.

    10.   sin_addr      in_addr <>;is the IP address of the remote host. Again, you must convert the

    11. ;IP address to network byte order before using it

    12.   sin_zero      BYTE 8 dup(?);is reserved. Don’t mess with it

    13. mov qword ptr [rbp8],LR_DEFAULTCOLOR

    14. invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR

    15. mov r9d,offset DialogProc

    16. mov qword ptr[rbp10h],rax;30h-10h=+20h

    17. invoke DialogBoxParam,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP

    18. invoke RtlExitUserProcess,NULL

    19. DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD

    20. wmDESTROY:invoke WSACleanup

    21. wmSEND_WAV:mov port,12345

    22. mov qword ptr[rsp+30h],r9

    23. mov qword ptr[rsp+28h],FILE_ATTRIBUTE_ARCHIVE

    24. mov qword ptr[rsp+20h],OPEN_EXISTING

    25.        invoke CreateFile,,GENERIC_READ or GENERIC_WRITE,

    26.        FILE_SHARE_READ or FILE_SHARE_WRITE

    27.        invoke GlobalAlloc,GPTR,eax

    28.         invoke ReadFile,hFile,eax,FSize

    29. wmSEND_ICO:mov port,12344

    30.        invoke FindResource,0,,RT_ICON; find the resource

    31.        invoke  SizeofResource,0,eax ; get its size

    32.        invoke LoadResource,0,hResource ; load the resource

    33.        invoke LockResource,eax;pResource

    34. and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0

    35. mov qword ptr[rsp+20h],256

    36. mov qword ptr[rsp+28h],256

    37.        invoke  CreateIconFromResourceEx,eax,FSize,TRUE,30000h;270376,TRUE,30000h

    38.        invoke  SendDlgItemMessage,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON

    39. wmSEND_TXT:mov port,12343

    40. invoke GlobalAlloc,GPTR,256

    41. invoke GetDlgItemText,hWnddlg,ID_TXT,eax,256

    42. ; Отправить данные получателю

    43.        invoke PostMessage,eax,type0,hWnddlg,FSize

    44.        invoke SendData,p,FSize,port

    45. wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1

    46.        invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam

    47. ; активировать библиотеку сокетов

    48.        invoke WSAStartup,WINSOCK_VERSION

    49. ;An error occured if eax != null, because there’s no return value for this api, if there’s return,

    50. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT

    51. cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV

    52. cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO

    53. cmp     r8d,BN_CLICKED shl 16 + IDCANCEL

    54. wmCLOSE:invoke EndDialog,,0

    55. SendData proc buf:qword,len:qword,port:qword

    56. local saddr:SOCKADDR_IN;sizeof(saddr)) =10h

    57. invoke socket,AF_INET, SOCK_STREAM, IPPROTO_TCP

    58. jz exit0;if (sock != INVALID_SOCKET)

    59. mov saddr.sin_family,AF_INET

    60. invoke htonl,INADDR_LOOPBACK

    61. mov saddr.sin_addr.S_un.S_addr,eax

    62. ;After the socket is created, you have two choices: wait for an incoming connection or connect

    63. ;to a remote socket. If you want to wait for incoming connection, you must call listen to listen

    64. ;for an incoming connection and call accept to establish connection with the remote socket. If you

    65. ;want to connect to a remote socket, you must call connect

    66. mov r8d,sizeof saddr;the size of SOCKADDR_IN structure

    67. lea edx,saddr;a pointer to a SOCKADDR_IN structure

    68. invoke connect,sock;socket descriptor of the local socket. You can pass the socket

    69. ;descriptor returned by socket call as this parameter

    70. jnz @0;if (connect (sock,(struct sockaddr*)&saddr,sizeof (saddr)) == 0)

    71. @@: cmp len,0 ;       while (size)

    72. ;use send to send data on a stream socket and sendto to send data on a datagram socket. I’ll

    73. ;examine send here since many popular protocols such as HTTP and FTP use stream sockets.

    74. ; запрос пришел — посылаем информацию

    75. invoke send,sock,buf,len, 0

    76. ; #1 socket == socket descriptor

    77. ; #2 buffer == address of the data that you want to send. The data need not be NULL-terminated

    78. ;since its size is specified in len parameter.

    79. ; #3 len == the size of data to send

    80. ; #4 flags == flags specifying the behavior of the function. There are two flags you can use:

    81. ; MSG_DONTROUTE : specifies that the data should not be subject to routing. Notice

    82. ;the word «should». Some windows socket implementation may ignore this flag.

    83. ; MSG_OOB : specifies that the data is out-of-band data.

    84. ;Normally we don’t use any of these two flags, flags parameter should be 0 in this case.

    85. ;If the call is unsuccessful, the value SOCKET_ERROR is returned in eax.

    86. ;If it’s successful, the actual number of bytes sent is returned in eax. Note that this number

    87. ;may not be equal to len parameter.

    88. jz @0;if (bytesSent <= 0)          break;

    89. sub len,rax;     size -= (uint32_t)bytesSent;

    90. add buf,rax;    data = (uint8_t*)data + bytesSent;

    91. @0:     invoke shutdown,sock,SD_BOTH

    92. ;—————————————

    93. szWin db ‘Socket Reciever’,0

    94. wav_file db ‘..Images3.wav’,0

    rc-файл (12s.rc)

    1. IDC_ICON1 ICON «..Imagesicon1.ico»

    2. IDC_ICON2 ICON «..Imagesicon2.ico»

    3. IDC_DIALOG DIALOG 0, 0, 212, 140

    4. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |

    5. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

    6.     CONTROL «»,-1,«BUTTON»,BS_GROUPBOX, 2, 1, 207, 24

    7.     CONTROL «»,IDC_IMG1,«Static»,WS_CHILDWINDOW | WS_VISIBLE | SS_ICON,5,23,128,128

    8.     CONTROL «Write something and click ‘Send Text’»,ID_TXT,«EDIT»,WS_BORDER | WS_TABSTOP |

    9.  ES_AUTOHSCROLL,5,7,199,13

    10.     DEFPUSHBUTTON «Send Text»,ID_SEND_TXT,149,27,60,15

    11.     PUSHBUTTON   «Send ICO», ID_SEND_ICO,149,45,60,15

    12.     PUSHBUTTON   «Send WAV», ID_SEND_WAV,149,65,60,15

    13.     PUSHBUTTON   «Exit»,     IDCANCEL,   149,85,60,15

    Текст приложения-клиента (12r.asm)

    1.   szDescription db (WSADESCRIPTION_LEN + 1) dup(?)

    2.   szSystemStatus db (WSASYS_STATUS_LEN + 1) dup(?)

    3. mov r9d,offset DialogProc

    4.         invoke  DialogBoxParam,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP

    5.         invoke  RtlExitUserProcess,NULL

    6. DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword

    7. local saddr:SOCKADDR_IN;sizeof(saddr)=10h

    8. wmDESTROY:cmp serverSocket,INVALID_SOCKET

    9. invoke shutdown,serverSocket,SD_BOTH

    10. invoke closesocket,serverSocket

    11. or serverSocket,INVALID_SOCKET

    12. wmUSER_1:cmp serverSocket,INVALID_SOCKET

    13. invoke shutdown,serverSocket,SD_BOTH

    14. invoke closesocket,serverSocket

    15. ; Create a stream socket for internet use

    16. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP

    17. mov saddr.sin_family,AF_INET

    18. invoke htonl,INADDR_LOOPBACK

    19. mov saddr.sin_addr.S_un.S_addr,eax

    20. invoke htons,12343; convert port number into network byte order first

    21. mov saddr.sin_port,ax; адрес порта

    22. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)

    23. ; перевести сокет в состояние «слушать»

    24. invoke listen,serverSocket,256

    25. jnz break;if (listen (serverSocket, 256) == 0)

    26. ; ждем запроса от клиента

    27. mov addrSize,sizeof saddr

    28. invoke accept,serverSocket

    29. jz break;if (clientSocket == INVALID_SOCKET) break;

    30. ; запрос пришел — посылаем информацию

    31. invoke recv,clientSocket,,1024,0

    32. ;recv is for use with a stream socket

    33. ; #1 socket == socket descriptor

    34. ; #2 buffer == address of the memory block to store the incoming data.

    35. ; #3 len == the size of the memory block

    36. ; #4 flags == flags specifying the behavior of the function. There are two flags you can use:

    37. ; MSG_PEEK Peek at the incoming data. The data is copied into the buffer but is not

    38. ;removed from the input queue.

    39. ; MSG_OOB Process out-of-band data. This flag is usually used when FD_OOB notification

    40. ;is received. If the call is successful, it returns the number of bytes read from the socket. If it

    41. ;is unsuccessful, the value SOCKET_ERROR is returned. If the return value is 0, the remote socket

    42. jnz @b;if (len <= 0)    break

    43. ; выводим строку символов

    44. invoke  SetDlgItemText,hWnddlg,IDC_OUTPUT

    45. cmp serverSocket,INVALID_SOCKET

    46. invoke shutdown,serverSocket,SD_BOTH

    47. invoke closesocket,serverSocket

    48. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP; Create a stream socket for internet use

    49. cmp serverSocket,INVALID_SOCKET

    50. mov saddr.sin_family,AF_INET

    51. invoke htonl,INADDR_LOOPBACK

    52. mov saddr.sin_addr.S_un.S_addr,eax

    53. invoke htons,12344; convert port number into network byte order first

    54. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)

    55. invoke listen,serverSocket,256

    56. jnz break;if (listen (serverSocket, 256) == 0)

    57. mov addrSize,sizeof saddr

    58. invoke accept,serverSocket

    59. jz break;if (clientSocket == INVALID_SOCKET) break;

    60. invoke GlobalAlloc,GPTR,FSize

    61. invoke recv,clientSocket,,1024,0

    62. jmp @b;if (len <= 0)    break;

    63. @@: invoke  CreateIconFromResourceEx,p,FSize,TRUE,30000h,256,256,LR_DEFAULTCOLOR

    64. invoke  SendDlgItemMessage,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax

    65. cmp serverSocket,INVALID_SOCKET

    66. invoke shutdown,serverSocket,SD_BOTH

    67. invoke closesocket,serverSocket

    68. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP; Create a stream socket for internet use

    69. mov saddr.sin_family,AF_INET

    70. invoke htonl,INADDR_LOOPBACK

    71. mov saddr.sin_addr.S_un.S_addr,eax

    72. invoke htons,12345; convert port number into network byte order first

    73. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)

    74. invoke listen,serverSocket,256

    75. jnz break;if (listen (serverSocket, 256) == 0)

    76. mov addrSize,sizeof saddr

    77. invoke accept,serverSocket

    78. jz break;if (clientSocket == INVALID_SOCKET) break;

    79. invoke GlobalAlloc,GPTR,FSize

    80. invoke recv,clientSocket,,1024,0

    81. jmp @b;if (len <= 0)    break;

    82. ;»RIFF»+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h

    83.         invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC

    84. ; Подготавливаем заголовок для вывода

    85. mov ecx,(sizeof WAVEHDR)/8

    86. ;»RIFF»+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+

    87. ;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+

    88. ;(BitsPerSample*Channels/8)+(Bits per sample)+(“data” chunk header)+(Size of the data section)=2Ch

    89. mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных

    90. mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных

    91. invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR

    92. ; Запускаем проигрывание блока

    93. invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR

    94. @@: test lpwiocb.dwFlags,WHDR_DONE

    95. invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR

    96. invoke waveOutClose,hWaveOut

    97. ;———————————————————-

    98. @0: invoke shutdown,clientSocket,SD_BOTH

    99. invoke closesocket,clientSocket

    100. ;This function closes a socket. Every resource of the socket will be released

    101. break: cmp serverSocket,INVALID_SOCKET;if (serverSocket != INVALID_SOCKET)

    102. invoke shutdown,serverSocket,SD_BOTH

    103. invoke closesocket,serverSocket

    104. mov serverSocket,INVALID_SOCKET

    105. wmINITDIALOG:;mov hWnd,rcx

    106. invoke MessageBox,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO

    107. ;активировать библиотеку сокетов

    108. invoke WSAStartup,WINSOCK_VERSION

    109. ;—————————————————

    110. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL

    111. wmCLOSE:invoke EndDialog,,0

    112. ;————————————————————————

    113. szWin db «Socket Sender»,0

    114. Error1 db «The server is not running.»,10,«Run?»,0

    115. szAppName db «Socket Reciever»,0

    116. serverSocket dq INVALID_SOCKET

    rc-файл (08r.rc)

    1. IDC_DIALOG DIALOG 0,0,212,140

    2. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |

    3. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

    4. CAPTION «Socket Reciever»

    5. CONTROL «»,-1,«BUTTON»,BS_GROUPBOX, 2, 1, 207, 24

    6. CONTROL «»,IDC_OUTPUT,«STATIC»,WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL,5,7,199,13

    7. DEFPUSHBUTTON  «Exit»,IDCANCEL,149,27,60,15

    8.         CONTROL 1,ID_ICON,«STATIC»,WS_CHILDWINDOW | SS_ICON,5,23,128,128

    в аттаче ASM-/RC-/EXE-файлы


    Благодарности

    Огромное спасибо rmn за подсказки, замечания и предоставленную программу :yes3:

    Вложения:

  • Mikl___

    Супермодератор
    Команда форума

    Публикаций:

    14

    Регистрация:
    25 июн 2008
    Сообщения:
    3.465

    09. Mutexes. Блин #2. Более удачный, хотя и не последний вариант

    Пока только текст, но выводится без ошибок, вариант с передачей картинок и WAV-файлов будет позже (хотя есть вероятность, что механизм мьютексов не предназначен для такого интенсивного обмена сообщениями, но буду пробовать :) )…

    09.jpg

    Вложения:

  • Mikl___

    Супермодератор
    Команда форума

    Публикаций:

    14

    Регистрация:
    25 июн 2008
    Сообщения:
    3.465

    09. Mutexes. Блин #3. Передача картинок (неудачная реализация)

    Для эксперимента были созданы иконки размером 16×16, 32×32, 64×64, 128×128, 256×256

    16x16.jpg

    Результат передачи текстовой строки и иконки 16×16​

    32x32.jpg

    Результат передачи иконки 32×32​

    64x64.jpg

    Результат передачи иконки 64×64​

    128x128.jpg

    Результат передачи иконки 128×128​

    256x256.jpg

    Результат передачи иконки 256×256​

    Передача идет полубайтами+задержки для синхронизации. Картинка передана без искажений. Передача иконки 256×256 заняла примерно 42 минуты (2513036/60000 = 41,88393(3)). Видно, что нужно менять алгоритм и увеличивать скорость передачи.

    Size of
    Resource
    (bytes)
    mSec Bytes/mSec
    текстовая строка

    37​

    702​

    0,05270655
    иконка 16×16

    1128​

    20639​

    0,05465381
    иконка 32×32

    4264​

    81776​

    0,05214244
    иконка 64×64

    16936​

    323546​

    0,05234495
    иконка 128×128

    67624​

    543882​

    0,12433579
    иконка 256×256

    270376​

    2513036 0,10758939


    who_know777 нравится это.

  • Mikl___

    Супермодератор
    Команда форума

    Публикаций:

    14

    Регистрация:
    25 июн 2008
    Сообщения:
    3.465

    14. Удаленный вызов процедур (Remote Procedure Call, RPC)

    Огромное спасибо HoShiMin и f13nd за помощь оказанную при написании программы!

    RPC технологии ― достаточно старые технологии. Наиболее яркие представители технологий RPC, это ― CORBA и DCOM. Главная идея RPC в том, чтобы сделать вызов удаленных систем похожим на вызов функций внутри программы. Вся механика удаленных вызовов прячется от программиста. Обычные вызовы функций внутри процессов обрабатывались на вызывающей стороне в Proxy, а на стороне системы, выполняющей функцию, в Dispatcher. Наблюдается своеобразный ренессанс RPC, наиболее яркие представители которого: Google ProtoBuf, Thrift, Avro. Теперь программист явным образом создает сервис (Service) или клиента (Client), вызывающего сервис. Сервис ― набор операций (Operation), каждая из которых на входе принимает запрос (Request) и выдает ответ (Response). Клиент явным образом посылает (Sent) запрос, сервис явным образом получает (Receive) его и отвечает (Sent), высылая ответ. Клиент получает (Receive) ответ и на этом вызов завершался.

    В процессе RPC выполняются следующие шаги:

    1. Клиент, заглушка клиента и один экземпляр времени выполнения RPC выполняются на клиентском компьютере.
    2. Клиент запускает процесс-заглушку клиента, передавая параметры обычным способом. Клиентская заглушка хранится в собственном адресном пространстве клиента. Он также просит локальную среду выполнения RPC отправить обратно на заглушку сервера.
    3. На этом этапе RPC доступен для пользователя путем выполнения обычной локальной процедурной калибровки. RPC Runtime управляет передачей сообщений между сетью через клиент и сервер. Он также выполняет работу по повторной передаче, подтверждению, маршрутизации и шифрованию.
    4. После завершения серверной процедуры он возвращается к заглушке сервера, которая упаковывает (маршаллы) возвращаемые значения в сообщение. Затем заглушка сервера отправляет сообщение обратно на транспортный уровень.
    5. На этом этапе транспортный уровень отправляет сообщение с результатом клиентскому транспортному уровню, который возвращает сообщение клиентской заглушке.
    6. На этом этапе клиентская заглушка демаршаллизирует (распаковывает) возвращаемые параметры в результирующем пакете, и процесс выполнения возвращается вызывающей стороне.

    Характеристики RPC

    • Вызываемая процедура находится в другом процессе, который находится на другом компьютере.
    • Процессы не разделяют адресное пространство.
    • Параметры передаются только по значениям.
    • RPC выполняется в среде серверного процесса.
    • Он не предлагает доступ к среде вызывающей процедуры.

    RpcStringBindingCompose
    Функция RpcStringBindingCompose создает дескриптор привязки строки.

    1. RPC_STATUS RpcStringBindingCompose(

    Параметры

    • ObjUuid ― Указатель на строковое представление UUID объекта, заканчивающееся нулем.
    • ProtSeq ― Указатель на строковое представление последовательности протокола, заканчивающееся нулем.
    • NetworkAddr ― Указатель на строковое представление сетевого адреса, заканчивающееся нулем. Формат сетевого адреса связан с последовательностью протокола.
    • endpoint ― Указатель на строковое представление endpoint, заканчивающееся нулем. Формат и содержимое endpoint связаны с последовательностью протокола. Например, endpoint, связан с последовательностью протокола ncacn_np, представляет собой имя канала в формате pipepipename.
    • Options ― Указатель на строковое представление параметров сети, заканчивающееся нулем. Строка параметра связана с последовательностью протокола.
    • StringBinding — возвращает указатель на строковое представление дескриптора привязки, заканчивающееся нулем.
      Укажите значение NULL, чтобы RpcStringBindingCompose не возвращал параметр StringBinding. В этом случае приложение не вызывает RpcStringFree.

    Возвращаемые значения

    Значение hex Описание
    RPC_S_OK

    0​

    Успешный вызов функции
    RPC_S_INVALID_STRING_UUID 6A9 недопустимое строковое представление UUID

    RpcBindingFromStringBinding
    Функция RpcBindingFromStringBinding возвращает дескриптор привязки из строкового представления дескриптора привязки.

    1. RPC_STATUS RpcBindingFromStringBinding(

    2.   RPC_BINDING_HANDLE *Binding

    Параметры

    • StringBinding ― Указатель на строковое представление дескриптора привязки.
    • Binding ― возвращает указатель на дескриптор привязки сервера.

    Возвращаемые значения

    Значение hex Описание
    RPC_S_OK

    0​

    Успешный вызов функции
    RPC_S_INVALID_ARG

    57​

    Аргумент недействителен
    RPC_S_INVALID_STRING_BINDING 6A4 Привязка строки недействительна
    RPC_S_PROTSEQ_NOT_SUPPORTED 6A7 Последовательность протоколов не поддерживается на этом хосте
    RPC_S_INVALID_RPC_PROTSEQ 6A8 Последовательность протокола недействительна.
    RPC_S_INVALID_ENDPOINT_FORMAT 6AA Недопустимый формат endpoint.
    RPC_S_INVALID_NET_ADDR 6AB Недействительный сетевой адрес.
    RPC_S_STRING_TOO_LONG 6CF Слишком длинная строка.
    RPC_S_INVALID_NAF_ID 6E3 Недопустимый идентификатор семейства сетевых адресов.

    Функция RpcStringFree освобождает строку символов, выделенную библиотекой времени выполнения RPC.

    1. RPC_STATUS RpcStringFree(

    Параметры

    • String ― Указатель на указатель на строку символов, которую нужно освободить.

    Возвращаемые значения

    Значение hex Описание
    RPC_S_OK

    0​

    Успешный вызов функции.

    Примечание
    Приложение отвечает за однократный вызов RpcStringFree для каждой строки символов, выделенной и возвращенной вызовами других процедур библиотеки времени выполнения RPC.
    NdrClientCall2
    Функция NdrClientCall2 точка входа на стороне клиента для заглушки режима /Oicf.

    1. CLIENT_CALL_RETURN RPC_VAR_ENTRY NdrClientCall2(

    2. [in] PMIDL_STUB_DESC pStubDescriptor,

    3. [in] PFORMAT_STRING  pFormat,

    Параметры

    • [in] pStubDescriptor ― Указатель на сгенерированную MIDL структуру MIDL_STUB_DESC, которая содержит информацию об описании удаленного интерфейса.
    • [in] pFormat ― Указатель на строку формата процедуры, сгенерированную MIDL, которая описывает метод и параметры.

      Указатель на стек вызовов на стороне клиента.

    Возвращаемые значения
    Возвращаемое значение удаленного вызова. Максимальный размер возвращаемого значения эквивалентен размеру регистра системы. MIDL переключается на заглушку режима /Os, если размер возвращаемого значения больше размера регистра. В зависимости от определения метода эта функция может вызвать исключение в случае сбоя сети или сервера.
    Примечания
    Функция NdrClientCall2 используется всеми клиентскими заглушками режима /Oicf. Функция NdrClientCall2 передает все [in] данные на удаленный сервер и после получения ответного пакета возвращает значение [out] клиентскому приложению.
    NdrServerCall2
    Функция NdrServerCall2 не предназначена для непосредственного вызова из приложения.

    Параметры

    • pRpcMsg ― зарезервировано.

    RpcServerUseProtseqEp
    Функция RpcServerUseProtseqEp указывает библиотеке времени выполнения RPC использовать указанную последовательность протоколов в сочетании с указанной конечной точкой для получения удаленных вызовов процедур.

    1. RPC_STATUS RpcServerUseProtseqEp(

    Параметры

    • Protseq ― указатель на строковый идентификатор последовательности протокола для регистрации в библиотеке времени выполнения RPC.
    • MaxCalls ― длина очереди очереди для последовательности протокола ncacn_ip_tcp. Все другие последовательности протоколов игнорируют этот параметр. Используйте RPC_C_PROTSEQ_MAX_REQS_DEFAULT, чтобы указать значение по умолчанию.
    • Endpoint ― указатель на информацию об адресе конечной точки, используемую при создании привязки для последовательности протоколов, указанной в параметре Protseq.
    • SecurityDescriptor ― указатель на необязательный параметр, предоставленный для подсистемы безопасности. Используется только для последовательностей протоколов ncacn_np и ncalrpc. Все другие последовательности протоколов игнорируют этот параметр. Использование дескриптора безопасности на конечной точке для обеспечения безопасности сервера не рекомендуется. Этот параметр отсутствует в спецификации DCE для этого API.

    Возвращаемые значения

    Значение hex Описание
    RPC_S_OK

    0​

    Успешный вызов функции
    RPC_S_PROTSEQ_NOT_SUPPORTED

    6A7​

    Последовательность протоколов не поддерживается на этом хосте
    RPC_S_INVALID_RPC_PROTSEQ

    6A8​

    Последовательность протокола недействительна.
    RPC_S_INVALID_ENDPOINT_FORMAT

    6AA​

    Недопустимый формат endpoint.
    RPC_S_OUT_OF_MEMORY C0000017 Системе не хватает памяти.
    RPC_S_DUPLICATE_ENDPOINT

    6CC​

    endpoint является дубликатом
    RPC_S_INVALID_SECURITY_DESC

    53A​

    Недопустимый дескриптор безопасности.

    Примечания
    Серверное приложение вызывает RpcServerUseProtseqEp для регистрации одной последовательности протокола в библиотеке времени выполнения RPC. При каждой регистрации последовательности протоколов RpcServerUseProtseqEp включает указанную информацию об адресе конечной точки.
    Чтобы получать запросы на удаленный вызов процедур, сервер должен зарегистрировать хотя бы одну последовательность протоколов в библиотеке времени выполнения RPC. Серверное приложение может вызывать эту процедуру несколько раз, чтобы зарегистрировать дополнительные последовательности протоколов и конечные точки. Для каждой последовательности протокола, зарегистрированной сервером, библиотека времени выполнения RPC создает одну или несколько конечных точек, через которые сервер получает запросы удаленного вызова процедур. Библиотека времени выполнения RPC создает разные конечные точки для каждой последовательности протоколов. Однако каждый интерфейс в процессе доступен через любую конечную точку.
    Для MaxCalls значение, предоставляемое приложением, является лишь подсказкой. Это значение может быть переопределено средой выполнения RPC или поставщиком сокетов Windows. Например, в Windows XP или Windows 2000 Professional значение ограничено 5. Значения больше 5 игнорируются и вместо них используется 5. В Windows Server 2003 и Windows 2000 Server это значение будет учитываться.
    Приложения должны быть осторожны, чтобы передавать разумные значения в MaxCalls. Большие значения для Server, Advanced Server или Datacenter Server могут привести к использованию большого объема памяти невыгружаемого пула. Использование слишком малого значения также нежелательно, так как это может привести к тому, что пакеты TCP SYN будут встречены протоколом TCP RST с сервера, если очередь ожидания будет исчерпана. Разработчик приложения должен сбалансировать объем памяти и требования к масштабируемости при определении правильного значения для MaxCalls.
    Если компьютер настроен на использование выборочной привязки, успешный возврат не гарантирует, что сервер создал конечные точки для всех сетевых интерфейсов, присутствующих на компьютере. Среда выполнения RPC может не прослушивать некоторые сетевые интерфейсы в зависимости от настроек выборочной привязки. Кроме того, если интерфейс еще не получил IP-адрес с помощью DHCP, сервер RPC не прослушивает сетевой интерфейс, пока ему не будет назначен DHCP-адрес. Успешный возврат означает, что сервер прослушивает по крайней мере один сетевой интерфейс; полный список дескрипторов привязки, через которые могут быть получены удаленные вызовы процедур, можно получить с помощью вызова функции
    RpcServerInqBindings.
    RpcServerRegisterIf
    Функция RpcServerRegisterIf регистрирует интерфейс в библиотеке времени выполнения RPC.

    1. RPC_STATUS RpcServerRegisterIf(

    Параметры

    • IfSpec ― генерируемая MIDL структура, указывающая интерфейс для регистрации.
    • MgrTypeUuid ― Указатель на UUID типа для связи с параметром MgrEpv. Указание нулевого значения параметра (или нулевого UUID) регистрирует IfSpec с нулевым UUID.
    • MgrEpv ― Вектор точек входа (EPV) подпрограмм менеджера. Чтобы использовать EPV по умолчанию, сгенерированный MIDL, укажите нулевое значение.

    Возвращаемое значение
    Возвращает RPC_S_OK в случае успеха.
    Примечания
    Сервер может зарегистрировать неограниченное количество интерфейсов в библиотеке времени выполнения RPC. Регистрация делает интерфейс доступным для клиентов, используя дескриптор привязки к серверу. Чтобы зарегистрировать интерфейс, код серверного приложения вызывает RpcServerRegisterIf. Для каждой реализации интерфейса, которую предлагает сервер, он должен зарегистрировать отдельный EPV менеджера.
    При вызове RpcServerRegisterIf сервер предоставляет следующую информацию:
    Спецификация интерфейса. Спецификация интерфейса — это структура данных, которую генерирует компилятор MIDL. Сервер указывает интерфейс с помощью параметра IfSpec.
    UUID типа менеджера и EPV менеджера ― UUID типа менеджера и EPV менеджера определяют, какая подпрограмма менеджера выполняется, когда сервер получает запрос удаленного вызова процедуры от клиента. Сервер указывает UUID и EPV типа менеджера, используя параметры MgrTypeUuid и MgrEpv. Обратите внимание, что при указании UUID типа менеджера, отличного от nil, сервер должен также вызывать функцию RpcObjectSetType для регистрации объектов этого отличного от nil типа. Если вашему серверному приложению необходимо зарегистрировать интерфейс автоматического прослушивания или использовать функцию обратного вызова для аутентификации, используйте RpcServerRegisterIfEx.
    RpcServerListen
    Функция RpcServerListen сигнализирует библиотеке времени выполнения RPC прослушивать удаленные вызовы процедур. Эта функция не повлияет на интерфейсы автоматического прослушивания; используйте RpcServerRegisterIfEx , если вам нужна эта функциональность.

    1. RPC_STATUS RpcServerListen(

    2. unsigned int MinimumCallThreads,

    Параметры

    • MinimumCallThreads ― подсказка для среды выполнения RPC, указывающая минимальное количество потоков вызовов, которые должны быть созданы и поддерживаться на данном сервере. Это значение является лишь подсказкой и интерпретируется по-разному в разных версиях Windows. В Windows XP это значение представляет собой количество ранее созданных потоков в каждом пуле потоков, которые создает среда выполнения RPC. Приложение должно указать один для этого параметра и отложить принятие решений о создании потока во время выполнения RPC.
    • MaxCalls ― рекомендуемое максимальное количество одновременных удаленных вызовов процедур, которые может выполнить сервер. Чтобы обеспечить эффективную производительность, библиотеки времени выполнения RPC интерпретируют параметр MaxCalls как предлагаемый предел, а не как абсолютную верхнюю границу. Используйте RPC_C_LISTEN_MAX_CALLS_DEFAULT , чтобы указать значение по умолчанию.
    • DontWait ― флаг, управляющий возвратом от RpcServerListen. Ненулевое значение указывает, что RpcServerListen должен вернуться сразу после завершения обработки функции. Нулевое значение указывает, что RpcServerListen не должен возвращаться до тех пор, пока не будет вызвана функция RpcMgmtStopServerListening и не будут завершены все удаленные вызовы.

    Возвращаемые значения

    Значение hex Описание
    RPC_S_OK

    0​

    Успешный вызов функции
    RPC_S_ALREADY_LISTENING 6B1 Сервер уже в режиме прослушивания.
    RPC_S_NO_PROTSEQS_REGISTERED 6B2 Протокольные последовательности не зарегистрированы.
    RPC_S_MAX_CALLS_TOO_SMALL 6CE Максимальное значение вызовов слишком мало.

    RpcServerUnregisterIf
    Функция RpcServerUnregisterIf удаляет интерфейс из реестра библиотеки времени выполнения RPC.

    1. RPC_STATUS RpcServerUnregisterIf(

    2. unsigned int  WaitForCallsToComplete

    Параметры

    • IfSpec ― Интерфейс для удаления из реестра. Укажите нулевое значение, чтобы удалить все интерфейсы, ранее зарегистрированные со значением UUID типа, указанным в параметре MgrTypeUuid.
    • MgrTypeUuid ― указатель на тип UUID вектора точки входа менеджера (EPV), который необходимо удалить из реестра. Значение MgrTypeUuid должно быть тем же значением, которое было предоставлено при вызове функции RpcServerRegisterIf, RpcServerRegisterIf2 или функции RpcServerRegisterIfEx. Укажите нулевое значение, чтобы удалить интерфейс, указанный в параметре IfSpec, для всех ранее зарегистрированных UUID типов из реестра. Укажите нулевой UUID, чтобы удалить EPV менеджера по умолчанию, сгенерированный MIDL, из реестра. В этом случае все EPV менеджера, зарегистрированные с UUID отличного от nil типа, остаются зарегистрированными.
    • WaitForCallsToComplete ― флаг, указывающий, следует ли немедленно удалить интерфейс из реестра или дождаться завершения всех текущих вызовов. Укажите нулевое значение, чтобы игнорировать текущие вызовы и немедленно удалить интерфейс из реестра. Укажите любое ненулевое значение для ожидания завершения всех активных вызовов.

    Возвращаемые значения

    Значение hex Описание
    RPC_S_OK

    0​

    Успешный вызов функции
    RPC_S_UNKNOWN_MGR_TYPE 6B4 Тип менеджера неизвестен.
    RPC_S_UNKNOWN_IF 6B5 Интерфейс неизвестен.

    Вложения:

    • 14.zip
      Размер файла:
      246,5 КБ
      Просмотров:
      43
    • 8a0fd91187a467189a4a3c1662b1d11a.png

  • Mikl___

    Супермодератор
    Команда форума

    Публикаций:

    14

    Регистрация:
    25 июн 2008
    Сообщения:
    3.465

    Атрибут ncalrpc

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

    1. endpoint(«ncalrpc:[port-name]»)

    Параметры

    port-name
    Символьная строка, задающая порт связи (приложение, служба или экземпляр службы), который клиент использует для выполнения межпроцессных вызовов к серверу. Строка может содержать до 53 символов и не должна содержать символы обратной косой черты (). Имя компьютера не должно использоваться с ключевым словом ncalrpc .
    Синтаксис строки локального межпроцессного порта, как и все строки портов, определяется реализацией транспорта и не зависит от спецификации IDL. Компилятор MIDL выполняет ограниченную проверку синтаксиса, но не гарантирует правильность спецификации endpoint. Некоторые классы ошибок могут сообщаться во время выполнения, а не во время компиляции.

    Атрибут endpoint

    Атрибут [endpoint] указывает известный порт или порты (endpoint связи), на которых серверы интерфейса прослушивают вызовы.

    1. endpoint(«protocol-sequence:[endpoint-port]» [ ,] )

    Параметры

    последовательность протоколов
    Задает символьную строку, представляющую допустимое сочетание протокола RPC (например, ncacn), транспортного протокола (например, tcp) и сетевого протокола (например, ip).

    Список допустимых последовательностей протоколов

    Microsoft RPC поддерживает следующие последовательности протоколов.

    Константа Значение Описание
    ncacn_nb_tcp Протокол TCP, ориентированный на подключение NetBIOS Только клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncacn_nb_ipx Ориентированные на подключение NetBIOS через интернет-пакет Exchange (IPX) Только клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncacn_nb_nb Ориентированный на подключение пользовательский интерфейс NetBIOS (NetBEUI) Только клиент: MS-DOS, Windows 3.x Client and Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, Windows 95
    ncacn_ip_tcp Протокол TCP/IP, ориентированный на подключение Только клиент: MS-DOS, Windows 3.x и клиент и сервер Apple Macintosh: Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, Windows 95
    ncacn_np Именованные каналы, ориентированные на подключение Только клиент: MS-DOS, Windows 3.x, Windows 95 Client and Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncacn_spx Exchange пакетов, ориентированных на подключение (SPX) Только клиент: MS-DOS, Windows 3.x Client and Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, Windows 95
    ncacn_dnet_nsp Транспорт DECnet, ориентированный на подключение Только клиент: MS-DOS, Windows 3.x
    ncacn_at_dsp Поставщик служб DSP AppleTalk, ориентированный на подключение Клиент: Apple Macintosh Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncacn_vns_spp Транспорт масштабируемой параллельной обработки с ориентацией на подключение (SPP) Только клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncadg_ip_udp Datagram (без подключения) User Datagram Protocol/Internet Protocol (UDP/IP) Только клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncadg_ipx Datagram (без подключения) IPX Только клиент: MS-DOS, клиент Windows 3.x и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT
    ncadg_mq Датаграмма (без подключения) через сервер очереди сообщений Майкрософт (MSMQ) Только клиент: Windows Me/98/95 Client and Server: Windows Server 2003, Windows XP, Windows 2000, Windows NT Server 4.0 с пакетом обновления 3 (SP3) и более поздних версий
    ncacn_http Протокол TCP/IP, ориентированный на подключение, с помощью Microsoft Internet Information Server в качестве прокси-сервера HTTP Только клиент: Windows Me/98/95 Client and Server: Windows Server 2003, Windows XP, Windows 2000
    ncalrpc Вызов локальной процедуры Клиент и сервер: Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, Windows 95

    порт endpoint
    Указывает строку, представляющую назначение endpoint для указанного семейства протоколов. Синтаксис строки порта зависит от каждой последовательности протоколов.
    Атрибут [endpoint] указывает семейство транспорта, такое как протокол, ориентированный на подключение TCP/IP, протокол, ориентированный на подключение NetBIOS, или протокол, ориентированный на подключение с именованным каналом. Использование атрибута [endpoint] согласуется с другими методами добавления endpoint и не предоставляет дополнительные или специальные службы для endpoint; он просто предоставляет ярлык для вызова API.

    14.jpg

    Передача текста, картинок и музыки между приложениями практически мгновенная! :)
    Текст приложения-сервера 14r.asm

    1. RPC_C_LISTEN_MAX_CALLS_DEFAULT equ 1234

    2. RPC_SERVER_INTERFACE struct

    3.     RpcProtseqEndpointCount  dd ?,?

    4. RPC_SERVER_INTERFACE ends

    5. mov    r9d,offset DialogProc

    6.         invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP

    7.         invoke  RtlExitUserProcess,NULL

    8. DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword

    9. wmINITDIALOG:mov hWnd,rcx

    10.     invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO

    11. ;start Rpc Server And Listen———————————

    12.     invoke    RpcServerUseProtseqEpA,,RPC_C_LISTEN_MAX_CALLS_DEFAULT,,0

    13. or    eax,eax;cmp    eax,RPC_S_OK

    14. @@:    mov    ecx,offset RPC_SampleInterface_v1_0_s_ifspec

    15.     invoke    RpcServerRegisterIf,,0,0

    16. or    eax,eax;cmp    eax,RPC_S_OK

    17. mov    edx,offset aUnableToRegist

    18. ; Start to listen for remote procedure

    19. ; calls for all registered interfaces.

    20. ; This call will not return until

    21. ; RpcMgmtStopServerListening is called.

    22. @@:    invoke    RpcServerListen,1,;Recommended minimum number of threads.

    23.     RPC_C_LISTEN_MAX_CALLS_DEFAULT,;Recommended maximum number of threads

    24. or    eax,eax;cmp    eax,RPC_S_OK

    25. mov    edx,offset aUnableToStartL

    26.     invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_OK

    27. mov    ecx,offset RPC_SampleInterface_v1_0_s_ifspec

    28.     invoke    RpcServerUnregisterIf,,0,0

    29. or    eax,eax;cmp    eax,RPC_S_OK

    30. mov    edx,offset aUnableToUnregi

    31. @0:    mov    r8d,offset szAppName

    32.     invoke    MessageBoxA,hWnddlg,,,MB_ICONEXCLAMATION or MB_OK

    33. ;—————————————————

    34. wmCOMMAND:cmp    r8d,BN_CLICKED shl 16 + IDCANCEL

    35. wmCLOSE:invoke    EndDialog,,0

    36. ; Memory allocation function for RPC.

    37. ; The runtime uses these two functions for allocating/deallocating

    38. ; enough memory to pass the string to the server.

    39. MIDL_user_allocate proc len:qword

    40.     invoke    RtlAllocateHeap,hHeap,0

    41. MIDL_user_free proc lpMem:qword

    42. RPC_SampleInterface_sampleFunc proc handle_t:qword,size_:dword,buffer:qword

    43.     invoke    SetDlgItemTextA,hWnd,IDC_TXT;,buffer

    44. ;——————————————————————

    45. @@:    cmp    byte ptr[r8],CF_BITMAP

    46.     invoke  CreateIconFromResourceEx,,,TRUE,30000h,256,256,LR_DEFAULTCOLOR

    47.     invoke  SendDlgItemMessageA,hWnd,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax

    48. ;——————————————————————

    49. ;»RIFF»+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h

    50.         invoke    waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC

    51. ; Подготавливаем заголовок для вывода

    52. mov    ecx,(sizeof WAVEHDR)/8

    53. ;»RIFF»+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+

    54. ;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+

    55. ;(BitsPerSample*Channels/8)+(Bits per sample)+(“data” chunk header)+(Size of the data section)=2Ch

    56. mov    [rdx].WAVEHDR.lpData,rax ;адрес блока данных

    57. mov    [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных

    58.     invoke    waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR

    59. ; Запускаем проигрывание блока

    60.     invoke    waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR

    61. @@:    test    lpwiocb.dwFlags,WHDR_DONE

    62.     invoke    waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR

    63.     invoke    waveOutClose,hWaveOut

    64. RPC_SampleInterface_sampleFunc endp

    65. ;————————————————————————

    66. szWin        db «Remote Procedure Call Sender»,0

    67. Error1        db «The server is not running.»,10,«Run?»,0

    68. szAppName    db «Remote Procedure Call Reciever»,0

    69. endpoint    db «{46E785FC-BCCC-46B8-B161-D6C90D391670}»,0; // Unique user-defined endpoint ID in a free form

    70. Format        db «Unable to setup protocol sequence»,0

    71. aUnableToRegist    db «Unable to register the interface»,0

    72. aUnableToStartL db «Unable to start listening»,0

    73. aUnableToUnregi db «Unable to unregister the interface»,0

    74. RPC_SampleInterface_v1_0_s_ifspec label RPC_SERVER_INTERFACE

    75. dd sizeof RPC_SERVER_INTERFACE;Length

    76.     GUID <8A4A7813h,0ADAAh,49BCh,{99h,6Ah,4Dh,47h,71h,5Fh,0CAh,40h}>

    77.     RPC_VERSION <1,0>          ;RPC_VERSION  MajorVersion: u16, MinorVersion: u16 +14

    78.     GUID <8A885D04h,1CEBh,11C9h,{9Fh,0E8h,8,0,2Bh,10h,48h,60h}>               ;+20

    79.     RPC_VERSION <2,0>          ;RPC_VERSION  MajorVersion: u16, MinorVersion: u16 +28

    80. dq RPC_SampleInterface_v1_0_DispatchTable;DispatchTable: *mut RPC_DISPATCH_TABLE +30

    81. dd 0,0 ;RpcProtseqEndpointCount: u32                 +38

    82. dq 0   ;RpcProtseqEndpoint: *mut RPC_PROTSEQ_ENDPOINT +3C

    83. dq 0   ;DefaultManagerEpv: *mut c_void               +44

    84. dq RPC_SampleInterface_ServerInfo;InterpreterInfo: *const c_void +4C

    85. RPC_SampleInterface_v1_0_DispatchTable:

    86. dq RPC_SampleInterface_table

    87. RPC_SampleInterface_table:

    88. ;———————————————

    89. RPC_SampleInterface_ServerInfo:

    90. dq RPC_SampleInterface_StubDesc

    91. dq RPC_SampleInterface_ServerRoutineTable

    92. dq RPC_SampleInterface__MIDL_ProcFormatString

    93. dq RPC_SampleInterface_FormatStringOffsetTable

    94. RPC_SampleInterface_StubDesc:

    95. dq RPC_SampleInterface_v1_0_s_ifspec

    96. dq RPC_SampleInterface__MIDL_TypeFormatString

    97. ;——————————————

    98. RPC_SampleInterface_ServerRoutineTable dq RPC_SampleInterface_sampleFunc

    99. RPC_SampleInterface__MIDL_ProcFormatString:

    100. RPC_SampleInterface_FormatStringOffsetTable:

    101. RPC_SampleInterface__MIDL_TypeFormatString:

    ресурсы (14r.rc)

    1. IDC_DIALOG DIALOG 0,0,212,140

    2. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |

    3. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

    4. CAPTION «Remote Procedure Call Reciever»

    5.     CONTROL    «»,-1,«BUTTON»,BS_GROUPBOX, 2, 1, 207, 24

    6.     CONTROL    «»,IDC_TXT,«STATIC»,WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL,5,7,199,13

    7.     DEFPUSHBUTTON  «Exit»,IDCANCEL,149,27,60,15

    8.         CONTROL    1,ID_ICON,«STATIC»,WS_CHILDWINDOW | SS_ICON,5,23,128,128

    Текст приложения-клиента (14s.asm)

    1. RPC_C_LISTEN_MAX_CALLS_DEFAULT equ 1234

    2. RPC_CLIENT_INTERFACE struct

    3.     RpcProtseqEndpointCount  dd ?,?

    4. RPC_CLIENT_INTERFACE ends

    5. mov    qword ptr [rbp8],LR_DEFAULTCOLOR

    6.     invoke    LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR

    7. mov    r9d,offset DialogProc

    8. mov    qword ptr[rbp10h],rax;30h-10h=+20h

    9.     invoke    DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP

    10.     invoke    RtlExitUserProcess,NULL

    11. DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD

    12. local    szReadWrite:qword    ;number of bytes actually read or write

    13. local    stringBinding:qword

    14. wmSEND_WAV:mov    ecx,offset wav_file

    15.     invoke    CreateFile,,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,

    16.     invoke    GlobalAlloc,GPTR,eax

    17.         invoke    ReadFile,hFile,eax,FSize

    18.     invoke    RPC_SampleInterface_sampleFunc,bindingHandle,FSize,p

    19.     invoke    FindResource,0,,RT_ICON; find the resource

    20.     invoke  SizeofResource,0,eax        ; get its size

    21.     invoke    GlobalAlloc,GPTR,eax

    22.     invoke    LoadResource,0,hResource    ; load the resource

    23.     invoke    LockResource,eax;pResource

    24. mov    byte ptr[rdi],CF_BITMAP

    25.     invoke    RPC_SampleInterface_sampleFunc,bindingHandle,,p

    26. and    qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0

    27.     invoke  CreateIconFromResourceEx,,FSize,TRUE,30000h;270376,TRUE,30000h

    28.     invoke  SendDlgItemMessageA,hWnd,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON

    29. wmSEND_TXT:invoke GlobalAlloc,GPTR,256

    30. mov    byte ptr[rax],CF_TEXT

    31.     invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,256

    32.     invoke    RPC_SampleInterface_sampleFunc,bindingHandle,eax,p

    33. wmINITDIALOG:mov hWnd,rcx

    34.     invoke    GetDlgItem,hWnddlg,IDC_IMG1

    35.     invoke    SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam

    36. ;setup Rpc——————————

    37.     movr    qword ptr[rsp+20h],security

    38.     invoke    RpcStringBindingComposeA,0,,0

    39. mov    edx,offset bindingHandle

    40.     invoke    RpcBindingFromStringBindingA,stringBinding

    41.         invoke    RpcStringFreeW,&stringBinding

    42. ;—————————————————-

    43.     invoke    MessageBoxA,hWnd,,,MB_OK

    44. wmCOMMAND:cmp    r8d,BN_CLICKED shl 16 + ID_SEND_TXT

    45. cmp    r8d,BN_CLICKED shl 16 + ID_SEND_WAV

    46. cmp    r8d,BN_CLICKED shl 16 + ID_SEND_ICO

    47. cmp     r8d,BN_CLICKED shl 16 + IDCANCEL

    48. wmCLOSE:invoke    EndDialog,,0

    49. mov    ecx,offset bindingHandle

    50. RPC_SampleInterface_sampleFunc proc bindingHandle:qword,bufferLength:dword,buffer:qword

    51. lea    rdx, RPC_SampleInterface__MIDL_ProcFormatString

    52. lea    rcx,RPC_SampleInterface_StubDesc ; pStubDescriptor

    53. RPC_SampleInterface_sampleFunc endp

    54. MIDL_user_allocate proc len:qword

    55.     invoke    RtlAllocateHeap,hHeap,0

    56. MIDL_user_free proc lpMem:qword

    57. ;—————————————

    58. szWin        db ‘Remote Procedure Call Reciever’,0

    59. Error        db «Unable to setup an RPC connection, exiting…»,0

    60. endpoint    db «{46E785FC-BCCC-46B8-B161-D6C90D391670}»,0; // Unique user-defined endpoint ID in a free form

    61. security    db «Security=impersonation static false»,0

    62. RPC_SampleInterface__MIDL_ProcFormatString:

    63. RPC_SampleInterface_StubDesc:

    64. dq RPC_SampleInterface___RpcClientInterface; RpcInterfaceInformation

    65. dq MIDL_user_allocate;    pfnAllocate

    66. dq MIDL_user_free; pfnFree

    67. dq RPC_SampleInterface__MIDL_AutoBindHandle; IMPLICIT_HANDLE_INFO.pAutoHandle

    68. dq 0            ; apfnNdrRundownRoutines

    69. dq 0            ; aGenericBindingRoutinePairs

    70. dq RPC_SampleInterface__MIDL_TypeFormatString; pFormatTypes

    71. dd 8010274h        ; MIDLVersion

    72. dq 0            ; aUserMarshalQuadruple

    73. dq 0            ; NotifyRoutineTable

    74. RPC_SampleInterface___RpcClientInterface label RPC_CLIENT_INTERFACE

    75. dd sizeof RPC_CLIENT_INTERFACE;Length struct;+0

    76.     GUID <8A4A7813h,0ADAAh,49BCh,{99h,6Ah,4Dh,47h,71h,5Fh,0CAh,40h}>

    77.     GUID <8A885D04h,1CEBh,11C9h,{9Fh,0E8h,8,0,2Bh,10h,48h,60h}>

    78. dq 0;  PRPC_DISPATCH_TABLE   DispatchTable;+30h

    79. dd 0,0;  unsigned int          RpcProtseqEndpointCount;+38h

    80. dq 0;  PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;+40h

    81. dq 0;  ULONG_PTR             Reserved;+48h

    82. dq 0;  void const            *InterpreterInfo;+50h

    83. dd 0;unsigned int          Flags;+5Ch

    84. RPC_SampleInterface__MIDL_AutoBindHandle dq 0,0

    85. RPC_SampleInterface__MIDL_TypeFormatString:

    86. ;——————————-

    87. wav_file db ‘..Images3.wav’,0

    ресурсы (14s.rc)

    1. IDC_ICON1 ICON «..Imagesicon1.ico»

    2. IDC_ICON2 ICON «..Imagesicon2.ico»

    3. IDC_DIALOG DIALOG 0, 0, 212, 140

    4. STYLE 0x0004  | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |

    5. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

    6. CAPTION «Remote Procedure Call Sender»

    7.     CONTROL «»,-1,«BUTTON»,BS_GROUPBOX, 2, 1, 207, 24

    8.     CONTROL «»,IDC_IMG1,«Static»,WS_CHILDWINDOW | WS_VISIBLE | SS_ICON,5,23,128,128

    9.     CONTROL «Write something and click ‘Send Text’»,ID_TXT,«EDIT»,WS_BORDER|WS_TABSTOP|ES_AUTOHSCROLL,5,7,199,13

    10.     DEFPUSHBUTTON   «Send Text»,ID_SEND_TXT,149,27,60,15

    11.     PUSHBUTTON      «Send ICO», ID_SEND_ICO,149,45,60,15

    12.     PUSHBUTTON      «Send WAV», ID_SEND_WAV,149,65,60,15

    13.     PUSHBUTTON      «Exit»,     IDCANCEL,   149,85,60,15

    в аттаче ASM-/RC-/EXE-файлы

  • Mikl___

    Супермодератор
    Команда форума

    Публикаций:

    14

    Регистрация:
    25 июн 2008
    Сообщения:
    3.465

    15. DLL

    06.jpg

    Текст приложения-сервера (15s.asm)

    1. ExeToDll PROTO :qword,:dword,:dword

    2. DllToExe PROTO :qword,:dword,:dword

    3. WinMain proc ;dummy:qword

    4. and     qword ptr [rbp8],LR_DEFAULTCOLOR

    5. invoke LoadImageA,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,0,0,LR_DEFAULTCOLOR

    6. mov r9d,offset DialogProc

    7. invoke DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP

    8. invoke RtlExitUserProcess,NULL

    9. DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD

    10. local cdata:COPYDATASTRUCT

    11. local szReadWrite:qword ;number of bytes actually read or write

    12. wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1

    13. invoke SendMessageA,eax,STM_SETIMAGE,IMAGE_ICON,lParam

    14. wmSEND_TXT:invoke GlobalAlloc,GPTR,256

    15. invoke  GetDlgItemTextA,hWnddlg,ID_TXT,eax,256

    16.         invoke ExeToDll,buffer,eax,CF_TEXT

    17. ; Отправить данные получателю

    18. mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG

    19. mov qword ptr[rsp+28h],5000

    20. invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg

    21. invoke FindResource,0,,RT_ICON; find the resource

    22. invoke  SizeofResource,0,eax ; get its size

    23. invoke LoadResource,0,hResource ; load the resource

    24. invoke LockResource,eax;pResource

    25. ;————————————————-

    26. and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0

    27. invoke  CreateIconFromResourceEx,p,,TRUE,30000h;270376,TRUE,30000h

    28. invoke  SendDlgItemMessageA,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON

    29. invoke ExeToDll,p,,CF_BITMAP

    30. ; Отправить данные получателю

    31. mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG

    32. mov qword ptr[rsp+28h],5000

    33. invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg

    34. wmSEND_WAV:mov ecx,offset wav_file

    35. invoke CreateFile,,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,

    36.         invoke GlobalAlloc,GPTR,eax

    37.         invoke ReadFile,hFile,eax,FSize

    38. invoke ExeToDll,p,,CF_WAVE

    39. ; Отправить данные получателю

    40. mov qword ptr[rsp+20h],SMTO_ABORTIFHUNG

    41. mov qword ptr[rsp+28h],500

    42. invoke  SendMessageTimeoutA,eax,WM_USER+1,hWnddlg

    43. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT

    44. cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO

    45. cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV

    46. cmp     r8d,BN_CLICKED shl 16 + IDCANCEL

    47. wmCLOSE:invoke EndDialog,,0

    48. ;—————————————

    49. szWin db ‘DLL Reciever’,0

    50. wav_file db ‘..Images3.wav’,0

    ресурсы (15s.rc)

    1. IDC_ICON1 ICON «..Imagesicon1.ico»

    2. IDC_ICON2 ICON «..Imagesicon2.ico»

    3. IDC_DIALOG DIALOGEX 200, 0, 212, 154

    4. STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |

    5. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

    6. CONTROL «»,-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE,2,-1,207,24

    7. CONTROL «»,IDC_IMG1,STATIC,SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128

    8. CONTROL «Write something and click ‘Send Text’»,ID_TXT,EDIT,ES_LEFT |

    9. ES_AUTOHSCROLL|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP,5,7,199,13

    10. CONTROL «Send Text», ID_SEND_TXT, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |

    11. WS_VISIBLE | WS_TABSTOP, 149, 27, 60, 15

    12. CONTROL «Send ICO», ID_SEND_ICO, BUTTON, BS_PUSHBUTTON | WS_CHILD |

    13. WS_VISIBLE | WS_TABSTOP, 149, 45, 60, 15

    14. CONTROL «Send WAV», ID_SEND_WAV, BUTTON, BS_PUSHBUTTON | WS_CHILD |

    15. WS_VISIBLE | WS_TABSTOP, 149, 65, 60, 15

    16. CONTROL «Exit»,IDCANCEL,BUTTON,BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE |

    17. WS_TABSTOP, 149, 85, 60, 15

    Текст приложения-клиента (15r.asm)

    1. ExeToDll PROTO :qword,:dword,:dword

    2. DllToExe PROTO :qword,:dword,:dword

    3.         invoke  DialogBoxParamA,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP,qword ptr(offset DialogProc),0

    4.         invoke  RtlExitUserProcess,NULL

    5. DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword

    6. wmINITDIALOG:;mov rcx,hWnd

    7.         invoke  FindWindowA,0,&szWin

    8. invoke MessageBoxA,hWnddlg,&Error1,&szAppName,MB_ICONEXCLAMATION or MB_YESNO

    9. invoke WinExec,&szService,SW_SHOW

    10. cmp     r9b,CF_BITMAP; Это нужный тип данных?

    11. ;»RIFF»+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h

    12.         invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC

    13. ; Подготавливаем заголовок для вывода

    14. mov ecx,(sizeof WAVEHDR)/8

    15. ;»RIFF»+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+

    16. ;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+

    17. ;(BitsPerSample*Channels/8)+(Bits per sample)+(“data” chunk header)+(Size of the data section)=2Ch

    18. mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных

    19. mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных

    20. invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR

    21. ; Запускаем проигрывание блока

    22. invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR

    23. @@: test lpwiocb.dwFlags,WHDR_DONE

    24. invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR

    25. invoke waveOutClose,hWaveOut

    26. COPY_TEXT:invoke DllToExe

    27. invoke SetDlgItemTextA,hWnddlg,ID_TXT,eax

    28. ; Создать HICON напрямую из памяти

    29. invoke  CreateIconFromResourceEx,eax,FSize,TRUE,30000h,256,256,LR_DEFAULTCOLOR

    30. invoke  SendDlgItemMessageA,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax

    31. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL

    32. wmCLOSE:invoke EndDialog,,0

    33. Error1   db «The server is not running.»,10,«Run?»,0

    34. szAppName db «DLL Reciever»,0

    35. ClassName db ‘DLGCLASS’,0

    ресурсы приложения-клиента (15r.rc)

    1. IDC_DIALOG DIALOGEX 0,0,212,154

    2. STYLE DS_MODALFRAME | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |

    3. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

    4. CONTROL «»,-1,BUTTON,BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 2,-3,207,24

    5. CONTROL «», ID_TXT, STATIC, SS_LEFT | SS_NOPREFIX | WS_CHILD |

    6. WS_VISIBLE | WS_BORDER | WS_TABSTOP, 5, 5, 199, 13

    7. CONTROL «Exit», IDCANCEL, BUTTON, BS_DEFPUSHBUTTON | WS_CHILD |

    8. WS_VISIBLE | WS_TABSTOP, 149, 25, 60, 15

    9. CONTROL «»,ID_ICON, STATIC, SS_ICON | WS_CHILD | WS_VISIBLE,3,40,128,128

    Текст IPC.dll

    1. DllMain proc hInstDLL:QWORD, reason:QWORD, unused:QWORD

    2. ExeToDll proc buffer:qword,FSize:dword,type0:dword

    3. bufferDLL db 8000000 dup(?)

    Текст IPC.def

    в аттаче ASM-/RC-/EXE-/DLL-/DEF-/LIB-файлы

    Вложения:

    • Cisco AnyConnect — популярный вариант VPN для удаленных сотрудников, которые пытаются получить доступ к корпоративным ресурсам безопасным и контролируемым образом.
    • Некоторые пользователи не могут установить или запустить Cisco AnyConnect на своих ПК из-за ошибки агента VPN-клиента. Мы можем научить вас, как это исправить.
    • Посетите наш Раздел устранения неполадок VPN чтобы найти более удобные руководства по VPN.
    • Ознакомьтесь с нашими Cisco Hub для получения дополнительных руководств, новостей и исправлений Cisco.

    ИСПРАВИТЬ ОШИБКУ агента Vpn

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

    1. Скачать DriverFix (проверенный файл загрузки).
    2. Нажмите Начать сканирование найти все проблемные драйверы.
    3. Нажмите Обновите драйверы чтобы получить новые версии и избежать сбоев в работе системы.
    • DriverFix был загружен 0 читатели в этом месяце.

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

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

    Несмотря на прямолинейность Cisco AnyConnect, некоторые пользователи сообщали о трудностях при установке или запуске программы.

    Чтобы быть более конкретным, во время установки или при попытке запустить Cisco AnyConnect пользователям будет предложено сообщение об ошибке:

    Агент клиента VPN не смог создать хранилище межпроцессного взаимодействия.

    Как оказалось, эта проблема не редкость, и в ней есть несколько простых исправлений. Ознакомьтесь с ними ниже:

    Как исправить ошибку межпроцессного взаимодействия агента клиента VPN?

    Отключить ICS (общий доступ к подключению к Интернету)

    1. нажмите Win + R комбинация клавиш на клавиатуре
    2. Тип control.exe / имя Microsoft. Центр коммуникаций и передачи данныхЗапустить аксессуар. Агенту клиента VPN не удалось создать хранилище межпроцессного взаимодействия.
    3. Нажмите Входить на клавиатуре или щелкните ОК кнопкаАгенту VPN-клиента Центра управления сетями и общим доступом не удалось создать хранилище межпроцессного взаимодействия.
    4. Щелкните значок Смените настройки адаптера кнопка
    5. Щелкните правой кнопкой мыши общее сетевое подключение и выберите Характеристики
      Сетевые подключения Агенту VPN-клиента не удалось создать хранилище межпроцессного взаимодействия.
    6. Перейдите к Совместное использование вкладкапараметры совместного использования соединения. Агенту VPN-клиента не удалось создать хранилище межпроцессного взаимодействия.
    7. Снимите флажок Разрешить другим пользователям подключаться через подключение к Интернету на этом компьютере. коробка
    8. Щелкните значок ОК кнопка
    9. Повторите описанные выше шаги для каждого общего сетевого подключения.
    10. По завершении перезагрузите компьютер с Windows.

    Функция совместного использования подключения к Интернету несовместима с Cisco AnyConnect.

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


    Не удается установить Cisco AnyConnect на ПК с Windows 10? Ознакомьтесь с нашим руководством и узнайте, как решить эту проблему.


    По этой причине перед установкой / запуском Cisco AnyConnect убедитесь, что вы отключили ICS для всех активных сетевых подключений.

    Если описанный выше метод не работает для вас, перейдите ко второму предлагаемому ниже исправлению.

    Отключить службу ICS

    Заключение

    Учитывая все обстоятельства, легко увидеть, что оба решения основаны на отключении функции общего доступа к подключению к Интернету.

    В большинстве случаев отключение ICS прямо из общего соединения должно восстановить функциональность Cisco AnyConnect.

    Однако, если проблема имеет более глубокие корни, возможно, вам придется запачкать руки и полностью отключить службу ICS.

    Часто задаваемые вопросы

    • Как я могу исправить проблемы с установкой Cisco AnyConnect?

      Если вы столкнетесь проблемы при установке Cisco AnyConnect на вашем ПК с Windows 10 наше руководство поможет вам исправить их в кратчайшие сроки.

    • Как мне исправить, что клиент Cisco VPN не смог установить ошибку соединения?

      Если твой Клиент Cisco VPN не может установить соединение, ознакомьтесь с нашим руководством и узнайте, как решить эту проблему.

    • Как установить Cisco VPN в Windows 10?

      Наше подробное руководство научит вас установить Cisco VPN в Windows 10 в миг.

    Некоторые пользователи получают Агенту VPN-клиента не удалось создать хранилище межпроцессного взаимодействия. ошибка при установке Клиент безопасной мобильности Cisco AnyConnect. Другие пользователи сообщают, что сталкиваются с ошибкой при попытке запустить AnyConnect заявление. Обычно проблема возникает с версией 3.1.05170.

    Агенту VPN-клиента не удалось создать хранилище межпроцессного взаимодействия

    Агенту VPN-клиента не удалось создать хранилище межпроцессного взаимодействия

    Что такое Cisco AnyConnect?

    Cisco AnyConnect — это унифицированный агент безопасности, который предоставляет несколько сервисов безопасности для защиты предприятий от атак безопасности. Хотя Cisco AnyConnect включает в себя функцию VPN, это гораздо больше, чем просто VPN.

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

    Что является причиной того, что агент клиента VPN не смог создать межпроцессную ошибку?

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

    Как выясняется из, Совместное использование подключения к Интернету (ICS) не совместим с AnyConnect программное обеспечение. Чтобы обеспечить правильную работу AnyConnect, пользователи должны отключить Совместное использование подключения к Интернету характерная черта.

    Если вы попытаетесь установить или запустить приложение AnyConnect, когда на том же компьютере включен ICS, приложение вернет следующую ошибку:

    «Агент клиента VPN не смог создать хранилище межпроцессного взаимодействия»

    Если вы изо всех сил пытаетесь решить эту конкретную проблему, в этой статье вы найдете список проверенных шагов по ремонту. Ниже у вас есть пара исправлений, которые другие пользователи в аналогичной ситуации использовали для решения проблемы. Имейте в виду, что мы подтвердили, что некоторые из представленных ниже методов работают только с одной версией Windows. Если вы хотите сэкономить как можно больше времени, следуйте методу, который был подтвержден для вашей операционной системы.

    Метод 1: запретить другим пользователям сети использовать текущее подключение к Интернету

    Было подтверждено, что этот конкретный метод эффективен только в Windows 7, но мы обнаружили, что он также может быть воспроизведен в Windows 8.1 и Windows 10.

    Паре пользователей удалось окончательно решить проблему, перейдя на вкладку «Сеть» панели управления и отключив параметр, который позволял другим пользователям сети подключаться, используя текущее подключение к Интернету.

    Примечание: Этот метод является предпочтительным, поскольку он устраняет проблему без полного отключения службы ICS.

    Вот краткое руководство по устранению проблемы путем предотвращения подключения других пользователей сети через подключение к Интернету на этом компьютере:

    1. Доступ к Начинать кнопку, затем поиск и доступ Панель управления. Или вы можете нажать Клавиша Windows + R открыть Запустить поле, затем введите » контроль »И нажмите Входить, чтобы открыть Панель управления.
    2. Внутри панели управления измените Вид по типу Категория из правого верхнего угла.
    3. Затем нажмите на Просмотр состояния сети и задач (прямо под Сеть и Интернет).
    4. в Центр сети и совместного использованияr нажмите на Смените настройки адаптера из подменю слева.
    5. в Сетевые соединения экрана, найдите сеть (или сети), в которых Общий в Статус столбец, затем щелкните его правой кнопкой мыши и выберите Характеристики.
    6. в Характеристики экран, перейдите к Совместное использование вкладка и снимите флажок, связанный с Разрешить другим пользователям сети подключаться к Интернету на этом компьютере..
    7. Нажмите ОК чтобы сохранить изменения, затем перезагрузите компьютер.
    8. Если у вас есть несколько общих подключений на вкладке «Сетевое подключение», повторите шаги 5–7 со всеми из них.
    9. При следующем запуске переустановите Cisco AnyConnect. Вы не должны получать Агенту VPN-клиента не удалось создать хранилище межпроцессного взаимодействия ошибка во время или после процесса установки.

    Устранение ошибки путем предотвращения подключения других пользователей сети через подключение к Интернету этого компьютера

    Устранение ошибки путем предотвращения подключения других пользователей сети через подключение к Интернету этого компьютера

    Если этот метод неприменим или вы ищете другой подход, перейдите к следующему методу ниже.

    Метод 2: изменение типа запуска службы ICS на отключено

    Если вы готовы потерять некоторые функции, исправить это так же просто, как остановить службу общего доступа к подключению к Интернету (ICS). Однако это только временное исправление, так как служба автоматически запускается при каждом запуске. Более того, выполнение этой процедуры означает, что вы потеряете функциональность службы ICS, что помешает ПК использовать ваше интернет-соединение с другими машинами.

    Нескольким пользователям в аналогичной ситуации удалось окончательно решить проблему, остановив службу ICS из Услуги экран, а затем измените Тип запуска службы Отключено. Это гарантирует, что Windows не откроет повторно службу общего доступа к подключению Интернета при следующем запуске и Агенту VPN-клиента не удалось создать хранилище межпроцессного взаимодействия ошибка появляется снова.

    Примечание: Приведенное ниже руководство может быть успешно воспроизведено во всех последних версиях Windows (Windows 7, Windows 8.1 и Windows 10).

    Вот краткое руководство по отключению службы ICS на экране Windows 10 vithe Services:

    1. Нажмите Клавиша Windows + R открыться Запустить чат. Затем введите « services.msc »И нажмите Входить открыть Услуги экран.

      Диалоговое окно "Выполнить": services.msc

      Диалоговое окно «Выполнить»: services.msc
    2. Внутри Услуги окна, используйте правую панель, чтобы прокрутить список служб вниз и найти Совместное использование подключения к Интернету (ICS) Вход.
    3. Как только вы его увидите, щелкните его правой кнопкой мыши и нажмите «Остановить», чтобы отключить службу.

      Остановка службы общего доступа к подключению к Интернету (ICS)

      Остановка службы общего доступа к подключению к Интернету (ICS)

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

    4. Щелкните правой кнопкой мыши на Совместное использование подключения к Интернету (ICS) и щелкните «Свойства».

      Щелкните правой кнопкой мыши «Общий доступ к подключению к Интернету» и выберите «Свойства»

      Щелкните правой кнопкой мыши «Общий доступ к подключению к Интернету» и выберите «Свойства»
    5. в Свойства общего доступа к подключению к Интернету (ICS) окно, перейдите в Общий вкладка и измените тип запуска на Отключено с помощью связанного с ним раскрывающегося меню. Затем нажмите Применять чтобы сохранить изменения.

      Изменение типа запуска службы ICS на Отключено

      Изменение типа запуска службы ICS на Отключено
    6. После изменения типа запуска перезагрузите компьютер. При следующем запуске снова установите или запустите Cisco AnyCpnnect — ошибка больше не должна возникать.

    Возможно, вам также будет интересно:

  • Внутренняя ошибка пожалуйста попробуйте позже варфейс
  • Внутренняя ошибка пожалуйста попробуйте позже warface
  • Внутренняя ошибка пожалуйста попробуйте позже my games
  • Внутренняя ошибка паспорта на яндекс
  • Внутренняя ошибка обработчика запросов обработчику запросов не удалось предоставить план запроса

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии