Метод IDirect3DCryptoSession9::EncryptionBlt (d3d9.h)

Считывает зашифрованные данные с защищенной поверхности.

Синтаксис

HRESULT EncryptionBlt(
  IDirect3DSurface9 *pSrcSurface,
  IDirect3DSurface9 *pDstSurface,
  UINT              DstSurfaceSize,
  VOID              *pIV
);

Параметры

pSrcSurface

Указатель на защищенную поверхность.

pDstSurface

Указатель на поверхность, которая получает зашифрованные данные.

DstSurfaceSize

Размер поверхностной памяти, на которую указывает pDstSurface , в байтах. Размер должен быть выровнен по значению BlockAlignmentSize в структуре возможностей драйвера; См. примечания.

pIV

Указатель на буфер, который получает вектор инициализации (IV). Вызывающий объект выделяет этот буфер, но драйвер создает инициализацию.

Если тип шифрования — D3DCRYPTOTYPE_AES128_CTR (128-разрядный AES-CTR), pIV указывает на D3DAES_CTR_IV структуру. Когда драйвер создает первый iv, он инициализирует структуру случайным числом. Для каждого последующего вектора драйвер просто увеличивает элемент IV структуры, гарантируя, что значение всегда увеличивается. Эта процедура позволяет приложению проверить, что один и тот же iv никогда не используется более одного раза с одной и той же парой ключей.

Для других типов шифрования может использоваться другая структура или шифрование может не использовать инициализацию.

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

Если этот метод завершается успешно, он возвращает S_OK. В противном случае возвращается код ошибки HRESULT .

Комментарии

Если драйвер поддерживает этот метод, он устанавливает флаг D3DCPCAPS_ENCRYPTEDREADBACK в структуре возможностей, возвращаемой методом IDirect3Device9Video::GetContentProtectionCaps .

Если драйвер устанавливает флаг возможностей D3DCPCAPS_ENCRYPTEDREADBACKKEY , это означает, что драйвер использует отдельный ключ для шифрования данных. Чтобы получить этот ключ, вызовите метод IDirect3DCryptoSession9::GetEncryptionBltKey . В противном случае драйвер использует сеансовый ключ для шифрования данных.

Выделите конечную поверхность (pDstSurface) следующим образом:

  1. Вызовите метод IDirect3DCryptoSession9::GetSurfacePitch , чтобы получить представление о защищенной поверхности.
  2. Вызовите метод GetContentProtectionCaps , чтобы получить значение элементов BufferAlignmentStart и BlockAlignmentSize в структуре D3DCONTENTPROTECTIONCAPS .
  3. Вычислите минимальный размер поверхностной памяти, как SysMemSize = шаг защищенной поверхности × высоту защищенной поверхности.
  4. Добавьте заполнение для размещения значений BufferAlignmentStart и BlockAlignmentSize.
  5. Выделите буфер в системной памяти с размером, равным SysMemSize (включая заполнение).
  6. Если адрес системного буфера памяти не выровнен по значению BufferAlignmentStart, вычислите указатель, выравниваемый по памяти, который является смещением от начала буфера.
  7. Вызовите метод IDirect3DDevice9Ex::CreateOffscreenPlainSurfaceEx , чтобы создать область назначения. Передайте указатель, выровненный по памяти, в качестве дескриптора общего ресурса (pSharedHandle).
Этот метод имеет следующие ограничения:
  • Метод не может считывать обратно подпроекты или частично зашифрованные поверхности.
  • Защищенная поверхность должна быть простой поверхностью вне экрана или целевым объектом отрисовки.
  • Конечная поверхность должна быть поверхностью системной памяти, созданной с правильным выравниванием, как описано выше.
  • Защищенная поверхность не может быть многопримерной.
  • Метод не поддерживает растяжение или преобразование цветового пространства.
Если вы заблокируете конечную поверхность, шаг, сообщаемый в структуре D3DLOCKED_RECT , может не совпадать с шагом защищенной поверхности. Однако при интерпретации данных всегда используйте шаг защищенной поверхности.

Требования

Требование Значение
Минимальная версия клиента Windows 7 [только классические приложения]
Минимальная версия сервера Windows Server 2008 R2 [только классические приложения]
Целевая платформа Windows
Header d3d9.h

См. также раздел

Защита содержимого на основе GPU

IDirect3DCryptoSession9