ReactOS 0.4.17-dev-966-gf06eace
d3dkmt.c File Reference
#include <gdi32_vista.h>
#include <d3dkmddi.h>
#include <winuser.h>
Include dependency graph for d3dkmt.c:

Go to the source code of this file.

Classes

struct  _D3DKMT_EMU_ADAPTER
 
struct  _D3DKMT_EMU_DEVICE
 

Macros

#define D3DKMT_EMU_ADAPTER_TAG   0x0ada0000u
 
#define D3DKMT_EMU_DEVICE_TAG   0x0de00000u
 
#define D3DKMT_EMU_INDEX_MASK   0x0000ffffu
 
#define D3DKMT_EMU_MAX_ADAPTERS   16
 
#define D3DKMT_EMU_MAX_DEVICES   64
 

Typedefs

typedef struct _D3DKMT_EMU_ADAPTER D3DKMT_EMU_ADAPTER
 
typedef struct _D3DKMT_EMU_DEVICE D3DKMT_EMU_DEVICE
 

Functions

static D3DKMT_EMU_ADAPTER * D3DKMTEmuGetAdapter (_In_ D3DKMT_HANDLE hAdapter)
 
static D3DKMT_EMU_DEVICE * D3DKMTEmuGetDevice (_In_ D3DKMT_HANDLE hDevice)
 
static D3DKMT_HANDLE D3DKMTEmuOpenAdapter (_In_ const LUID *AdapterLuid, _In_ D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
 
static VOID D3DKMTEmuMakeLuid (_In_ D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, _Out_ LUID *AdapterLuid)
 
NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName (_Inout_ D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *unnamedParam1)
 
NTSTATUS WINAPI D3DKMTOpenAdapterFromLuid (_Inout_ CONST D3DKMT_OPENADAPTERFROMLUID *unnamedParam1)
 
NTSTATUS WINAPI D3DKMTCloseAdapter (_In_ const D3DKMT_CLOSEADAPTER *unnamedParam1)
 
NTSTATUS WINAPI D3DKMTCreateDevice (_Inout_ D3DKMT_CREATEDEVICE *unnamedParam1)
 
NTSTATUS WINAPI D3DKMTDestroyDevice (_In_ const D3DKMT_DESTROYDEVICE *unnamedParam1)
 
NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner (_In_ const D3DKMT_SETVIDPNSOURCEOWNER *unnamedParam1)
 
NTSTATUS WINAPI D3DKMTCheckVidPnExclusiveOwnership (_In_ CONST D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *unnamedParam1)
 
NTSTATUS WINAPI D3DKMTQueryVideoMemoryInfo (_Inout_ D3DKMT_QUERYVIDEOMEMORYINFO *unnamedParam1)
 

Variables

static D3DKMT_EMU_ADAPTER D3DKMTEmuAdapters [D3DKMT_EMU_MAX_ADAPTERS]
 
static D3DKMT_EMU_DEVICE D3DKMTEmuDevices [D3DKMT_EMU_MAX_DEVICES]
 

Macro Definition Documentation

◆ D3DKMT_EMU_ADAPTER_TAG

#define D3DKMT_EMU_ADAPTER_TAG   0x0ada0000u

Definition at line 40 of file d3dkmt.c.

◆ D3DKMT_EMU_DEVICE_TAG

#define D3DKMT_EMU_DEVICE_TAG   0x0de00000u

Definition at line 41 of file d3dkmt.c.

◆ D3DKMT_EMU_INDEX_MASK

#define D3DKMT_EMU_INDEX_MASK   0x0000ffffu

Definition at line 42 of file d3dkmt.c.

◆ D3DKMT_EMU_MAX_ADAPTERS

#define D3DKMT_EMU_MAX_ADAPTERS   16

Definition at line 44 of file d3dkmt.c.

◆ D3DKMT_EMU_MAX_DEVICES

#define D3DKMT_EMU_MAX_DEVICES   64

Definition at line 45 of file d3dkmt.c.

Typedef Documentation

◆ D3DKMT_EMU_ADAPTER

◆ D3DKMT_EMU_DEVICE

Function Documentation

◆ D3DKMTCheckVidPnExclusiveOwnership()

NTSTATUS WINAPI D3DKMTCheckVidPnExclusiveOwnership ( _In_ CONST D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *  unnamedParam1)

Definition at line 323 of file d3dkmt.c.

324{
325 if (!unnamedParam1)
327
329}
#define STATUS_PROCEDURE_NOT_FOUND
Definition: ntstatus.h:452
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135

◆ D3DKMTCloseAdapter()

NTSTATUS WINAPI D3DKMTCloseAdapter ( _In_ const D3DKMT_CLOSEADAPTER *  unnamedParam1)

Definition at line 216 of file d3dkmt.c.

217{
218 D3DKMT_EMU_ADAPTER* Adapter;
220
221 if (!unnamedParam1)
223
224 Status = NtGdiDdDDICloseAdapter(unnamedParam1);
226 return Status;
227
228 Adapter = D3DKMTEmuGetAdapter(unnamedParam1->hAdapter);
229 if (!Adapter)
231
232 InterlockedExchange(&Adapter->InUse, 0);
233
234 return STATUS_SUCCESS;
235}
#define InterlockedExchange
Definition: armddk.h:54
LONG NTSTATUS
Definition: precomp.h:26
static D3DKMT_EMU_ADAPTER * D3DKMTEmuGetAdapter(_In_ D3DKMT_HANDLE hAdapter)
Definition: d3dkmt.c:65
Status
Definition: gdiplustypes.h:24
__kernel_entry W32KAPI NTSTATUS APIENTRY NtGdiDdDDICloseAdapter(_In_ const D3DKMT_CLOSEADAPTER *unnamedParam1)
Definition: d3dkmt.c:147
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ D3DKMTCreateDevice()

NTSTATUS WINAPI D3DKMTCreateDevice ( _Inout_ D3DKMT_CREATEDEVICE *  unnamedParam1)

Definition at line 239 of file d3dkmt.c.

240{
242 ULONG Index;
243
244 if (!unnamedParam1)
246
247 Status = NtGdiDdDDICreateDevice(unnamedParam1);
249 return Status;
250
251 if (!D3DKMTEmuGetAdapter(unnamedParam1->hAdapter))
253
255 {
256 if (InterlockedCompareExchange(&D3DKMTEmuDevices[Index].InUse, 1, 0) == 0)
257 {
258 D3DKMTEmuDevices[Index].hAdapter = unnamedParam1->hAdapter;
259
260 unnamedParam1->hDevice = D3DKMT_EMU_DEVICE_TAG | (Index + 1);
261 unnamedParam1->pCommandBuffer = NULL;
262 unnamedParam1->CommandBufferSize = 0;
263 unnamedParam1->pAllocationList = NULL;
264 unnamedParam1->AllocationListSize = 0;
265 unnamedParam1->pPatchLocationList = NULL;
266 unnamedParam1->PatchLocationListSize = 0;
267
268 return STATUS_SUCCESS;
269 }
270 }
271
273}
#define NULL
Definition: types.h:112
#define D3DKMT_EMU_MAX_DEVICES
Definition: d3dkmt.c:45
#define D3DKMT_EMU_DEVICE_TAG
Definition: d3dkmt.c:41
static D3DKMT_EMU_DEVICE D3DKMTEmuDevices[D3DKMT_EMU_MAX_DEVICES]
Definition: d3dkmt.c:61
#define InterlockedCompareExchange
Definition: interlocked.h:119
__kernel_entry W32KAPI NTSTATUS APIENTRY NtGdiDdDDICreateDevice(_Inout_ D3DKMT_CREATEDEVICE *unnamedParam1)
Definition: d3dkmt.c:173
D3DKMT_HANDLE hAdapter
Definition: d3dkmt.c:57
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ WDFCOLLECTION _In_ ULONG Index

◆ D3DKMTDestroyDevice()

NTSTATUS WINAPI D3DKMTDestroyDevice ( _In_ const D3DKMT_DESTROYDEVICE *  unnamedParam1)

Definition at line 277 of file d3dkmt.c.

278{
281
282 if (!unnamedParam1)
284
285 Status = NtGdiDdDDIDestroyDevice(unnamedParam1);
287 return Status;
288
289 Device = D3DKMTEmuGetDevice(unnamedParam1->hDevice);
290 if (!Device)
292
293 InterlockedExchange(&Device->InUse, 0);
294
295 return STATUS_SUCCESS;
296}
static D3DKMT_EMU_DEVICE * D3DKMTEmuGetDevice(_In_ D3DKMT_HANDLE hDevice)
Definition: d3dkmt.c:85
__kernel_entry W32KAPI NTSTATUS APIENTRY NtGdiDdDDIDestroyDevice(_In_ const D3DKMT_DESTROYDEVICE *unnamedParam1)
Definition: d3dkmt.c:238
_Must_inspect_result_ _In_ WDFDEVICE Device
Definition: wdfchildlist.h:474

◆ D3DKMTEmuGetAdapter()

static D3DKMT_EMU_ADAPTER * D3DKMTEmuGetAdapter ( _In_ D3DKMT_HANDLE  hAdapter)
static

Definition at line 65 of file d3dkmt.c.

67{
69
71 return NULL;
72
73 Index = hAdapter & D3DKMT_EMU_INDEX_MASK;
75 return NULL;
76
77 if (!D3DKMTEmuAdapters[Index - 1].InUse)
78 return NULL;
79
80 return &D3DKMTEmuAdapters[Index - 1];
81}
static D3DKMT_EMU_ADAPTER D3DKMTEmuAdapters[D3DKMT_EMU_MAX_ADAPTERS]
Definition: d3dkmt.c:60
#define D3DKMT_EMU_MAX_ADAPTERS
Definition: d3dkmt.c:44
#define D3DKMT_EMU_INDEX_MASK
Definition: d3dkmt.c:42
#define D3DKMT_EMU_ADAPTER_TAG
Definition: d3dkmt.c:40

Referenced by D3DKMTCloseAdapter(), D3DKMTCreateDevice(), and D3DKMTQueryVideoMemoryInfo().

◆ D3DKMTEmuGetDevice()

static D3DKMT_EMU_DEVICE * D3DKMTEmuGetDevice ( _In_ D3DKMT_HANDLE  hDevice)
static

Definition at line 85 of file d3dkmt.c.

87{
89
91 return NULL;
92
93 Index = hDevice & D3DKMT_EMU_INDEX_MASK;
95 return NULL;
96
97 if (!D3DKMTEmuDevices[Index - 1].InUse)
98 return NULL;
99
100 return &D3DKMTEmuDevices[Index - 1];
101}

Referenced by D3DKMTDestroyDevice(), and D3DKMTSetVidPnSourceOwner().

◆ D3DKMTEmuMakeLuid()

static VOID D3DKMTEmuMakeLuid ( _In_ D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId,
_Out_ LUID *  AdapterLuid 
)
static

Definition at line 127 of file d3dkmt.c.

130{
131 AdapterLuid->HighPart = 0x524f5300; /* 'ROS\0' */
132 AdapterLuid->LowPart = VidPnSourceId + 1;
133}
_Check_return_ _In_ ULONG VidPnSourceId
Definition: dispmprt.h:1205

Referenced by D3DKMTOpenAdapterFromGdiDisplayName().

◆ D3DKMTEmuOpenAdapter()

static D3DKMT_HANDLE D3DKMTEmuOpenAdapter ( _In_ const LUID *  AdapterLuid,
_In_ D3DDDI_VIDEO_PRESENT_SOURCE_ID  VidPnSourceId 
)
static

Definition at line 105 of file d3dkmt.c.

108{
109 ULONG Index;
110
112 {
113 if (InterlockedCompareExchange(&D3DKMTEmuAdapters[Index].InUse, 1, 0) == 0)
114 {
115 D3DKMTEmuAdapters[Index].AdapterLuid = *AdapterLuid;
117 return D3DKMT_EMU_ADAPTER_TAG | (Index + 1);
118 }
119 }
120
121 return 0;
122}
D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId
Definition: d3dkmt.c:51

Referenced by D3DKMTOpenAdapterFromGdiDisplayName(), and D3DKMTOpenAdapterFromLuid().

◆ D3DKMTOpenAdapterFromGdiDisplayName()

NTSTATUS WINAPI D3DKMTOpenAdapterFromGdiDisplayName ( _Inout_ D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *  unnamedParam1)

Definition at line 138 of file d3dkmt.c.

139{
141 DISPLAY_DEVICEW DisplayDevice;
142 D3DKMT_HANDLE hAdapter;
143 LUID AdapterLuid;
144 DWORD Index = 0;
145
146 if (!unnamedParam1)
148
149 /* Locate the GDI display device with this name to obtain its index, which
150 doubles as the VidPN source ID */
151 DisplayDevice.cb = sizeof(DisplayDevice);
152 while (EnumDisplayDevicesW(NULL, Index, &DisplayDevice, 0))
153 {
154 if (wcsncmp(DisplayDevice.DeviceName,
155 unnamedParam1->DeviceName,
156 ARRAYSIZE(unnamedParam1->DeviceName)) == 0)
157 {
159 break;
160 }
161
162 DisplayDevice.cb = sizeof(DisplayDevice);
163 Index++;
164 }
165
166 if (!DisplayDevice.DeviceName[0] || VidPnSourceId != Index)
168
169 D3DKMTEmuMakeLuid(VidPnSourceId, &AdapterLuid);
170
171 hAdapter = D3DKMTEmuOpenAdapter(&AdapterLuid, VidPnSourceId);
172 if (!hAdapter)
174
175 unnamedParam1->hAdapter = hAdapter;
176 unnamedParam1->AdapterLuid = AdapterLuid;
177 unnamedParam1->VidPnSourceId = VidPnSourceId;
178
179 return STATUS_SUCCESS;
180}
#define ARRAYSIZE(a)
Definition: cat.c:25
_ACRTIMP int __cdecl wcsncmp(const wchar_t *, const wchar_t *, size_t)
Definition: wcs.c:523
unsigned long DWORD
Definition: ntddk_ex.h:95
static D3DKMT_HANDLE D3DKMTEmuOpenAdapter(_In_ const LUID *AdapterLuid, _In_ D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId)
Definition: d3dkmt.c:105
static VOID D3DKMTEmuMakeLuid(_In_ D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId, _Out_ LUID *AdapterLuid)
Definition: d3dkmt.c:127
WCHAR DeviceName[32]
Definition: wingdi.h:3264
BOOL WINAPI EnumDisplayDevicesW(LPCWSTR lpDevice, DWORD iDevNum, PDISPLAY_DEVICEW lpDisplayDevice, DWORD dwFlags)
Definition: display.c:78
UINT D3DKMT_HANDLE
Definition: d3dukmdt.h:28
UINT D3DDDI_VIDEO_PRESENT_SOURCE_ID
Definition: d3dukmdt.h:141

◆ D3DKMTOpenAdapterFromLuid()

NTSTATUS WINAPI D3DKMTOpenAdapterFromLuid ( _Inout_ CONST D3DKMT_OPENADAPTERFROMLUID *  unnamedParam1)

Definition at line 184 of file d3dkmt.c.

185{
188 D3DKMT_HANDLE hAdapter;
189
190 if (!unnamedParam1)
192
193 /* Recover the source ID for LUIDs we minted ourselves; anything else is a
194 caller-allocated LUID, for which the primary output is the best match. */
195 if (unnamedParam1->AdapterLuid.HighPart == 0x524f5300 &&
196 unnamedParam1->AdapterLuid.LowPart > 0)
197 {
198 VidPnSourceId = unnamedParam1->AdapterLuid.LowPart - 1;
199 }
200 else
201 {
202 VidPnSourceId = 0;
203 }
204
205 hAdapter = D3DKMTEmuOpenAdapter(&unnamedParam1->AdapterLuid, VidPnSourceId);
206 if (!hAdapter)
208
209 Desc->hAdapter = hAdapter;
210
211 return STATUS_SUCCESS;
212}
D3DKMT_HANDLE hAdapter
Definition: d3dkmthk.h:135

◆ D3DKMTQueryVideoMemoryInfo()

NTSTATUS WINAPI D3DKMTQueryVideoMemoryInfo ( _Inout_ D3DKMT_QUERYVIDEOMEMORYINFO *  unnamedParam1)

Definition at line 333 of file d3dkmt.c.

334{
335 if (!unnamedParam1)
337
338 if (!D3DKMTEmuGetAdapter(unnamedParam1->hAdapter))
340
342}

◆ D3DKMTSetVidPnSourceOwner()

NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner ( _In_ const D3DKMT_SETVIDPNSOURCEOWNER *  unnamedParam1)

Definition at line 300 of file d3dkmt.c.

301{
303
304 if (!unnamedParam1)
306
307 Status = NtGdiDdDDISetVidPnSourceOwner(unnamedParam1);
309 return Status;
310
311 /* A zero VidPnSourceCount releases ownership, which always succeeds. */
312 if (unnamedParam1->VidPnSourceCount == 0)
313 return STATUS_SUCCESS;
314
315 if (!D3DKMTEmuGetDevice(unnamedParam1->hDevice))
317
319}
__kernel_entry W32KAPI NTSTATUS APIENTRY NtGdiDdDDISetVidPnSourceOwner(_In_ const D3DKMT_SETVIDPNSOURCEOWNER *unnamedParam1)
Definition: d3dkmt.c:629

Variable Documentation

◆ D3DKMTEmuAdapters

D3DKMT_EMU_ADAPTER D3DKMTEmuAdapters[D3DKMT_EMU_MAX_ADAPTERS]
static

Definition at line 60 of file d3dkmt.c.

Referenced by D3DKMTEmuGetAdapter(), and D3DKMTEmuOpenAdapter().

◆ D3DKMTEmuDevices

D3DKMT_EMU_DEVICE D3DKMTEmuDevices[D3DKMT_EMU_MAX_DEVICES]
static

Definition at line 61 of file d3dkmt.c.

Referenced by D3DKMTCreateDevice(), and D3DKMTEmuGetDevice().