other-licenses/nsis/Contrib/ExDLL/exdll.dpr

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 {
     2   NSIS ExDLL example
     3   (C) 2001 - Peter Windridge
     5   Fixed and formatted by Brett Dever
     6   http://editor.nfscheats.com/
     8   Tested in Delphi 7.0
     9 }
    11 library exdll;
    13 uses Windows;
    15 type
    16   VarConstants = (
    17     INST_0,
    18     INST_1,       // $1
    19     INST_2,       // $2
    20     INST_3,       // $3
    21     INST_4,       // $4
    22     INST_5,       // $5
    23     INST_6,       // $6
    24     INST_7,       // $7
    25     INST_8,       // $8
    26     INST_9,       // $9
    27     INST_R0,      // $R0
    28     INST_R1,      // $R1
    29     INST_R2,      // $R2
    30     INST_R3,      // $R3
    31     INST_R4,      // $R4
    32     INST_R5,      // $R5
    33     INST_R6,      // $R6
    34     INST_R7,      // $R7
    35     INST_R8,      // $R8
    36     INST_R9,      // $R9
    37     INST_CMDLINE, // $CMDLINE
    38     INST_INSTDIR, // $INSTDIR
    39     INST_OUTDIR,  // $OUTDIR
    40     INST_EXEDIR,  // $EXEDIR
    41     INST_LANG,    // $LANGUAGE
    42     __INST_LAST
    43     );
    44   TVariableList = INST_0..__INST_LAST;
    45   pstack_t = ^stack_t;
    46   stack_t = record
    47     next: pstack_t;
    48     text: PChar;
    49   end;
    51 var
    52   g_stringsize: integer;
    53   g_stacktop: ^pstack_t;
    54   g_variables: PChar;
    55   g_hwndParent: HWND;
    57 function PopString(): string;
    58 var
    59   th: pstack_t;
    60 begin
    61   if integer(g_stacktop^) <> 0 then begin
    62     th := g_stacktop^;
    63     Result := PChar(@th.text);
    64     g_stacktop^ := th.next;
    65     GlobalFree(HGLOBAL(th));
    66   end;
    67 end;
    69 procedure PushString(const str: string='');
    70 var
    71   th: pstack_t;
    72 begin
    73   if integer(g_stacktop) <> 0 then begin
    74     th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
    75     lstrcpyn(@th.text, PChar(str), g_stringsize);
    76     th.next := g_stacktop^;
    77     g_stacktop^ := th;
    78   end;
    79 end;
    81 function GetUserVariable(const varnum: TVariableList): string;
    82 begin
    83   if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
    84     Result := g_variables + integer(varnum) * g_stringsize
    85   else
    86     Result := '';
    87 end;
    89 procedure SetUserVariable(const varnum: TVariableList; const value: string);
    90 begin
    91   if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
    92     lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
    93 end;
    95 procedure NSISDialog(const text, caption: string; const buttons: integer);
    96 begin
    97   MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
    98 end;
   100 procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
   101 begin
   102   // setup global variables
   103   g_stringsize := string_size;
   104   g_hwndParent := hwndParent;
   105   g_stacktop := stacktop;
   106   g_variables := variables;
   107   // end global variable setup
   109   NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
   110   NSISDialog(PopString, 'pop', MB_OK);
   111   PushString('Hello, this is a push');
   112   SetUserVariable(INST_0, 'This is user var $0');
   113 end;
   115 exports ex_dll;
   117 begin
   118 end.

mercurial