структура 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;
UINT NoImplicitSynchronization : 1;
#if ...
UINT Reserved : 9;
#elif
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. Этот случай недопустим, если vaD DXGALLOCATION 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
[out] Задает время выполнения выделения с обнуляемых страниц. Поддерживается начиная с Windows 8 (WDDM 1.3).
WriteWatch
[in] Указывает, следует ли создать выделение с включенными контрольными значениями записи. Поддерживается начиная с Windows 8.1 (WDDM 1.3).
StandardAllocation
[in] Если этот параметр задан, указывает Dxgkrnl создать стандартное выделение с помощью pStandardAllocation вместо pPrivateDriverData. Если задано Значение StandardAllocation, необходимо задать либо ExistingSysMem, либо ExistingSection (но не оба). Кроме того, при создании StandardAllocation также должны быть установлены флаги CreateShared и CrossAdapter . Поддерживается начиная с Windows 10 версии 1709 (WDDM 2.3).
ExistingSection
[in] Если этот параметр задан, указывает Dxgkrnl использовать дескриптор раздела (hSection) вместо указателя системной памяти (pSystemMem). ExistingSystemMem и ExistingSection нельзя задать для одного и того же выделения. Если задано значение ExistingSection , необходимо также задать StandardAllocation . Поддерживается начиная с Windows 10 версии 1709 (WDDM 2.3).
AllowNotZeroed
[in] Указывает, что выделение может быть создано без обнуления страниц. Поддерживается начиная с Windows 10 версии 1903 (WDDM 2.6).
PhysicallyContiguous
[in] Указывает, что выделение должно быть физически непрерывным. Поддерживается начиная с Windows 10 версии 2004 (WDDM 2.7).
NoKmdAccess
[in] Указывает, что KMD не получает уведомления о выделении. Поддерживается начиная с Windows 10 версии 2004 (WDDM 2.7).
SharedDisplayable
Указывает, что выделение является общим отображаемым ресурсом. Поддерживается начиная с Windows 11 (WDDM 3.0).
NoImplicitSynchronization
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) |