2013-04-11 09:27:55 +00:00
!ifndef __WIN_PROPKEY__INC
!define __WIN_PROPKEY__INC
!verbose push
!verbose 3
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
WTypes.h
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
;NOTE: This list is incomplete
!define VT_EMPTY 0
!define VT_NULL 1
2019-01-26 20:34:57 +00:00
!define VT_I2 2
2013-04-11 09:27:55 +00:00
!define VT_I4 3
!define VT_BSTR 8
!define VT_BOOL 11
2019-01-26 20:34:57 +00:00
!define VT_I1 16
!define VT_UI1 17
!define VT_UI2 18
2013-04-11 09:27:55 +00:00
!define VT_UI4 19
2019-01-26 20:34:57 +00:00
!define VT_I8 20
!define VT_UI8 21
2013-04-11 09:27:55 +00:00
!define VT_INT 22
!define VT_UINT 23
!define VT_HRESULT 25
!define VT_PTR 26
!define VT_SAFEARRAY 27
2019-09-04 19:39:06 +00:00
!define VT_LPSTR 30 ; SHStrDupA
2019-08-16 21:43:44 +00:00
!define VT_LPWSTR 31 ; SHStrDupW
2019-01-29 22:11:00 +00:00
!define VT_FILETIME 64
2019-08-11 17:12:33 +00:00
!define VT_STREAM 66
2019-08-16 21:43:44 +00:00
!define VT_CLSID 72 ; Pointer to CoTaskMem allocated GUID
2019-08-11 17:12:33 +00:00
!define VT_TYPEMASK 0xFFF
!define VT_VECTOR 0x1000
!define VT_ARRAY 0x2000
!define VT_BYREF 0x4000
2013-04-11 09:27:55 +00:00
!define /ifndef VARIANT_TRUE - 1
!define /ifndef VARIANT_FALSE 0
!define SYSSIZEOF_PROPERTYKEY 20
!define SYSSTRUCT_PROPERTYKEY ( & g16, & i4) ;System.dll is buggy when it comes to g and forces us to specify the size
2019-01-26 20:34:57 +00:00
!define STGC_DEFAULT 0
!define STGC_OVERWRITE 1
!define STGC_ONLYIFCURRENT 2
!define STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE 4
!define STGC_CONSOLIDATE 8
2013-04-11 09:27:55 +00:00
2019-08-11 17:12:33 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
OAIdl.h
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
!define /ifndef SYSSIZEOF_VARIANT 16
!define /ifndef SYSSTRUCT_VARIANT ( & i2, & i6, & i8)
2013-04-11 09:27:55 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
PropIdl.h
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2019-08-11 17:12:33 +00:00
!if " ${NSIS_PTR_SIZE} " > 4
!define SYSSIZEOF_PROPVARIANT 24
!define SYSSTRUCT_PROPVARIANT ( & i2, & i6, & i8, & i8)
!else
2013-04-11 09:27:55 +00:00
!define SYSSIZEOF_PROPVARIANT 16
!define SYSSTRUCT_PROPVARIANT ( & i2, & i6, & i8)
2019-08-11 17:12:33 +00:00
!endif
2013-04-11 09:27:55 +00:00
2019-01-26 20:34:57 +00:00
!define PRSPEC_LPWSTR 0
!define PRSPEC_PROPID 1
!define SYSSTRUCT_PROPSPEC ( p, p)
2013-04-11 09:27:55 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Propkey.h
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2019-08-16 21:43:44 +00:00
!define PKEY_AppUserModel_RelaunchCommand '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",2' ; VT_LPWSTR (SHGetPropertyStoreForWindow)
!define PKEY_AppUserModel_RelaunchIconResource '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",3' ; VT_LPWSTR (SHGetPropertyStoreForWindow, optional. Path to icon or module, with resource ID or index.)
!define PKEY_AppUserModel_RelaunchDisplayNameResource '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",4' ; VT_LPWSTR (SHGetPropertyStoreForWindow. @ style indirect resource string or a plain string.)
!define PKEY_AppUserModel_ID '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",5' ; VT_LPWSTR
!define PKEY_AppUserModel_IsDestListSeparator '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",6' ; VT_BOOL
2013-04-11 09:27:55 +00:00
!define PKEY_AppUserModel_ExcludeFromShowInNewInstall '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",8' ; VT_BOOL
!define PKEY_AppUserModel_PreventPinning '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",9' ; VT_BOOL
2019-08-16 21:43:44 +00:00
!define PKEY_AppUserModel_IsDualMode '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",11' ; [Eight+] VT_BOOL
2013-04-11 09:27:55 +00:00
!define APPUSERMODEL_STARTPINOPTION_NOPINONINSTALL 1
!define APPUSERMODEL_STARTPINOPTION_USERPINNED 2
2019-08-16 21:43:44 +00:00
!define PKEY_AppUserModel_StartPinOption '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",12' ; [Eight+] VT_UI4
!define PKEY_AppUserModel_ToastActivatorCLSID '"{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}",26' ; [10FU1507+] VT_CLSID
!define PKEY_EdgeGesture_DisableTouchWhenFullscreen '"{32CE38B2-2C9A-41B1-9BC5-B3784394AA44}",2' ; [Eight+] VT_BOOL (SHGetPropertyStoreForWindow)
2013-04-11 09:27:55 +00:00
2019-01-26 20:34:57 +00:00
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
ShlGuid.h & ShlObj.h
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
!define FMTID_Intshcut { 000214A0- 0000- 0000- C000- 000000000046}
!define PID_IS_URL 2 ; VT_LPWSTR
!define PID_IS_HOTKEY 6 ; VT_UI2
!define PID_IS_ICONINDEX 8 ; VT_I4
!define PID_IS_ICONFILE 9 ; VT_LPWSTR
!define PKEY_Intshcut_Url '"${FMTID_Intshcut}",${PID_IS_URL}' ; Undocumented
!define FMTID_InternetSite { 000214A1- 0000- 0000- C000- 000000000046}
!define PID_INTSITE_LASTVISIT 4 ; VT_FILETIME
!define PID_INTSITE_VISITCOUNT 6 ; VT_UI4
/ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Helper macros
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /
2019-01-29 22:11:00 +00:00
!define V_GetVT '!insertmacro V_GetVT '
2019-01-26 20:34:57 +00:00
!macro V_GetVT pPV sysdst
System :: Call '*${pPV}(&i2.${sysdst})'
!macroend
2019-01-29 22:11:00 +00:00
!define V_SetVT '!insertmacro V_SetVT '
2019-01-26 20:34:57 +00:00
!macro V_SetVT pPV syssrc
System :: Call '*${pPV}(&i2 ${syssrc})'
!macroend
2019-01-29 22:11:00 +00:00
!macro V_GetHelper sysvaltyp pPV sysdst
System :: Call '*${pPV}(l,${sysvaltyp}.${sysdst})'
2019-01-26 20:34:57 +00:00
!macroend
2019-01-29 22:11:00 +00:00
!macro V_GenericSetHelper sysvaltyp pPV VT syssrc
!if " ${VT} " != " " ; Setting the VT is optional
System :: Call '*${pPV}(&i2 ${VT},&i6,${sysvaltyp}${syssrc})'
!else
System :: Call '*${pPV}(l,${sysvaltyp}${syssrc})'
!endif
2019-01-26 20:34:57 +00:00
!macroend
2019-01-29 22:11:00 +00:00
!macro V_SpecificSetHelper VT sysvaltyp pPV syssrc
System :: Call '*${pPV}(&i2 ${VT},&i6,${sysvaltyp}${syssrc})'
2019-01-26 20:34:57 +00:00
!macroend
2019-01-29 22:11:00 +00:00
!macro Make_V_GetterSetter name sysvaltyp setsep
!define V_Get${name} '!insertmacro V_GetHelper "${sysvaltyp}" '
!ifdef VT_${name}
!define V_Set${name} '!insertmacro V_SpecificSetHelper ${VT_${name}} "${sysvaltyp}${setsep}" '
!else
!define V_Set${name} '!insertmacro V_GenericSetHelper "${sysvaltyp}${setsep}" '
!endif
2019-01-26 20:34:57 +00:00
!macroend
2019-01-29 22:11:00 +00:00
!insertmacro Make_V_GetterSetter Int8 " &i1 " " " ; Generic
!insertmacro Make_V_GetterSetter Int16 " &i2 " " " ; Generic
!insertmacro Make_V_GetterSetter Int32 " i " " " ; Generic
!insertmacro Make_V_GetterSetter Int64 " l " " " ; Generic
!insertmacro Make_V_GetterSetter Pointer " p " " " ; Generic
!insertmacro Make_V_GetterSetter I4 " i " " "
!insertmacro Make_V_GetterSetter BOOL " &i2 " " "
!insertmacro Make_V_GetterSetter FILETIME " l " " "
!macro VariantInit pV
${V_SetVT} ${pV} ${VT_EMPTY}
2019-01-26 20:34:57 +00:00
!macroend
2019-01-29 22:11:00 +00:00
!macro VariantClear pV
System :: Call 'OLEAUT32::#9(p${pV})'
2019-01-26 20:34:57 +00:00
!macroend
2019-01-29 22:11:00 +00:00
!macro VariantCopy pDstV pSrcV sysretHR
2019-08-17 20:13:07 +00:00
System :: Call 'OLEAUT32::#10(p${pDstV},p${pSrcV})i.${sysretHR}' ; (Frees the destination variant before it copies the source)
2019-01-26 20:34:57 +00:00
!macroend
2019-09-04 19:39:06 +00:00
!macro VariantCopyInd pDstV pSrcV sysretHR
System :: Call 'OLEAUT32::#11(p${pDstV},p${pSrcV})i.${sysretHR}' ; (Frees the destination variant before it copies the source)
!macroend
2019-01-29 22:11:00 +00:00
!macro VariantChangeType pDstV pSrcV Flags VT sysretHR
2019-09-04 19:39:06 +00:00
System :: Call 'OLEAUT32::#12(p${pDstV},p${pSrcV},i${Flags},i${VT})i.${sysretHR}' ; (Might free the destination on success)
2019-01-26 20:34:57 +00:00
!macroend
2019-08-17 20:13:07 +00:00
2019-01-29 22:11:00 +00:00
!macro PropVariantClear pPV
2019-11-19 16:58:32 +00:00
System :: Call 'OLE32::PropVariantClear(p${pPV})' ; WinNT4.SP0+, Win98+, IE4+
2019-01-26 20:34:57 +00:00
!macroend
2019-11-19 16:58:32 +00:00
!macro PropVariantCopy pDstPV pSrcPV sysretHR
System :: Call 'OLE32::PropVariantCopy(p${pDstPV},p${pSrcPV})i.${sysretHR}' ; WinNT4.SP0+, Win98+, IE4+ (Does NOT free the destination before it copies the source)
2019-09-04 19:39:06 +00:00
!macroend
2019-11-19 16:58:32 +00:00
!macro PropVariantChangeType pDstPV pSrcPV VT sysretHR
2019-09-04 19:39:06 +00:00
!ifdef NSIS_ARM | NSIS_ARM32 | NSIS_ARMNT | NSIS_ARM64
2019-11-19 16:58:32 +00:00
System :: Call 'PROPSYS::PropVariantChangeType(p${pDstPV},p${pSrcPV},i0,i${VT})i.${sysretHR}'
2019-09-04 19:39:06 +00:00
!else
Push " ${VT} "
2019-11-19 16:58:32 +00:00
Push ${pSrcPV}
Push ${pDstPV}
2019-09-04 19:39:06 +00:00
!include Util.nsh
${CallArtificialFunction} TryPropVariantChangeType
System :: Call 'KERNEL32::SetLastError(is${sysretHR})' ; A hack to move the result from the stack to somewhere with System variable syntax
!endif
!macroend
!macro TryPropVariantChangeType
System :: Store S
System :: Call 'PROPSYS::PropVariantChangeType(psr1,psr2,i0,isr3)i.r0' ; Vista+ (Source and destination cannot be the same address)
StrCmp $0 error " " done
System :: Call 'OLE32::PropVariantChangeType(pr1,pr2,i0,i0,ir3})i.r0' ; 2000+ (Source and destination cannot be the same address)
!if ${NSIS_PTR_SIZE} < 8
StrCmp $0 error " " done
!insertmacro VariantChangeType $1 $2 0 $3 r0 ; This is not really correct but there is no PROPVARIANT support on these platforms. Might free the destination!
!endif
done :
Push $0
System :: Store L
2019-08-17 20:13:07 +00:00
!macroend
2019-01-26 20:34:57 +00:00
!macro IPropertyStorage_ReadPropById pPS ID pPV sysoutHR
System :: Call '*(p${PRSPEC_PROPID},p${ID})p.s'
$ { IPropertyStorage :: ReadMultiple } ${pPS} '(1,pss,p${pPV})${sysoutHR}'
System :: Free
!macroend
!macro IPropertyStorage_WritePropById pPS ID pPV sysoutHR
System :: Call '*(p${PRSPEC_PROPID},p${ID})p.s'
$ { IPropertyStorage :: WriteMultiple } ${pPS} '(1,pss,p${pPV},2)${sysoutHR}'
System :: Free
!macroend
2013-04-11 09:27:55 +00:00
!verbose pop
!endif / * __WIN_PROPKEY__INC * /