/admin/win/nsi/nsis_uac/NSISUtil.h

http://github.com/tomahawk-player/tomahawk · C Header · 149 lines · 113 code · 24 blank · 12 comment · 6 complexity · afa86128ade9e22ff94bcac262b07f10 MD5 · raw file

  1. /*
  2. Alternative to ExDll.h
  3. v0.0.1 - 20060811 (AndersK)
  4. */
  5. #pragma once
  6. #include <TChar.h>
  7. typedef TCHAR NSISCH;
  8. #define NSISCALL __stdcall
  9. namespace NSIS {
  10. __forceinline void* NSISCALL MemAlloc(SIZE_T cb) {return GlobalAlloc(LPTR,cb);}
  11. __forceinline void NSISCALL MemFree(void* p) {GlobalFree(p);}
  12. enum {
  13. INST_0, // $0
  14. INST_1, // $1
  15. INST_2, // $2
  16. INST_3, // $3
  17. INST_4, // $4
  18. INST_5, // $5
  19. INST_6, // $6
  20. INST_7, // $7
  21. INST_8, // $8
  22. INST_9, // $9
  23. INST_R0, // $R0
  24. INST_R1, // $R1
  25. INST_R2, // $R2
  26. INST_R3, // $R3
  27. INST_R4, // $R4
  28. INST_R5, // $R5
  29. INST_R6, // $R6
  30. INST_R7, // $R7
  31. INST_R8, // $R8
  32. INST_R9, // $R9
  33. INST_CMDLINE, // $CMDLINE
  34. INST_INSTDIR, // $INSTDIR
  35. INST_OUTDIR, // $OUTDIR
  36. INST_EXEDIR, // $EXEDIR
  37. INST_LANG, // $LANGUAGE
  38. __INST_LAST,
  39. VIDX_TEMP=(INST_LANG+1), //#define state_temp_dir g_usrvars[25]
  40. VIDX_PLUGINSDIR,//# define state_plugins_dir g_usrvars[26]
  41. VIDX_EXEPATH,//#define state_exe_path g_usrvars[27]
  42. VIDX_EXEFILENAME,//#define state_exe_file g_usrvars[28]
  43. VIDX_STATECLICKNEXT,//#define state_click_next g_usrvars[30]
  44. __VIDX_UNDOCLAST
  45. };
  46. typedef struct _stack_t {
  47. struct _stack_t *next;
  48. NSISCH text[ANYSIZE_ARRAY];
  49. } stack_t;
  50. typedef struct {
  51. int autoclose;
  52. int all_user_var;
  53. int exec_error;
  54. int abort;
  55. int exec_reboot;
  56. int reboot_called;
  57. int XXX_cur_insttype; // deprecated
  58. int XXX_insttype_changed; // deprecated
  59. int silent;
  60. int instdir_error;
  61. int rtl;
  62. int errlvl;
  63. //NSIS v2.3x ?
  64. int alter_reg_view;
  65. int status_update;
  66. } exec_flags_type;
  67. typedef struct {
  68. exec_flags_type *exec_flags;
  69. int (NSISCALL *ExecuteCodeSegment)(int, HWND);
  70. void (NSISCALL *validate_filename)(char *);
  71. } extra_parameters;
  72. extern UINT StrSize;
  73. extern stack_t **StackTop;
  74. extern NSISCH*Vars;
  75. inline bool NSISCALL SetErrLvl(extra_parameters*pExtraParams,int ErrLevel) {return pExtraParams? ((pExtraParams->exec_flags->errlvl=ErrLevel)||true):false;}
  76. inline bool NSISCALL SetErrorFlag(extra_parameters*pExtraParams) {return pExtraParams? ((pExtraParams->exec_flags->exec_error=1)||true):false;}
  77. inline bool NSISCALL ClearErrorFlag(extra_parameters*pExtraParams) {return pExtraParams?((pExtraParams->exec_flags->exec_error=0)||true):false;}
  78. __forceinline int NSISCALL ExecuteCodeSegment(extra_parameters*pExtraParams,int pos,HWND hwndProgress=NULL) {
  79. return pExtraParams?pExtraParams->ExecuteCodeSegment(pos,hwndProgress):(/*EXEC_ERROR*/0x7FFFFFFF);
  80. }
  81. static NSISCH* __fastcall GetVar(const int varnum)
  82. {
  83. //ASSERT(NSIS::Vars && NSIS::StrSize);
  84. if (varnum < 0 || varnum >= __VIDX_UNDOCLAST) return NULL;
  85. return NSIS::Vars+(varnum*NSIS::StrSize);
  86. }
  87. inline void NSISCALL SetVarUINT(const int varnum,UINT Value) {
  88. wsprintf(GetVar(varnum),_T("%u"),Value);
  89. }
  90. static stack_t* NSISCALL StackPop() {
  91. if (NSIS::StackTop && *NSIS::StackTop) {
  92. stack_t*s=(*NSIS::StackTop);
  93. *NSIS::StackTop=(*NSIS::StackTop)->next;
  94. return s;
  95. }
  96. return 0;
  97. }
  98. __forceinline void NSISCALL StackFreeItem(stack_t*pStackItem) {NSIS::MemFree(pStackItem);}
  99. static DWORD NSISCALL StackPush(NSISCH*InStr,UINT StackStrSize=NSIS::StrSize) {
  100. if (!NSIS::StackTop)return ERROR_INVALID_PARAMETER;
  101. stack_t*sNew=(stack_t*)NSIS::MemAlloc(sizeof(stack_t)+(StackStrSize*sizeof(NSISCH)));
  102. if (!sNew)return ERROR_OUTOFMEMORY;
  103. lstrcpyn(sNew->text,InStr,StackStrSize);
  104. sNew->next=*NSIS::StackTop;
  105. *NSIS::StackTop=sNew;
  106. return NO_ERROR;
  107. }
  108. }; /* namespace */
  109. #define NSISUTIL_INIT() namespace NSIS {static UINT StrSize;static stack_t **StackTop;static NSISCH*Vars;}//Call in only ONE source file
  110. #define NSISUTIL_INITEXPORT(_v,_strsize,_stackt) NSIS::Vars=_v;NSIS::StrSize=_strsize;NSIS::StackTop=_stackt
  111. //#define NSISEXPORT4(_func,_h,_strsize,_v,_stackt) extern "C" void __declspec(dllexport) __cdecl \
  112. // _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
  113. //#define NSISEXPORT5(_func,_h,_strsize,_v,_stackt,_eparams) extern "C" void __declspec(dllexport) __cdecl \
  114. // _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt,NSIS::extra_parameters* _eparams) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
  115. //#define NSISEXPORT NSISEXPORT5
  116. #ifdef _MSC_VER
  117. # define EXPORTNSISFUNC extern "C" void __declspec(dllexport) __cdecl
  118. # else
  119. # error EXPORTNSISFUNC needs compiler goo, you are on your own!
  120. # endif
  121. #define NSISFUNCSTART4(_h,_strsize,_v,_stackt) {NSISUTIL_INITEXPORT(_v,_strsize,_stackt);
  122. #define NSISFUNCSTART5(_h,_strsize,_v,_stackt,_eparams) NSISFUNCSTART4(_h,_strsize,_v,_stackt)
  123. #define NSISFUNCSTART NSISFUNCSTART5
  124. #define NSISFUNCEND() }