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


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

Записывает зашифрованные данные на защищенную поверхность.

Синтаксис

HRESULT DecryptionBlt(
  IDirect3DSurface9       *pSrcSurface,
  IDirect3DSurface9       *pDstSurface,
  UINT                    SrcSurfaceSize,
  D3DENCRYPTED_BLOCK_INFO *pEncryptedBlockInfo,
  VOID                    *pContentKey,
  VOID                    *pIV
);

Параметры

pSrcSurface

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

pDstSurface

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

SrcSurfaceSize

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

pEncryptedBlockInfo

Указатель на структуру D3DENCRYPTED_BLOCK_INFO или NULL.

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

Чтобы проверка, поддерживает ли драйвер частично зашифрованные буферы, вызовите IDirect3Device9Video::GetContentProtectionCaps и проверка для флага возможностей D3DCPCAPS_PARTIALDECRYPTION. Если драйвер не поддерживает частично зашифрованные буферы, задайте для этого параметра значение NULL.

pContentKey

Указатель на буфер, содержащий ключ шифрования содержимого или NULL. Чтобы запросить, поддерживает ли драйвер использование ключей содержимого, вызовите IDirect3Device9Video::GetContentProtectionCaps и проверка для флага возможностей D3DCPCAPS_CONTENTKEY.

Если драйвер поддерживает ключи содержимого, используйте ключ содержимого для шифрования поверхности. Зашифруйте ключ содержимого с помощью ключа сеанса и поместите полученный текст шифра в pContentKey. Если драйвер не поддерживает ключи содержимого, используйте сеансовый ключ для шифрования поверхности и задайте для pContentKeyзначение NULL.

pIV

Указатель на буфер, содержащий вектор инициализации (IV).

Если тип шифрования D3DCRYPTOTYPE_AES128_CTR, буфер является D3DAES_CTR_IV структурой. Вызывающий объект выделяет структуру и создает инициализацию. При создании первого IV инициализируйте структуру случайным числом. Для каждого последующего IV просто увеличьте элемент IV структуры, гарантируя, что значение всегда увеличивается. Эта процедура позволяет драйверу проверить, что один и тот же iv никогда не используется более одного раза с одной и той же парой ключей.

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

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

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

Комментарии

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

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

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

  1. Вызовите метод IDirect3DCryptoSession9::GetSurfacePitch , чтобы получить представление о защищенной поверхности.
  2. Вызовите метод IDirect3DDevice9Video::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