структура D3DKMT_CREATEALLOCATIONFLAGS (d3dkmthk.h)

D3DKMT_CREATEALLOCATIONFLAGS — это структура битовых полей, которая указывает, как создать выделение в вызове функции D3DKMTCreateAllocation .

Синтаксис

typedef struct _D3DKMT_CREATEALLOCATIONFLAGS {
  UINT CreateResource : 1;
  UINT CreateShared : 1;
  UINT NonSecure : 1;
  UINT CreateProtected : 1;
  UINT RestrictSharedAccess : 1;
  UINT ExistingSysMem : 1;
  UINT NtSecuritySharing : 1;
  UINT ReadOnly : 1;
  UINT CreateWriteCombined : 1;
  UINT CreateCached : 1;
  UINT SwapChainBackBuffer : 1;
  UINT CrossAdapter : 1;
  UINT OpenCrossAdapter : 1;
  UINT PartialSharedCreation : 1;
  UINT Zeroed : 1;
  UINT WriteWatch : 1;
  UINT StandardAllocation : 1;
  UINT ExistingSection : 1;
  UINT AllowNotZeroed : 1;
  UINT PhysicallyContiguous : 1;
  UINT NoKmdAccess : 1;
  UINT SharedDisplayable : 1;
#if ...
  UINT Reserved : 10;
#elif
  UINT Reserved : 11;
#elif
  UINT Reserved : 13;
#elif
  UINT Reserved : 14;
#elif
  UINT Reserved : 16;
#elif
  UINT Reserved : 21;
#else
  UINT Reserved : 26;
#endif
} D3DKMT_CREATEALLOCATIONFLAGS;

Члены

CreateResource

Указывает, следует ли создавать ресурс для конкретного устройства. Если задано значение CreateShared, необходимо также задать параметр CreateResource.

CreateShared

Указывает, следует ли создать ресурс, общий для всех устройств. Если задано значение CreateShared, необходимо также задать параметр CreateResource. Дополнительные сведения об использовании CreateShared см. в разделе Примечания.

NonSecure

Указывает, следует ли создавать выделение, которое может быть открыто любым процессом. Если задан параметр NonSecure , безопасные и небезопасные процессы могут открыть выделение.

CreateProtected

Этот элемент зарезервирован и должен иметь нулевое значение. Поддерживается начиная с Windows 7.

RestrictSharedAccess

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

ExistingSysMem

Этот элемент зарезервирован и должен иметь нулевое значение. Поддерживается начиная с Windows 7. Ограничения ExistingSysMem:

  • ExistingSystemMem и ExistingSection нельзя задать для одного и того же выделения. Задано значение ExistingSysMem , необходимо также задать StandardAllocation .

  • ExistingSysMem должен быть правильно выровнен. Существующий системный буфер памяти, который среда выполнения D3D предоставляет ядру, должен быть выровнен по страницам и кратным размеру страницы. В противном случае ядро не сможет вызвать D3DKMTCreateAllocation.

  • Когда ядро создает D3DKMDT_STANDARDALLOCATION_GDISURFACE тип стандартного выделения:

    • Среда выполнения предоставляет размер существующего системного буфера. Используя этот размер, ядро создает стандартное выделение типа GDISURFACE со следующими параметрами, которые правильно понимают kmD:

      D3DKMDT_GDISURFACEDATA::Width = Size of ExistingSysMem buffer
      D3DKMDT_GDISURFACEDATA::Height = 1
      D3DKMDT_GDISURFACEDATA::Format = D3DDDIFMT_UNKNOWN
      D3DKMDT_GDISURFACEDATA::Type = D3DKMDT_GDISURFACE_TEXTURE_CROSSADAPTER
      
  • Защита от указателя ExistingSysMem, указывающего на DXGALLOCATION, который является MemRotated

    Ядро должно защищаться от сценария, в котором пользовательский режим блокирует существующую функцию DXGALLOCATION и использует результирующий указатель ЦП для создания стандартного выделения ExistingSysMem. Этот случай недопустим, если DXGALLOCATION VAD MEM_ROTATE, т. е. если выделение может находиться в виртуальной памяти. Ядро выполняет следующие действия при создании стандартного выделения с помощью вызова ExistingSysMem:

    • MemSecure для указателя ExistingSysMem.
    • VirtualQuery для памяти. Если атрибуты содержат MEM_ROTATE вызов завершится ошибкой.
    • MemSecure освобождается только при освобождении этого выделения, чтобы предотвратить изменение памяти за спиной ядра.

NtSecuritySharing

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

Если ntSecuritySharing имеет значение 1 (TRUE):

  • Выделение совместно используется с помощью функции D3DKMTShareObjects , но не имеет глобального D3DKMT_HANDLE дескриптора ресурса.
  • Для свойства CreateShared должно быть задано значение 1.

Дополнительные сведения об использовании NtSecuritySharing см. в разделе Примечания. Поддерживается начиная с Windows 8.

ReadOnly

Указывает, можно ли только считывать выделение. Поддерживается начиная с Windows 8.

CreateWriteCombined

Этот элемент зарезервирован и должен иметь нулевое значение. Поддерживается начиная с Windows 8.

CreateCached

Этот элемент зарезервирован и должен иметь нулевое значение. Поддерживается начиная с Windows 8.

SwapChainBackBuffer

Этот элемент зарезервирован и должен иметь нулевое значение. Поддерживается начиная с Windows 8.

CrossAdapter

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

OpenCrossAdapter

Если задано значение , указывает, что ресурс создается путем открытия ресурса перекрестного адаптера. Нельзя использовать при создании выделения из пользовательского режима. Поддерживается начиная с Windows 8.1 (WDDM 1.3).

PartialSharedCreation

Указывает, создается ли выделение как частичное совместное выделение. Поддерживается начиная с Windows 8.1 (WDDM 1.3).

Zeroed

Указывает, следует ли заполнять выделение с нуля при создании. Поддерживается начиная с Windows 8.

WriteWatch

Указывает, следует ли создать выделение с включенным watch записи. Поддерживается начиная с Windows 8.1 (WDDM 1.3).

StandardAllocation

Если этот параметр задан, указывает Dxgkrnl создать стандартное выделение с помощью pStandardAllocation вместо pPrivateDriverData. Если задано значение StandardAllocation, необходимо задать либо ExistingSysMem, либо ExistingSection (но не оба). Кроме того, при создании StandardAllocation также должны быть установлены флаги CreateShared и CrossAdapter . Поддерживается начиная с Windows 10 версии 1709 (WDDM 2.3).

ExistingSection

Если этот параметр задан, указывает Dxgkrnl использовать дескриптор раздела (hSection) вместо указателя системной памяти (pSystemMem). ExistingSystemMem и ExistingSection нельзя задать для одного и того же выделения. Если задан параметр ExistingSection , необходимо также задать StandardAllocation . Поддерживается начиная с Windows 10 версии 1709 (WDDM 2.3).

AllowNotZeroed

Указывает, что выделение можно создать без обнуления страниц. Поддерживается начиная с Windows 10 версии 1903 (WDDM 2.6).

PhysicallyContiguous

Указывает, что выделение должно быть физически непрерывным. Поддерживается начиная с Windows 10 версии 2004 (WDDM 2.7).

NoKmdAccess

Указывает, что KMD не получает уведомления о выделении. Поддерживается начиная с Windows 10 версии 2004 (WDDM 2.7).

SharedDisplayable

Указывает, что выделение является общим отображаемым ресурсом. Поддерживается начиная с Windows 11 (WDDM 3.0).

Reserved

Поддерживается начиная с Windows 8.

Этот элемент зарезервирован и должен иметь нулевое значение.

Комментарии

Объекты для совместного использования с помощью функции D3DKMTShareObjects должны быть сначала созданы с заданным значением флага NtSecuritySharing . Это значение флага доступно в структурах D3DKMT_CREATEALLOCATIONFLAGS, D3DKMT_CREATEKEYEDMUTEX2_FLAGS и D3DDDI_SYNCHRONIZATIONOBJECT_FLAGS .

Драйверы должны следовать следующим рекомендациям по D3DKMT_CREATEALLOCATIONFLAGS флагам общего доступа:

  • Если выделение не является общим, задайте для параметра CreateShared и NtSecuritySharing значение 0.
  • Если выделение используется совместно с типом данных D3DKMT_HANDLE , задайте для параметра CreateShared = 1 и NtSecuritySharing = 0.
  • Если выделение совместно с дескриптором NT для процесса (и без глобального D3DKMT_HANDLE дескриптор режима ядра для ресурса), задайте createShared = 1 и NtSecuritySharing = 1.

Требования

Требование Значение
Минимальная версия клиента Windows Vista
Верхняя часть d3dkmthk.h (включая D3dkmthk.h)

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

D3DKMTCreateAllocation

D3DKMT_CREATEALLOCATION