other-licenses/nsis/Contrib/ExDLL/nsis.pas

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     Original Code from
     3     (C) 2001 - Peter Windridge
     5     Code in seperate unit and some changes
     6     2003 by Bernhard Mayer
     8     Fixed and formatted by Brett Dever
     9     http://editor.nfscheats.com/
    11     simply include this unit in your plugin project and export
    12     functions as needed
    13 }
    16 unit nsis;
    18 interface
    20 uses
    21   windows;
    23 type
    24   VarConstants = (
    25     INST_0,       // $0
    26     INST_1,       // $1
    27     INST_2,       // $2
    28     INST_3,       // $3
    29     INST_4,       // $4
    30     INST_5,       // $5
    31     INST_6,       // $6
    32     INST_7,       // $7
    33     INST_8,       // $8
    34     INST_9,       // $9
    35     INST_R0,      // $R0
    36     INST_R1,      // $R1
    37     INST_R2,      // $R2
    38     INST_R3,      // $R3
    39     INST_R4,      // $R4
    40     INST_R5,      // $R5
    41     INST_R6,      // $R6
    42     INST_R7,      // $R7
    43     INST_R8,      // $R8
    44     INST_R9,      // $R9
    45     INST_CMDLINE, // $CMDLINE
    46     INST_INSTDIR, // $INSTDIR
    47     INST_OUTDIR,  // $OUTDIR
    48     INST_EXEDIR,  // $EXEDIR
    49     INST_LANG,    // $LANGUAGE
    50     __INST_LAST
    51     );
    52   TVariableList = INST_0..__INST_LAST;
    53   pstack_t = ^stack_t;
    54   stack_t = record
    55     next: pstack_t;
    56     text: PChar;
    57   end;
    59 var
    60   g_stringsize: integer;
    61   g_stacktop: ^pstack_t;
    62   g_variables: PChar;
    63   g_hwndParent: HWND;
    65 procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer);
    66 function PopString(): string;
    67 procedure PushString(const str: string='');
    68 function GetUserVariable(const varnum: TVariableList): string;
    69 procedure SetUserVariable(const varnum: TVariableList; const value: string);
    70 procedure NSISDialog(const text, caption: string; const buttons: integer);
    72 implementation
    74 procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer);
    75 begin
    76   g_stringsize := string_size;
    77   g_hwndParent := hwndParent;
    78   g_stacktop   := stacktop;
    79   g_variables  := variables;
    80 end;
    82 function PopString(): string;
    83 var
    84   th: pstack_t;
    85 begin
    86   if integer(g_stacktop^) <> 0 then begin
    87     th := g_stacktop^;
    88     Result := PChar(@th.text);
    89     g_stacktop^ := th.next;
    90     GlobalFree(HGLOBAL(th));
    91   end;
    92 end;
    94 procedure PushString(const str: string='');
    95 var
    96   th: pstack_t;
    97 begin
    98   if integer(g_stacktop) <> 0 then begin
    99     th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
   100     lstrcpyn(@th.text, PChar(str), g_stringsize);
   101     th.next := g_stacktop^;
   102     g_stacktop^ := th;
   103   end;
   104 end;
   106 function GetUserVariable(const varnum: TVariableList): string;
   107 begin
   108   if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
   109     Result := g_variables + integer(varnum) * g_stringsize
   110   else
   111     Result := '';
   112 end;
   114 procedure SetUserVariable(const varnum: TVariableList; const value: string);
   115 begin
   116   if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
   117     lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
   118 end;
   120 procedure NSISDialog(const text, caption: string; const buttons: integer);
   121 begin
   122   MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
   123 end;
   125 begin
   126 end.

mercurial