# user interface !define GameExplorer_GenerateGUID '!insertmacro GameExplorer_GenerateGUID' !define GameExplorer_AddGame '!insertmacro GameExplorer_AddGame' !define GameExplorer_UpdateGame '!insertmacro GameExplorer_UpdateGame' !define GameExplorer_RemoveGame '!insertmacro GameExplorer_RemoveGame' # internal stuff !define CLSCTX_INPROC_SERVER 1 !define IID_IGameExplorer {E7B2FB72-D728-49B3-A5F2-18EBF5F1349E} !define CLSID_GameExplorer {9A5EA990-3034-4D6F-9128-01F3C61022BC} !define GIS_CURRENT_USER 2 !define GIS_ALL_USERS 3 !define IGameExplorer_QueryInterface 0 !define IGameExplorer_AddRef 1 !define IGameExplorer_Release 2 !define IGameExplorer_AddGame 3 !define IGameExplorer_RemoveGame 4 !define IGameExplorer_UpdateGame 5 !define IGameExplorer_VerifyAccess 6 # includes !include LogicLib.nsh # the actual code !macro GameExplorer_GenerateGUID System::Call 'ole32::CoCreateGuid(g .s)' !macroend !macro GameExplorer_AddGame CONTEXT GDF INSTDIR EXE GUID !define __GAME_EXPLORER_UNIQUE "${__LINE__}${__FILE__}" Push $0 Push $1 Push $R0 Push $R1 Push $R2 Push $R3 Push "${EXE}" Push "${GUID}" Push "${INSTDIR}" Push "${GDF}" Pop $R0 # == ${GDF} Pop $R1 # == ${INSTDIR} Pop $R2 # == ${GUID} Pop $R3 # == ${EXE} ClearErrors System::Call "ole32::CoCreateInstance( \ g '${CLSID_GameExplorer}', i 0, \ i ${CLSCTX_INPROC_SERVER}, \ g '${IID_IGameExplorer}', *i .r1) i .r0" ${If} $0 != 0 # S_OK SetErrors Goto "done_${__GAME_EXPLORER_UNIQUE}" ${EndIf} !if ${CONTEXT} == all System::Call "$1->${IGameExplorer_AddGame}(w R0, w R1, i ${GIS_ALL_USERS}, g R2) i .r0" !else if ${CONTEXT} == user System::Call "$1->${IGameExplorer_AddGame}(w R1, w R0, i ${GIS_CURRENT_USER}, g R2) i .r0" !else !error "Invalid CONTEXT passed to GameExplorer_AddGame! Must be `user` or `all`." !endif ${If} $0 != 0 # S_OK SetErrors ${Else} # Create play task !if ${CONTEXT} == all SetShellVarContext all !else if if ${CONTEXT} == user SetShellVarContext user !endif CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$R2\PlayTasks\0 CreateShortcut $APPDATA\Microsoft\Windows\GameExplorer\$R2\PlayTasks\0\Play.lnk $R3 ${EndIf} System::Call "$1->${IGameExplorer_Release}()" "done_${__GAME_EXPLORER_UNIQUE}:" Pop $R3 Pop $R2 Pop $R1 Pop $R0 Pop $1 Pop $0 !undef __GAME_EXPLORER_UNIQUE !macroend !macro _GameExplorer_GUID_Function Function GUID !define __GAME_EXPLORER_UNIQUE "${__LINE__}${__FILE__}" Push $0 Push $1 Push $2 Push $3 Push $4 Push $5 Push $R0 Push "${GUID}" Pop $R0 # == ${GUID} System::Alloc 16 Exch $R0 System::Call "ole32::CLSIDFromString(w s, i R0)" System::Call "*$R0(i .r2, i .r3, i .r4, i .r5)" System::Free $R0 ClearErrors System::Call "ole32::CoCreateInstance( \ g '${CLSID_GameExplorer}', i 0, \ i ${CLSCTX_INPROC_SERVER}, \ g '${IID_IGameExplorer}', *i .r1) i .r0" ${If} $0 != 0 # S_OK SetErrors Goto "done_${__GAME_EXPLORER_UNIQUE}" ${EndIf} System::Call "$1->${Function}(i r2, i r3, i r4, i r5) i .r0" ${If} $0 != 0 # S_OK SetErrors ${EndIf} System::Call "$1->${IGameExplorer_Release}()" "done_${__GAME_EXPLORER_UNIQUE}:" Pop $R0 Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Pop $0 !undef __GAME_EXPLORER_UNIQUE !macroend !macro GameExplorer_UpdateGame GUID !insertmacro _GameExplorer_GUID_Function ${IGameExplorer_UpdateGame} "${GUID}" !macroend !macro GameExplorer_RemoveGame GUID !insertmacro _GameExplorer_GUID_Function ${IGameExplorer_RemoveGame} "${GUID}" !macroend