diff --git a/reactos/dll/directx/d3d9/d3d9_caps.c b/reactos/dll/directx/d3d9/d3d9_caps.c index b934e531e41..4fce37292d2 100644 --- a/reactos/dll/directx/d3d9/d3d9_caps.c +++ b/reactos/dll/directx/d3d9/d3d9_caps.c @@ -502,6 +502,7 @@ BOOL GetD3D9DriverInfo( D3D9_Unknown6BC_INT* pUnknown6BC, memcpy(&pDriverCaps->DriverCaps9, &DriverCaps8, sizeof(D3DCAPS8)); pDriverCaps->DriverCaps9.Caps = HalInfo.ddCaps.dwCaps; + pDriverCaps->dwDriverCaps |= D3D9_INT_D3DCAPS8_VALID; } } @@ -524,6 +525,7 @@ BOOL GetD3D9DriverInfo( D3D9_Unknown6BC_INT* pUnknown6BC, pDriverCaps->DriverCaps9 = DriverCaps9; pDriverCaps->DriverCaps9.Caps = HalInfo.ddCaps.dwCaps; + pDriverCaps->dwDriverCaps |= D3D9_INT_D3DCAPS9_VALID; } diff --git a/reactos/dll/directx/d3d9/d3d9_create.c b/reactos/dll/directx/d3d9/d3d9_create.c index 0f6f3742457..91bf49dd82c 100644 --- a/reactos/dll/directx/d3d9/d3d9_create.c +++ b/reactos/dll/directx/d3d9/d3d9_create.c @@ -177,7 +177,7 @@ static BOOL GetDisplayDeviceInfo(IN OUT LPDIRECT3D9_INT pDirect3D9) AdapterIndex = 0; while (EnumDisplayDevicesA(NULL, AdapterIndex, &DisplayDevice, 0) == TRUE && - pDirect3D9->NumDisplayAdapters < DX_D3D9_MAX_NUM_ADAPTERS) + pDirect3D9->NumDisplayAdapters < D3D9_INT_MAX_NUM_ADAPTERS) { if ((DisplayDevice.StateFlags & (DISPLAY_DEVICE_DISCONNECT | DISPLAY_DEVICE_MIRRORING_DRIVER)) == 0 && (DisplayDevice.StateFlags & (DISPLAY_DEVICE_PRIMARY_DEVICE | DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) != 0) @@ -196,7 +196,7 @@ static BOOL GetDisplayDeviceInfo(IN OUT LPDIRECT3D9_INT pDirect3D9) AdapterIndex = 0; while (EnumDisplayDevicesA(NULL, AdapterIndex, &DisplayDevice, 0) == TRUE && - pDirect3D9->NumDisplayAdapters < DX_D3D9_MAX_NUM_ADAPTERS) + pDirect3D9->NumDisplayAdapters < D3D9_INT_MAX_NUM_ADAPTERS) { if ((DisplayDevice.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) != 0 && (DisplayDevice.StateFlags & (DISPLAY_DEVICE_MIRRORING_DRIVER | DISPLAY_DEVICE_PRIMARY_DEVICE)) == 0) @@ -240,13 +240,6 @@ HRESULT CreateD3D9(OUT LPDIRECT3D9 *ppDirect3D9, UINT SDKVersion) pDirect3D9->dwProcessId = GetCurrentThreadId(); pDirect3D9->dwRefCnt = 1; - pDirect3D9->unknown004576 = 0; - pDirect3D9->unknown004578 = 0; - pDirect3D9->unknown004579 = 0; - pDirect3D9->unknown004580 = 0; - pDirect3D9->unknown004581 = 0; - pDirect3D9->unknown004582 = 0; - pDirect3D9->unknown004583 = 0; pDirect3D9->SDKVersion = SDKVersion; pDirect3D9->lpInt = pDirect3D9; @@ -254,7 +247,6 @@ HRESULT CreateD3D9(OUT LPDIRECT3D9 *ppDirect3D9, UINT SDKVersion) InitializeCriticalSection(&pDirect3D9->d3d9_cs); - memset(pDirect3D9->DisplayAdapters, 0, sizeof(pDirect3D9->DisplayAdapters)); GetDisplayDeviceInfo(pDirect3D9); *ppDirect3D9 = (LPDIRECT3D9)&pDirect3D9->lpVtbl; diff --git a/reactos/dll/directx/d3d9/d3d9_impl.c b/reactos/dll/directx/d3d9/d3d9_impl.c index 6cffefb7822..7d065af939f 100644 --- a/reactos/dll/directx/d3d9/d3d9_impl.c +++ b/reactos/dll/directx/d3d9/d3d9_impl.c @@ -881,6 +881,55 @@ static HRESULT WINAPI IDirect3D9Impl_CreateDevice(LPDIRECT3D9 iface, UINT Adapte D3DPRESENT_PARAMETERS* pPresentationParameters, struct IDirect3DDevice9** ppReturnedDeviceInterface) { + DWORD NumAdaptersToCreate; + + LPDIRECT3D9_INT This = impl_from_IDirect3D9(iface); + LOCK_D3D9(); + + if (Adapter >= This->NumDisplayAdapters) + { + DPRINT1("Invalid Adapter number specified"); + UNLOCK_D3D9(); + return D3DERR_INVALIDCALL; + } + + if (DeviceType != D3DDEVTYPE_HAL && + DeviceType != D3DDEVTYPE_REF && + DeviceType != D3DDEVTYPE_SW) + { + DPRINT1("Invalid DeviceType specified"); + UNLOCK_D3D9(); + return D3DERR_INVALIDCALL; + } + + if (DeviceType != D3DDEVTYPE_HAL) + { + UNIMPLEMENTED + DPRINT1("Sorry, only D3DDEVTYPE_HAL is implemented at this time..."); + return D3DERR_INVALIDCALL; + } + + if (hFocusWindow != NULL && FALSE == IsWindow(hFocusWindow)) + { + DPRINT1("Invalid hFocusWindow parameter specified"); + UNLOCK_D3D9(); + return D3DERR_INVALIDCALL; + } + + if (IsBadWritePtr(ppReturnedDeviceInterface, sizeof(IDirect3DDevice9*))) + { + DPRINT1("Invalid ppReturnedDeviceInterface parameter specified"); + UNLOCK_D3D9(); + return D3DERR_INVALIDCALL; + } + + if ((BehaviourFlags & D3DCREATE_ADAPTERGROUP_DEVICE) != 0) + NumAdaptersToCreate = This->DisplayAdapters[Adapter].NumAdaptersInGroup; + else + NumAdaptersToCreate = 1; + + *ppReturnedDeviceInterface = 0; + UNIMPLEMENTED return D3D_OK; diff --git a/reactos/dll/directx/d3d9/d3d9_private.h b/reactos/dll/directx/d3d9/d3d9_private.h index bfa931fde48..109f94d4085 100644 --- a/reactos/dll/directx/d3d9/d3d9_private.h +++ b/reactos/dll/directx/d3d9/d3d9_private.h @@ -11,7 +11,10 @@ #include #include -#define DX_D3D9_MAX_NUM_ADAPTERS 12 +#define D3D9_INT_MAX_NUM_ADAPTERS 12 + +#define D3D9_INT_D3DCAPS8_VALID 1 +#define D3D9_INT_D3DCAPS9_VALID 2 typedef struct _D3D9Unknown6BC_INT_ { @@ -64,7 +67,7 @@ typedef struct _tagD3D9_DRIVERCAPS /* 0x0148 */ DWORD dwSVBCaps; /* 0x014c */ DWORD dwVSBCaps; /* 0x0150 */ DWORD dwSVBCaps2; -/* 0x0154 */ DWORD unknown0085; +/* 0x0154 */ DWORD dwDriverCaps; /* 0x0158 */ DWORD NumSupportedFormatOps; /* 0x015c */ LPDDSURFACEDESC pSupportedFormatOps; /* 0x0160 */ DWORD unknown0088; @@ -162,7 +165,7 @@ typedef struct _tagDIRECT3D9_INT_ /* 0x0024 */ struct _tagDIRECT3D9_INT_ *lpInt; /* 0x0028 */ LONG dwRefCnt; /* Increases and decreases by AddRef() and Release() */ /* 0x002c */ UINT NumDisplayAdapters; -/* 0x0030 */ Direct3D9DisplayAdapterInfo_INT DisplayAdapters[DX_D3D9_MAX_NUM_ADAPTERS]; +/* 0x0030 */ Direct3D9DisplayAdapterInfo_INT DisplayAdapters[D3D9_INT_MAX_NUM_ADAPTERS]; /* 0x2100 */ DWORD unknown002112; /* 0x2104 */ DWORD unknown002113; /* 0x2108 */ DWORD unknown002114;