Поделиться через


Предотвращение скрытия информации

Иногда программы намеренно или непреднамеренно скрывают информацию от подсистемы маршалинга RPC. Ниже приведен ряд примеров.

  • Отправка структуры данных в виде недифференцированного блока байтов
  • Использование производительности с помощью побочного эффекта метода для передачи дополнительных данных по сети
  • Попытка скрыть дескриптор путем передачи его в виде DWORD или ULONG

Эти методы почти гарантированно создают проблемы совместимости еще до переноса приложения в 64-разрядную версию Windows.

Вместо отправки контекста сервера в виде DWORD в стандартном удаленном вызове процедуры используйте дескриптор контекста, чтобы предоставить непрозрачный дескриптор контексту сервера, который хранится от имени клиента. Контексты определяются идентификаторами GUID, определенными во время выполнения RPC, когда сервер создает дескриптор контекста для клиента. Указатель не используется по проводу, и операция полностью прозрачна через 32- или 64-разрядные границы. Дополнительные сведения об использовании дескрипторов контекста см. в разделе Дескрипторы контекста.

Интерфейсы DCOM не могут использовать дескрипторы контекста, так как COM обеспечивает собственное управление контекстом. Вместо создания дескриптора контекста можно передать указатель интерфейса в COM-объект. Затем можно вызвать методы непосредственно через указатель интерфейса или поместить указатель внутри других вызовов. Чтобы освободить объект сервера, клиент вызывает метод Release интерфейса через указатель интерфейса.

Опять же, могут возникать ситуации, когда невозможно изменить исходный дизайн переносимого кода. Если нет способа избежать отправки указателя по сети в виде DWORD, необходимо реализовать некоторую форму сопоставления на стороне сервера между значениями DWORD и указателями. Один из способов сделать это — изменить указатели в клиентском приложении на типы точности указателей, такие как ULONG_PTR или DWORD_PTR. Затем используйте атрибут MIDL [call_as], чтобы поместить указатели на провод в качестве значений DWORD . Оболочка на стороне клиента должна передавать только аргументы. Оболочка на стороне сервера обрабатывает сопоставление между обоими типами. Аналогичным образом можно использовать атрибут [transmit_as] или атрибут [represent_as] для преобразования данных в формат обратной совместимости для представления.

Если обратная совместимость не является проблемой или дескриптор не используется для удаленных вызовов и вы уверены, что удаленные вызовы между 32- и 64-разрядными процессами никогда не будут происходить, можно переопределить аргумент как ULONG64. При необходимости можно изменить 32-разрядное приложение, чтобы передать пользователю DWORD . Кроме того, можно создать отдельные заглушки из отдельных IDL-файлов для каждой платформы с помощью DWORD в 32-разрядной версии Windows и ULONG64 в 64-разрядной версии Windows.