15#define DEBUG_DEVSETTINGS
59#define impl_to_interface(impl,iface) (struct iface *)(&(impl)->lp##iface##Vtbl)
117 dd2.
cb =
sizeof(dd2);
202 DPRINT(
"CDevSettings::GetDeviceInstanceId(%ws)!\n", pszDevice);
212 InfoData.
cbSize =
sizeof(InfoData);
231 if (lpDevInstId ==
NULL)
233 DPRINT1(
"LocalAlloc failed\n");
245 DPRINT(
"instance id: %ws\n", lpDevInstId);
256 static const WCHAR szRegPrefix[] =
L"\\Registry\\Machine\\";
261 lpRegKey =
This->pDisplayKey;
262 if (lpRegKey !=
NULL)
269 lpRegKey +=
wcslen(szRegPrefix);
300 for (
i = 0;
i <
This->nDevModes;
i++)
303 if (!
This->DevModes[
i])
307 return This->DevModes[
i];
320 DPRINT1(
"CDevSettings::GetCurrentMode\n");
321 return This->lpCurDevMode;
331 DPRINT1(
"CDevSettings::SetCurrentMode(0x%p)\n", pDevMode);
336 for (
i = 0;
i <
This->nDevModes;
i++)
339 if (!
This->DevModes[
i])
342 if (
This->DevModes[
i] == pDevMode)
344 This->lpCurDevMode = pDevMode;
355 PBOOL pbKeyIsReadOnly,
360 DPRINT1(
"CDevSettings::GetPruningMode(%p,%p,%p)\n", pbModesPruned, pbKeyIsReadOnly, pbPruningOn);
362 *pbModesPruned =
This->bModesPruned;
363 *pbKeyIsReadOnly =
This->bKeyIsReadOnly;
364 *pbPruningOn =
This->bPruningOn;
375 DPRINT1(
"CDevSettings::SetPruningMode(%d)\n", PruningOn);
377 if (
This->bModesPruned && !
This->bKeyIsReadOnly &&
378 PruningOn !=
This->bPruningOn)
392 (
const BYTE *)&dwValue,
438 DWORD dwType, dwMemSize = 0;
442 TEXT(
"HardwareInformation.MemorySize"),
448 dwSize ==
sizeof(dwMemSize))
452 if (dwMemSize > 1024)
455 if (dwMemSize > 1024)
477 TEXT(
"HardwareInformation.ChipType"),
480 TEXT(
"HardwareInformation.DacType"),
483 TEXT(
"HardwareInformation.AdapterString"),
486 TEXT(
"HardwareInformation.BiosString"),
506 DPRINT1(
"This->StateFlags: %x\n",
This->StateFlags);
521 DPRINT1(
"This->pDisplayDevice: %ws\n",
This->pDisplayDevice);
523 DPRINT1(
"This->pDisplayName: %ws\n",
This->pDisplayName);
525 DPRINT1(
"This->pDisplayKey: %ws\n",
This->pDisplayKey);
527 DPRINT1(
"This->pDisplayId: %ws\n",
This->pDisplayId);
529 DPRINT1(
"This->pMonitorName: %ws\n",
This->pMonitorName);
531 DPRINT1(
"This->pMonitorDevice: %ws\n",
This->pMonitorDevice);
557 This->bPruningOn = (
dw != 0);
578 dwSize = (
This->nDevModes + 1) *
sizeof(pDevMode);
586 This->nDevModes *
sizeof(pDevMode));
591 This->DevModes = DevModesNew;
592 This->DevModes[
This->nDevModes++] = pDevMode;
619 for (
i = 0;
i <
This->nDevModes;
i++)
631 This->lpOrigDevMode =
This->lpCurDevMode = CurMode;
648 while (
This->nDevModes)
682 DPRINT1(
"CDevSettings::QueryInterface: Queried unknown interface\n");
709 FORMATETC* pformatetcIn,
721 hr = IDataObject_QueryGetData(iface,
727 if (pformatetcIn->cfFormat ==
This->cfDisplayDevice)
729 pszRet =
This->pDisplayDevice;
730 DPRINT1(
"CDevSettings::GetData returns display device %ws\n", pszRet);
732 else if (pformatetcIn->cfFormat ==
This->cfDisplayName)
734 pszRet =
This->pDisplayName;
735 DPRINT1(
"CDevSettings::GetData returns display name %ws\n", pszRet);
737 else if (pformatetcIn->cfFormat ==
This->cfDisplayKey)
739 pszRet =
This->pDisplayKey;
740 DPRINT1(
"CDevSettings::GetData returns display key %ws\n", pszRet);
742 else if (pformatetcIn->cfFormat ==
This->cfDisplayId)
744 pszRet =
This->pDisplayId;
745 DPRINT1(
"CDevSettings::GetData returns display id %ws\n", pszRet);
747 else if (pformatetcIn->cfFormat ==
This->cfMonitorName)
749 pszRet =
This->pMonitorName;
750 DPRINT1(
"CDevSettings::GetData returns monitor name %ws\n", pszRet);
752 else if (pformatetcIn->cfFormat ==
This->cfMonitorDevice)
754 pszRet =
This->pMonitorDevice;
755 DPRINT1(
"CDevSettings::GetData returns monitor device %ws\n", pszRet);
757 else if (pformatetcIn->cfFormat ==
This->cfExtInterface)
767 sizeof(
This->ExtInterface));
769 DPRINT1(
"CDevSettings::GetData returns the desk.cpl extension interface\n");
771 pmedium->tymed = TYMED_HGLOBAL;
772 pmedium->hGlobal = pIface;
779 else if (pformatetcIn->cfFormat ==
This->cfDisplayStateFlags)
787 *pdw =
This->StateFlags;
789 DPRINT1(
"CDevSettings::GetData returns the display state flags %x\n",
This->StateFlags);
791 pmedium->tymed = TYMED_HGLOBAL;
792 pmedium->hGlobal = pdw;
799 else if (pformatetcIn->cfFormat ==
This->cfPruningMode)
807 *pb = (
This->bModesPruned &&
This->bPruningOn);
809 pmedium->tymed = TYMED_HGLOBAL;
810 pmedium->hGlobal = pb;
833 pmedium->tymed = TYMED_HGLOBAL;
834 pmedium->hGlobal = pszBuf;
847 FORMATETC* pformatetc,
851 sizeof(*pformatetc));
857 FORMATETC* pformatetc)
860 TCHAR szFormatName[255];
864 if (pformatetc->dwAspect != DVASPECT_CONTENT)
867 if (pformatetc->lindex != -1)
870 if (!(pformatetc->tymed & TYMED_HGLOBAL))
874 if (pformatetc->cfFormat ==
This->cfExtInterface ||
875 pformatetc->cfFormat ==
This->cfDisplayDevice ||
876 pformatetc->cfFormat ==
This->cfDisplayName ||
877 pformatetc->cfFormat ==
This->cfDisplayId ||
878 pformatetc->cfFormat ==
This->cfDisplayKey ||
879 pformatetc->cfFormat ==
This->cfDisplayStateFlags ||
880 pformatetc->cfFormat ==
This->cfMonitorDevice ||
881 pformatetc->cfFormat ==
This->cfMonitorName ||
882 pformatetc->cfFormat ==
This->cfPruningMode)
891 sizeof(szFormatName) /
sizeof(szFormatName[0])))
893 DPRINT1(
"CDevSettings::QueryGetData(\"%ws\")\n", szFormatName);
897 DPRINT1(
"CDevSettings::QueryGetData(Format %u)\n", (
unsigned int)pformatetc->cfFormat);
907 FORMATETC* pformatectIn,
908 FORMATETC* pformatetcOut)
912 DPRINT1(
"CDevSettings::GetCanonicalFormatEtc\n");
914 hr = IDataObject_QueryGetData(iface,
923 if (pformatectIn->ptd ==
NULL)
927 pformatetcOut->ptd =
NULL;
942 FORMATETC* pformatetc,
946 DPRINT1(
"CDevSettings::SetData UNIMPLEMENTED\n");
954 pFormatEtc->cfFormat =
cf;
955 pFormatEtc->ptd =
NULL;
956 pFormatEtc->dwAspect = DVASPECT_CONTENT;
957 pFormatEtc->lindex = -1;
958 pFormatEtc->tymed = TYMED_HGLOBAL;
970 *ppenumFormatEtc =
NULL;
972 if (dwDirection == DATADIR_GET)
975 This->cfExtInterface);
977 This->cfDisplayDevice);
979 This->cfDisplayName);
985 This->cfDisplayStateFlags);
987 This->cfMonitorName);
989 This->cfMonitorDevice);
991 This->cfPruningMode);
1005 FORMATETC* pformatetc,
1008 DWORD* pdwConnection)
1025 *ppenumAdvise =
NULL;
1058 DisplayDeviceInfo)))
1076 if (
This->lpCurDevMode !=
This->lpOrigDevMode)
1092 This->pDisplayDevice,
1100 This->lpOrigDevMode =
This->lpCurDevMode;
1102 This->lpCurDevMode =
This->lpOrigDevMode;
#define InterlockedIncrement
#define InterlockedDecrement
#define STDMETHODCALLTYPE
#define RegCloseKey(hKey)
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
#define ERROR_INSUFFICIENT_BUFFER
BOOL SwitchDisplayMode(HWND hwndDlg, PWSTR DeviceName, PSETTINGS_ENTRY seInit, PSETTINGS_ENTRY seNew, OUT PLONG rc)
#define DESK_EXT_CALLBACK
#define DESK_EXT_MONITORNAME
#define DESK_EXT_DISPLAYSTATEFLAGS
#define DESK_EXT_DISPLAYDEVICE
#define DESK_EXT_PRUNINGMODE
#define DESK_EXT_EXTINTERFACE
#define DESK_EXT_DISPLAYNAME
#define DESK_EXT_DISPLAYID
#define DESK_EXT_DISPLAYKEY
#define DESK_EXT_MONITORDEVICE
static HRESULT STDMETHODCALLTYPE CDevSettings_QueryInterface(IDataObject *iface, REFIID riid, void **ppvObject)
static HRESULT STDMETHODCALLTYPE CDevSettings_QueryGetData(IDataObject *iface, FORMATETC *pformatetc)
static __inline VOID pCDevSettings_FreeString(PWCHAR *psz)
static const struct IDataObjectVtbl vtblIDataObject
static PWSTR pCDevSettings_GetMonitorDevice(const WCHAR *pszDisplayDevice)
static HRESULT STDMETHODCALLTYPE CDevSettings_SetData(IDataObject *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
static HRESULT STDMETHODCALLTYPE CDevSettings_GetData(IDataObject *iface, FORMATETC *pformatetcIn, STGMEDIUM *pmedium)
VOID DESK_EXT_CALLBACK CDevSettings_GetPruningMode(PVOID Context, PBOOL pbModesPruned, PBOOL pbKeyIsReadOnly, PBOOL pbPruningOn)
static HRESULT STDMETHODCALLTYPE CDevSettings_EnumFormatEtc(IDataObject *iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
PDEVMODEW DESK_EXT_CALLBACK CDevSettings_EnumAllModes(PVOID Context, DWORD Index)
static HRESULT STDMETHODCALLTYPE CDevSettings_GetDataHere(IDataObject *iface, FORMATETC *pformatetc, STGMEDIUM *pmedium)
static __inline PCDevSettings impl_from_IDataObject(struct IDataObject *iface)
BOOL DESK_EXT_CALLBACK CDevSettings_SetCurrentMode(PVOID Context, DEVMODEW *pDevMode)
static ULONG STDMETHODCALLTYPE CDevSettings_AddRef(IDataObject *iface)
static HRESULT STDMETHODCALLTYPE CDevSettings_GetCanonicalFormatEtc(IDataObject *iface, FORMATETC *pformatectIn, FORMATETC *pformatetcOut)
struct _CDevSettings * PCDevSettings
static PWSTR pCDevSettings_AllocAndCopyString(const TCHAR *pszSrc)
static HKEY pCDevSettings_OpenDeviceKey(PCDevSettings This, BOOL ReadOnly)
#define impl_to_interface(impl, iface)
static ULONG STDMETHODCALLTYPE CDevSettings_Release(IDataObject *iface)
struct _CDevSettings CDevSettings
static HRESULT STDMETHODCALLTYPE CDevSettings_DUnadvise(IDataObject *iface, DWORD dwConnection)
static VOID pCDevSettings_InitializeExtInterface(PCDevSettings This)
static __inline VOID pCDevSettings_FillFormatEtc(FORMATETC *pFormatEtc, CLIPFORMAT cf)
VOID DESK_EXT_CALLBACK CDevSettings_SetPruningMode(PVOID Context, BOOL PruningOn)
static HRESULT pCDevSettings_Initialize(PCDevSettings This, PDISPLAY_DEVICE_ENTRY DisplayDeviceInfo)
static HRESULT STDMETHODCALLTYPE CDevSettings_DAdvise(IDataObject *iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
PDEVMODEW DESK_EXT_CALLBACK CDevSettings_GetCurrentMode(PVOID Context)
static PWSTR pCDevSettings_GetDeviceInstanceId(const WCHAR *pszDevice)
Converts a Hardware ID (DeviceID from EnumDisplayDevices) to an unique Device Instance ID.
static HRESULT STDMETHODCALLTYPE CDevSettings_EnumDAdvise(IDataObject *iface, IEnumSTATDATA **ppenumAdvise)
IDataObject * CreateDevSettings(PDISPLAY_DEVICE_ENTRY DisplayDeviceInfo)
static PWSTR pCDevSettings_GetMonitorName(const WCHAR *pszDisplayDevice)
static VOID pCDevSettings_ReadHardwareInfo(HKEY hKey, LPCTSTR lpValueName, LPWSTR lpBuffer)
static VOID pCDevSettings_Free(PCDevSettings This)
LONG WINAPI DisplaySaveSettings(PVOID pContext, HWND hwndPropSheet)
#define IDS_UNKNOWNMONITOR
#define IDS_MULTIPLEMONITORS
static const WCHAR szEmpty[]
#define INVALID_HANDLE_VALUE
#define MultiByteToWideChar
BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO devinfo, DWORD index, PSP_DEVINFO_DATA info)
HDEVINFO WINAPI SetupDiGetClassDevsW(CONST GUID *class, LPCWSTR enumstr, HWND parent, DWORD flags)
GLuint GLuint GLsizei GLenum type
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
HLOCAL NTAPI LocalFree(HLOCAL hMem)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
REFIID LPVOID DWORD_PTR dw
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
const GUID IID_IDataObject
#define IsEqualGUID(rguid1, rguid2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
#define SetupDiGetDeviceInstanceId
HRESULT WINAPI SHCreateStdEnumFmtEtc(UINT cFormats, const FORMATETC *lpFormats, LPENUMFORMATETC *ppenumFormatetc)
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
DESK_EXT_INTERFACE ExtInterface
CLIPFORMAT cfDisplayStateFlags
const struct IDataObjectVtbl * lpIDataObjectVtbl
CLIPFORMAT cfExtInterface
CLIPFORMAT cfMonitorDevice
CLIPFORMAT cfDisplayDevice
#define FIELD_OFFSET(t, f)
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
BOOL WINAPI EnumDisplayDevicesW(LPCWSTR lpDevice, DWORD iDevNum, PDISPLAY_DEVICEW lpDisplayDevice, DWORD dwFlags)
BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum, LPDEVMODEW lpDevMode, DWORD dwFlags)
DWORD WINAPI GetLastError(void)
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
#define OLE_E_ADVISENOTSUPPORTED
#define DATA_S_SAMEFORMATETC
#define DM_DISPLAYFREQUENCY
#define DISPLAY_DEVICE_MODESPRUNED
#define HKEY_LOCAL_MACHINE
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define DISP_CHANGE_SUCCESSFUL
#define RegisterClipboardFormat
#define GetClipboardFormatName
#define ENUM_CURRENT_SETTINGS