static HRESULT WINAPI IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This, LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags) { DDDEVICEIDENTIFIER2 DDDI2; HRESULT hr; hr = IDirectDraw7_GetDeviceIdentifier((IDirectDraw7 *)ddraw_from_ddraw4(This), &DDDI2, dwFlags); DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI); return hr; }
static void testddraw7(void) { IDirectDraw7 *dd7; HRESULT hr; DDDEVICEIDENTIFIER2 *pdddi2; DWORD dddi2Bytes; DWORD *pend; hr = IDirectDraw_QueryInterface(lpDD, &IID_IDirectDraw7, (void **) &dd7); if (hr==E_NOINTERFACE) { win_skip("DirectDraw7 is not supported\n"); return; } ok(hr==DD_OK, "IDirectDraw7_QueryInterface returned %08x\n", hr); if (hr==DD_OK) { dddi2Bytes = FIELD_OFFSET(DDDEVICEIDENTIFIER2, dwWHQLLevel) + sizeof(DWORD); pdddi2 = HeapAlloc( GetProcessHeap(), 0, dddi2Bytes + 2*sizeof(DWORD) ); pend = (DWORD *)((char *)pdddi2 + dddi2Bytes); pend[0] = 0xdeadbeef; pend[1] = 0xdeadbeef; hr = IDirectDraw7_GetDeviceIdentifier(dd7, pdddi2, 0); ok(hr==DD_OK, "get device identifier failed with %08x\n", hr); if (hr==DD_OK) { /* check how strings are copied into the structure */ ok(pdddi2->szDriver[MAX_DDDEVICEID_STRING - 1]==0, "szDriver not cleared\n"); ok(pdddi2->szDescription[MAX_DDDEVICEID_STRING - 1]==0, "szDescription not cleared\n"); /* verify that 8 byte structure size alignment will not overwrite memory */ ok(pend[0]==0xdeadbeef || broken(pend[0] != 0xdeadbeef), /* win2k */ "memory beyond DDDEVICEIDENTIFIER2 overwritten\n"); ok(pend[1]==0xdeadbeef, "memory beyond DDDEVICEIDENTIFIER2 overwritten\n"); } IDirectDraw_Release(dd7); HeapFree( GetProcessHeap(), 0, pdddi2 ); } }
static int config_adapter_mode(win_window_info *window) { DDDEVICEIDENTIFIER2 identifier; dd_info *dd = window->drawdata; HRESULT result; // choose the monitor number get_adapter_for_monitor(dd, window->monitor); // create a temporary DirectDraw object result = (*directdrawcreateex)(dd->adapter_ptr, (LPVOID *)&dd->ddraw, &IID_IDirectDraw7, NULL); if (result != DD_OK) { mame_printf_verbose("DirectDraw: Error %08X during DirectDrawCreateEx call\n", (int)result); return 1; } // get the identifier result = IDirectDraw7_GetDeviceIdentifier(dd->ddraw, &identifier, 0); if (result != DD_OK) { mame_printf_error("Error getting identifier for device\n"); return 1; } mame_printf_verbose("DirectDraw: Configuring device %s\n", identifier.szDescription); // get the current display mode memset(&dd->origmode, 0, sizeof(dd->origmode)); dd->origmode.dwSize = sizeof(dd->origmode); result = IDirectDraw7_GetDisplayMode(dd->ddraw, &dd->origmode); if (result != DD_OK) { mame_printf_verbose("DirectDraw: Error %08X getting current display mode\n", (int)result); IDirectDraw7_Release(dd->ddraw); return 1; } // choose a resolution: full screen mode case if (window->fullscreen) { // default to the current mode exactly dd->width = dd->origmode.dwWidth; dd->height = dd->origmode.dwHeight; dd->refresh = dd->origmode.dwRefreshRate; // if we're allowed to switch resolutions, override with something better if (video_config.switchres) pick_best_mode(window); } // release the DirectDraw object IDirectDraw7_Release(dd->ddraw); dd->ddraw = NULL; // if we're not changing resolutions, make sure we have a resolution we can handle if (!window->fullscreen || !video_config.switchres) { switch (dd->origmode.ddpfPixelFormat.dwRBitMask) { case 0x00ff0000: case 0x000000ff: case 0xf800: case 0x7c00: break; default: mame_printf_verbose("DirectDraw: Unknown target mode: R=%08X G=%08X B=%08X\n", (int)dd->origmode.ddpfPixelFormat.dwRBitMask, (int)dd->origmode.ddpfPixelFormat.dwGBitMask, (int)dd->origmode.ddpfPixelFormat.dwBBitMask); return 1; } } return 0; }