Bug 571387 - Use the official Unicode UAC and ShellLink distributions. r=jmathies

This commit is contained in:
Robert Strong 2010-06-21 18:17:05 -07:00
parent 6555844abb
commit b855c0578a
19 changed files with 7 additions and 3525 deletions

View File

@ -27,6 +27,13 @@ changes were made to these files.
-------------------------------------------------------------------------------
ApplicationID v1.0
http://nsis.sourceforge.net/ApplicationID_plug-in
Unicode support and taskbar resource deleteion was added for this plugin. A diff
of the changes to the source is available at:
https://bugzilla.mozilla.org/show_bug.cgi?id=521141
-------------------------------------------------------------------------------
nsProcess NSIS plugin v1.5
http://nsis.sourceforge.net/NsProcess_plugin
Unicode support was added for this plugin. A diff of the changes to the source
@ -35,30 +42,3 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=473348
https://bugzilla.mozilla.org/attachment.cgi?id=357012
-------------------------------------------------------------------------------
ShellLink NSIS plugin v1.1
http://nsis.sourceforge.net/ShellLink_plug-in
Unicode support was added for this plugin. A diff of the changes to the source
are available at:
https://bugzilla.mozilla.org/show_bug.cgi?id=473348
https://bugzilla.mozilla.org/attachment.cgi?id=357058
-------------------------------------------------------------------------------
UAC NSIS plugin v0.0.10a
http://nsis.sourceforge.net/UAC_plug-in
The source files already support Unicode but there is no Unicode distribution
so the plugin had to be compiled with Unicode support. A diff of the changes to
the source are available at:
https://bugzilla.mozilla.org/show_bug.cgi?id=473348
https://bugzilla.mozilla.org/attachment.cgi?id=357014
-------------------------------------------------------------------------------
ApplicationID v1.0
http://nsis.sourceforge.net/ApplicationID_plug-in
Unicode support and taskbar resource deleteion was added for this plugin. A diff
of the changes to the source is available at:
https://bugzilla.mozilla.org/show_bug.cgi?id=521141
-------------------------------------------------------------------------------

View File

@ -1,242 +0,0 @@
/*****************************************************************
* Conversion functions header v1.2 *
* *
* 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) *
* *
* *
*Functions: *
* xatoi, xitoa, hex2dec, dec2hex, str2hex, hex2str *
* *
*Usage: *
*#define xatoi //insert xatoi function *
*#define xitoa //insert xitoa function *
*#include "ConvFunc.h" *
*****************************************************************/
#ifndef _CONVFUNC_
#define _CONVFUNC_
/********************************************************************
*
* xatoi
*
*Converts char to int.
*
*[in] char *str -string number
*
*Returns: integer
*
*Examples:
* xatoi("45") == 45;
* xatoi(" -0045:value") == -45;
********************************************************************/
#ifdef xatoi
#define xatoi_INCLUDED
#undef xatoi
int xatoi(TCHAR *str)
{
BOOL bMinus=FALSE;
int nNumber=0;
while (*str == TEXT(' '))
++str;
if (*str == TEXT('-'))
{
bMinus=TRUE;
++str;
}
for (; (*str != TEXT('\0')) && (*str >= TEXT('0')) && (*str <= TEXT('9')); ++str)
nNumber=(nNumber * 10) + (*str - 48);
if (bMinus == TRUE)
nNumber=0 - nNumber;
return nNumber;
}
#endif
/********************************************************************
*
* xitoa [API: wsprintf(szResult, "%d", 45)]
*
*Converts int to char.
*
*[out] char *str -string number
*[in] int number -integer
*
*Examples:
* xitoa(szResult, 45); //szResult == "45"
* xitoa(szResult, -45); //szResult == "-45"
********************************************************************/
#ifdef xitoa
#define xitoa_INCLUDED
#undef xitoa
void xitoa(char *str, int number)
{
int nCapacity=0;
int nTmp=number;
if (number == 0)
{
str[0]='0';
str[1]='\0';
return;
}
if (number < 0)
{
str[0]='-';
number=0 - number;
++nCapacity;
}
for (; (nTmp != 0); ++nCapacity)
nTmp=nTmp/10;
for (str[nCapacity--]='\0'; (number != 0); --nCapacity)
{
str[nCapacity]=(number % 10) + 48;
number=number/10;
}
}
#endif
/********************************************************************
*
* hex2dec
*
*Converts hex value to decimal.
*
*[in] char *hex -hex value
*
*Returns: integer
*
*Examples:
* hex2dec("A1F") == 2591;
********************************************************************/
#if defined hex2dec || defined hex2str
#define hex2dec_INCLUDED
#undef hex2dec
unsigned hex2dec(char *hex)
{
int a;
int b=0;
while (1)
{
a=*hex++;
if (a >= '0' && a <= '9') a-='0';
else if (a >= 'a' && a <= 'f') a-='a'-10;
else if (a >= 'A' && a <= 'F') a-='A'-10;
else return b;
if (*hex) b=(b + a) * 16;
else return (b + a);
}
}
#endif
/********************************************************************
*
* dec2hex [API: wsprintf(szResult, "%02x", 2591)]
*
*Converts decimal to hex value.
*
*[in] DWORD dec -positive integer
*[out] char *hex -hex value (output)
*[in] BOOL lowercase -if TRUE hexadecimal value in lowercase
* if FALSE in uppercase.
*[in] DWORD width -minimum number of characters to the output
*
*Examples:
* dec2hex(2591, szResult, FALSE, 2); //szResult == "A1F"
* dec2hex(10, szResult, TRUE, 2); //szResult == "0a"
********************************************************************/
#if defined dec2hex || defined str2hex
#define dec2hex_INCLUDED
#undef dec2hex
void dec2hex(unsigned int dec, char *hex, BOOL lowercase, unsigned int width)
{
unsigned int a=dec;
unsigned int b=0;
unsigned int c=0;
char d='1';
if (a == 0) d='0';
while (a)
{
b=a % 16;
a=a / 16;
if (b < 10) hex[c++]=b + '0';
else if (lowercase == TRUE) hex[c++]=b + 'a' - 10;
else hex[c++]=b + 'A' - 10;
}
while (width > c) hex[c++]='0';
hex[c]='\0';
if (d == '1')
for (b=0, --c; b < c; d=hex[b], hex[b++]=hex[c], hex[c--]=d);
}
#endif
/********************************************************************
*
* str2hex
*
*Converts string to hex values.
*
*[in] unsigned char *str -string
*[out] char *hex -hex string
*[in] BOOL lowercase -if TRUE hexadecimal value in lowercase
* if FALSE in uppercase.
*[in] unsigned int bytes -number of characters in string
*
*Examples:
* str2hex((unsigned char *)"Some Text", szResult, TRUE, lstrlen("Some Text")); //szResult == "536f6d652054657874"
********************************************************************/
#if defined str2hex && defined dec2hex_INCLUDED
#define str2hex_INCLUDED
#undef str2hex
void str2hex(unsigned char *str, char *hex, BOOL lowercase, unsigned int bytes)
{
char a[16];
unsigned int b=0;
for (hex[0]='\0'; b < bytes; ++b)
{
//wsprintf(a, "%02x", (unsigned int)str[b]);
dec2hex((unsigned int)str[b], a, lowercase, 2);
lstrcat(hex, a);
}
}
#endif
/********************************************************************
*
* hex2str
*
*Converts hex values to string.
*
*[in] char *hex -hex string
*[out] char *str -string
*
*Examples:
* hex2str("536f6d652054657874", szResult); //szResult == "Some Text"
********************************************************************/
#if defined hex2str && defined hex2dec_INCLUDED
#define hex2str_INCLUDED
#undef hex2str
void hex2str(char *hex, char *str)
{
char a[4];
while (*hex)
{
a[0]=*hex;
a[1]=*++hex;
a[2]='\0';
if (*hex++) *str++=hex2dec(a);
else break;
}
*str='\0';
}
#endif
#endif //_CONVFUNC_

View File

@ -1,229 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML><HEAD><TITLE>ShellLink</TITLE>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<STYLE type=text/css>
BODY {
PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-WEIGHT: normal; FONT-SIZE: 10pt; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #f0f0f0
}
CENTER {
TEXT-ALIGN: center
}
TABLE {
MARGIN: auto; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left
}
.maintable {
BORDER-RIGHT: #376eab 2px solid; BORDER-TOP: #376eab 2px solid; BORDER-LEFT: #376eab 2px solid; BORDER-BOTTOM: #376eab 2px solid
}
.margin {
MARGIN: 20px
}
.text {
MARGIN: 20px
}
.bold {
FONT-WEIGHT: bold
}
.italic {
FONT-STYLE: italic
}
.bigheader {
FONT-SIZE: 24pt; MARGIN: 10px; COLOR: #333333; TEXT-ALIGN: center
}
.header {
FONT-SIZE: 14pt; COLOR: #7a7272
}
.subheader {
FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030
}
.footer {
FONT-SIZE: 8pt; MARGIN: 5px; COLOR: #909090; TEXT-ALIGN: right
}
A:link {
COLOR: #294f75; TEXT-DECORATION: none
}
A:visited {
COLOR: #294f75; TEXT-DECORATION: none
}
A:active {
COLOR: #294f75; TEXT-DECORATION: none
}
A:hover {
COLOR: #182634; TEXT-DECORATION: none
}
</STYLE>
<META content="MSHTML 6.00.2800.1264" name=GENERATOR></HEAD>
<BODY>
<DIV class=center>
<TABLE class=maintable cellSpacing=0 cellPadding=0 width=750>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=0>
<TBODY>
<TR>
<TD>
<P class=bigheader>ShellLink </P></TD></TR>
<TR>
<TD>
<DIV style="MARGIN: 20px">
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Introduction</P>
<P style="MARGIN: 20px">ShellLink is a NSIS plugin that allows you to read and write shell link (.lnk) files.</P>
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">How to use</P>
<P style="MARGIN: 20px">Make sure you have a valid path (link.lnk) to the shell link file.</P>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Working Directory</P>
<PRE style="MARGIN: 20px">ShellLink::GetShortCutWorkingDirectory link.lnk
Pop $0
$0=C:\Program Files\MyProgram
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Target</P>
<PRE style="MARGIN: 20px">ShellLink::GetShortCutTarget link.lnk
Pop $0
$0=C:\Program Files\MyProgram\run.exe
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Arguments </P>
<PRE style="MARGIN: 20px">ShellLink::GetShortCutArgs link.lnk
Pop $0
$0=/s /d=1
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Icon Location </P>
<PRE style="MARGIN: 20px">ShellLink::GetShortCutIconLocation link.lnk
Pop $0
$0=C:\Program Files\MyProgram\run.dll
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Icon Index </P>
<PRE style="MARGIN: 20px">ShellLink::GetShortCutIconIndex link.lnk
Pop $0
$0=3
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Show Mode </P>
<PRE style="MARGIN: 20px">ShellLink::GetShortCutShowMode link.lnk
Pop $0
$0=0 (SW_HIDE)
$0=1 (SW_SHOWNORMAL or SW_NORMAL)
$0=2 (SW_SHOWMINIMIZED)
$0=3 (SW_SHOWMAXIMIZED or SW_MAXIMIZE)
$0=4 (SW_SHOWNOACTIVATE)
$0=5 (SW_SHOW)
$0=6 (SW_MINIMIZE)
$0=7 (SW_SHOWMINNOACTIVE)
$0=8 (SW_SHOWNA)
$0=9 (SW_RESTORE)
$0=10 (SW_SHOWDEFAULT)
$0=11 (SW_FORCEMINIMIZE or SW_MAX)
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Hot Keys</P>
<PRE style="MARGIN: 20px">ShellLink::GetShortCutHotkey link.lnk
Pop $0
$0=634
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Description</P>
<PRE style="MARGIN: 20px">ShellLink::GetShortCutDescription link.lnk
Pop $0
$0=My Shortcut Description
</PRE>
<BR>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Working Directory</P>
<PRE style="MARGIN: 20px">ShellLink::SetShortCutWorkingDirectory link.lnk directory
Pop $0
$0=0 -no errors
$0=-1 -error
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Target</P>
<PRE style="MARGIN: 20px">ShellLink::SetShortCutTarget link.lnk target.file
Pop $0
$0=0 -no errors
$0=-1 -error
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Arguments</P>
<PRE style="MARGIN: 20px">ShellLink::SetShortCutArgs link.lnk parameters
Pop $0
$0=0 -no errors
$0=-1 -error
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Icon Location</P>
<PRE style="MARGIN: 20px">ShellLink::SetShortCutIconLocation link.lnk icon.file
Pop $0
$0=0 -no errors
$0=-1 -error
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Icon Index</P>
<PRE style="MARGIN: 20px">ShellLink::SetShortCutIconIndex link.lnk icon_index_number
Pop $0
$0=0 -no errors
$0=-1 -error
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Show Mode</P>
<PRE style="MARGIN: 20px">ShellLink::SetShortCutShowMode link.lnk start_options
Pop $0
$0=0 -no errors
$0=-1 -error
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Hot Keys</P>
<PRE style="MARGIN: 20px">ShellLink::SetShortCutHotkey link.lnk keyboard_shortcut
Pop $0
$0=0 -no errors
$0=-1 -error
</PRE>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Description</P>
<PRE style="MARGIN: 20px">ShellLink::SetShortCutDescription link.lnk description
Pop $0
$0=0 -no errors
$0=-1 -error
</PRE>
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Source code</P>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">NSIS plug-in (C++)</P>
<P style="MARGIN: 20px">A download link to the source and DLL of this NSIS plug-in
can be found below.</P>
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Version history</P>
<UL>
<LI>1.1 by Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-code has been rewritten
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-added functions to change shell link information
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-reduced dll size 44Kb -> 4Kb
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-documentation updated
<LI>1.0 first release of ShellLink.
</UL>
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Credits</P>
<P style="MARGIN: 20px">Written and documented by Angelo Mandato </P>
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">License</P>
<PRE style="MARGIN: 20px">&copy; 2004 Angelo Mandato
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute
it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented;
you must not claim that you wrote the original software.
If you use this software in a product, an acknowledgment in the
product documentation would be appreciated but is not required.
2. Altered versions must be plainly marked as such,
and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any distribution.
</PRE>
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Download</P>
<P style="MARGIN: 20px"><a href="http://www.spaceblue.com/downloads/shelllink.zip">http://www.spaceblue.com/downloads/shelllink.zip</a></P>
</DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV></BODY></HTML>

View File

@ -1,350 +0,0 @@
/*
Module : ShellLink.cpp
Purpose: NSIS Plug-in for retriving shell link information
Created: 12/16/2003
Last Update: 01/14/2004
Copyright (c) 2004 Angelo Mandato.
See ShellLink.html for more information
Modified: 21/09/2005
Author: Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
Changes: -code has been rewritten
-added functions to change shell link information
-reduced dll size 44Kb -> 4Kb
*/
#define UNICODE
#define _UNICODE
// Uncomment for debugging message boxes
//#define SHELLLINK_DEBUG
#include <windows.h>
#include <shlobj.h>
#define xatoi
#include "ConvFunc.h"
#define MAX_STRLEN 1024
#define SHELLLINKTYPE_GETARGS 1
#define SHELLLINKTYPE_GETDESC 2
#define SHELLLINKTYPE_GETHOTKEY 3
#define SHELLLINKTYPE_GETICONLOC 4
#define SHELLLINKTYPE_GETICONINDEX 5
#define SHELLLINKTYPE_GETPATH 6
#define SHELLLINKTYPE_GETSHOWMODE 7
#define SHELLLINKTYPE_GETWORKINGDIR 8
#define SHELLLINKTYPE_SETARGS 9
#define SHELLLINKTYPE_SETDESC 10
#define SHELLLINKTYPE_SETHOTKEY 11
#define SHELLLINKTYPE_SETICONLOC 12
#define SHELLLINKTYPE_SETICONINDEX 13
#define SHELLLINKTYPE_SETPATH 14
#define SHELLLINKTYPE_SETSHOWMODE 15
#define SHELLLINKTYPE_SETWORKINGDIR 16
typedef struct _stack_t {
struct _stack_t *next;
TCHAR text[MAX_STRLEN];
} stack_t;
stack_t **g_stacktop;
unsigned int g_stringsize;
TCHAR *g_variables;
TCHAR szBuf[MAX_STRLEN]=TEXT("");
TCHAR szBuf2[MAX_STRLEN]=TEXT("");
int nBuf;
WORD wHotkey;
void ShortCutData(int nType, HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop);
int popstring(TCHAR *str);
void pushstring(TCHAR *str);
//Get
extern "C" void __declspec(dllexport) GetShortCutArgs(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_GETARGS, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) GetShortCutDescription(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_GETDESC, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) GetShortCutHotkey(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_GETHOTKEY, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) GetShortCutIconLocation(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_GETICONLOC, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) GetShortCutIconIndex(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_GETICONINDEX, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) GetShortCutTarget(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_GETPATH, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) GetShortCutShowMode(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_GETSHOWMODE, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) GetShortCutWorkingDirectory(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_GETWORKINGDIR, hwndParent, string_size, variables, stacktop);
}
//Set
extern "C" void __declspec(dllexport) SetShortCutArgs(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_SETARGS, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) SetShortCutDescription(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_SETDESC, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) SetShortCutHotkey(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_SETHOTKEY, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) SetShortCutIconLocation(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_SETICONLOC, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) SetShortCutIconIndex(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_SETICONINDEX, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) SetShortCutTarget(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_SETPATH, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) SetShortCutShowMode(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_SETSHOWMODE, hwndParent, string_size, variables, stacktop);
}
extern "C" void __declspec(dllexport) SetShortCutWorkingDirectory(HWND hwndParent, int string_size,
TCHAR *variables, stack_t **stacktop)
{
ShortCutData(SHELLLINKTYPE_SETWORKINGDIR, hwndParent, string_size, variables, stacktop);
}
void ShortCutData(int nType, HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop)
{
g_stringsize=string_size;
g_stacktop=stacktop;
g_variables=variables;
{
HRESULT hRes;
IShellLink* m_psl;
IPersistFile* m_ppf;
popstring(szBuf);
if (nType > SHELLLINKTYPE_GETWORKINGDIR) popstring(szBuf2);
hRes=CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &m_psl);
if (hRes == S_OK)
{
hRes=m_psl->QueryInterface(IID_IPersistFile, (LPVOID*) &m_ppf);
if (hRes == S_OK)
{
#ifdef UNICODE
hRes=m_ppf->Load(szBuf, STGM_READWRITE);
#else
WCHAR wszPath[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, szBuf, -1, wszPath, MAX_PATH);
hRes=m_ppf->Load(wszPath, STGM_READWRITE);
#endif
if (hRes == S_OK)
{
if (nType <= SHELLLINKTYPE_GETWORKINGDIR)
{
//Get
switch(nType)
{
case SHELLLINKTYPE_GETARGS:
{
hRes=m_psl->GetArguments(szBuf, MAX_PATH);
if (hRes != S_OK) szBuf[0]=TEXT('\0');
}; break;
case SHELLLINKTYPE_GETDESC:
{
hRes=m_psl->GetDescription(szBuf, MAX_PATH);
if (hRes != S_OK) szBuf[0]=TEXT('\0');
}; break;
case SHELLLINKTYPE_GETHOTKEY:
{
hRes=m_psl->GetHotkey(&wHotkey);
if (hRes == S_OK) wsprintf(szBuf, TEXT("%d"), wHotkey);
else szBuf[0]=TEXT('\0');
}; break;
case SHELLLINKTYPE_GETICONLOC:
{
hRes=m_psl->GetIconLocation(szBuf, MAX_PATH, &nBuf);
if (hRes != S_OK) szBuf[0]=TEXT('\0');
}; break;
case SHELLLINKTYPE_GETICONINDEX:
{
hRes=m_psl->GetIconLocation(szBuf, MAX_PATH, &nBuf);
if (hRes == S_OK) wsprintf(szBuf, TEXT("%d"), nBuf);
else szBuf[0]=TEXT('\0');
}; break;
case SHELLLINKTYPE_GETPATH:
{
WIN32_FIND_DATA fd;
hRes=m_psl->GetPath(szBuf, MAX_PATH, &fd, SLGP_UNCPRIORITY);
if (hRes != S_OK) szBuf[0]=TEXT('\0');
}; break;
case SHELLLINKTYPE_GETSHOWMODE:
{
hRes=m_psl->GetShowCmd(&nBuf);
if (hRes == S_OK) wsprintf(szBuf, TEXT("%d"), nBuf);
else szBuf[0]=TEXT('\0');
}; break;
case SHELLLINKTYPE_GETWORKINGDIR:
{
hRes=m_psl->GetWorkingDirectory(szBuf, MAX_PATH);
if (hRes != S_OK) szBuf[0]=TEXT('\0');
}; break;
}
}
else
{
//Set
switch(nType)
{
case SHELLLINKTYPE_SETARGS:
{
hRes=m_psl->SetArguments(szBuf2);
}; break;
case SHELLLINKTYPE_SETDESC:
{
hRes=m_psl->SetDescription(szBuf2);
}; break;
case SHELLLINKTYPE_SETHOTKEY:
{
wHotkey=(unsigned short)xatoi(szBuf2);
hRes=m_psl->SetHotkey(wHotkey);
}; break;
case SHELLLINKTYPE_SETICONLOC:
{
hRes=m_psl->GetIconLocation(szBuf, MAX_PATH, &nBuf);
if (hRes == S_OK)
hRes=m_psl->SetIconLocation(szBuf2, nBuf);
}; break;
case SHELLLINKTYPE_SETICONINDEX:
{
int nBuf2;
nBuf=xatoi(szBuf2);
hRes=m_psl->GetIconLocation(szBuf, MAX_PATH, &nBuf2);
if (hRes == S_OK)
hRes=m_psl->SetIconLocation(szBuf, nBuf);
}; break;
case SHELLLINKTYPE_SETPATH:
{
hRes=m_psl->SetPath(szBuf2);
}; break;
case SHELLLINKTYPE_SETSHOWMODE:
{
nBuf=xatoi(szBuf2);
hRes=m_psl->SetShowCmd(nBuf);
}; break;
case SHELLLINKTYPE_SETWORKINGDIR:
{
hRes=m_psl->SetWorkingDirectory(szBuf2);
}; break;
}
if (hRes == S_OK) hRes=m_ppf->Save(NULL, FALSE);
#ifdef SHELLLINK_DEBUG
else MessageBox(hwndParent, "ERROR: Save()", "ShellLink", MB_OK);
#endif
}
}
#ifdef SHELLLINK_DEBUG
else MessageBox(hwndParent, "ERROR: Load()", "ShellLink", MB_OK);
#endif
}
#ifdef SHELLLINK_DEBUG
else MessageBox(hwndParent, "CShellLink::Initialise, Failed in call to QueryInterface for IPersistFile, HRESULT was %x\n", "ShellLink", MB_OK);
#endif
// Cleanup:
if (m_ppf) m_ppf->Release();
if (m_psl) m_psl->Release();
}
#ifdef SHELLLINK_DEBUG
else MessageBox(hwndParent, "ERROR: CoCreateInstance()", "ShellLink", MB_OK);
#endif
if (hRes == S_OK)
{
if (nType <= SHELLLINKTYPE_GETWORKINGDIR) pushstring(szBuf);
else pushstring(TEXT("0"));
}
else
{
if (nType <= SHELLLINKTYPE_GETWORKINGDIR) pushstring(TEXT(""));
else pushstring(TEXT("-1"));
}
}
}
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
int popstring(TCHAR *str)
{
stack_t *th;
if (!g_stacktop || !*g_stacktop) return 1;
th=(*g_stacktop);
lstrcpy(str,th->text);
*g_stacktop=th->next;
GlobalFree((HGLOBAL)th);
return 0;
}
void pushstring(TCHAR *str)
{
stack_t *th;
if (!g_stacktop) return;
th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize);
lstrcpyn(th->text,str,g_stringsize);
th->next=*g_stacktop;
*g_stacktop=th;
}

View File

@ -1,108 +0,0 @@
# Microsoft Developer Studio Project File - Name="ShellLink" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=ShellLink - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "ShellLink.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "ShellLink.mak" CFG="ShellLink - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "ShellLink - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "ShellLink - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "ShellLink - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ShellLink_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ShellLink_EXPORTS" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib uuid.lib ole32.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"ShellLink.dll" /opt:nowin98
# SUBTRACT LINK32 /pdb:none
!ELSEIF "$(CFG)" == "ShellLink - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ShellLink_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ShellLink_EXPORTS" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "ShellLink - Win32 Release"
# Name "ShellLink - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\ShellLink.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# End Group
# End Target
# End Project

View File

@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "ShellLink"=.\ShellLink.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@ -1,89 +0,0 @@
History:
--------
v0.0.10a - 20081004 (AndersK)
*Added SEE_MASK_NOZONECHECKS flag (experimental)
v0.0.10 - 20080812 (AndersK)
*Added ugly hook hack to the shells run-as dialog on xp, defaults to other user
v0.0.9 - 20080721 (AndersK)
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi related bug (Thanks Case)
v0.0.8 - 20080310 (AndersK)
+HTML Readme
+Added UAC::GetOuterHwnd (used by UAC_RealWorldFullyLoadedDualModeExample.nsi)
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi
*Major code cleanup in UAC.cpp
-Removed UAC::RunElevatedAndProcessMessages (UAC::RunElevated now supports non NULL $HWNDParent)
-Removed several useless sample scripts
v0.0.7e - 20080229 (AndersK)
*Added ugly hack for hackwnd to find correct title and give us a proper taskbar so the elevation dialog does not get lost (2000,XP (This also fixed Alt-Tab icon on Vista))
*Should compile with MSVC2005 now (Thanks Case)
*More unicode fixes, this time even tested with NSIS Unicode (Only RunElevated and Exec tested)
v0.0.7d - 20080226 (AndersK)
*Fixed a couple of unicode version bugs (Unicode version still untested)
*Fixed weird XP string length bug (Thanks kfank)
v0.0.7c - 20080218 (AndersK)
*Fixed SyncVars string length bug
v0.0.7b - 20080205 (AndersK)
*Fixed DelayLoadDlls() problem on NT4
v0.0.7 - 20080120 (AndersK)
+Added UAC::StackPush (For use with ExecCodeSegment)
v0.0.6d - 20071108 (AndersK)
+Now syncs basic registers/variables before calling UAC::*Exec* and UAC::ExecCodeSegment (r0-r9,R0-R9,$CMDLINE,$INSTDIR,$OUTDIR,$EXEDIR,$LANGUAGE)
+Added UAC::RunElevatedAndProcessMessages, this can be called after .onInit (Very experimental, DO NOT USE)
+New include file with helper macros: UAC.nsh
*Replazed Clammerz hack with a better version
v0.0.6c - 20071014 (AndersK)
+Check for and split up "domain\user" style input in RunAs.cpp for CreateProcessWithLogonW
*Added a ugly hack to trick messagebox'es in .OnInit to appear correctly on Vista (Thanks Clammerz)
v0.0.6b - 20070523 (AndersK)
*Fixed showwindow flag (Thanks for the help kichik)
v0.0.6 - 20070512 (AndersK)
+Added basic language support for MyRunAs dialog.
v0.0.5e - 20070509 (AndersK)
*Fixed detection of UAC mode?
+IPC window is visible (but offscreen) during elevation to help with SetForegroundWindow/Focus problems
v0.0.5d - 20070324 (AndersK)
*Fixed stupid IsAdmin bug
v0.0.5c - 20070304 (AndersK)
*_IsAdmin now uses CheckTokenMembership if it exists ( MSKB:Q118626 / http://blogs.msdn.com/larryosterman/archive/2007/03/14/why-does-kb-118626-use-accesscheck-to-check-if-you-re-a-member-of-the-administrators-group.aspx )
v0.0.5b - 20070301 (AndersK)
*Fixed ExecCodeSegment (Thread now calls CoInitialize)
v0.0.5 - 20070228 (AndersK)
+Added ExecCodeSegment (You can now call ANY code in the context of the original user)
v0.0.4b - 20070226 (AndersK)
*Fixed (My)RunAs font (http://blogs.msdn.com/oldnewthing/archive/2005/02/04/366987.aspx)
v0.0.4 - 20070225 (AndersK)
+Added (My)RunAs dialog, used on Vista when running as LUA with UAC off
+Always uses /NCRC for elevated instance
*Now compiles as UNICODE (Untested, no UnicodeNSIS to test on)
v0.0.3 - 20070224 (AndersK)
+Added Exec/ExecWait
+Added Verb & ShowWindow support for ShellExec[Wait]
v0.0.2 - 20070219 (AndersK)
+Added ShellExecWait
*IPC srv wnd now has its own thread and msg loop
*Removed CRT dependency
*Hopefully loads on Win95 now
v0.0.1 - 20070215 (AndersK)
*Initial release

View File

@ -1,14 +0,0 @@
This software is provided 'as-is', without any express or implied warranty.
ZLIB/LIBPNG LICENSE
-------------------
This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

View File

@ -1,149 +0,0 @@
/*
Alternative to ExDll.h
v0.0.1 - 20060811 (AndersK)
*/
#pragma once
#include <TChar.h>
typedef TCHAR NSISCH;
#define NSISCALL __stdcall
namespace NSIS {
__forceinline void* NSISCALL MemAlloc(SIZE_T cb) {return GlobalAlloc(LPTR,cb);}
__forceinline void NSISCALL MemFree(void* p) {GlobalFree(p);}
enum {
INST_0, // $0
INST_1, // $1
INST_2, // $2
INST_3, // $3
INST_4, // $4
INST_5, // $5
INST_6, // $6
INST_7, // $7
INST_8, // $8
INST_9, // $9
INST_R0, // $R0
INST_R1, // $R1
INST_R2, // $R2
INST_R3, // $R3
INST_R4, // $R4
INST_R5, // $R5
INST_R6, // $R6
INST_R7, // $R7
INST_R8, // $R8
INST_R9, // $R9
INST_CMDLINE, // $CMDLINE
INST_INSTDIR, // $INSTDIR
INST_OUTDIR, // $OUTDIR
INST_EXEDIR, // $EXEDIR
INST_LANG, // $LANGUAGE
__INST_LAST,
VIDX_TEMP=(INST_LANG+1), //#define state_temp_dir g_usrvars[25]
VIDX_PLUGINSDIR,//# define state_plugins_dir g_usrvars[26]
VIDX_EXEPATH,//#define state_exe_path g_usrvars[27]
VIDX_EXEFILENAME,//#define state_exe_file g_usrvars[28]
VIDX_STATECLICKNEXT,//#define state_click_next g_usrvars[30]
__VIDX_UNDOCLAST
};
typedef struct _stack_t {
struct _stack_t *next;
NSISCH text[ANYSIZE_ARRAY];
} stack_t;
typedef struct {
int autoclose;
int all_user_var;
int exec_error;
int abort;
int exec_reboot;
int reboot_called;
int XXX_cur_insttype; // deprecated
int XXX_insttype_changed; // deprecated
int silent;
int instdir_error;
int rtl;
int errlvl;
//NSIS v2.3x ?
int alter_reg_view;
int status_update;
} exec_flags_type;
typedef struct {
exec_flags_type *exec_flags;
int (NSISCALL *ExecuteCodeSegment)(int, HWND);
void (NSISCALL *validate_filename)(char *);
} extra_parameters;
extern UINT StrSize;
extern stack_t **StackTop;
extern NSISCH*Vars;
inline bool NSISCALL SetErrLvl(extra_parameters*pExtraParams,int ErrLevel) {return pExtraParams? ((pExtraParams->exec_flags->errlvl=ErrLevel)||true):false;}
inline bool NSISCALL SetErrorFlag(extra_parameters*pExtraParams) {return pExtraParams? ((pExtraParams->exec_flags->exec_error=1)||true):false;}
inline bool NSISCALL ClearErrorFlag(extra_parameters*pExtraParams) {return pExtraParams?((pExtraParams->exec_flags->exec_error=0)||true):false;}
__forceinline int NSISCALL ExecuteCodeSegment(extra_parameters*pExtraParams,int pos,HWND hwndProgress=NULL) {
return pExtraParams?pExtraParams->ExecuteCodeSegment(pos,hwndProgress):(/*EXEC_ERROR*/0x7FFFFFFF);
}
static NSISCH* __fastcall GetVar(const int varnum)
{
//ASSERT(NSIS::Vars && NSIS::StrSize);
if (varnum < 0 || varnum >= __VIDX_UNDOCLAST) return NULL;
return NSIS::Vars+(varnum*NSIS::StrSize);
}
inline void NSISCALL SetVarUINT(const int varnum,UINT Value) {
wsprintf(GetVar(varnum),_T("%u"),Value);
}
static stack_t* NSISCALL StackPop() {
if (NSIS::StackTop && *NSIS::StackTop) {
stack_t*s=(*NSIS::StackTop);
*NSIS::StackTop=(*NSIS::StackTop)->next;
return s;
}
return 0;
}
__forceinline void NSISCALL StackFreeItem(stack_t*pStackItem) {NSIS::MemFree(pStackItem);}
static DWORD NSISCALL StackPush(NSISCH*InStr,UINT StackStrSize=NSIS::StrSize) {
if (!NSIS::StackTop)return ERROR_INVALID_PARAMETER;
stack_t*sNew=(stack_t*)NSIS::MemAlloc(sizeof(stack_t)+(StackStrSize*sizeof(NSISCH)));
if (!sNew)return ERROR_OUTOFMEMORY;
lstrcpyn(sNew->text,InStr,StackStrSize);
sNew->next=*NSIS::StackTop;
*NSIS::StackTop=sNew;
return NO_ERROR;
}
}; /* namespace */
#define NSISUTIL_INIT() namespace NSIS {static UINT StrSize;static stack_t **StackTop;static NSISCH*Vars;}//Call in only ONE source file
#define NSISUTIL_INITEXPORT(_v,_strsize,_stackt) NSIS::Vars=_v;NSIS::StrSize=_strsize;NSIS::StackTop=_stackt
//#define NSISEXPORT4(_func,_h,_strsize,_v,_stackt) extern "C" void __declspec(dllexport) __cdecl \
// _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
//#define NSISEXPORT5(_func,_h,_strsize,_v,_stackt,_eparams) extern "C" void __declspec(dllexport) __cdecl \
// _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt,NSIS::extra_parameters* _eparams) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
//#define NSISEXPORT NSISEXPORT5
#ifdef _MSC_VER
# define EXPORTNSISFUNC extern "C" void __declspec(dllexport) __cdecl
# else
# error EXPORTNSISFUNC needs compiler goo, you are on your own!
# endif
#define NSISFUNCSTART4(_h,_strsize,_v,_stackt) {NSISUTIL_INITEXPORT(_v,_strsize,_stackt);
#define NSISFUNCSTART5(_h,_strsize,_v,_stackt,_eparams) NSISFUNCSTART4(_h,_strsize,_v,_stackt)
#define NSISFUNCSTART NSISFUNCSTART5
#define NSISFUNCEND() }

View File

@ -1,276 +0,0 @@
//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
/*
If UAC is disabled, the runas verb is broken (Vista RTM) so when running as LUA there is no way to elevate so
we provide our own dialog.
*/
#include "UAC.h"
#ifdef FEAT_CUSTOMRUNASDLG
#include <Lmcons.h>//UNLEN && GNLEN && PWLEN
#include <WindowsX.h>
#include "resource.h"
#include "NSISUtil.h"
using namespace NSIS;
#define ERRAPP_TRYAGAIN (0x20000000|1)
#define MYMAX_DOMAIN (2+max(GNLEN,MAX_COMPUTERNAME_LENGTH)+1)
static LPCTSTR g_RunAsDlgTitle=_T("Run as");
static LPCTSTR g_RunAsHelpText=_T("You may not have the necessary permissions to use all the features of the program you are about to run. You may run this program as a different user or continue to run the program as the current user.");
static LPCTSTR g_RunAsCurrUsrFmt=_T("&Current user (%s)");//Max 50 chars!
static LPCTSTR g_RunAsSpecHelp=_T("Run the program as the &following user:");
FORCEINLINE bool MySetDlgItemText(HWND hDlg,int id,LPCTSTR s) {return MySndDlgItemMsg(hDlg,id,WM_SETTEXT,0,(LPARAM)s)!=0;}
typedef struct {
SHELLEXECUTEINFO*pSEI;
bool AsSelf;
} RUNASDLGDATA;
void MyRunAsFmtCurrUserRadio(HWND hDlg,LPCTSTR Fmt) {
TCHAR bufFullName[MYMAX_DOMAIN+UNLEN+1];
TCHAR buf[50+MYMAX_DOMAIN+UNLEN+1];
*bufFullName=0;
ULONG cch;
if ((!_GetUserNameEx || !_GetUserNameEx(NameSamCompatible,bufFullName,&(cch=COUNTOF(bufFullName)))) &&
!_GetUserName(bufFullName,&(cch=COUNTOF(bufFullName))) ) {
*bufFullName=0;
}
wsprintf(buf,Fmt,*bufFullName?bufFullName:_T("?"));
MySetDlgItemText(hDlg,IDC_RUNASCURR,buf);
// default the "User name:" to Administrator from shell32
if (LoadString(GetModuleHandle(_T("SHELL32.dll")),21763, bufFullName, COUNTOF(bufFullName)) > 0) {
MySetDlgItemText(hDlg,IDC_USERNAME,bufFullName);
}
}
#ifdef FEAT_CUSTOMRUNASDLG_TRANSLATE
void MyRunAsTranslateDlgString(LPCTSTR StrID,LPTSTR Ini,HWND hDlg,INT_PTR DlgItemId,int special=0) {
TCHAR buf[MAX_PATH*2];
DWORD len=GetPrivateProfileString(_T("MyRunAsStrings"),StrID,0,buf,ARRAYSIZE(buf),Ini);
if (len) {
if (IDC_RUNASCURR==special)
MyRunAsFmtCurrUserRadio(hDlg,buf);
else
(DlgItemId==-1) ? SetWindowText(hDlg,buf) : MySetDlgItemText(hDlg,DlgItemId,buf);
}
}
void MyRunAsTranslateDlg(HWND hDlg) {
DWORD len;
TCHAR buf[MAX_PATH*2];
HMODULE hDll=GetWindowInstance(hDlg);ASSERT(hDll);
if ( (len=GetModuleFileName(hDll,buf,ARRAYSIZE(buf))) <1)return;
buf[len-3]=0;
lstrcat(buf,_T("lng"));
MyRunAsTranslateDlgString(_T("DlgTitle"),buf,hDlg,-1);
MyRunAsTranslateDlgString(_T("HelpText"),buf,hDlg,IDC_HELPTEXT);
MyRunAsTranslateDlgString(_T("OptCurrUser"),buf,hDlg,IDC_RUNASCURR,IDC_RUNASCURR);
MyRunAsTranslateDlgString(_T("OptOtherUser"),buf,hDlg,IDC_RUNASSPEC);
MyRunAsTranslateDlgString(_T("Username"),buf,hDlg,IDC_LBLUSER);
MyRunAsTranslateDlgString(_T("Pwd"),buf,hDlg,IDC_LBLPWD);
MyRunAsTranslateDlgString(_T("OK"),buf,hDlg,IDOK);
MyRunAsTranslateDlgString(_T("Cancel"),buf,hDlg,IDCANCEL);
HWND h=GetDlgItem(hDlg,IDC_RUNASCURR);
if (GetPrivateProfileInt(_T("MyRunAsCfg"),_T("DisableCurrUserOpt"),false,buf))EnableWindow(h,false);
if (GetPrivateProfileInt(_T("MyRunAsCfg"),_T("HideCurrUserOpt"),false,buf))ShowWindow(h,false);
}
#endif
bool ErrorIsLogonError(DWORD err) {
switch (err) {
case ERROR_LOGON_FAILURE:
case ERROR_ACCOUNT_RESTRICTION:
case ERROR_INVALID_LOGON_HOURS:
case ERROR_INVALID_WORKSTATION:
case ERROR_PASSWORD_EXPIRED:
case ERROR_ACCOUNT_DISABLED:
case ERROR_NONE_MAPPED:
case ERROR_NO_SUCH_USER:
case ERROR_INVALID_ACCOUNT_NAME:
return true;
}
return false;
}
void VerifyOKBtn(HWND hDlg,RUNASDLGDATA*pRADD) {
const bool HasText=pRADD?(pRADD->AsSelf?true:MySndDlgItemMsg(hDlg,IDC_USERNAME,WM_GETTEXTLENGTH)>0):false;
EnableWindow(GetDlgItem(hDlg,IDOK),HasText);
}
void SetDlgState(HWND hDlg,bool AsSelf,RUNASDLGDATA*pRADD) {
if (pRADD)pRADD->AsSelf=AsSelf;
MySndDlgItemMsg(hDlg,IDC_RUNASCURR,BM_SETCHECK,AsSelf?BST_CHECKED:BST_UNCHECKED);
MySndDlgItemMsg(hDlg,IDC_RUNASSPEC,BM_SETCHECK,!AsSelf?BST_CHECKED:BST_UNCHECKED);
int ids[]={IDC_USERNAME,IDC_PASSWORD,IDC_LBLUSER,IDC_LBLPWD};
for (int i=0; i<COUNTOF(ids);++i)EnableWindow(GetDlgItem(hDlg,ids[i]),!AsSelf);
VerifyOKBtn(hDlg,pRADD);
}
INT_PTR CALLBACK MyRunAsDlgProc(HWND hwnd,UINT uMsg,WPARAM wp,LPARAM lp) {
RUNASDLGDATA*pRADD=(RUNASDLGDATA*)GetWindowLongPtr(hwnd,GWLP_USERDATA);
switch(uMsg) {
//case WM_DESTROY:
// break;
case WM_CLOSE:
return DestroyWindow(hwnd);
case WM_INITDIALOG:
{
pRADD=(RUNASDLGDATA*)lp;ASSERT(pRADD);
SetWindowLongPtr(hwnd,GWLP_USERDATA,lp);
Edit_LimitText(GetDlgItem(hwnd,IDC_USERNAME),UNLEN+1+MYMAX_DOMAIN); //room for "foo@BAR" or "BAR\foo"
Edit_LimitText(GetDlgItem(hwnd,IDC_PASSWORD),PWLEN);
const HINSTANCE hSh32=GetModuleHandle(_T("SHELL32.dll"));
const HICON hIco=(HICON)LoadImage(hSh32,MAKEINTRESOURCE(194),IMAGE_ICON,32,32,LR_SHARED);
MySndDlgItemMsg(hwnd,IDC_SHICON,STM_SETICON,(WPARAM)hIco);
SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)g_RunAsDlgTitle);
MySetDlgItemText(hwnd,IDC_HELPTEXT,g_RunAsHelpText);
MyRunAsFmtCurrUserRadio(hwnd,g_RunAsCurrUsrFmt);
MySetDlgItemText(hwnd,IDC_RUNASSPEC,g_RunAsSpecHelp);
#ifdef FEAT_CUSTOMRUNASDLG_TRANSLATE
MyRunAsTranslateDlg(hwnd);
#endif
SetDlgState(hwnd,false,pRADD);
#if defined(BUILD_DBG) && 0 //auto login used during testing ;)
SetDlgItemText(hwnd,IDC_USERNAME,_T("root"));
SetDlgItemText(hwnd,IDC_PASSWORD,_T("???"));
Sleep(1);PostMessage(hwnd,WM_COMMAND,IDOK,0);
#endif
}
return true;
case WM_COMMAND:
{
switch(HIWORD(wp)) {
case EN_CHANGE:
VerifyOKBtn(hwnd,pRADD);
break;
case EN_SETFOCUS:
case BN_CLICKED:
if (LOWORD(wp)<=IDCANCEL)break;
SetDlgState(hwnd,LOWORD(wp)==IDC_RUNASCURR,pRADD);
return FALSE;
}
INT_PTR exitcode=!pRADD?-1:IDCANCEL;
switch(LOWORD(wp)) {
case IDOK:
if (pRADD) {
SHELLEXECUTEINFO&sei=*pRADD->pSEI;
PROCESS_INFORMATION pi={0};
DWORD ec=NO_ERROR;
WCHAR*wszExec;//Also used as TCHAR buffer in AsSelf mode
bool PerformTCharFmt=pRADD->AsSelf;
//const DWORD CommonStartupInfoFlags=STARTF_FORCEONFEEDBACK;
#ifdef UNICODE
PerformTCharFmt=true;
#endif
wszExec=(WCHAR*)NSIS::MemAlloc( (pRADD->AsSelf?sizeof(TCHAR):sizeof(WCHAR)) *(lstrlen(sei.lpFile)+1+lstrlen(sei.lpParameters)+1));
if (!wszExec)ec=ERROR_OUTOFMEMORY;
if (PerformTCharFmt)wsprintf((TCHAR*)wszExec,_T("%s%s%s"),sei.lpFile,((sei.lpParameters&&*sei.lpParameters)?_T(" "):_T("")),sei.lpParameters);
if (!ec) {
if (pRADD->AsSelf) {
STARTUPINFO si={sizeof(si)};
TRACEF("MyRunAs:CreateProcess:%s|\n",wszExec);
ec=(CreateProcess(0,(TCHAR*)wszExec,0,0,false,0,0,0,&si,&pi)?NO_ERROR:GetLastError());
}
else {
//All Wide strings!
WCHAR wszPwd[PWLEN+1];
WCHAR wszUName[UNLEN+1+MYMAX_DOMAIN+1];
STARTUPINFOW siw={sizeof(siw)};
WCHAR*p;
#ifndef UNICODE
//Build unicode string, we already know the buffer is big enough so no error handling
p=wszExec;
MultiByteToWideChar(CP_THREAD_ACP,0,sei.lpFile,-1,p,0xFFFFFF);
if (sei.lpParameters && *sei.lpParameters) {
p+=lstrlen(sei.lpFile);*p++=L' ';*p=0;
MultiByteToWideChar(CP_THREAD_ACP,0,sei.lpParameters,-1,p,0xFFFFFF);
}
#endif
SendMessageW(GetDlgItem(hwnd,IDC_USERNAME),WM_GETTEXT,COUNTOF(wszUName),(LPARAM)wszUName);
SendMessageW(GetDlgItem(hwnd,IDC_PASSWORD),WM_GETTEXT,COUNTOF(wszPwd),(LPARAM)wszPwd);
//Try to find [\\]domain\user and split into username and domain strings
WCHAR*pUName=wszUName,*pDomain=0;
p=wszUName;
//if (*p==p[1]=='\\')pUName=(p+=2);else \ //Should we still split things up if the string starts with \\ ? Is it possible to use \\machine\user at all?
++p;//Don't parse "\something", require at least one char before backslash "?[*\]something"
while(*p && *p!='\\')++p;
if (*p=='\\') {
pDomain=pUName;
pUName=p+1;*p=0;
}
TRACEF("MyRunAs:CreateProcessWithLogonW:%ws|%ws|%ws|%ws|\n",pUName,pDomain?pDomain:L"NO?DOMAIN",wszPwd,wszExec);
ec=(_CreateProcessWithLogonW(pUName,pDomain?pDomain:0,wszPwd,LOGON_WITH_PROFILE,0,wszExec,0,0,0,&siw,&pi)?NO_ERROR:GetLastError());
TRACEF("MyRunAs:CreateProcessWithLogonW: ret=%u\n",ec);
SecureZeroMemory(wszPwd,sizeof(wszPwd));//if (wszPwd) {volatile WCHAR*_p=wszPwd;for(;_p&&*_p;++_p)*_p=1;if (_p)*wszPwd=0;}//Burn password (And attempt to prevent compiler from removing it)
if (ec && ErrorIsLogonError(ec)) {
LPTSTR szMsg;
DWORD ret=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,0,ec,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&szMsg,0,0);
if (ret) {
ec=ERRAPP_TRYAGAIN;
MessageBox(hwnd,szMsg,0,MB_ICONWARNING);
LocalFree(szMsg);
}
else ec=GetLastError();
}
}
}
NSIS::MemFree(wszExec);
if (pi.hThread)CloseHandle(pi.hThread);
if (ERRAPP_TRYAGAIN==ec)break;
if (ec) {
SetLastError(ec);
exitcode=-1;
}
else {
pRADD->pSEI->hProcess=pi.hProcess;
exitcode=IDOK;
}
}
case IDCANCEL:
EndDialog(hwnd,exitcode);
}
}
break;
}
return FALSE;
}
DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei) {
INT_PTR ec;
ASSERT(sei.cbSize>=sizeof(SHELLEXECUTEINFO) && hInstDll);
if (ec=DelayLoadDlls())return ec;
ASSERT(_CreateProcessWithLogonW && _GetUserName);
RUNASDLGDATA radd={0};
radd.pSEI=&sei;
ec=DialogBoxParam(hInstDll,MAKEINTRESOURCE(IDD_MYRUNAS),sei.hwnd,MyRunAsDlgProc,(LPARAM)&radd);
TRACEF("MyRunAs returned %d (%s|%s)\n",ec,sei.lpFile,sei.lpParameters);
switch(ec) {
case 0:
return ERROR_INVALID_HANDLE;//DialogBoxParam returns 0 on bad hwnd
case IDOK:
return NO_ERROR;
case IDCANCEL:
return ERROR_CANCELLED;
}
return GetLastError();
}
#ifdef BUILD_DBG
// RunDll exports are __stdcall, we dont care about that for this debug export, rundll32.exe is able to handle this mistake
extern "C" void __declspec(dllexport) __cdecl DBGRDMyRunAs(HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,int nCmdShow) {
SHELLEXECUTEINFO sei={sizeof(sei)};
sei.lpFile=_T("Notepad.exe");//sei.lpParameters=_T("param1");
TRACEF("ec=%d\n",MyRunAs(GetModuleHandle(_T("UAC.dll")),sei));
}
#endif
#endif /* FEAT_CUSTOMRUNASDLG */

View File

@ -1,222 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>UAC plug-in readme</title>
<script type="text/javascript">
function NavGL(q){window.open("http://www.google.com/search?hl=en&btnI=I&num=2&q="+escape(q));return 0;}
</script>
<style type="text/css">
html,body {background-color:#FFF; color:#000;}
a:link, a:visited, a:active {color:#00F;}
h2 {border-bottom:0.1em solid #000;}
#docHdrHdln{text-align:center;}
.importanttxt {color:#e00;}
.code {font-family:monospace;}
.nsisvar {color:#C00;}
.str {color:#390}
.inifile {background-color:#EEE;border:1px solid #000;padding:0.2em;}
.inicomment {background-color:#f5f5c5;color:#555;}
table.piexport {text-align:left;margin-bottom:1em;}
table.piexport td {vertical-align:top;}
table.piexport table.ret {padding:0;margin:0;border:0;}
</style>
</head><body>
<h1 id="docHdrHdln">UAC plug-in</h1>
<code><pre>
Interactive User (MediumIL) Admin user(HighIL)
+++[Setup.exe]++++++++++++++ +++[Setup.exe]++++++++++++++
+ + + +
+ ***[.OnInit]************ + + ***[.OnInit]************ +
+ * UAC::RunElevated >---+-+------>+ * * +
+ * NSIS.Quit() * + + * * +
+ ************************ + + ***********||*********** +
+ + + || +
+ + + \/ +
+ ***[Sections]*********** + + ***[Sections]*********** +
+ * * + /--+-+-< UAC::Exec * +
+ ************************ + | + ************************ +
+ + | + +
+ Win32.CreateProcess() <-+----/ + +
+ + + +
++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++
</pre></code>
<h2>Contents</h2>
<ul>
<li><a href="#exports">Plugin Functions</a>
<li><a href="#lang">Language support</a>
<li><a href="#knownissues">Known Issues</a>
<li><a href="#glossary">Glossary</a>
</ul>
<a name="exports"><h2>Plugin Functions</h2></a><div class="CntSec"><p>
Every function will try to emulate the basic NSIS instruction (of similar name) when UAC::RunElevated has not "succeeded" or running on a system that does not support elevation (Win9x/NT4)</p>
<table class="piexport"><tr><th colspan=2>UAC::RunElevated</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code (0 on success, 1223 if user aborted elevation dialog, anything else should be treated as a fatal error)</td></tr>
<tr><td><span class="nsisvar">$1</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0</span>:
<table class="ret">
<tr><td>0</td><td>UAC is not supported by the OS</td></tr>
<tr><td>1</td><td>Started a elevated child process, the current process should act like a wrapper (Call Quit without any further processing)</td></tr>
<tr><td>2</td><td>The process is already running @ HighIL (Member of admin group)</td></tr>
<tr><td>3</td><td>You should call RunElevated again (This can happen if a user without admin priv. is used in the runas dialog)</td></tr>
</table>
</td></tr>
<tr><td><span class="nsisvar">$2</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0 && <span class="nsisvar">$1</span>==1</span>: ExitCode of the elevated fork process (The NSIS errlvl is also set)</td></tr>
<tr><td><span class="nsisvar">$3</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0</span>: 1 if the user is a member of the admin group or 0 otherwise</td></tr>
</table></td></tr>
<tr><td>Description:</td><td>Allows non-admin/UAC.LUA users to re-spawn the installer as another user and UAC.Admin users to elevate.</td></tr>
</table>
<!--table class="piexport"><tr><th colspan=2>UAC::RunElevatedAndProcessMessages <i style="font-size:smaller;">(Experimental)</i></th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td><i>See UAC::RunElevated</i></td></tr>
<tr><td>Description:</td><td>Version of UAC::RunElevated that can be called from a page</td></tr>
</table-->
<table class="piexport"><tr><th colspan=2>UAC::Unload</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td></td></tr>
<tr><td>Description:</td><td>Cleanup, you must call this function in .OnInstFailed, .onUserAbort and .OnInstSuccess</td></tr>
</table>
<table class="piexport"><tr>
<th colspan=2>UAC::Exec</th></tr>
<tr><td>Parameters:</td><td>&lt;INT:ShowWindow&gt; &lt;STR:App&gt; &lt;STR:Parameters&gt; &lt;STR:WorkingDir&gt;</td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
</table></td></tr>
</table>
<table class="piexport"><tr>
<th colspan=2>UAC::ExecWait</th></tr>
<tr><td>Parameters:</td><td>&lt;INT:ShowWindow&gt; &lt;STR:App&gt; &lt;STR:Parameters&gt; &lt;STR:WorkingDir&gt;</td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
<tr><td><span class="nsisvar">$1</span></td><td>Exitcode of new process</td></tr>
</table></td></tr>
</table>
<table class="piexport"><tr>
<th colspan=2>UAC::ShellExec</th></tr>
<tr><td>Parameters:</td><td>&lt;STR:Verb&gt; &lt;INT:ShowWindow&gt; &lt;STR:App&gt; &lt;STR:Parameters&gt; &lt;STR:WorkingDir&gt;</td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
</table></td></tr>
</table>
<table class="piexport"><tr>
<th colspan=2>UAC::ShellExecWait</th></tr>
<tr><td>Parameters:</td><td>&lt;STR:Verb&gt; &lt;INT:ShowWindow&gt; &lt;STR:App&gt; &lt;STR:Parameters&gt; &lt;STR:WorkingDir&gt;</td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
<tr><td><span class="nsisvar">$1</span></td><td>Exitcode of new process</td></tr>
</table></td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::IsAdmin</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> (BOOL) result</td></tr>
<tr><td>Description:</td><td>Check current thread/process token for a non-deny admin group SID entry</td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::ExecCodeSegment</th></tr>
<tr><td>Parameters:</td><td>&lt;INT:NSISFunctionAddress&gt;</td></tr>
<tr><td>Returns:</td><td>[None] (ErrorFlag is set on error)</td></tr>
<tr><td>Description:</td><td>Calls NSIS function in LUA/outer instance (If you use instructions that alter the UI or the stack/variables in the code segment (StrCpy,Push/Pop/Exch,DetailPrint etc.) they will affect the hidden wrapper installer and not "your" installer instance)</td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::StackPush</th></tr>
<tr><td>Parameters:</td><td>&lt;STR:String&gt;</td></tr>
<tr><td>Returns:</td><td>[None] (ErrorFlag is set on error)</td></tr>
<tr><td>Description:</td><td>Push to outer instance stack (For use with UAC::ExecCodeSegment)</td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::GetOuterHwnd</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> HWNDPARENT of outer instance</td></tr>
<tr><td>Description:</td><td>For use with ${UAC.RunElevatedAndProcessMessages}</td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::SupportsUAC</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> !=0 if supported</td></tr>
<tr><td>Description:</td><td>Check if the OS supports UAC (And the user has UAC turned on) <span class="importanttxt">This function only tests if UAC is active, will return 0 on NT5 even though runas is implemented on those platforms, will also return 0 on NT6+ if UAC is off. You should only call this function during testing, NOT to determine if you can call UAC::RunElevated</span></td></tr>
</table>
<table class="piexport"><tr><th colspan=2>UAC::GetElevationType</th></tr>
<tr><td>Parameters:</td><td></td></tr>
<tr><td>Returns:</td><td>
<table class="ret">
<tr><td><span class="nsisvar">$0</span></td><td><a href="#" OnClick="return NavGL('TOKEN_ELEVATION_TYPE Enumeration')">TOKEN_ELEVATION_TYPE</a>:
<table class="ret">
<tr><td>0</td><td>Unsupported/Failed (ErrorFlag is also set)</td></tr>
<tr><td>1</td><td>TokenElevationTypeDefault: User is not using a split token (UAC disabled)</td></tr>
<tr><td>2</td><td>TokenElevationTypeFull: UAC enabled, the (current) process is elevated</td></tr>
<tr><td>3</td><td>TokenElevationTypeLimited: UAC enabled, the process is not elevated</td></tr>
</table>
</td></tr>
</table></td></tr>
</table>
</div>
<a name="lang"><h2>Language support</h2></a><div class="CntSec">
<p>If the plugin is built with FEAT_CUSTOMRUNASDLG_TRANSLATE (Enabled by default),
you can extract a file named <span class="str">UAC.LNG</span> to <span class="nsisvar">$pluginsdir</span>.
It is a ini file with the following sections:
</p><pre class="inifile">
[MyRunAsCfg]
<span class="inicomment">;Set to 1 to disable the radio button</span>
DisableCurrUserOpt=
<span class="inicomment">;Set to 1 to hide the radio button</span>
HideCurrUserOpt=
[MyRunAsStrings]
DlgTitle=Hello There!
HelpText=Just do your thing!
<span class="inicomment">;Label for current user radio button, %s is replaced with result of GetUserNameEx(NameSamCompatible,...)</span>
OptCurrUser=Self service (%s)
OptOtherUser=Run as someone:
UserName=Who:
Pwd=PIN:
OK=Okey!
Cancel=No Way</pre>
</div>
<a name="knownissues"><h2>Known Issues</h2></a><div class="CntSec">
<ul>
<li>UACPI.KI#1: DetailPrint in outer process is ignored
<li>UACPI.KI#2: Elevation can fail if the installer is located on a remote share that requires authentication
</ul>
</div>
<a name="glossary"><h2>Glossary</h2></a><div class="CntSec">
<ul>
<li>AAM: Admin Approval Mode
<li>IL: Integrity level (Part of the new MIC/WIC security levels added to NT6)
<li>LUA: Limited/Least-privilege User Account
<li>MIC: <a href="http://en.wikipedia.org/wiki/Mandatory_Integrity_Control">Mandatory Integrity Controls</a> (Now known as WIC)
<li>UAC: User Account Control (Part of the UAP umbrella)
<li>UAP: User Account Protection
<li>WIC: <a href="http://www.securityfocus.com/infocus/1887">Windows Integrity Controls</a>
<li>Win32 error code: Standard windows error codes, ERROR_???
</ul>
</div>
</body></html>

View File

@ -1,133 +0,0 @@
# Microsoft Developer Studio Project File - Name="UAC" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=UAC - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "UAC.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "UAC.mak" CFG="UAC - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "UAC - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "UAC - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "UAC - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UAC_EXPORTS" /YX /FD /c
# ADD CPP /nologo /Gz /MD /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UAC_EXPORTS" /YX /FD /c
# SUBTRACT CPP /Fr
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x414 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
# SUBTRACT LINK32 /map
!ELSEIF "$(CFG)" == "UAC - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UAC_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UAC_EXPORTS" /YX /FD /GZ /c
# SUBTRACT CPP /Fr
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x414 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
!ENDIF
# Begin Target
# Name "UAC - Win32 Release"
# Name "UAC - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\RunAs.cpp
# End Source File
# Begin Source File
SOURCE=.\uac.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\NSISUtil.h
# End Source File
# Begin Source File
SOURCE=.\uac.h
# End Source File
# End Group
# Begin Group "Resource Files"
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
# Begin Source File
SOURCE=.\resource.rc
# End Source File
# End Group
# Begin Group "Other"
# PROP Default_Filter "txt"
# Begin Source File
SOURCE=.\History.txt
# End Source File
# End Group
# End Target
# End Project

View File

@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "UAC"=".\UAC.dsp" - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@ -1,24 +0,0 @@
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by resource.rc
//
#define IDD_MYRUNAS 101
#define IDC_RUNASCURR 1000
#define IDC_RUNASSPEC 1001
#define IDC_SHICON 1002
#define IDC_HELPTEXT 1003
#define IDC_USERNAME 1004
#define IDC_PASSWORD 1005
#define IDC_LBLUSER 1007
#define IDC_LBLPWD 1008
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1009
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -1,109 +0,0 @@
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
#include "uac.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_MYRUNAS DIALOG DISCARDABLE 0, 0, 250, 145
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_SETFOREGROUND | DS_FIXEDSYS |
DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "&OK",IDOK,132,122,50,14
PUSHBUTTON "Ca&ncel",IDCANCEL,188,122,50,14
ICON "",IDC_SHICON,7,7,20,20
LTEXT "",IDC_HELPTEXT,34,7,204,35
CONTROL "",IDC_RUNASCURR,"Button",BS_AUTORADIOBUTTON,20,49,218,
10
CONTROL "",IDC_RUNASSPEC,"Button",BS_AUTORADIOBUTTON,20,65,218,
10
LTEXT "&User name:",IDC_LBLUSER,20,84,42,16
EDITTEXT IDC_USERNAME,63,83,175,14,ES_AUTOHSCROLL
LTEXT "&Password:",IDC_LBLPWD,20,102,42,20
EDITTEXT IDC_PASSWORD,63,100,175,14,ES_PASSWORD | ES_AUTOHSCROLL
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_MYRUNAS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 238
TOPMARGIN, 7
BOTTOMMARGIN, 136
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"#include ""uac.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

File diff suppressed because it is too large Load Diff

View File

@ -1,141 +0,0 @@
//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
#pragma once
/** /#define BUILD_DBGRELEASE // Include simple debug output in release version */
/** /#define BUILD_DBGSELECTELVMODE //Test MyRunAs in release builds*/
/**/#define UNICODE // Unicode build */
/**/#define FEAT_CUSTOMRUNASDLG // Include custom runas dialog */
/**/#define FEAT_CUSTOMRUNASDLG_TRANSLATE //*/
/**/#define FEAT_MSRUNASDLGMODHACK // Default to other user radio button */
#if !defined(APSTUDIO_INVOKED) && !defined(RC_INVOKED)
#if (defined(_MSC_VER) && !defined(_DEBUG))
#pragma comment(linker,"/opt:nowin98")
#pragma comment(linker,"/ignore:4078")
#pragma comment(linker,"/merge:.rdata=.text")
//#pragma intrinsic(memset) //http://www.codeguru.com/forum/showthread.php?t=371491&page=2&pp=15 | http://www.ddj.com/windows/184416623
#endif
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#endif
#define _WIN32_WINNT 0x0501
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <ShellAPI.h>
#include <TChar.h>
#include "NSISUtil.h"
#ifndef SEE_MASK_NOZONECHECKS
#define SEE_MASK_NOZONECHECKS 0x00800000
#endif
#define COUNTOF(___c) ( sizeof(___c)/sizeof(___c[0]) )
#ifndef ARRAYSIZE
#define ARRAYSIZE COUNTOF
#endif
#define FORCEINLINE __forceinline
#if _MSC_VER >= 1400
extern void* __cdecl memset(void*mem,int c,size_t len);
#endif
FORCEINLINE LRESULT MySndDlgItemMsg(HWND hDlg,int id,UINT Msg,WPARAM wp=0,LPARAM lp=0) {return SendMessage(GetDlgItem(hDlg,id),Msg,wp,lp);}
//DelayLoaded functions:
typedef BOOL (WINAPI*ALLOWSETFOREGROUNDWINDOW)(DWORD dwProcessId);
typedef BOOL (WINAPI*OPENPROCESSTOKEN)(HANDLE ProcessHandle,DWORD DesiredAccess,PHANDLE TokenHandle);
typedef BOOL (WINAPI*OPENTHREADTOKEN)(HANDLE ThreadHandle,DWORD DesiredAccess,BOOL OpenAsSelf,PHANDLE TokenHandle);
typedef BOOL (WINAPI*GETTOKENINFORMATION)(HANDLE hToken,TOKEN_INFORMATION_CLASS TokInfoClass,LPVOID TokInfo,DWORD TokInfoLenh,PDWORD RetLen);
typedef BOOL (WINAPI*ALLOCATEANDINITIALIZESID)(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,BYTE nSubAuthorityCount,DWORD sa0,DWORD sa1,DWORD sa2,DWORD sa3,DWORD sa4,DWORD sa5,DWORD sa6,DWORD sa7,PSID*pSid);
typedef PVOID (WINAPI*FREESID)(PSID pSid);
typedef BOOL (WINAPI*EQUALSID)(PSID pSid1,PSID pSid2);
typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember);
#ifdef FEAT_CUSTOMRUNASDLG
typedef BOOL (WINAPI*GETUSERNAME)(LPTSTR lpBuffer,LPDWORD nSize);
typedef BOOL (WINAPI*CREATEPROCESSWITHLOGONW)(LPCWSTR lpUsername,LPCWSTR lpDomain,LPCWSTR lpPassword,DWORD dwLogonFlags,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,DWORD dwCreationFlags,LPVOID pEnv,LPCWSTR WorkDir,LPSTARTUPINFOW pSI,LPPROCESS_INFORMATION pPI);
#define SECURITY_WIN32
#include <Security.h>//NameSamCompatible
typedef BOOLEAN (WINAPI*GETUSERNAMEEX)(EXTENDED_NAME_FORMAT NameFormat,LPTSTR lpNameBuffer,PULONG nSize);
#endif
#ifdef UAC_INITIMPORTS
ALLOWSETFOREGROUNDWINDOW _AllowSetForegroundWindow=0;
OPENPROCESSTOKEN _OpenProcessToken=0;
OPENTHREADTOKEN _OpenThreadToken=0;
GETTOKENINFORMATION _GetTokenInformation=0;
ALLOCATEANDINITIALIZESID _AllocateAndInitializeSid=0;
FREESID _FreeSid=0;
EQUALSID _EqualSid=0;
CHECKTOKENMEMBERSHIP _CheckTokenMembership=0;
#ifdef FEAT_CUSTOMRUNASDLG
GETUSERNAME _GetUserName=0;
GETUSERNAMEEX _GetUserNameEx=0;
CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW=0;
#endif
#else
#ifdef FEAT_CUSTOMRUNASDLG
extern GETUSERNAME _GetUserName;
extern GETUSERNAMEEX _GetUserNameEx;
extern CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW;
#endif
#endif /* UAC_INITIMPORTS */
extern DWORD DelayLoadDlls();
#ifdef FEAT_CUSTOMRUNASDLG
extern DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei);
#endif
#if !defined(NTDDI_VISTA) || defined(BUILD_OLDSDK)
//#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < 0x06000000) || !defined(NTDDI_VISTA)
//#if !defined(TOKEN_ELEVATION_TYPE) || defined(BUILD_OLDSDK)
enum TOKEN_ELEVATION_TYPE {
TokenElevationTypeDefault = 1,
TokenElevationTypeFull,
TokenElevationTypeLimited
};
enum _TOKEN_INFORMATION_CLASS___VISTA {
TokenElevationType = (TokenOrigin+1),
TokenLinkedToken,
TokenElevation,
TokenHasRestrictions,
TokenAccessInformation,
TokenVirtualizationAllowed,
TokenVirtualizationEnabled,
TokenIntegrityLevel,
TokenUIAccess,
TokenMandatoryPolicy,
TokenLogonSid,
};
#endif
#if defined(_DEBUG) || defined(BUILD_DBGRELEASE)
//Simple debug helpers:
#define BUILD_DBG
/** /#define BUILD_XPTEST //Pretend UAC exists and "elevate" with NT runas */
#define DBG_RESETDBGVIEW() do{HWND hDbgView=FindWindowA("dbgviewClass",0);PostMessage(hDbgView,WM_COMMAND,40020,0);if(0)SetForegroundWindow(hDbgView);}while(0)
#define _pp_MakeStr_(x) #x
#define pp_MakeStr(x) _pp_MakeStr_(x)
#define TRACE OutputDebugStringA
#define DBGONLY(_x) _x
#ifndef ASSERT
#define ASSERT(_x) do{if(!(_x)){MessageBoxA(GetActiveWindow(),#_x##"\n\n"##__FILE__##":"## pp_MakeStr(__LINE__),"SimpleAssert",0);/*TRACE(#_x##"\n"##__FILE__##":" pp_MakeStr(__LINE__)"\n");*/}}while(0)
#endif
#define VERIFY(_x) ASSERT(_x)
static void TRACEF(const char*fmt,...) {va_list a;va_start(a,fmt);static TCHAR b[1024*4];if (sizeof(TCHAR)!=sizeof(char)){static TCHAR fmtBuf[COUNTOF(b)];VERIFY(wsprintf(fmtBuf,_T("%hs"),fmt)<COUNTOF(fmtBuf));fmt=(LPCSTR)fmtBuf;}wvsprintf(b,(TCHAR*)fmt,a);OutputDebugString(b);}
#else
#define TRACE /*(void)0*/
#define DBGONLY(_x)
#define ASSERT(_x)
#define VERIFY(_x) ((void)(_x))
#define TRACEF TRACE
#endif /* DEBUG */
#endif /* APSTUDIO_INVOKED */

Binary file not shown.