структура 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. ограничения СуществующихSysMem:
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, т. е. если выделение может находиться в VRAM. Ядро выполняет следующие действия при создании стандартного выделения с помощью вызова 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. ExistingSysMem или ExistingSection (но не оба) также необходимо задать, если задан StandardAllocation. Кроме того, при создании StandardAllocation необходимо также задать флаги CreateShared 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 (include D3dkmthk.h) |