summaryrefslogtreecommitdiffstats
path: root/ldap/synctools
diff options
context:
space:
mode:
authorDavid Boreham <dboreham@redhat.com>2005-03-11 02:44:17 +0000
committerDavid Boreham <dboreham@redhat.com>2005-03-11 02:44:17 +0000
commita957eeb8962ee1611b2546fda2bb11a5c909e59b (patch)
treea954c178f40f3531a52b01227c48e7a2df8d8894 /ldap/synctools
parent9a7d1e1fd10a644ed17952acd18f755470d4744a (diff)
downloadds-a957eeb8962ee1611b2546fda2bb11a5c909e59b.tar.gz
ds-a957eeb8962ee1611b2546fda2bb11a5c909e59b.tar.xz
ds-a957eeb8962ee1611b2546fda2bb11a5c909e59b.zip
Merge over new code: fractional replication, wan replication and windows sync plus associated UI
Diffstat (limited to 'ldap/synctools')
-rw-r--r--ldap/synctools/passwordsync/README.txt2
-rw-r--r--ldap/synctools/passwordsync/build.bat27
-rw-r--r--ldap/synctools/passwordsync/passhand.cpp122
-rw-r--r--ldap/synctools/passwordsync/passhand.h40
-rw-r--r--ldap/synctools/passwordsync/passhook/passhook.cpp47
-rw-r--r--ldap/synctools/passwordsync/passhook/passhook.def6
-rw-r--r--ldap/synctools/passwordsync/passhook/passhook.dep9
-rw-r--r--ldap/synctools/passwordsync/passhook/passhook.dsp117
-rw-r--r--ldap/synctools/passwordsync/passhook/passhook.mak207
-rw-r--r--ldap/synctools/passwordsync/passsync.dsw41
-rw-r--r--ldap/synctools/passwordsync/passsync/dssynch.h39
-rw-r--r--ldap/synctools/passwordsync/passsync/dssynchmsg.h604
-rw-r--r--ldap/synctools/passwordsync/passsync/ntservice.cpp576
-rw-r--r--ldap/synctools/passwordsync/passsync/ntservice.h80
-rw-r--r--ldap/synctools/passwordsync/passsync/passsync.dep32
-rw-r--r--ldap/synctools/passwordsync/passsync/passsync.dsp145
-rw-r--r--ldap/synctools/passwordsync/passsync/passsync.mak222
-rw-r--r--ldap/synctools/passwordsync/passsync/service.cpp295
-rw-r--r--ldap/synctools/passwordsync/passsync/subuniutil.cpp59
-rw-r--r--ldap/synctools/passwordsync/passsync/subuniutil.h20
-rw-r--r--ldap/synctools/passwordsync/passsync/synchcmds.h55
-rw-r--r--ldap/synctools/passwordsync/passsync/syncserv.cpp236
-rw-r--r--ldap/synctools/passwordsync/passsync/syncserv.h55
-rw-r--r--ldap/synctools/passwordsync/wix/PassSync.wxs1210
-rw-r--r--ldap/synctools/passwordsync/wix/README.txt2
25 files changed, 4248 insertions, 0 deletions
diff --git a/ldap/synctools/passwordsync/README.txt b/ldap/synctools/passwordsync/README.txt
new file mode 100644
index 00000000..5caa65a0
--- /dev/null
+++ b/ldap/synctools/passwordsync/README.txt
@@ -0,0 +1,2 @@
+1. Download Wix and unzip into Wix folder.
+2. run build.bat. \ No newline at end of file
diff --git a/ldap/synctools/passwordsync/build.bat b/ldap/synctools/passwordsync/build.bat
new file mode 100644
index 00000000..323e6288
--- /dev/null
+++ b/ldap/synctools/passwordsync/build.bat
@@ -0,0 +1,27 @@
+@echo off
+cd passsync
+nmake passsync.mak
+copy Debug\passsync.exe ..\Wix
+cd ..\passhook
+nmake passhook.mak
+copy Debug\passhook.dll ..\Wix
+
+if EXIST ..\Wix (goto :WIX)
+
+goto :EOF
+:WIX
+
+cd ..\Wix
+if NOT EXIST candle.exe (
+ echo ERROR: Wix not properly installed. See readme.
+ pause
+ exit 1 )
+
+if NOT EXIST light.exe (
+ echo ERROR: Wix not properly installed. See readme.
+ pause
+ exit 1 )
+
+candle PassSync.wxs
+light PassSync.wixobj
+
diff --git a/ldap/synctools/passwordsync/passhand.cpp b/ldap/synctools/passwordsync/passhand.cpp
new file mode 100644
index 00000000..23725e78
--- /dev/null
+++ b/ldap/synctools/passwordsync/passhand.cpp
@@ -0,0 +1,122 @@
+// Created: 2-8-2005
+// Author(s): Scott Bridges
+#include "passhand.h"
+
+PasswordHandler::PasswordHandler()
+{
+}
+
+PasswordHandler::~PasswordHandler()
+{
+}
+
+int PasswordHandler::SaveSet(char* filename)
+{
+ fstream outFile;
+ list<USER_PASS_PAIR>::iterator currentPair;
+
+ outFile.open(filename, ios::out | ios::binary);
+
+ if(!outFile.is_open())
+ {
+ return -1;
+ }
+
+ for(currentPair = userPassPairs.begin(); currentPair != userPassPairs.end(); currentPair++)
+ {
+ outFile.write((char*)&currentPair->username.Length, sizeof(currentPair->username.Length));
+ outFile.write((char*)currentPair->username.Buffer, currentPair->username.Length);
+
+ outFile.write((char*)&currentPair->password.Length, sizeof(currentPair->password.Length));
+ outFile.write((char*)currentPair->password.Buffer, currentPair->password.Length);
+ }
+
+ // ToDo: Zero out memory.
+ userPassPairs.clear();
+
+ return 0;
+}
+
+int PasswordHandler::LoadSet(char* filename)
+{
+ fstream inFile;
+ USER_PASS_PAIR newPair;
+
+ inFile.open(filename, ios::in | ios::binary);
+
+ if(!inFile.is_open())
+ {
+ return -1;
+ }
+
+ while(!inFile.eof())
+ {
+ inFile.read((char*)&newPair.username.Length, sizeof(newPair.username.Length));
+ newPair.username.Buffer = (unsigned short*)malloc(newPair.username.Length);
+ inFile.read((char*)newPair.username.Buffer, newPair.username.Length);
+ newPair.username.MaximumLength = newPair.username.Length;
+
+ inFile.read((char*)&newPair.password.Length, sizeof(newPair.password.Length));
+ newPair.password.Buffer = (unsigned short*)malloc(newPair.password.Length);
+ inFile.read((char*)newPair.password.Buffer, newPair.password.Length);
+ newPair.password.MaximumLength = newPair.password.Length;
+
+ if(!inFile.eof())
+ {
+ userPassPairs.push_back(newPair);
+ }
+ }
+
+ return 0;
+}
+
+int PasswordHandler::PushUserPass(PUNICODE_STRING username, PUNICODE_STRING password)
+{
+ USER_PASS_PAIR newPair;
+
+ newPair.username.Length = username->Length;
+ newPair.username.Buffer = (unsigned short*)malloc(username->Length);
+ memcpy(newPair.username.Buffer, username->Buffer, username->Length);
+ newPair.username.MaximumLength = newPair.username.Length;
+
+ newPair.password.Length = password->Length;
+ newPair.password.Buffer = (unsigned short*)malloc(password->Length);
+ memcpy(newPair.password.Buffer, password->Buffer, password->Length);
+ newPair.password.MaximumLength = newPair.password.Length;
+
+ userPassPairs.push_back(newPair);
+
+ return 0;
+}
+
+int PasswordHandler::PeekUserPass(PUNICODE_STRING username, PUNICODE_STRING password)
+{
+ list<USER_PASS_PAIR>::iterator currentPair;
+
+ if(userPassPairs.size() == 0)
+ {
+ return -1;
+ }
+
+ currentPair = userPassPairs.begin();
+
+ username->Length = currentPair->username.Length;
+ username->Buffer = (unsigned short*)malloc(username->Length);
+ memcpy(username->Buffer, currentPair->username.Buffer, username->Length);
+ username->MaximumLength = username->Length;
+
+ password->Length = currentPair->password.Length;
+ password->Buffer = (unsigned short*)malloc(password->Length);
+ memcpy(password->Buffer, currentPair->password.Buffer, password->Length);
+ password->MaximumLength = password->Length;
+
+ return 0;
+}
+
+int PasswordHandler::PopUserPass()
+{
+ // ToDo: Zero out memory.
+ userPassPairs.pop_front();
+
+ return 0;
+} \ No newline at end of file
diff --git a/ldap/synctools/passwordsync/passhand.h b/ldap/synctools/passwordsync/passhand.h
new file mode 100644
index 00000000..03b5f630
--- /dev/null
+++ b/ldap/synctools/passwordsync/passhand.h
@@ -0,0 +1,40 @@
+// Created: 2-8-2005
+// Author(s): Scott Bridges
+#ifndef _PASSHAND_H_
+#define _PASSHAND_H_
+
+#include <windows.h>
+#include <ntsecapi.h>
+#include <fstream>
+#include <list>
+
+#define PASSHAND_EVENT_NAME "passhand_event"
+
+#define STRSTREAM_BUF_SIZE 1024
+
+using namespace std;
+
+struct USER_PASS_PAIR
+{
+ UNICODE_STRING username;
+ UNICODE_STRING password;
+};
+
+class PasswordHandler
+{
+public:
+ PasswordHandler();
+ ~PasswordHandler();
+
+ //WritePassToStorage(PUNICODE_STRING username, PUNICODE_STRING password);
+ //ReadPassFromStorage(PUNICODE_STRING username, PUNICODE_STRING password);
+ int SaveSet(char* filename);
+ int LoadSet(char* filename);
+ int PushUserPass(PUNICODE_STRING username, PUNICODE_STRING password);
+ int PeekUserPass(PUNICODE_STRING username, PUNICODE_STRING password);
+ int PopUserPass();
+private:
+ list<USER_PASS_PAIR> userPassPairs;
+};
+
+#endif \ No newline at end of file
diff --git a/ldap/synctools/passwordsync/passhook/passhook.cpp b/ldap/synctools/passwordsync/passhook/passhook.cpp
new file mode 100644
index 00000000..ff49d575
--- /dev/null
+++ b/ldap/synctools/passwordsync/passhook/passhook.cpp
@@ -0,0 +1,47 @@
+// Created: 2-8-2005
+// Author(s): Scott Bridges
+#include <windows.h>
+#include <ntsecapi.h>
+#include "../passhand.h"
+
+#ifndef STATUS_SUCCESS
+#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
+#endif
+
+NTSTATUS NTAPI PasswordChangeNotify(
+ PUNICODE_STRING UserName,
+ ULONG RelativeId,
+ PUNICODE_STRING Password)
+{
+ PasswordHandler ourPasswordHandler;
+ HANDLE passhookEventHandle = OpenEvent(EVENT_MODIFY_STATE, FALSE, PASSHAND_EVENT_NAME);
+
+ ourPasswordHandler.LoadSet("passhook.dat");
+ ourPasswordHandler.PushUserPass(UserName, Password);
+ ourPasswordHandler.SaveSet("passhook.dat");
+
+ if(passhookEventHandle == NULL)
+ {
+ // ToDo: Generate event sync service not running.
+ }
+ else
+ {
+ SetEvent(passhookEventHandle);
+ }
+
+ return STATUS_SUCCESS;
+}
+
+BOOL NTAPI PasswordFilter(
+ PUNICODE_STRING UserName,
+ PUNICODE_STRING FullName,
+ PUNICODE_STRING Password,
+ BOOL SetOperation)
+{
+ return TRUE;
+}
+
+BOOL NTAPI InitializeChangeNotify()
+{
+ return TRUE;
+} \ No newline at end of file
diff --git a/ldap/synctools/passwordsync/passhook/passhook.def b/ldap/synctools/passwordsync/passhook/passhook.def
new file mode 100644
index 00000000..eeddeeea
--- /dev/null
+++ b/ldap/synctools/passwordsync/passhook/passhook.def
@@ -0,0 +1,6 @@
+
+LIBRARY passhook
+EXPORTS
+ InitializeChangeNotify
+ PasswordChangeNotify
+ PasswordFilter
diff --git a/ldap/synctools/passwordsync/passhook/passhook.dep b/ldap/synctools/passwordsync/passhook/passhook.dep
new file mode 100644
index 00000000..5eb1b6b5
--- /dev/null
+++ b/ldap/synctools/passwordsync/passhook/passhook.dep
@@ -0,0 +1,9 @@
+# Microsoft Developer Studio Generated Dependency File, included by passhook.mak
+
+..\passhand.cpp : \
+ "..\passhand.h"\
+
+
+.\passhook.cpp : \
+ "..\passhand.h"\
+
diff --git a/ldap/synctools/passwordsync/passhook/passhook.dsp b/ldap/synctools/passwordsync/passhook/passhook.dsp
new file mode 100644
index 00000000..385972a3
--- /dev/null
+++ b/ldap/synctools/passwordsync/passhook/passhook.dsp
@@ -0,0 +1,117 @@
+# Microsoft Developer Studio Project File - Name="passhook" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=passhook - 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 "passhook.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 "passhook.mak" CFG="passhook - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "passhook - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "passhook - 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)" == "passhook - 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 Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PASSHOOK_EXPORTS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PASSHOOK_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 gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+
+!ELSEIF "$(CFG)" == "passhook - 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 "PASSHOOK_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 "PASSHOOK_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 "passhook - Win32 Release"
+# Name "passhook - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\passhand.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\passhook.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\passhook.def
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\passhand.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"
+# End Group
+# End Target
+# End Project
diff --git a/ldap/synctools/passwordsync/passhook/passhook.mak b/ldap/synctools/passwordsync/passhook/passhook.mak
new file mode 100644
index 00000000..7f24e3ca
--- /dev/null
+++ b/ldap/synctools/passwordsync/passhook/passhook.mak
@@ -0,0 +1,207 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on passhook.dsp
+!IF "$(CFG)" == ""
+CFG=passhook - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to passhook - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "passhook - Win32 Release" && "$(CFG)" != "passhook - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!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 "passhook.mak" CFG="passhook - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "passhook - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "passhook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "passhook - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\passhook.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\passhand.obj"
+ -@erase "$(INTDIR)\passhook.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\passhook.dll"
+ -@erase "$(OUTDIR)\passhook.exp"
+ -@erase "$(OUTDIR)\passhook.lib"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PASSHOOK_EXPORTS" /Fp"$(INTDIR)\passhook.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\passhook.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=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 /incremental:no /pdb:"$(OUTDIR)\passhook.pdb" /machine:I386 /def:".\passhook.def" /out:"$(OUTDIR)\passhook.dll" /implib:"$(OUTDIR)\passhook.lib"
+DEF_FILE= \
+ ".\passhook.def"
+LINK32_OBJS= \
+ "$(INTDIR)\passhand.obj" \
+ "$(INTDIR)\passhook.obj"
+
+"$(OUTDIR)\passhook.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "passhook - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+ALL : "$(OUTDIR)\passhook.dll"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\passhand.obj"
+ -@erase "$(INTDIR)\passhook.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\passhook.dll"
+ -@erase "$(OUTDIR)\passhook.exp"
+ -@erase "$(OUTDIR)\passhook.ilk"
+ -@erase "$(OUTDIR)\passhook.lib"
+ -@erase "$(OUTDIR)\passhook.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PASSHOOK_EXPORTS" /Fp"$(INTDIR)\passhook.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+MTL=midl.exe
+MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\passhook.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=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 /incremental:yes /pdb:"$(OUTDIR)\passhook.pdb" /debug /machine:I386 /def:".\passhook.def" /out:"$(OUTDIR)\passhook.dll" /implib:"$(OUTDIR)\passhook.lib" /pdbtype:sept
+DEF_FILE= \
+ ".\passhook.def"
+LINK32_OBJS= \
+ "$(INTDIR)\passhand.obj" \
+ "$(INTDIR)\passhook.obj"
+
+"$(OUTDIR)\passhook.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("passhook.dep")
+!INCLUDE "passhook.dep"
+!ELSE
+!MESSAGE Warning: cannot find "passhook.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "passhook - Win32 Release" || "$(CFG)" == "passhook - Win32 Debug"
+SOURCE=..\passhand.cpp
+
+"$(INTDIR)\passhand.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\passhook.cpp
+
+"$(INTDIR)\passhook.obj" : $(SOURCE) "$(INTDIR)"
+
+
+
+!ENDIF
+
diff --git a/ldap/synctools/passwordsync/passsync.dsw b/ldap/synctools/passwordsync/passsync.dsw
new file mode 100644
index 00000000..f20d73a0
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync.dsw
@@ -0,0 +1,41 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "passhook"=".\passhook\passhook.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "passsync"=".\passsync\passsync.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/ldap/synctools/passwordsync/passsync/dssynch.h b/ldap/synctools/passwordsync/passsync/dssynch.h
new file mode 100644
index 00000000..f594cccd
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/dssynch.h
@@ -0,0 +1,39 @@
+/**
+ * PROPRIETARY/CONFIDENTIAL. Use of this product is subject to
+ * license terms. Copyright © 2001 Sun Microsystems, Inc.
+ * Some preexisting portions Copyright © 2001 Netscape Communications Corp.
+ * All rights reserved.
+ */
+/***********************************************************************
+**
+** Copyright 1996 - Netscape Communications Corporation
+**
+** NAME
+** DSSynch.h
+**
+** DESCRIPTION
+** Exported name of Directory Synchronization Service
+**
+** AUTHOR
+** Rob Weltman <rweltman@netscape.com>
+**
+***********************************************************************/
+
+#ifndef _DSSYNCH_H_
+#define _DSSYNCH_H_
+
+#define PLUGIN_STATE_UNKNOWN 0
+#define PLUGIN_STATE_DISABLED 1
+#define PLUGIN_STATE_ENABLED 2
+
+#if defined(_UNICODE)
+#define DS_SERVICE_NAME _T("Netscape Directory Synchronization Service")
+#else
+#define DS_SERVICE_NAME "Netscape Directory Synchronization Service"
+#endif
+#define DS_SERVICE_NAME_UNI L"Netscape Directory Synchronization Service"
+#define DS_EVENT_NAME TEXT("Netscape DirSynch")
+#define DSS_TERM_EVENT TEXT("NS_DSSYNCH")
+#define SYNCH_VERSION "5.0"
+
+#endif // _DSSYNCH_H_
diff --git a/ldap/synctools/passwordsync/passsync/dssynchmsg.h b/ldap/synctools/passwordsync/passsync/dssynchmsg.h
new file mode 100644
index 00000000..b3d2753e
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/dssynchmsg.h
@@ -0,0 +1,604 @@
+//
+// Values are 32 bit values layed out as follows:
+//
+// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+// +---+-+-+-----------------------+-------------------------------+
+// |Sev|C|R| Facility | Code |
+// +---+-+-+-----------------------+-------------------------------+
+//
+// where
+//
+// Sev - is the severity code
+//
+// 00 - Success
+// 01 - Informational
+// 10 - Warning
+// 11 - Error
+//
+// C - is the Customer code flag
+//
+// R - is a reserved bit
+//
+// Facility - is the facility code
+//
+// Code - is the facility's status code
+//
+//
+// Define the facility codes
+//
+
+
+//
+// Define the severity codes
+//
+
+
+//
+// MessageId: EVMSG_INSTALLED
+//
+// MessageText:
+//
+// The %1 service was installed.
+//
+#define EVMSG_INSTALLED 0x00000064L
+
+//
+// MessageId: EVMSG_REMOVED
+//
+// MessageText:
+//
+// The %1 service was removed.
+//
+#define EVMSG_REMOVED 0x00000065L
+
+//
+// MessageId: EVMSG_NOTREMOVED
+//
+// MessageText:
+//
+// The %1 service could not be removed.
+//
+#define EVMSG_NOTREMOVED 0x00000066L
+
+//
+// MessageId: EVMSG_CTRLHANDLERNOTINSTALLED
+//
+// MessageText:
+//
+// The control handler could not be installed.
+//
+#define EVMSG_CTRLHANDLERNOTINSTALLED 0x00000067L
+
+//
+// MessageId: EVMSG_FAILEDINIT
+//
+// MessageText:
+//
+// The initialization process failed.
+//
+#define EVMSG_FAILEDINIT 0x00000068L
+
+//
+// MessageId: EVMSG_STARTED
+//
+// MessageText:
+//
+// The service was started.
+//
+#define EVMSG_STARTED 0x00000069L
+
+//
+// MessageId: EVMSG_RESTART
+//
+// MessageText:
+//
+// The service was restarted.
+//
+#define EVMSG_RESTART 0x0000006AL
+
+//
+// MessageId: EVMSG_BADREQUEST
+//
+// MessageText:
+//
+// The service received an unsupported request.
+//
+#define EVMSG_BADREQUEST 0x0000006BL
+
+//
+// MessageId: EVMSG_SECURITYREGISTER
+//
+// MessageText:
+//
+// The service has registered for security events.
+//
+#define EVMSG_SECURITYREGISTER 0x0000006CL
+
+//
+// MessageId: EVMSG_FAILEDNOTIFY
+//
+// MessageText:
+//
+// The service failed on waiting for security event.
+//
+#define EVMSG_FAILEDNOTIFY 0x0000006DL
+
+//
+// MessageId: EVMSG_SECURITYNOTIFY
+//
+// MessageText:
+//
+// There was a security event.
+//
+#define EVMSG_SECURITYNOTIFY 0x0000006EL
+
+//
+// MessageId: EVMSG_FAILEDSECURITYNOTIFY
+//
+// MessageText:
+//
+// Failure waiting for security event involving Users.
+//
+#define EVMSG_FAILEDSECURITYNOTIFY 0x0000006FL
+
+//
+// MessageId: EVMSG_SECURITYAUDITINGENABLED
+//
+// MessageText:
+//
+// Auditing of User and Group Management events has been enabled.
+//
+#define EVMSG_SECURITYAUDITINGENABLED 0x00000070L
+
+//
+// MessageId: EVMSG_SECURITYAUDITINGDISABLED
+//
+// MessageText:
+//
+// Auditing of User and Group Management events has been turned off.
+// Notification-based monitoring of user changes has terminated.
+//
+#define EVMSG_SECURITYAUDITINGDISABLED 0x00000071L
+
+//
+// MessageId: EVMSG_FAILEDBINDDS
+//
+// MessageText:
+//
+// Failed to bind to Directory Service on %1 at %2.
+//
+#define EVMSG_FAILEDBINDDS 0x00000072L
+
+//
+// MessageId: EVMSG_BINDDS
+//
+// MessageText:
+//
+// Connected to Directory Service on %1 at %2.
+//
+#define EVMSG_BINDDS 0x00000073L
+
+//
+// MessageId: EVMSG_FAILEDGETNTUSERS
+//
+// MessageText:
+//
+// Failed to get user information from NT SAM.
+//
+#define EVMSG_FAILEDGETNTUSERS 0x00000074L
+
+//
+// MessageId: EVMSG_FAILEDGETDSUSERS
+//
+// MessageText:
+//
+// Failed to get user information from Directory Server.
+//
+#define EVMSG_FAILEDGETDSUSERS 0x00000075L
+
+//
+// MessageId: EVMSG_FAILEDSETDSTIMESTAMPS
+//
+// MessageText:
+//
+// Failed to set initial time stamps of NT users on Directory Server.
+//
+#define EVMSG_FAILEDSETDSTIMESTAMPS 0x00000076L
+
+//
+// MessageId: EVMSG_FAILEDGETNTUSERINFO
+//
+// MessageText:
+//
+// Failed to get user information for <%1> from NT.
+//
+#define EVMSG_FAILEDGETNTUSERINFO 0x00000077L
+
+//
+// MessageId: EVMSG_FAILEDADDDSUSER
+//
+// MessageText:
+//
+// Failed to add user <%1> to Directory Server.
+//
+#define EVMSG_FAILEDADDDSUSER 0x00000078L
+
+//
+// MessageId: EVMSG_FAILEDMODIFYDSUSER
+//
+// MessageText:
+//
+// Failed to modify user <%1> on Directory Server.
+//
+#define EVMSG_FAILEDMODIFYDSUSER 0x00000079L
+
+//
+// MessageId: EVMSG_FAILEDDELETEDSUSER
+//
+// MessageText:
+//
+// Failed to delete user <%1> on Directory Server.
+//
+#define EVMSG_FAILEDDELETEDSUSER 0x0000007AL
+
+//
+// MessageId: EVMSG_FAILEDADDNTUSER
+//
+// MessageText:
+//
+// Failed to add user <%1> to NT.
+//
+#define EVMSG_FAILEDADDNTUSER 0x0000007BL
+
+//
+// MessageId: EVMSG_FAILEDMODIFYNTUSER
+//
+// MessageText:
+//
+// Failed to modify user <%1> in NT.
+//
+#define EVMSG_FAILEDMODIFYNTUSER 0x0000007CL
+
+//
+// MessageId: EVMSG_FAILEDDELETENTUSER
+//
+// MessageText:
+//
+// Failed to delete user <%1> in NT.
+//
+#define EVMSG_FAILEDDELETENTUSER 0x0000007DL
+
+//
+// MessageId: EVMSG_FAILEDREADEVENTLOG
+//
+// MessageText:
+//
+// Failed reading Security Event Log.
+//
+#define EVMSG_FAILEDREADEVENTLOG 0x0000007EL
+
+//
+// MessageId: EVMSG_FAILEDCOMMANDOPEN
+//
+// MessageText:
+//
+// Failed opening command socket at port %1.
+//
+#define EVMSG_FAILEDCOMMANDOPEN 0x0000007FL
+
+//
+// MessageId: EVMSG_FAILEDCOMMANDREAD
+//
+// MessageText:
+//
+// Failed reading from command socket.
+//
+#define EVMSG_FAILEDCOMMANDREAD 0x00000080L
+
+//
+// MessageId: EVMSG_FAILEDCOMMANDWRITE
+//
+// MessageText:
+//
+// Failed writing to command socket.
+//
+#define EVMSG_FAILEDCOMMANDWRITE 0x00000081L
+
+//
+// MessageId: EVMSG_FAILEDGETKEY
+//
+// MessageText:
+//
+// Failed to get registry key <%1>.
+//
+#define EVMSG_FAILEDGETKEY 0x00000082L
+
+//
+// MessageId: EVMSG_FAILEDREADREGVALUE
+//
+// MessageText:
+//
+// Failed to read registry value <%1>.
+//
+#define EVMSG_FAILEDREADREGVALUE 0x00000083L
+
+//
+// MessageId: EVMSG_FAILEDWRITEREGVALUE
+//
+// MessageText:
+//
+// Failed to write registry value <%1>.
+//
+#define EVMSG_FAILEDWRITEREGVALUE 0x00000084L
+
+//
+// MessageId: EVMSG_FAILEDSAVESTATUS
+//
+// MessageText:
+//
+// Failed to save status to registry.
+//
+#define EVMSG_FAILEDSAVESTATUS 0x00000085L
+
+//
+// MessageId: EVMSG_UserNotFound
+//
+// MessageText:
+//
+// The user name could not be found.
+//
+#define EVMSG_UserNotFound 0x00000086L
+
+//
+// MessageId: EVMSG_UserExists
+//
+// MessageText:
+//
+// The user account already exists.
+//
+#define EVMSG_UserExists 0x00000087L
+
+//
+// MessageId: EVMSG_PasswordTooShort
+//
+// MessageText:
+//
+// The password is shorter than required.
+//
+#define EVMSG_PasswordTooShort 0x00000088L
+
+//
+// MessageId: EVMSG_NameTooLong
+//
+// MessageText:
+//
+// The user name %1 is too long.
+//
+#define EVMSG_NameTooLong 0x00000089L
+
+//
+// MessageId: EVMSG_PasswordHistConflict
+//
+// MessageText:
+//
+// This password cannot be used now.
+//
+#define EVMSG_PasswordHistConflict 0x0000008AL
+
+//
+// MessageId: EVMSG_InvalidDatabase
+//
+// MessageText:
+//
+// The security database is corrupted.
+//
+#define EVMSG_InvalidDatabase 0x0000008BL
+
+//
+// MessageId: EVMSG_NetworkError
+//
+// MessageText:
+//
+// A general network error occurred.
+//
+#define EVMSG_NetworkError 0x0000008CL
+
+//
+// MessageId: EVMSG_BadUsername
+//
+// MessageText:
+//
+// The user name or group name parameter is invalid.
+//
+#define EVMSG_BadUsername 0x0000008DL
+
+//
+// MessageId: EVMSG_UserUnkownError
+//
+// MessageText:
+//
+// Unexpected error - number %1.
+//
+#define EVMSG_UserUnkownError 0x0000008EL
+
+//
+// MessageId: EVMSG_DEBUG
+//
+// MessageText:
+//
+// Debug: %1
+//
+#define EVMSG_DEBUG 0x0000008FL
+
+//
+// MessageId: EVMSG_STOPPED
+//
+// MessageText:
+//
+// The service was stopped.
+//
+#define EVMSG_STOPPED 0x00000090L
+
+//
+// MessageId: EVMSG_UIDNOTDUPLICATED
+//
+// MessageText:
+//
+// The UID "%1" already exists in the subtree and has not been duplicated.
+//
+#define EVMSG_UIDNOTDUPLICATED 0x00000091L
+
+//
+// MessageId: EVMSG_UIDDUPLICATED
+//
+// MessageText:
+//
+// The UID "%1" already exists in the subtree but HAS been duplicated because the user RDN component requires it. Further action may need to be taken if there are systems using the Directory Server which require unique UIDs.
+//
+#define EVMSG_UIDDUPLICATED 0x00000092L
+
+//
+// MessageId: EVMSG_FAILEDCONTROLOPEN
+//
+// MessageText:
+//
+// Failed opening control message socket at port %1.
+//
+#define EVMSG_FAILEDCONTROLOPEN 0x00000093L
+
+//
+// MessageId: EVMSG_FAILEDPREOPOPEN
+//
+// MessageText:
+//
+// Failed opening preoperation processing socket at port %1.
+//
+#define EVMSG_FAILEDPREOPOPEN 0x00000094L
+
+//
+// MessageId: EVMSG_FAILEDPOSTOPEN
+//
+// MessageText:
+//
+// Failed opening postoperation processing socket at port %1.
+//
+#define EVMSG_FAILEDPOSTOPEN 0x00000095L
+
+//
+// MessageId: EVMSG_FAILEDCONTROLWRITE
+//
+// MessageText:
+//
+// Failed writing to control message socket at port %1.
+//
+#define EVMSG_FAILEDCONTROLWRITE 0x00000096L
+
+//
+// MessageId: EVMSG_FAILEDPREOPWRITE
+//
+// MessageText:
+//
+// Failed writing to preoperation processing socket at port %1.
+//
+#define EVMSG_FAILEDPREOPWRITE 0x00000097L
+
+//
+// MessageId: EVMSG_FAILEDPOSTOPWRITE
+//
+// MessageText:
+//
+// Failed writing to postoperation processing socket at port %1.
+//
+#define EVMSG_FAILEDPOSTOPWRITE 0x00000098L
+
+//
+// MessageId: EVMSG_FAILEDCONTROLREAD
+//
+// MessageText:
+//
+// Failed reading from control message socket at port %1.
+//
+#define EVMSG_FAILEDCONTROLREAD 0x00000099L
+
+//
+// MessageId: EVMSG_FAILEDPREOPREAD
+//
+// MessageText:
+//
+// Failed reading from preoperation processing socket at port %1.
+//
+#define EVMSG_FAILEDPREOPREAD 0x0000009AL
+
+//
+// MessageId: EVMSG_FAILEDPOSTOPREAD
+//
+// MessageText:
+//
+// Failed reading from postoperation processing socket at port %1.
+//
+#define EVMSG_FAILEDPOSTOPREAD 0x0000009BL
+
+//
+// MessageId: EVMSG_FAILEDCONTROLBADBASE
+//
+// MessageText:
+//
+// The subtree "%1" is invalid.
+//
+#define EVMSG_FAILEDCONTROLBADBASE 0x0000009CL
+
+//
+// MessageId: EVMSG_FAILEDGETNTGROUPINFO
+//
+// MessageText:
+//
+// Failed to get group information for <%1> from NT.
+//
+#define EVMSG_FAILEDGETNTGROUPINFO 0x0000009DL
+
+//
+// MessageId: EVMSG_FAILEDADDDSGROUP
+//
+// MessageText:
+//
+// Failed to add group <%1> to Directory Server.
+//
+#define EVMSG_FAILEDADDDSGROUP 0x0000009EL
+
+//
+// MessageId: EVMSG_FAILEDMODIFYDSGROUP
+//
+// MessageText:
+//
+// Failed to modify group <%1> on Directory Server.
+//
+#define EVMSG_FAILEDMODIFYDSGROUP 0x0000009FL
+
+//
+// MessageId: EVMSG_FAILEDDELETEDSGROUP
+//
+// MessageText:
+//
+// Failed to delete group <%1> on Directory Server.
+//
+#define EVMSG_FAILEDDELETEDSGROUP 0x000000A0L
+
+//
+// MessageId: EVMSG_FAILEDCONTROLDUPTREE
+//
+// MessageText:
+//
+// Synch Service control connection rejected by Directory Server, duplicate users base <%1> or groups base <%2>.
+//
+#define EVMSG_FAILEDCONTROLDUPTREE 0x000000A1L
+
+//
+// MessageId: EVMSG_FAILEDCONTROLSETUP
+//
+// MessageText:
+//
+// Synch Service control connection rejected by Directory Server, users base <%1>, groups base <%2>.
+//
+#define EVMSG_FAILEDCONTROLSETUP 0x000000A2L
+
diff --git a/ldap/synctools/passwordsync/passsync/ntservice.cpp b/ldap/synctools/passwordsync/passsync/ntservice.cpp
new file mode 100644
index 00000000..6d0f1151
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/ntservice.cpp
@@ -0,0 +1,576 @@
+/***********************************************************************
+**
+** Copyright 1996 - Netscape Communications Corporation
+**
+** NAME
+** NTService.cpp
+**
+** DESCRIPTION
+** Base class for NT Service app
+**
+** AUTHOR
+** Rob Weltman <rweltman@netscape.com>
+**
+***********************************************************************/
+
+/***********************************************************************
+** Includes
+***********************************************************************/
+// Removed: 2-8-2005
+//#include "sysplat.h"
+// Added: 2-8-2005
+#include <stdio.h>
+// End Change
+
+#include <tchar.h>
+#include <time.h>
+#include "NTService.h"
+// Remove: 2-8-2005
+//#include "uniutil.h"
+// End Change
+#include "dssynchmsg.h"
+
+// static variables
+CNTService* CNTService::m_pThis = NULL;
+
+CNTService::CNTService(const TCHAR* szServiceName)
+{
+ // copy the address of the current object so we can access it from
+ // the static member callback functions.
+ // WARNING: This limits the application to only one CNTService object.
+ m_pThis = this;
+
+ // Set the default service name and version
+ _tcsncpy(m_szServiceName, szServiceName, sizeof(m_szServiceName)-1);
+ m_iMajorVersion = 1;
+ m_iMinorVersion = 0;
+ m_hEventSource = NULL;
+
+ // set up the initial service status
+ m_hServiceStatus = NULL;
+ m_Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
+ m_Status.dwCurrentState = SERVICE_STOPPED;
+ m_Status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
+ m_Status.dwWin32ExitCode = 0;
+ m_Status.dwServiceSpecificExitCode = 0;
+ m_Status.dwCheckPoint = 0;
+ m_Status.dwWaitHint = 0;
+ m_bIsRunning = FALSE;
+}
+
+CNTService::~CNTService()
+{
+ DebugMsg(_T("CNTService::~CNTService()"));
+ if (m_hEventSource) {
+ ::DeregisterEventSource(m_hEventSource);
+ m_hEventSource = NULL;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Default command line argument parsing
+
+// Returns TRUE if it found an arg it recognised, FALSE if not
+// Note: processing some arguments causes output to stdout to be generated.
+BOOL CNTService::ParseStandardArgs(int argc, char* argv[])
+{
+ // See if we have any command line args we recognise
+ if (argc <= 1) return FALSE;
+
+ if (_stricmp(argv[1], "-v") == 0) {
+
+ // Spit out version info
+ _tprintf(_T("%s Version %d.%d\n"),
+ m_szServiceName, m_iMajorVersion, m_iMinorVersion);
+ _tprintf(_T("The service is %s installed\n"),
+ IsInstalled() ? _T("currently") : _T("not"));
+ return TRUE; // say we processed the argument
+
+ } else if (_stricmp(argv[1], "-i") == 0) {
+
+ // Request to install.
+ if (IsInstalled()) {
+ _tprintf(_T("%s is already installed\n"), m_szServiceName);
+ } else {
+ // Try and install the copy that's running
+ if (Install()) {
+ _tprintf(_T("%s installed\n"), m_szServiceName);
+ } else {
+ _tprintf(_T("%s failed to install. Error %d\n"),
+ m_szServiceName, GetLastError());
+ }
+ }
+ return TRUE; // say we processed the argument
+
+ } else if (_stricmp(argv[1], "-u") == 0) {
+
+ // Request to uninstall.
+ if (!IsInstalled()) {
+ _tprintf(_T("%s is not installed\n"), m_szServiceName);
+ } else {
+ // Try and remove the copy that's installed
+ if (Uninstall()) {
+ // Get the executable file path
+ TCHAR szFilePath[_MAX_PATH];
+ ::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath));
+ _tprintf(_T("%s removed. (You must delete the file (%s) yourself.)\n"),
+ m_szServiceName, szFilePath);
+ } else {
+ _tprintf(_T("Could not remove %s. Error %d\n"),
+ m_szServiceName, GetLastError());
+ }
+ }
+ return TRUE; // say we processed the argument
+
+ }
+
+ // Don't recognise the args
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////
+// Install/uninstall routines
+
+// Test if the service is currently installed
+BOOL CNTService::IsInstalled()
+{
+ BOOL bResult = FALSE;
+
+ // Open the Service Control Manager
+ SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (hSCM) {
+
+ // Try to open the service
+ SC_HANDLE hService = ::OpenService(hSCM,
+ m_szServiceName,
+ SERVICE_QUERY_CONFIG);
+ if (hService) {
+ bResult = TRUE;
+ ::CloseServiceHandle(hService);
+ }
+
+ ::CloseServiceHandle(hSCM);
+ }
+
+ return bResult;
+}
+
+BOOL CNTService::Install()
+{
+ // Open the Service Control Manager
+ SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (!hSCM) return FALSE;
+
+ // Get the executable file path
+ TCHAR szFilePath[_MAX_PATH];
+ ::GetModuleFileName(NULL, szFilePath, sizeof(szFilePath)/sizeof(*szFilePath));
+
+ // Create the service
+ SC_HANDLE hService = ::CreateService(hSCM,
+ m_szServiceName,
+ m_szServiceName,
+ SERVICE_ALL_ACCESS,
+ SERVICE_WIN32_OWN_PROCESS,
+ SERVICE_DEMAND_START, // start condition
+ SERVICE_ERROR_NORMAL,
+ szFilePath,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+ if (!hService) {
+ ::CloseServiceHandle(hSCM);
+ return FALSE;
+ }
+
+ // make registry entries to support logging messages
+ // Add the source name as a subkey under the Application
+ // key in the EventLog service portion of the registry.
+ TCHAR szKey[256];
+ HKEY hKey = NULL;
+ _tcscpy(szKey, _T("SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\"));
+ _tcscat(szKey, GetEventName());
+ if (::RegCreateKey(HKEY_LOCAL_MACHINE, szKey, &hKey) != ERROR_SUCCESS) {
+ ::CloseServiceHandle(hService);
+ ::CloseServiceHandle(hSCM);
+ return FALSE;
+ }
+
+ // Add the Event ID message-file name to the 'EventMessageFile' subkey.
+ ::RegSetValueEx(hKey,
+ _T("EventMessageFile"),
+ 0,
+ REG_EXPAND_SZ,
+ (CONST BYTE*)szFilePath,
+ (_tcslen(szFilePath) + 1)*sizeof(*szFilePath));
+
+ // Set the supported types flags.
+ DWORD dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE;
+ ::RegSetValueEx(hKey,
+ _T("TypesSupported"),
+ 0,
+ REG_DWORD,
+ (CONST BYTE*)&dwData,
+ sizeof(DWORD));
+ ::RegCloseKey(hKey);
+
+ LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_INSTALLED, m_szServiceName);
+
+ // tidy up
+ ::CloseServiceHandle(hService);
+ ::CloseServiceHandle(hSCM);
+ return TRUE;
+}
+
+BOOL CNTService::Uninstall()
+{
+ // Open the Service Control Manager
+ SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (!hSCM) return FALSE;
+
+ BOOL bResult = FALSE;
+ SC_HANDLE hService = ::OpenService(hSCM,
+ m_szServiceName,
+ DELETE);
+ if (hService) {
+ // Stop it if it is running
+ SERVICE_STATUS serviceStatus;
+ BOOL bStop = ControlService( hService, SERVICE_CONTROL_STOP,
+ &serviceStatus );
+ if (::DeleteService(hService)) {
+ LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_REMOVED, m_szServiceName);
+ bResult = TRUE;
+ } else {
+ LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_NOTREMOVED, m_szServiceName);
+ }
+ ::CloseServiceHandle(hService);
+ }
+
+ ::CloseServiceHandle(hSCM);
+ return bResult;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////
+// Logging functions
+
+// This function makes an entry into the application event log
+void CNTService::LogEvent(WORD wType, DWORD dwID,
+ const wchar_t* pszS1,
+ const wchar_t* pszS2,
+ const wchar_t* pszS3)
+{
+#ifndef _DEBUG
+ if ( EVMSG_DEBUG == dwID )
+ return;
+#endif
+ const wchar_t* ps[3];
+ ps[0] = pszS1;
+ ps[1] = pszS2;
+ ps[2] = pszS3;
+
+ int iStr = 0;
+ for (int i = 0; i < 3; i++) {
+ if (ps[i] != NULL) iStr++;
+ }
+
+ // Check the event source has been registered and if
+ // not then register it now
+ if (!m_hEventSource) {
+ TCHAR *name = GetEventName();
+// Modification: 2-8-2005
+// m_hEventSource = ::RegisterEventSourceW(NULL, // local machine
+// GetEventName()); // source name
+ m_hEventSource = ::RegisterEventSourceW(NULL, // local machine
+ (const unsigned short *)GetEventName()); // source name
+// End Change
+ }
+
+ if (m_hEventSource) {
+ ::ReportEventW(m_hEventSource,
+ wType,
+ 0,
+ dwID,
+ NULL, // sid
+ iStr,
+ 0,
+ ps,
+ NULL);
+ }
+}
+
+// This function makes an entry into the application event log
+void CNTService::LogEvent(WORD wType, DWORD dwID,
+ const char* pszS1,
+ const char* pszS2,
+ const char* pszS3)
+{
+ wchar_t *p1 = pszS1 ? StrToUnicode( pszS1 ) : NULL;
+ wchar_t *p2 = pszS2 ? StrToUnicode( pszS2 ) : NULL;
+ wchar_t *p3 = pszS3 ? StrToUnicode( pszS3 ) : NULL;
+ LogEvent( wType, dwID, p1, p2, p3 );
+ if ( p1 )
+ free( p1 );
+ if ( p2 )
+ free( p2 );
+ if ( p3 )
+ free( p3 );
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+// Service startup and registration
+
+BOOL CNTService::StartService()
+{
+ CNTService* pService = m_pThis;
+ SERVICE_TABLE_ENTRY st[] = {
+ {m_szServiceName, ServiceMain},
+ {NULL, NULL}
+ };
+
+ DebugMsg(_T("Calling StartServiceCtrlDispatcher()"));
+ // Fails if started from command line, but StartService
+ // works any way
+ BOOL b = ::StartServiceCtrlDispatcher(st);
+ DWORD err = GetLastError();
+ DebugMsg(_T("Returned from StartServiceCtrlDispatcher()"));
+ return b;
+}
+
+BOOL CNTService::StartServiceDirect()
+{
+ BOOL b = FALSE;
+
+ // Open the Service Control Manager
+ SC_HANDLE hSCM = ::OpenSCManager(NULL, // local machine
+ NULL, // ServicesActive database
+ SC_MANAGER_ALL_ACCESS); // full access
+ if (!hSCM) return FALSE;
+ SC_HANDLE hService = ::OpenService(hSCM,
+ m_szServiceName,
+ SERVICE_START);
+ if (hService)
+ {
+ DebugMsg(_T("Calling StartServiceDirect()"));
+ b = ::StartService( hService, 0, NULL );
+ ::CloseServiceHandle(hService);
+ }
+ ::CloseServiceHandle(hSCM);
+
+ return b;
+}
+
+// static member function (callback)
+void CNTService::ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv)
+{
+ // Get a pointer to the C++ object
+ CNTService* pService = m_pThis;
+
+ pService->DebugMsg(_T("Entering CNTService::ServiceMain()"));
+ // Register the control request handler
+ pService->m_Status.dwCurrentState = SERVICE_START_PENDING;
+ pService->m_hServiceStatus = RegisterServiceCtrlHandler(pService->m_szServiceName,
+ Handler);
+ if (pService->m_hServiceStatus == NULL) {
+ pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_CTRLHANDLERNOTINSTALLED);
+ return;
+ }
+
+ // Start the initialisation
+ if (pService->Initialize()) {
+
+ // Do the real work.
+ // When the Run function returns, the service has stopped.
+ pService->m_bIsRunning = TRUE;
+ pService->m_Status.dwWin32ExitCode = 0;
+ pService->m_Status.dwCheckPoint = 0;
+ pService->m_Status.dwWaitHint = 0;
+ pService->Run();
+ }
+
+ // Tell the service manager we are stopped
+ pService->SetStatus(SERVICE_STOPPED);
+
+ pService->DebugMsg(_T("Leaving CNTService::ServiceMain()"));
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+// status functions
+
+void CNTService::SetStatus(DWORD dwState)
+{
+ DebugMsg(_T("CNTService::SetStatus(%lu, %lu)"), m_hServiceStatus, dwState);
+ m_Status.dwCurrentState = dwState;
+ ::SetServiceStatus(m_hServiceStatus, &m_Status);
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////
+// Service initialization
+
+BOOL CNTService::Initialize()
+{
+ DebugMsg(_T("Entering CNTService::Initialize()"));
+
+ // Start the initialization
+ SetStatus(SERVICE_START_PENDING);
+
+ // Perform the actual initialization
+ BOOL bResult = OnInit();
+
+ // Set final state
+ m_Status.dwWin32ExitCode = GetLastError();
+ m_Status.dwCheckPoint = 0;
+ m_Status.dwWaitHint = 0;
+ if (!bResult) {
+ LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_FAILEDINIT);
+ SetStatus(SERVICE_STOPPED);
+ return FALSE;
+ }
+
+ LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_STARTED);
+ SetStatus(SERVICE_RUNNING);
+
+ DebugMsg(_T("Leaving CNTService::Initialize()"));
+ return TRUE;
+}
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+// main function to do the real work of the service
+
+// This function performs the main work of the service.
+// When this function returns the service has stopped.
+void CNTService::Run()
+{
+ DebugMsg(_T("Entering CNTService::Run()"));
+
+ while (m_bIsRunning) {
+ DebugMsg(_T("Sleeping..."));
+ Sleep(5000);
+ }
+
+ // nothing more to do
+ DebugMsg(_T("Leaving CNTService::Run()"));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////
+// Control request handlers
+
+// static member function (callback) to handle commands from the
+// service control manager
+void CNTService::Handler(DWORD dwOpcode)
+{
+ // Get a pointer to the object
+ CNTService* pService = m_pThis;
+
+ pService->DebugMsg(_T("CNTService::Handler(%lu)"), dwOpcode);
+ switch (dwOpcode) {
+ case SERVICE_CONTROL_STOP: // 1
+ pService->SetStatus(SERVICE_STOP_PENDING);
+ pService->OnStop();
+ pService->m_bIsRunning = FALSE;
+ pService->LogEvent(EVENTLOG_INFORMATION_TYPE, EVMSG_STOPPED);
+ if (pService->m_hEventSource) {
+ ::DeregisterEventSource(pService->m_hEventSource);
+ pService->m_hEventSource = NULL;
+ }
+
+ break;
+
+ case SERVICE_CONTROL_PAUSE: // 2
+ pService->OnPause();
+ break;
+
+ case SERVICE_CONTROL_CONTINUE: // 3
+ pService->OnContinue();
+ break;
+
+ case SERVICE_CONTROL_INTERROGATE: // 4
+ pService->OnInterrogate();
+ break;
+
+ case SERVICE_CONTROL_SHUTDOWN: // 5
+ pService->OnShutdown();
+ break;
+
+ default:
+ if (dwOpcode >= SERVICE_CONTROL_USER) {
+ if (!pService->OnUserControl(dwOpcode)) {
+ pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_BADREQUEST);
+ }
+ } else {
+ pService->LogEvent(EVENTLOG_ERROR_TYPE, EVMSG_BADREQUEST);
+ }
+ break;
+ }
+
+ // Report current status
+ pService->DebugMsg(_T("Updating status (%lu, %lu)"),
+ pService->m_hServiceStatus,
+ pService->m_Status.dwCurrentState);
+ ::SetServiceStatus(pService->m_hServiceStatus, &pService->m_Status);
+}
+
+// Called when the service is first initialized
+BOOL CNTService::OnInit()
+{
+ DebugMsg(_T("CNTService::OnInit()"));
+ return TRUE;
+}
+
+// Called when the service control manager wants to stop the service
+void CNTService::OnStop()
+{
+ DebugMsg(_T("CNTService::OnStop()"));
+}
+
+// called when the service is interrogated
+void CNTService::OnInterrogate()
+{
+ DebugMsg(_T("CNTService::OnInterrogate()"));
+}
+
+// called when the service is paused
+void CNTService::OnPause()
+{
+ DebugMsg(_T("CNTService::OnPause()"));
+}
+
+// called when the service is continued
+void CNTService::OnContinue()
+{
+ DebugMsg(_T("CNTService::OnContinue()"));
+}
+
+// called when the service is shut down
+void CNTService::OnShutdown()
+{
+ DebugMsg(_T("CNTService::OnShutdown()"));
+}
+
+// called when the service gets a user control message
+BOOL CNTService::OnUserControl(DWORD dwOpcode)
+{
+ DebugMsg(_T("CNTService::OnUserControl(%8.8lXH)"), dwOpcode);
+ return FALSE; // say not handled
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// Debugging support
+
+void CNTService::DebugMsg(const TCHAR* pszFormat, ...)
+{
+ TCHAR buf[1024];
+ _stprintf(buf, _T("[%s](%lu): "), m_szServiceName, GetCurrentThreadId());
+ va_list arglist;
+ va_start(arglist, pszFormat);
+ _vstprintf(&buf[_tcslen(buf)], pszFormat, arglist);
+ va_end(arglist);
+ _tcscat(buf, _T("\n"));
+ OutputDebugString(buf);
+}
diff --git a/ldap/synctools/passwordsync/passsync/ntservice.h b/ldap/synctools/passwordsync/passsync/ntservice.h
new file mode 100644
index 00000000..38233ab1
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/ntservice.h
@@ -0,0 +1,80 @@
+/***********************************************************************
+**
+** Copyright 1996 - Netscape Communications Corporation
+**
+** NAME
+** NTService.h
+**
+** DESCRIPTION
+**
+**
+** AUTHOR
+** Rob Weltman <rweltman@netscape.com>
+**
+***********************************************************************/
+
+#ifndef _NTSERVICE_H_
+#define _NTSERVICE_H_
+
+// Added: 2-8-2005
+#include <windows.h>
+#include "subuniutil.h"
+// End Change
+
+// #include "dssynchmsg.h" // Event message ids
+
+#define SERVICE_CONTROL_USER 128
+
+class CNTService
+{
+public:
+ CNTService(const TCHAR* szServiceName);
+ virtual ~CNTService();
+ BOOL ParseStandardArgs(int argc, char* argv[]);
+ BOOL IsInstalled();
+ BOOL Install();
+ BOOL Uninstall();
+ void LogEvent(WORD wType, DWORD dwID,
+ const wchar_t* pszS1 = NULL,
+ const wchar_t* pszS2 = NULL,
+ const wchar_t* pszS3 = NULL);
+ void LogEvent(WORD wType, DWORD dwID,
+ const char* pszS1,
+ const char* pszS2 = NULL,
+ const char* pszS3 = NULL);
+ BOOL StartService();
+ BOOL StartServiceDirect();
+ void SetStatus(DWORD dwState);
+ BOOL Initialize();
+ virtual void Run();
+ virtual BOOL OnInit();
+ virtual void OnStop();
+ virtual void OnInterrogate();
+ virtual void OnPause();
+ virtual void OnContinue();
+ virtual void OnShutdown();
+ virtual BOOL OnUserControl(DWORD dwOpcode);
+ virtual TCHAR *GetEventName() { return m_szServiceName; }
+ void DebugMsg(const TCHAR* pszFormat, ...);
+
+ // static member functions
+ static void WINAPI ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv);
+ static void WINAPI Handler(DWORD dwOpcode);
+
+ // data members
+ TCHAR m_szServiceName[64];
+ int m_iMajorVersion;
+ int m_iMinorVersion;
+ SERVICE_STATUS_HANDLE m_hServiceStatus;
+ SERVICE_STATUS m_Status;
+ BOOL IsRunning() { return m_bIsRunning; }
+
+ // static data
+ static CNTService* m_pThis; // nasty hack to get object ptr
+
+private:
+ HANDLE m_hEventSource;
+ BOOL m_bIsRunning;
+};
+
+#endif // _NTSERVICE_H_
diff --git a/ldap/synctools/passwordsync/passsync/passsync.dep b/ldap/synctools/passwordsync/passsync/passsync.dep
new file mode 100644
index 00000000..36cca3c7
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/passsync.dep
@@ -0,0 +1,32 @@
+# Microsoft Developer Studio Generated Dependency File, included by passsync.mak
+
+.\ntservice.cpp : \
+ ".\dssynchmsg.h"\
+ ".\ntservice.h"\
+ ".\subuniutil.h"\
+
+
+..\passhand.cpp : \
+ "..\passhand.h"\
+
+
+.\service.cpp : \
+ "..\passhand.h"\
+ ".\dssynch.h"\
+ ".\dssynchmsg.h"\
+ ".\ntservice.h"\
+ ".\subuniutil.h"\
+ ".\synchcmds.h"\
+ ".\syncserv.h"\
+
+
+.\subuniutil.cpp : \
+ ".\subuniutil.h"\
+
+
+.\syncserv.cpp : \
+ "..\passhand.h"\
+ ".\ntservice.h"\
+ ".\subuniutil.h"\
+ ".\syncserv.h"\
+
diff --git a/ldap/synctools/passwordsync/passsync/passsync.dsp b/ldap/synctools/passwordsync/passsync/passsync.dsp
new file mode 100644
index 00000000..e4d8c4de
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/passsync.dsp
@@ -0,0 +1,145 @@
+# Microsoft Developer Studio Project File - Name="passsync" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=passsync - 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 "passsync.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 "passsync.mak" CFG="passsync - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "passsync - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "passsync - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "passsync - 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 Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# 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 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 /subsystem:console /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 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 /subsystem:console /machine:I386
+
+!ELSEIF "$(CFG)" == "passsync - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "passsync___Win32_Debug"
+# PROP BASE Intermediate_Dir "passsync___Win32_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 /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# 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 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 /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 nsldapssl32v50.lib nsldap32v50.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 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 /subsystem:console /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "passsync - Win32 Release"
+# Name "passsync - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\ntservice.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\passhand.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\service.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\subuniutil.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\syncserv.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\dssynch.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dssynchmsg.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\ntservice.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\passhand.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\subuniutil.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\synchcmds.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\syncserv.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"
+# End Group
+# End Target
+# End Project
diff --git a/ldap/synctools/passwordsync/passsync/passsync.mak b/ldap/synctools/passwordsync/passsync/passsync.mak
new file mode 100644
index 00000000..58ed9269
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/passsync.mak
@@ -0,0 +1,222 @@
+# Microsoft Developer Studio Generated NMAKE File, Based on passsync.dsp
+!IF "$(CFG)" == ""
+CFG=passsync - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to passsync - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "passsync - Win32 Release" && "$(CFG)" != "passsync - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!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 "passsync.mak" CFG="passsync - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "passsync - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "passsync - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+
+!IF "$(CFG)" == "passsync - Win32 Release"
+
+OUTDIR=.\Release
+INTDIR=.\Release
+# Begin Custom Macros
+OutDir=.\Release
+# End Custom Macros
+
+ALL : "$(OUTDIR)\passsync.exe"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\ntservice.obj"
+ -@erase "$(INTDIR)\passhand.obj"
+ -@erase "$(INTDIR)\service.obj"
+ -@erase "$(INTDIR)\subuniutil.obj"
+ -@erase "$(INTDIR)\syncserv.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\passsync.exe"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\passsync.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\passsync.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 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 /subsystem:console /incremental:no /pdb:"$(OUTDIR)\passsync.pdb" /machine:I386 /out:"$(OUTDIR)\passsync.exe"
+LINK32_OBJS= \
+ "$(INTDIR)\ntservice.obj" \
+ "$(INTDIR)\passhand.obj" \
+ "$(INTDIR)\service.obj" \
+ "$(INTDIR)\subuniutil.obj" \
+ "$(INTDIR)\syncserv.obj"
+
+"$(OUTDIR)\passsync.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "passsync - Win32 Debug"
+
+OUTDIR=.\Debug
+INTDIR=.\Debug
+# Begin Custom Macros
+OutDir=.\Debug
+# End Custom Macros
+
+ALL : "$(OUTDIR)\passsync.exe"
+
+
+CLEAN :
+ -@erase "$(INTDIR)\ntservice.obj"
+ -@erase "$(INTDIR)\passhand.obj"
+ -@erase "$(INTDIR)\service.obj"
+ -@erase "$(INTDIR)\subuniutil.obj"
+ -@erase "$(INTDIR)\syncserv.obj"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\passsync.exe"
+ -@erase "$(OUTDIR)\passsync.ilk"
+ -@erase "$(OUTDIR)\passsync.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+CPP=cl.exe
+CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fp"$(INTDIR)\passsync.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+
+.c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+.cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+<<
+
+RSC=rc.exe
+BSC32=bscmake.exe
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\passsync.bsc"
+BSC32_SBRS= \
+
+LINK32=link.exe
+LINK32_FLAGS=nsldapssl32v50.lib nsldap32v50.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 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 /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\passsync.pdb" /debug /machine:I386 /out:"$(OUTDIR)\passsync.exe" /pdbtype:sept
+LINK32_OBJS= \
+ "$(INTDIR)\ntservice.obj" \
+ "$(INTDIR)\passhand.obj" \
+ "$(INTDIR)\service.obj" \
+ "$(INTDIR)\subuniutil.obj" \
+ "$(INTDIR)\syncserv.obj"
+
+"$(OUTDIR)\passsync.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+
+!IF "$(NO_EXTERNAL_DEPS)" != "1"
+!IF EXISTS("passsync.dep")
+!INCLUDE "passsync.dep"
+!ELSE
+!MESSAGE Warning: cannot find "passsync.dep"
+!ENDIF
+!ENDIF
+
+
+!IF "$(CFG)" == "passsync - Win32 Release" || "$(CFG)" == "passsync - Win32 Debug"
+SOURCE=.\ntservice.cpp
+
+"$(INTDIR)\ntservice.obj" : $(SOURCE) "$(INTDIR)"
+
+
+SOURCE=..\passhand.cpp
+
+"$(INTDIR)\passhand.obj" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+SOURCE=.\service.cpp
+
+"$(INTDIR)\service.obj" : $(SOURCE) "$(INTDIR)"
+
+
+SOURCE=.\subuniutil.cpp
+
+"$(INTDIR)\subuniutil.obj" : $(SOURCE) "$(INTDIR)"
+
+
+SOURCE=.\syncserv.cpp
+
+"$(INTDIR)\syncserv.obj" : $(SOURCE) "$(INTDIR)"
+
+
+
+!ENDIF
+
diff --git a/ldap/synctools/passwordsync/passsync/service.cpp b/ldap/synctools/passwordsync/passsync/service.cpp
new file mode 100644
index 00000000..09e0ce68
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/service.cpp
@@ -0,0 +1,295 @@
+// Created: 2-8-2005
+// Author(s): Scott Bridges
+
+#include <windows.h>
+#include <iostream.h>
+#include "syncserv.h"
+#include "dssynchmsg.h"
+// syncserv.h
+// ntservice.h (modified)
+// ntservice.cpp (modified)
+// sysplat
+// uniutil
+// dssynchmsg
+
+// Copied: 2-10-2005
+// From: ntsynch.cpp
+//#include "sysplat.h"
+
+//#include "NTSynch.h"
+//#include "ldapconn.h"
+//#include "dsperson.h"
+#include "synchcmds.h"
+#include "dssynch.h"
+
+#ifdef _DEBUG
+void doDebug( PassSyncService *pSynch );
+#endif // _DEBUG
+
+//#include <nspr.h>
+
+/////////////////////////////////////////////////////////////////
+static void usage()
+{
+ printf( "DS Synchronization Service version %s\n",
+ SYNCH_VERSION );
+ printf( " -%c NUMBER NT polling interval (minutes)\n",
+ SYNCH_CMD_NT_POLL_INTERVAL );
+// printf( " -%c NUMBER DS polling interval (minutes)\n",
+// SYNCH_CMD_DS_POLL_INTERVAL );
+// printf( " -%c CALENDAR NT update schedule\n",
+// SYNCH_CMD_NT_CALENDAR );
+// printf( " -%c CALENDAR DS update schedule\n",
+// SYNCH_CMD_DS_CALENDAR );
+ printf( " -%c NUMBER NT synchronization start time (minutes)\n",
+ SYNCH_CMD_NT_CALENDAR );
+// printf( " -%c NUMBER DS synchronization start time (minutes)\n",
+// SYNCH_CMD_DS_CALENDAR );
+ printf( " -%c NAME DS distinguished name\n",
+ SYNCH_CMD_ADMIN_DN );
+ printf( " -%c USERS_BASE DS users base\n",
+ SYNCH_CMD_DIRECTORY_USERS_BASE );
+ printf( " -%c GROUPS_BASE DS groups base\n",
+ SYNCH_CMD_DIRECTORY_GROUPS_BASE );
+ printf( " -%c HOST DS host\n",
+ SYNCH_CMD_DS_HOST );
+ printf( " -%c NUMBER DS port\n",
+ SYNCH_CMD_DS_PORT );
+ printf( " -%c PASSWORD DS password\n",
+ SYNCH_CMD_ADMIN_PASSWORD );
+ printf( " -%c NUMBER Command port\n",
+ SYNCH_CMD_NT_PORT );
+ printf( " -v Display this message\n",
+ SYNCH_CMD_NT_POLL_INTERVAL );
+ printf( " -i Install the service\n" );
+ printf( " -u Uninstall the service\n" );
+ printf( " -%c Synchronize all NT users to DS now\n",
+ SYNCH_CMD_SYNCH_FROM_NT );
+// printf( " -%c Synchronize DS users to NT now\n",
+// SYNCH_CMD_SYNCH_FROM_DS );
+ printf( " -%c Resynchronize changes to NT users now\n",
+ SYNCH_CMD_SYNCH_CHANGES );
+ printf( " -%c Load settings from Registry\n",
+ SYNCH_CMD_RELOAD_SETTINGS );
+// printf( "Options -t and -k are contradictory, as are -m and -y\n" );
+}
+
+#define OPT_NONE 0
+#define OPT_START 1
+#define OPT_APP 2
+#define OPT_TERMINATE 3
+#define OPT_START_DIRECT 4
+
+/////////////////////////////////////////////////////////////////
+static int checkOptions( PassSyncService *pSynch, int& argc, char *argv[] )
+{
+ int result = OPT_START; // Default is to start the service
+
+ // Check first for uninstall, since we shouldn't do anything else if set
+ int i;
+ for( i = 1; i < argc; i++ )
+ {
+ if ( !strncmp( argv[i], "-u", 2 ) )
+ {
+ // Uninstall
+ if ( !pSynch->IsInstalled() )
+ wprintf( L"%s is not installed\n", pSynch->m_szServiceName );
+ else
+ {
+ // Try and remove the copy that's installed
+ if ( pSynch->Uninstall() )
+ wprintf( L"%s removed\n", pSynch->m_szServiceName );
+ else
+ wprintf( L"Could not remove %s. Error %d\n",
+ pSynch->m_szServiceName, GetLastError() );
+// pSynch->ClearRegistry();
+ }
+ // Terminate after completion
+ result = OPT_TERMINATE;
+ argc = 1;
+ return result;
+ }
+ }
+
+ // Check command-line arguments
+ for( i = 1; i < argc; )
+ {
+ if ( '-' != argv[i][0] )
+ {
+ i++;
+ continue;
+ }
+ char opt = argv[i][1];
+ BOOL bLocal = FALSE;
+
+ // Usage
+ if ( 'v' == opt )
+ {
+ result = OPT_NONE;
+ usage();
+ bLocal = TRUE;
+ }
+ // Secret option to start as app, not service
+ else if ( 'a' == opt )
+ {
+ result = OPT_APP;
+ bLocal = TRUE;
+ }
+ // Start service
+ else if ( 'x' == opt )
+ {
+ result = OPT_START_DIRECT;
+ bLocal = TRUE;
+ }
+/*
+ // Command port
+ else if ( 'c' == opt )
+ {
+ result = OPT_NONE;
+ if ( i < (argc-1) )
+ {
+ i++;
+ pSynch->SetCommandPort( atoi( argv[i] ) );
+ bLocal = TRUE;
+ }
+ }
+*/
+ // Install
+ else if ( 'i' == opt )
+ {
+ result = OPT_NONE;
+ if ( pSynch->IsInstalled() )
+ printf( "%S is already installed\n", pSynch->m_szServiceName );
+ else
+ {
+ // Try and install the copy that's running
+ if ( pSynch->Install() )
+ {
+ printf( "%S installed\n", pSynch->m_szServiceName );
+ }
+ else
+ {
+ printf( "%S failed to install. Error %d\n",
+ pSynch->m_szServiceName, GetLastError() );
+ }
+ }
+ bLocal = TRUE;
+ }
+ // Synchronize from NT to DS
+ // Terminate after completion
+ else if ( 'n' == opt )
+ {
+ result = OPT_NONE;
+ }
+ // Synchronize from DS to NT
+ // Terminate after completion
+ else if ( 's' == opt )
+ {
+ result = OPT_NONE;
+ }
+ // Synchronize both ways
+ // Terminate after completion
+ else if ( 'r' == opt )
+ {
+ result = OPT_NONE;
+ }
+ if ( bLocal )
+ {
+ for( int j = i; j < (argc-1); j++ )
+ {
+ argv[j] = argv[j+1];
+ }
+ argc--;
+ }
+ else
+ {
+ i++;
+ if ( i >= argc )
+ break;
+ }
+ }
+ return result;
+}
+
+static int initialize( PassSyncService *pSynch, int argc, char *argv[] )
+{
+ // Check command-line arguments
+ for( int i = 1; i < argc; i++ )
+ {
+ if ( '-' != argv[i][0] )
+ continue;
+ char opt = argv[i][1];
+
+// pSynch->argToSynch( opt, argv[i] );
+
+ if ( i >= argc )
+ break;
+ }
+ if ( argc > 1 )
+ {
+ // Save settings to Registry
+// pSynch->SaveConfig();
+ }
+
+ return 0;
+}
+
+/////////////////////////////////////////////////////////////////
+
+int
+main( int argc, char *argv[] )
+{
+ // Global single instance
+ PassSyncService theSynch("Password Synchronization Service");
+
+ // Process special install/uninstall switches; this does install/uninstall
+ // It returns non-zero to actually start the service
+ int nStart = checkOptions( &theSynch, argc, argv );
+
+ // Set up configuration
+ if ( OPT_TERMINATE != nStart )
+ initialize( &theSynch, argc, argv );
+
+ // Started by Service Control Manager
+ if ( OPT_START == nStart )
+ {
+ // Start the service; doesn't return until the service is started
+ BOOL bStarted = theSynch.StartService();
+ if ( !bStarted )
+ {
+ printf( "Service could not be started\n" );
+ return(1);
+ }
+ return 0;
+ }
+#if 0
+ // Started from command line
+ else if ( OPT_START_DIRECT == nStart )
+ {
+ // This may fail, but the rest still succeeds
+ BOOL bStarted = theSynch.StartService();
+ bStarted = theSynch.StartServiceDirect();
+ if ( !bStarted )
+ {
+ printf( "Service could not be started\n" );
+ return(1);
+ }
+ return 0;
+ }
+#endif
+ // Secret debugging option - run as app instead of as service
+ else if ( OPT_APP == nStart )
+ {
+ if ( theSynch.OnInit() )
+ theSynch.Run();
+ }
+
+ exit(theSynch.m_Status.dwWin32ExitCode);
+
+
+ ////////// That's it - the rest is debugging stuff //////
+#ifdef _DEBUG
+ doDebug( &theSynch );
+#endif
+ return 0;
+}
diff --git a/ldap/synctools/passwordsync/passsync/subuniutil.cpp b/ldap/synctools/passwordsync/passsync/subuniutil.cpp
new file mode 100644
index 00000000..398e8a76
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/subuniutil.cpp
@@ -0,0 +1,59 @@
+#include "subuniutil.h"
+
+// Copied: 2-8-2005
+// From: secuniutil.c
+unsigned long
+utf8getcc( const char** src )
+{
+ register unsigned long c;
+ register const unsigned char* s = (const unsigned char*)*src;
+ switch (UTF8len [(*s >> 2) & 0x3F]) {
+ case 0: /* erroneous: s points to the middle of a character. */
+ c = (*s++) & 0x3F; goto more5;
+ case 1: c = (*s++); break;
+ case 2: c = (*s++) & 0x1F; goto more1;
+ case 3: c = (*s++) & 0x0F; goto more2;
+ case 4: c = (*s++) & 0x07; goto more3;
+ case 5: c = (*s++) & 0x03; goto more4;
+ case 6: c = (*s++) & 0x01; goto more5;
+ more5: if ((*s & 0xC0) != 0x80) break; c = (c << 6) | ((*s++) & 0x3F);
+ more4: if ((*s & 0xC0) != 0x80) break; c = (c << 6) | ((*s++) & 0x3F);
+ more3: if ((*s & 0xC0) != 0x80) break; c = (c << 6) | ((*s++) & 0x3F);
+ more2: if ((*s & 0xC0) != 0x80) break; c = (c << 6) | ((*s++) & 0x3F);
+ more1: if ((*s & 0xC0) != 0x80) break; c = (c << 6) | ((*s++) & 0x3F);
+ break;
+ }
+ *src = (const char*)s;
+ return c;
+}
+//
+wchar_t *
+ASCIIToUnicode( const char *buf, wchar_t *uni, int inUnilen )
+ /* Convert the 0-terminated UTF-8 string 'buf' to 0-terminated UCS-2;
+ write the result into uni, truncated (if necessary) to fit in 0..unilen-1. */
+ /* XXX This function should be named UTF8ToUnicode */
+ /* XXX unilen should be size_t, not int */
+{
+ auto size_t unilen = (size_t)inUnilen; /* to get rid of warnings for now */
+ auto size_t i;
+ if (unilen > 0 && buf && uni) {
+ for (i = 0; i < unilen; ++i) {
+ register unsigned long c = utf8getcc( &buf );
+ if (c >= 0xfffeUL) c = 0xfffdUL; /* REPLACEMENT CHARACTER */
+ if (0 == (uni[i] = (wchar_t)c)) break;
+ }
+ if (i >= unilen && unilen > 0) {
+ uni[unilen-1] = 0;
+ }
+ }
+ return uni;
+}
+
+wchar_t *
+StrToUnicode( const char *buf )
+{
+ wchar_t unibuf[1024];
+ ASCIIToUnicode( buf, unibuf, sizeof(unibuf) );
+ return _wcsdup( unibuf );
+}
+// End Copy \ No newline at end of file
diff --git a/ldap/synctools/passwordsync/passsync/subuniutil.h b/ldap/synctools/passwordsync/passsync/subuniutil.h
new file mode 100644
index 00000000..49d71f49
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/subuniutil.h
@@ -0,0 +1,20 @@
+#ifndef _SUBUNIUTIL_H_
+#define _SUBUNIUTIL_H_
+
+#include <windows.h>
+
+// Copied: 2-8-2005
+// From: secuniutil.c
+/* From ns/netsite/ldap/libraries/libldap/utf8.c */
+static char UTF8len[64]
+= {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 6};
+// End Copy
+
+unsigned long utf8getcc( const char** src );
+wchar_t * ASCIIToUnicode( const char *buf, wchar_t *uni, int inUnilen );
+wchar_t * StrToUnicode( const char *buf );
+
+#endif
diff --git a/ldap/synctools/passwordsync/passsync/synchcmds.h b/ldap/synctools/passwordsync/passsync/synchcmds.h
new file mode 100644
index 00000000..0b1c4210
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/synchcmds.h
@@ -0,0 +1,55 @@
+/**
+ * PROPRIETARY/CONFIDENTIAL. Use of this product is subject to
+ * license terms. Copyright © 2001 Sun Microsystems, Inc.
+ * Some preexisting portions Copyright © 2001 Netscape Communications Corp.
+ * All rights reserved.
+ */
+/***********************************************************************
+**
+** Copyright 1996 - Netscape Communications Corporation
+**
+** NAME
+** synchcmds.h
+**
+** DESCRIPTION
+** Commands accepted by DS Synchronization Service
+**
+** AUTHOR
+** Rob Weltman <rweltman@netscape.com>
+**
+***********************************************************************/
+
+#ifndef _SYNCHCMDS_H_
+#define _SYNCHCMDS_H_
+
+#define SYNCH_CMD_NT_POLL_INTERVAL 't'
+#define SYNCH_CMD_DS_POLL_INTERVAL 'm'
+#define SYNCH_CMD_ADMIN_DN 'd'
+#define SYNCH_CMD_ADMIN_PASSWORD 'w'
+#define SYNCH_CMD_DIRECTORY_USERS_BASE 'b'
+#define SYNCH_CMD_DIRECTORY_GROUPS_BASE 'f'
+#define SYNCH_CMD_DS_HOST 'h'
+#define SYNCH_CMD_DS_PORT 'p'
+#define SYNCH_CMD_NT_PORT 'c'
+#define SYNCH_CMD_NT_CALENDAR 'k'
+#define SYNCH_CMD_DS_CALENDAR 'y'
+#define SYNCH_CMD_SYNCH_FROM_NT 'n'
+#define SYNCH_CMD_SYNCH_FROM_DS 's'
+#define SYNCH_CMD_SYNCH_CHANGES 'r'
+#define SYNCH_CMD_RELOAD_SETTINGS 'l'
+
+/* LDAP error codes */
+#define SYNCH_ERR_PARTIAL_RESULTS 0x09
+#define SYNCH_ERR_INVALID_DN_SYNTAX 0x22
+#define SYNCH_ERR_INAPPROPRIATE_AUTH 0x30
+#define SYNCH_ERR_INVALID_CREDENTIALS 0x31
+#define SYNCH_ERR_INSUFFICIENT_ACCESS 0x32
+#define SYNCH_ERR_CONNECT_ERROR 0x5b
+
+#define SYNCH_ERR_INVALID_USERS_BASE 100
+#define SYNCH_ERR_INVALID_GROUPS_BASE 200
+#define SYNCH_ERR_INVALID_UID_UNIQUE_BASE 300
+#define SYNCH_ERR_BAD_CONFIG 400
+
+#endif _SYNCHCMDS_H_
+
diff --git a/ldap/synctools/passwordsync/passsync/syncserv.cpp b/ldap/synctools/passwordsync/passsync/syncserv.cpp
new file mode 100644
index 00000000..800e2977
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/syncserv.cpp
@@ -0,0 +1,236 @@
+// Created: 2-8-2005
+// Author(s): Scott Bridges
+#include "syncserv.h"
+
+PassSyncService::PassSyncService(const TCHAR *serviceName) : CNTService(serviceName)
+{
+ HKEY regKey;
+ DWORD type;
+ unsigned long size;
+
+ passhandEventHandle = CreateEvent(NULL, FALSE, FALSE, PASSHAND_EVENT_NAME);
+
+ pLdapConnection = NULL;
+ results = NULL;
+ currentResult = NULL;
+ lastLdapError = LDAP_SUCCESS;
+
+ dataFilename = "C:\\WINDOWS\\system32\\passhook.dat";
+ logFilename = NULL;
+ multipleModify = true;
+
+ ldapHostName = (char*)malloc(REG_BUF_SIZE);
+ ldpaHostPort = (char*)malloc(REG_BUF_SIZE);
+ ldalAuthUsername = (char*)malloc(REG_BUF_SIZE);
+ ldapAuthPassword = (char*)malloc(REG_BUF_SIZE);
+ ldapSearchBase = (char*)malloc(REG_BUF_SIZE);
+ ldapUsernameField = (char*)malloc(REG_BUF_SIZE);
+ ldapPasswordField = (char*)malloc(REG_BUF_SIZE);
+
+ RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\PasswordSync", &regKey);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Host Name", NULL, &type, (unsigned char*)ldapHostName, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Port Number", NULL, &type, (unsigned char*)ldpaHostPort, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "User Name", NULL, &type, (unsigned char*)ldalAuthUsername, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Password", NULL, &type, (unsigned char*)ldapAuthPassword, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Search Base", NULL, &type, (unsigned char*)ldapSearchBase, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "User Name Field", NULL, &type, (unsigned char*)ldapUsernameField, &size);
+ size = REG_BUF_SIZE;
+ RegQueryValueEx(regKey, "Password Field", NULL, &type, (unsigned char*)ldapPasswordField, &size);
+ RegCloseKey(regKey);
+}
+
+PassSyncService::~PassSyncService()
+{
+}
+
+int PassSyncService::SyncPasswords()
+{
+ UNICODE_STRING uUsername;
+ UNICODE_STRING uPassword;
+ char* username;
+ char* password;
+ char* dn;
+
+ if(Connect() < 0)
+ {
+ // ToDo: Generate event connection failure.
+ return -1;
+ }
+
+ ourPasswordHandler.LoadSet(dataFilename);
+
+ while(ourPasswordHandler.PeekUserPass(&uUsername, &uPassword) > -1)
+ {
+
+ username = (char*)malloc(uUsername.Length);
+ password = (char*)malloc(uPassword.Length);
+
+ sprintf(username, "%S", uUsername.Buffer);
+ sprintf(password, "%S", uPassword.Buffer);
+
+ results = NULL;
+ currentResult = NULL;
+ if(QueryUsername(username) < 0)
+ {
+ // ToDo: Generate event search failure.
+ }
+ else
+ {
+ while(dn != NULL)
+ {
+ if(GetDN(&dn) < 0)
+ {
+ // ToDo: Generate event multiple results.
+ }
+ else
+ {
+ if(ModifyPassword(dn, password) < 0)
+ {
+ // ToDo: Generate event modify failure.
+ }
+ else
+ {
+ ourPasswordHandler.PopUserPass();
+ }
+ }
+ }
+ }
+
+ // ToDo: Zero out buffers
+ free(username);
+ free(password);
+ }
+
+ ourPasswordHandler.SaveSet(dataFilename);
+
+ Disconnect();
+
+ return 0;
+}
+
+void PassSyncService::Run()
+{
+ while(true)
+ {
+ WaitForSingleObject(passhandEventHandle, INFINITE);
+ SyncPasswords();
+ ResetEvent(passhandEventHandle);
+ //Sleep(60000);
+ }
+}
+
+int PassSyncService::Connect()
+{
+ pLdapConnection = ldap_init(ldapHostName, atoi(ldpaHostPort));
+
+ lastLdapError = ldap_simple_bind_s(pLdapConnection, ldalAuthUsername, ldapAuthPassword);
+ if(lastLdapError != LDAP_SUCCESS)
+ {
+ // ToDo: Log reason for bind failure.
+ return -1;
+ }
+
+ return 0;
+}
+
+int PassSyncService::Disconnect()
+{
+ ldap_unbind(pLdapConnection);
+
+ pLdapConnection = NULL;
+
+ return 0;
+}
+
+int PassSyncService::QueryUsername(char* username)
+{
+ char* searchFilter = (char*)malloc(strlen(ldapUsernameField) + strlen(username) + 4);
+
+ sprintf(searchFilter, "(%s=%s)", ldapUsernameField, username);
+
+ lastLdapError = ldap_search_ext_s(
+ pLdapConnection,
+ ldapSearchBase,
+ LDAP_SCOPE_ONELEVEL,
+ searchFilter,
+ NULL,
+ 0,
+ NULL,
+ NULL,
+ NULL,
+ -1,
+ &results);
+
+ free(searchFilter);
+
+ if(lastLdapError != LDAP_SUCCESS)
+ {
+ // ToDo: Log reason for search failure.
+ return -1;
+ }
+
+ return 0;
+}
+
+int PassSyncService::GetDN(char** dn)
+{
+ if(multipleModify)
+ {
+ if(currentResult == NULL)
+ {
+ currentResult = ldap_first_entry(pLdapConnection, results);
+ }
+ else
+ {
+ currentResult = ldap_next_entry(pLdapConnection, results);
+ }
+
+ if(currentResult == NULL)
+ {
+ *dn = NULL;
+ return 0;
+ }
+
+ *dn = ldap_get_dn(pLdapConnection, currentResult);
+ return 0;
+ }
+ else
+ {
+ currentResult = ldap_first_entry(pLdapConnection, results);
+ if(ldap_next_entry(pLdapConnection, results) != NULLMSG)
+ {
+ // ToDo: Log that multiple results for username were found.
+ *dn = NULL;
+ return -1;
+ }
+
+ *dn = ldap_get_dn(pLdapConnection, currentResult);
+ return 0;
+ }
+}
+
+int PassSyncService::ModifyPassword(char* dn, char* password)
+{
+ LDAPMod passMod;
+ LDAPMod* mods[2] = {&passMod, NULL};
+ char* modValues[2] = {password, NULL};
+
+ passMod.mod_type = ldapPasswordField;
+ passMod.mod_op = LDAP_MOD_REPLACE;
+ passMod.mod_values = modValues;
+
+ lastLdapError = ldap_modify_ext_s(pLdapConnection, dn, mods, NULL, NULL);
+ if(lastLdapError != LDAP_SUCCESS)
+ {
+ // ToDo: Log the reason for the modify failure.
+ return -1;
+ }
+
+ return 0;
+} \ No newline at end of file
diff --git a/ldap/synctools/passwordsync/passsync/syncserv.h b/ldap/synctools/passwordsync/passsync/syncserv.h
new file mode 100644
index 00000000..64b95260
--- /dev/null
+++ b/ldap/synctools/passwordsync/passsync/syncserv.h
@@ -0,0 +1,55 @@
+// Created: 2-8-2005
+// Author(s): Scott Bridges
+#ifndef _SYNCSERV_H_
+#define _SYNCSERV_H_
+
+#include <stdio.h>
+#include <ldap.h>
+#include <ldap_ssl.h>
+#include "ntservice.h"
+#include "../passhand.h"
+
+#define REG_BUF_SIZE 64
+
+class PassSyncService : public CNTService
+{
+public:
+ PassSyncService(const TCHAR* serviceName);
+ ~PassSyncService();
+
+ void Run();
+
+ // ToDo: Move to private.
+ int Connect();
+ int Disconnect();
+ int QueryUsername(char* username);
+ int GetDN(char** dn);
+ int ModifyPassword(char* dn, char* password);
+
+ int SyncPasswords();
+
+private:
+
+ PasswordHandler ourPasswordHandler;
+ HANDLE passhandEventHandle;
+
+ // LDAP variables
+ LDAP* pLdapConnection;
+ LDAPMessage* results;
+ LDAPMessage* currentResult;
+ int lastLdapError;
+
+ // Config variables
+ char* dataFilename;
+ char* logFilename;
+ char* ldapHostName;
+ char* ldpaHostPort;
+ char* ldalAuthUsername;
+ char* ldapAuthPassword;
+ char* ldapSearchBase;
+ char* ldapUsernameField;
+ char* ldapPasswordField;
+ bool multipleModify;
+};
+
+#endif \ No newline at end of file
diff --git a/ldap/synctools/passwordsync/wix/PassSync.wxs b/ldap/synctools/passwordsync/wix/PassSync.wxs
new file mode 100644
index 00000000..3cefe39f
--- /dev/null
+++ b/ldap/synctools/passwordsync/wix/PassSync.wxs
@@ -0,0 +1,1210 @@
+<?xml version='1.0' encoding='windows-1252'?>
+<Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'>
+ <Product Name='Password Sync' Id='DB501C18-86C7-4D14-AEC0-86416A69ABDE'
+ Language='1033' Codepage='1252'
+ Version='1.0.0' Manufacturer='Acme Ltd.'>
+
+ <Package Id='????????-????-????-????-????????????' Keywords='Installer'
+ Description="Password Synchronization Installer"
+ Comments='Foobar is a registered trademark of Acme Ltd.' Manufacturer='Acme Ltd.'
+ InstallerVersion='100' Languages='1033' Compressed='yes' SummaryCodepage='1252' />
+
+ <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt="CD-ROM #1" />
+ <Property Id='DiskPrompt' Value="Password Sync Installation [1]" />
+
+ <Directory Id='TARGETDIR' Name='SourceDir'>
+
+ <Directory Id='WinDir' Name='WinDir' LongName='WINDOWS'>
+ <Directory Id='SysDir' Name='SysDir' LongName='system32'>
+ <Component Id='HelperLibrary' Guid='5C4B892B-6BE3-460D-A14F-75658D16550B'>
+ <File Id='PasshookDLL' Name='passhook.dll' DiskId='1' src='passhook.dll' Vital='yes' />
+ </Component>
+ </Directory>
+ </Directory>
+ <Directory Id='ProgramFilesFolder' Name='PFiles'>
+
+ <Directory Id='INSTALLDIR' Name='PassSync' LongName='Password Synchronization'>
+
+ <Component Id='MainExecutable' Guid='DCEECAA4-83F1-4F22-985B-FDB3C8ABD471'>
+ <File Id='PassSyncEXE' Name='PassSync.exe' LongName='passsync.exe' DiskId='1'
+ src='passsync.exe' Vital='yes' />
+ <Shortcut Id="startmenuPassSync" Directory="ProgramMenuDir" Name="PassSync"
+ LongName="Password Synchronization" Target="MainProgram" WorkingDirectory='INSTALLDIR'
+ Icon="PassSync.exe" IconIndex="0" />
+ <Shortcut Id="desktopPassSync" Directory="DesktopFolder" Name="PassSync"
+ LongName="Password Synchronization" Target="MainProgram" WorkingDirectory='INSTALLDIR'
+ Icon="PassSync.exe" IconIndex="0" />
+
+ <ServiceInstall Id='PassSyncEXE' Name='PassSync' DisplayName='Password Synchronization' Type='ownProcess'
+ Interactive='yes' Start='auto' Vital='yes' ErrorControl='normal'/>
+ <ServiceControl Id='PassSyncEXE' Name='PassSync' Start='install' Stop='both' Remove='uninstall' Wait='yes'/>
+
+
+ <Registry Id='HostName' Root='HKLM' Key='Software\PasswordSync' Name='Host Name' Action='write' Type='string' Value='[HOSTNAME]' />
+ <Registry Id='PortNum' Root='HKLM' Key='Software\PasswordSync' Name='Port Number' Action='write' Type='string' Value='[PORTNUM]' />
+ <Registry Id='UserName' Root='HKLM' Key='Software\PasswordSync' Name='User Name' Action='write' Type='string' Value='[USER]' />
+ <Registry Id='Password' Root='HKLM' Key='Software\PasswordSync' Name='Password' Action='write' Type='string' Value='[PASSWORD]' />
+ <Registry Id='SrchBase' Root='HKLM' Key='Software\PasswordSync' Name='Search Base' Action='write' Type='string' Value='[SRCHBASE]' />
+ <Registry Id='UserFld' Root='HKLM' Key='Software\PasswordSync' Name='User Name Field' Action='write' Type='string' Value='ntuserdomainid' />
+ <Registry Id='PassFld' Root='HKLM' Key='Software\PasswordSync' Name='Password Field' Action='write' Type='string' Value='ntusercomment' />
+ <Registry Id='NotPkgs' Root='HKLM' Key='SYSTEM\ControlSet001\Control\Lsa' Name='Notification Packages' Action='append'
+ Type='multiString' Value='passhook'/>
+
+ </Component>
+
+ </Directory>
+ </Directory>
+
+ <Directory Id="ProgramMenuFolder" Name="PMenu" LongName="Programs">
+ <Directory Id="ProgramMenuDir" Name='Foobar10' LongName="Foobar 1.0" />
+ </Directory>
+
+ <Directory Id="DesktopFolder" Name="Desktop" />
+ </Directory>
+
+ <Feature Id='Complete' Title='Foobar 1.0' Description='The complete package.'
+ TypicalDefault='install' Display='expand' Level='1'
+ ConfigurableDirectory='INSTALLDIR'>
+ <Feature Id='MainProgram' Title='Program' Description='The main executable.'
+ TypicalDefault='install' Level='1'>
+ <ComponentRef Id='MainExecutable' />
+ <ComponentRef Id='HelperLibrary' />
+ </Feature>
+ </Feature>
+
+ <UI>
+ <Property Id="DefaultUIFont">DlgFont8</Property>
+ <Property Id="ErrorDialog">ErrorDlg</Property>
+
+ <Dialog Id="AdminWelcomeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
+ <Publish Property="InstallMode" Value="Server Image">1</Publish>
+ <Publish Event="NewDialog" Value="AdminRegistrationDlg">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[DialogBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Back]" />
+ <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="30" Transparent="yes" NoPrefix="yes">
+ <Text>The [Wizard] will create a server image of [ProductName], at a specified network location. Click Next to continue or Cancel to exit the [Wizard].</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>{\VerdanaBold13}Welcome to the [ProductName] [Wizard]</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="PrepareDlg" Width="370" Height="270" Title="[ProductName] [Setup]" Modeless="yes">
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[DialogBitmap]" />
+ <Control Id="ActionText" Type="Text" X="135" Y="100" Width="220" Height="20" Transparent="yes" NoPrefix="yes">
+ <Subscribe Event="ActionText" Attribute="Text" />
+ </Control>
+ <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Please wait while the [Wizard] prepares to guide you through the installation.</Text>
+ </Control>
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" TabSkip="yes" Text="[ButtonText_Next]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" TabSkip="yes" Text="[ButtonText_Back]" />
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>{\VerdanaBold13}Welcome to the [ProductName] [Wizard]</Text>
+ </Control>
+ <Control Id="ActionData" Type="Text" X="135" Y="125" Width="220" Height="30" Transparent="yes" NoPrefix="yes">
+ <Subscribe Event="ActionData" Attribute="Text" />
+ </Control>
+ </Dialog>
+
+ <Dialog Id="ProgressDlg" Width="370" Height="270" Title="[ProductName] [Setup]" Modeless="yes">
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Back]" />
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Next]" />
+ <Control Id="ActionText" Type="Text" X="70" Y="100" Width="265" Height="10">
+ <Subscribe Event="ActionText" Attribute="Text" />
+ </Control>
+ <Control Id="Text" Type="Text" X="35" Y="65" Width="300" Height="20">
+ <Text>Please wait while the [Wizard] [Progress2] [ProductName]. This may take several minutes.</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="20" Y="15" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont][Progress1] [ProductName]</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ <Control Id="ProgressBar" Type="ProgressBar" X="35" Y="115" Width="300" Height="10" ProgressBlocks="yes" Text="Progress done">
+ <Subscribe Event="SetProgress" Attribute="Progress" />
+ </Control>
+ <Control Id="StatusLabel" Type="Text" X="35" Y="100" Width="35" Height="10" Text="Status:" />
+ </Dialog>
+
+ <Dialog Id="UserExit" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Finish]">
+ <Publish Event="EndDialog" Value="Exit">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Cancel]" />
+ <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[DialogBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Back]" />
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>{\VerdanaBold13}[ProductName] [Wizard] was interrupted</Text>
+ </Control>
+ <Control Id="Description1" Type="Text" X="135" Y="70" Width="220" Height="40" Transparent="yes" NoPrefix="yes">
+ <Text>[ProductName] setup was interrupted. Your system has not been modified. To install this program at a later time, please run the installation again.</Text>
+ </Control>
+ <Control Id="Description2" Type="Text" X="135" Y="115" Width="220" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Click the Finish button to exit the [Wizard].</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="FatalError" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Finish]">
+ <Publish Event="EndDialog" Value="Exit">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Cancel]" />
+ <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[DialogBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Back]" />
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>{\VerdanaBold13}[ProductName] [Wizard] ended prematurely</Text>
+ </Control>
+ <Control Id="Description1" Type="Text" X="135" Y="70" Width="220" Height="40" Transparent="yes" NoPrefix="yes">
+ <Text>[ProductName] setup ended prematurely because of an error. Your system has not been modified. To install this program at a later time, please run the installation again.</Text>
+ </Control>
+ <Control Id="Description2" Type="Text" X="135" Y="115" Width="220" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Click the Finish button to exit the [Wizard].</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="ExitDialog" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Finish" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Finish]">
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Cancel]" />
+ <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[DialogBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Back]" />
+ <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Click the Finish button to exit the [Wizard].</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>{\VerdanaBold13}Completing the [ProductName] [Wizard]</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="AdminBrowseDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="PathEdit" Type="PathEdit" X="84" Y="202" Width="261" Height="17" Property="TARGETDIR" />
+ <Control Id="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_OK]">
+ <Publish Event="SetTargetPath" Value="TARGETDIR">1</Publish>
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="240" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="Reset" Value="0">1</Publish>
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="ComboLabel" Type="Text" X="25" Y="58" Width="44" Height="10" TabSkip="no" Text="&amp;Look in:" />
+ <Control Id="DirectoryCombo" Type="DirectoryCombo" X="70" Y="55" Width="220" Height="80" Property="TARGETDIR" Removable="yes" Fixed="yes" Remote="yes">
+ <Subscribe Event="IgnoreChange" Attribute="IgnoreChange" />
+ </Control>
+ <Control Id="Up" Type="PushButton" X="298" Y="55" Width="19" Height="19" ToolTip="Up One Level" Icon="yes" FixedSize="yes" IconSize="16" Text="Up">
+ <Publish Event="DirectoryListUp" Value="0">1</Publish>
+ </Control>
+ <Control Id="NewFolder" Type="PushButton" X="325" Y="55" Width="19" Height="19" ToolTip="Create A New Folder" Icon="yes" FixedSize="yes" IconSize="16" Text="New">
+ <Publish Event="DirectoryListNew" Value="0">1</Publish>
+ </Control>
+ <Control Id="DirectoryList" Type="DirectoryList" X="25" Y="83" Width="320" Height="110" Property="TARGETDIR" Sunken="yes" TabSkip="no" />
+ <Control Id="PathLabel" Type="Text" X="25" Y="205" Width="59" Height="10" TabSkip="no" Text="&amp;Folder name:" />
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>Browse to the destination folder</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Change current destination folder</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="AdminInstallPointDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Text" Type="Text" X="25" Y="80" Width="320" Height="10" TabSkip="no">
+ <Text>&amp;Enter a new network location or click Browse to browse to one.</Text>
+ </Control>
+ <Control Id="PathEdit" Type="PathEdit" X="25" Y="93" Width="320" Height="18" Property="TARGETDIR" />
+ <Control Id="Browse" Type="PushButton" X="289" Y="119" Width="56" Height="17" Text="[ButtonText_Browse]">
+ <Publish Event="SpawnDialog" Value="AdminBrowseDlg">1</Publish>
+ </Control>
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="AdminRegistrationDlg">1</Publish>
+ </Control>
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
+ <Publish Event="SetTargetPath" Value="TARGETDIR">1</Publish>
+ <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="20" Width="280" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Please specify a network location for the server image of [ProductName] product</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Network Location</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="AdminRegistrationDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="OrganizationLabel" Type="Text" X="45" Y="71" Width="285" Height="30" TabSkip="no">
+ <Text>&amp;Please enter the name of your organization in the box below. This will be used as default company name for subsequent installations of [ProductName]:</Text>
+ </Control>
+ <Control Id="OrganizationEdit" Type="Edit" X="45" Y="105" Width="220" Height="18" Property="COMPANYNAME" Text="{80}" />
+ <Control Id="CDKeyLabel" Type="Text" X="45" Y="130" Width="50" Height="10" TabSkip="no">
+ <Text>CD &amp;Key:</Text>
+ </Control>
+ <Control Id="CDKeyEdit" Type="MaskedEdit" X="45" Y="143" Width="250" Height="16" Property="PIDKEY" Text="[PortTemplate]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Image="yes" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="AdminWelcomeDlg">1</Publish>
+ </Control>
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
+ <Publish Event="ValidateProductID" Value="0">0</Publish>
+ <Publish Event="NewDialog" Value="AdminInstallPointDlg">ProductID</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>Please enter your company information</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Company Information</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="BrowseDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="PathEdit" Type="PathEdit" X="84" Y="202" Width="261" Height="18" Property="_BrowseProperty" Indirect="yes" />
+ <Control Id="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_OK]">
+ <Publish Event="SetTargetPath" Value="[_BrowseProperty]">1</Publish>
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="240" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="Reset" Value="0">1</Publish>
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="ComboLabel" Type="Text" X="25" Y="58" Width="44" Height="10" TabSkip="no" Text="&amp;Look in:" />
+ <Control Id="DirectoryCombo" Type="DirectoryCombo" X="70" Y="55" Width="220" Height="80" Property="_BrowseProperty" Indirect="yes" Fixed="yes" Remote="yes">
+ <Subscribe Event="IgnoreChange" Attribute="IgnoreChange" />
+ </Control>
+ <Control Id="Up" Type="PushButton" X="298" Y="55" Width="19" Height="19" ToolTip="Up One Level" Icon="yes" FixedSize="yes" IconSize="16" Text="Up">
+ <Publish Event="DirectoryListUp" Value="0">1</Publish>
+ </Control>
+ <Control Id="NewFolder" Type="PushButton" X="325" Y="55" Width="19" Height="19" ToolTip="Create A New Folder" Icon="yes" FixedSize="yes" IconSize="16" Text="New">
+ <Publish Event="DirectoryListNew" Value="0">1</Publish>
+ </Control>
+ <Control Id="DirectoryList" Type="DirectoryList" X="25" Y="83" Width="320" Height="110" Property="_BrowseProperty" Sunken="yes" Indirect="yes" TabSkip="no" />
+ <Control Id="PathLabel" Type="Text" X="25" Y="205" Width="59" Height="10" TabSkip="no" Text="&amp;Folder name:" />
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>Browse to the destination folder</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Change current destination folder</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="CancelDlg" Width="260" Height="85" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="No" Type="PushButton" X="132" Y="57" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_No]">
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="Yes" Type="PushButton" X="72" Y="57" Width="56" Height="17" Text="[ButtonText_Yes]">
+ <Publish Event="EndDialog" Value="Exit">1</Publish>
+ </Control>
+ <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30">
+ <Text>Are you sure you want to cancel [ProductName] installation?</Text>
+ </Control>
+ <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Information icon" FixedSize="yes" IconSize="32" Text="[InfoIcon]" />
+ </Dialog>
+
+ <Dialog Id="CustomizeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes" TrackDiskSpace="yes">
+ <Control Id="Tree" Type="SelectionTree" X="25" Y="85" Width="175" Height="95" Property="_BrowseProperty" Sunken="yes" TabSkip="no" Text="Tree of selections" />
+ <Control Id="Browse" Type="PushButton" X="304" Y="200" Width="56" Height="17" Text="[ButtonText_Browse]">
+ <Publish Event="SelectionBrowse" Value="BrowseDlg">1</Publish>
+ <Condition Action="hide">Installed</Condition>
+ </Control>
+ <Control Id="Reset" Type="PushButton" X="42" Y="243" Width="56" Height="17" Text="[ButtonText_Reset]">
+ <Publish Event="Reset" Value="0">1</Publish>
+ <Subscribe Event="SelectionNoItems" Attribute="Enabled" />
+ </Control>
+ <Control Id="DiskCost" Type="PushButton" X="111" Y="243" Width="56" Height="17">
+ <Text>Disk &amp;Usage</Text>
+ <Publish Event="SpawnDialog" Value="DiskCostDlg">1</Publish>
+ <Subscribe Event="SelectionNoItems" Attribute="Enabled" />
+ </Control>
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="MaintenanceTypeDlg"><![CDATA[InstallMode = "Change"]]></Publish>
+ <Publish Event="NewDialog" Value="SetupTypeDlg"><![CDATA[InstallMode = "Custom"]]></Publish>
+ </Control>
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
+ <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ <Subscribe Event="SelectionNoItems" Attribute="Enabled" />
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>Select the way you want features to be installed.</Text>
+ </Control>
+ <Control Id="Text" Type="Text" X="25" Y="55" Width="320" Height="20">
+ <Text>Click on the icons in the tree below to change the way features will be installed.</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Custom Setup</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ <Control Id="Box" Type="GroupBox" X="210" Y="81" Width="140" Height="98" />
+ <Control Id="ItemDescription" Type="Text" X="215" Y="90" Width="131" Height="30">
+ <Text>Multiline description of the currently selected item.</Text>
+ <Subscribe Event="SelectionDescription" Attribute="Text" />
+ </Control>
+ <Control Id="ItemSize" Type="Text" X="215" Y="130" Width="131" Height="45">
+ <Text>The size of the currently selected item.</Text>
+ <Subscribe Event="SelectionSize" Attribute="Text" />
+ </Control>
+ <Control Id="Location" Type="Text" X="75" Y="200" Width="215" Height="20">
+ <Text>&lt;The selection's path&gt;</Text>
+ <Subscribe Event="SelectionPath" Attribute="Text" />
+ <Subscribe Event="SelectionPathOn" Attribute="Visible" />
+ <Condition Action="hide">Installed</Condition>
+ </Control>
+ <Control Id="LocationLabel" Type="Text" X="25" Y="200" Width="50" Height="10" Text="Location:">
+ <Subscribe Event="SelectionPathOn" Attribute="Visible" />
+ <Condition Action="hide">Installed</Condition>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="DiskCostDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_OK]">
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>The disk space required for the installation of the selected features.</Text>
+ </Control>
+ <Control Id="Text" Type="Text" X="20" Y="53" Width="330" Height="40">
+ <Text>The highlighted volumes (if any) do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s).</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Disk Space Requirements</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ <Control Id="VolumeList" Type="VolumeCostList" X="20" Y="100" Width="330" Height="120" Sunken="yes" Fixed="yes" Remote="yes">
+ <Text>{120}{70}{70}{70}{70}</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="ErrorDlg" Width="270" Height="105" Title="Installer Information" ErrorDialog="yes" NoMinimize="yes">
+ <Control Id="ErrorText" Type="Text" X="48" Y="15" Width="205" Height="60" TabSkip="no" Text="Information text" />
+ <Control Id="Y" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="[ButtonText_Yes]">
+ <Publish Event="EndDialog" Value="ErrorYes">1</Publish>
+ </Control>
+ <Control Id="A" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="EndDialog" Value="ErrorAbort">1</Publish>
+ </Control>
+ <Control Id="C" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="EndDialog" Value="ErrorCancel">1</Publish>
+ </Control>
+ <Control Id="ErrorIcon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Information icon" FixedSize="yes" IconSize="32" Text="[InfoIcon]" />
+ <Control Id="I" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="[ButtonText_Ignore]">
+ <Publish Event="EndDialog" Value="ErrorIgnore">1</Publish>
+ </Control>
+ <Control Id="N" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="[ButtonText_No]">
+ <Publish Event="EndDialog" Value="ErrorNo">1</Publish>
+ </Control>
+ <Control Id="O" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="[ButtonText_OK]">
+ <Publish Event="EndDialog" Value="ErrorOk">1</Publish>
+ </Control>
+ <Control Id="R" Type="PushButton" X="100" Y="80" Width="56" Height="17" TabSkip="yes" Text="[ButtonText_Retry]">
+ <Publish Event="EndDialog" Value="ErrorRetry">1</Publish>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="FilesInUse" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes" KeepModeless="yes">
+ <Control Id="Retry" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Retry]">
+ <Publish Event="EndDialog" Value="Retry">1</Publish>
+ </Control>
+ <Control Id="Ignore" Type="PushButton" X="235" Y="243" Width="56" Height="17" Text="[ButtonText_Ignore]">
+ <Publish Event="EndDialog" Value="Ignore">1</Publish>
+ </Control>
+ <Control Id="Exit" Type="PushButton" X="166" Y="243" Width="56" Height="17" Text="[ButtonText_Exit]">
+ <Publish Event="EndDialog" Value="Exit">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="20" Y="23" Width="280" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Some files that need to be updated are currently in use.</Text>
+ </Control>
+ <Control Id="Text" Type="Text" X="20" Y="55" Width="330" Height="30">
+ <Text>The following applications are using files that need to be updated by this setup. Close these applications and then click Retry to continue the installation or Cancel to exit it.</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Files in Use</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ <Control Id="List" Type="ListBox" X="20" Y="87" Width="330" Height="130" Property="FileInUseProcess" Sunken="yes" TabSkip="yes" />
+ </Dialog>
+
+ <Dialog Id="LicenseAgreementDlg" Width="370" Height="270" Title="[ProductName] License Agreement" NoMinimize="yes">
+ <Control Id="Buttons" Type="RadioButtonGroup" X="20" Y="187" Width="330" Height="40" Property="IAgree" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="WelcomeDlg">1</Publish>
+ </Control>
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
+ <Publish Event="NewDialog" Value="UserRegistrationDlg"><![CDATA[IAgree = "Yes" AND ShowUserRegistrationDlg = 1]]></Publish>
+ <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">CostingComplete = 1</Publish>
+ <Publish Event="NewDialog" Value="SetupTypeDlg"><![CDATA[IAgree = "Yes" AND ShowUserRegistrationDlg <> 1]]></Publish>
+ <Condition Action="disable"><![CDATA[IAgree <> "Yes"]]></Condition>
+ <Condition Action="enable">IAgree = "Yes"</Condition>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="AgreementText" Type="ScrollableText" X="20" Y="60" Width="330" Height="120" Sunken="yes" TabSkip="no">
+ <Text src="Binary/License.rtf" />
+ </Control>
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>Please read the following license agreement carefully</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]End-User License Agreement</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="MaintenanceTypeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="ChangeLabel" Type="Text" X="105" Y="65" Width="100" Height="10" TabSkip="no">
+ <Text>[DlgTitleFont]&amp;Modify</Text>
+ </Control>
+ <Control Id="ChangeButton" Type="PushButton" X="50" Y="65" Width="38" Height="38" ToolTip="Modify Installation" Default="yes" Icon="yes" FixedSize="yes" IconSize="32" Text="[CustomSetupIcon]">
+ <Publish Property="InstallMode" Value="Change">1</Publish>
+ <Publish Property="Progress1" Value="Changing">1</Publish>
+ <Publish Property="Progress2" Value="changes">1</Publish>
+ <Publish Event="NewDialog" Value="UserRegistrationDlg">1</Publish>
+ </Control>
+ <Control Id="RepairLabel" Type="Text" X="105" Y="114" Width="100" Height="10" TabSkip="no">
+ <Text>[DlgTitleFont]Re&amp;pair</Text>
+ </Control>
+ <Control Id="RepairButton" Type="PushButton" X="50" Y="114" Width="38" Height="38" ToolTip="Repair Installation" Icon="yes" FixedSize="yes" IconSize="32" Text="[RepairIcon]">
+ <Publish Property="InstallMode" Value="Repair">1</Publish>
+ <Publish Property="Progress1" Value="Repairing">1</Publish>
+ <Publish Property="Progress2" Value="repaires">1</Publish>
+ <Publish Event="NewDialog" Value="VerifyRepairDlg">1</Publish>
+ </Control>
+ <Control Id="RemoveLabel" Type="Text" X="105" Y="163" Width="100" Height="10" TabSkip="no">
+ <Text>[DlgTitleFont]&amp;Remove</Text>
+ </Control>
+ <Control Id="RemoveButton" Type="PushButton" X="50" Y="163" Width="38" Height="38" ToolTip="Remove Installation" Icon="yes" FixedSize="yes" IconSize="32" Text="[RemoveIcon]">
+ <Publish Property="InstallMode" Value="Remove">1</Publish>
+ <Publish Property="Progress1" Value="Removing">1</Publish>
+ <Publish Property="Progress2" Value="removes">1</Publish>
+ <Publish Event="NewDialog" Value="VerifyRemoveDlg">1</Publish>
+ </Control>
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
+ </Control>
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Next]" />
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Select the operation you wish to perform.</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="240" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Modify, Repair or Remove installation</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ <Control Id="ChangeText" Type="Text" X="105" Y="78" Width="230" Height="20">
+ <Text>Allows users to change the way features are installed.</Text>
+ </Control>
+ <Control Id="RemoveText" Type="Text" X="105" Y="176" Width="230" Height="20">
+ <Text>Removes [ProductName] from your computer.</Text>
+ </Control>
+ <Control Id="RepairText" Type="Text" X="105" Y="127" Width="230" Height="30">
+ <Text>Repairs errors in the most recent installation state - fixes missing or corrupt files, shortcuts and registry entries.</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="MaintenanceWelcomeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
+ <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">CostingComplete = 1</Publish>
+ <Publish Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[DialogBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Back]" />
+ <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>The [Wizard] will allow you to change the way [ProductName] features are installed on your computer or even to remove [ProductName] from your computer. Click Next to continue or Cancel to exit the [Wizard].</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>{\VerdanaBold13}Welcome to the [ProductName] [Wizard]</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="OutOfDiskDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_OK]">
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Disk space required for the installation exceeds available disk space.</Text>
+ </Control>
+ <Control Id="Text" Type="Text" X="20" Y="53" Width="330" Height="40">
+ <Text>The highlighted volumes do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s).</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Out of Disk Space</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ <Control Id="VolumeList" Type="VolumeCostList" X="20" Y="100" Width="330" Height="120" Sunken="yes" Fixed="yes" Remote="yes">
+ <Text>{120}{70}{70}{70}{70}</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="OutOfRbDiskDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="No" Type="PushButton" X="304" Y="243" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_No]">
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="Yes" Type="PushButton" X="240" Y="243" Width="56" Height="17" Text="[ButtonText_Yes]">
+ <Publish Event="EnableRollback" Value="False">1</Publish>
+ <Publish Event="EndDialog" Value="Return">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Transparent="yes" NoPrefix="yes">
+ <Text>Disk space required for the installation exceeds available disk space.</Text>
+ </Control>
+ <Control Id="Text" Type="Text" X="20" Y="53" Width="330" Height="40">
+ <Text>The highlighted volumes do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s).</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Out of Disk Space</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ <Control Id="VolumeList" Type="VolumeCostList" X="20" Y="140" Width="330" Height="80" Sunken="yes" Fixed="yes" Remote="yes" ShowRollbackCost="yes">
+ <Text>{120}{70}{70}{70}{70}</Text>
+ </Control>
+ <Control Id="Text2" Type="Text" X="20" Y="94" Width="330" Height="40">
+ <Text>Alternatively, you may choose to disable the installer's rollback functionality. This allows the installer to restore your computer's original state should the installation be interrupted in any way. Click Yes if you wish to take the risk to disable rollback.</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="ResumeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Install" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Install]">
+ <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">CostingComplete = 1</Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)]]></Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"]]></Publish>
+ <Publish Event="EnableRollback" Value="False"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfDiskDlg"><![CDATA[(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")]]></Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[DialogBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Back]" />
+ <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="30" Transparent="yes" NoPrefix="yes">
+ <Text>The [Wizard] will complete the installation of [ProductName] on your computer. Click Install to continue or Cancel to exit the [Wizard].</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>{\VerdanaBold13}Resuming the [ProductName] [Wizard]</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="SetupTypeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="TypicalLabel" Type="Text" X="105" Y="65" Width="100" Height="10" TabSkip="no">
+ <Text>[DlgTitleFont]&amp;Typical</Text>
+ </Control>
+ <Control Id="TypicalButton" Type="PushButton" X="50" Y="65" Width="38" Height="38" ToolTip="Typical Installation" Default="yes" Icon="yes" FixedSize="yes" IconSize="32" Text="[InstallerIcon]">
+ <Publish Property="InstallMode" Value="Typical">1</Publish>
+ <Publish Event="SetInstallLevel" Value="3">1</Publish>
+ <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ </Control>
+ <Control Id="CustomLabel" Type="Text" X="105" Y="118" Width="100" Height="10" TabSkip="no">
+ <Text>[DlgTitleFont]C&amp;ustom</Text>
+ </Control>
+ <Control Id="CustomButton" Type="PushButton" X="50" Y="118" Width="38" Height="38" ToolTip="Custom Installation" Icon="yes" FixedSize="yes" IconSize="32" Text="[CustomSetupIcon]">
+ <Publish Property="InstallMode" Value="Custom">1</Publish>
+ <Publish Event="NewDialog" Value="CustomizeDlg">1</Publish>
+ </Control>
+ <Control Id="CompleteLabel" Type="Text" X="105" Y="171" Width="100" Height="10" TabSkip="no">
+ <Text>[DlgTitleFont]C&amp;omplete</Text>
+ </Control>
+ <Control Id="CompleteButton" Type="PushButton" X="50" Y="171" Width="38" Height="38" ToolTip="Complete Installation" Icon="yes" FixedSize="yes" IconSize="32" Text="[CompleteSetupIcon]">
+ <Publish Property="InstallMode" Value="Complete">1</Publish>
+ <Publish Event="SetInstallLevel" Value="1000">1</Publish>
+ <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ </Control>
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="LicenseAgreementDlg"><![CDATA[ShowUserRegistrationDlg <> 1]]></Publish>
+ <Publish Event="NewDialog" Value="UserRegistrationDlg">ShowUserRegistrationDlg = 1</Publish>
+ </Control>
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Next]" />
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>Choose the setup type that best suits your needs</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Choose Setup Type</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ <Control Id="CompleteText" Type="Text" X="105" Y="184" Width="230" Height="20">
+ <Text>All program features will be installed. (Requires most disk space)</Text>
+ </Control>
+ <Control Id="CustomText" Type="Text" X="105" Y="131" Width="230" Height="30">
+ <Text>Allows users to choose which program features will be installed and where they will be installed. Recommended for advanced users.</Text>
+ </Control>
+ <Control Id="TypicalText" Type="Text" X="105" Y="78" Width="230" Height="20">
+ <Text>Installs the most common program features. Recommended for most users.</Text>
+ </Control>
+ </Dialog>
+
+ <Dialog Id="UserRegistrationDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="HostLabel" Type="Text" X="45" Y="73" Width="50" Height="15" TabSkip="no" Text="&amp;Host Name:" />
+ <Control Id="HostEdit" Type="Edit" X="100" Y="71" Width="220" Height="18" Property="HOSTNAME"/>
+ <Control Id="PortLabel" Type="Text" X="45" Y="100" Width="50" Height="15" TabSkip="no" Text="&amp;Port Number:" />
+ <Control Id="PortEdit" Type="MaskedEdit" X="100" Y="98" Width="220" Height="18" Property="PORTNUM" Text="[PortTemplate]" />
+ <Control Id="UserLabel" Type="Text" X="45" Y="127" Width="50" Height="15" TabSkip="no" Text="&amp;User Name:" />
+ <Control Id="UserEdit" Type="Edit" X="100" Y="125" Width="220" Height="18" Property="USER"/>
+ <Control Id="PwdLabel" Type="Text" X="45" Y="154" Width="50" Height="15" TabSkip="no" Text="&amp;Password:"/>
+ <Control Id="PwdEdit" Type="Edit" Password="yes" X="100" Y="152" Width="220" Height="18" Property="PASSWORD"/>
+ <Control Id="SBLabel" Type="Text" X="45" Y="181" Width="50" Height="15" TabSkip="no" Text="&amp;Search Base:"/>
+ <Control Id="SBEdit" Type="Edit" X="100" Y="179" Width="220" Height="18" Property="SRCHBASE"/>
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="WelcomeDlg">1</Publish>
+ </Control>
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
+ <Publish Event="SpawnWaitDialog" Value="WaitForCostingDlg">CostingComplete = 1</Publish>
+ <Publish Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>Please enter your password synchronization information</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Password Synchronization Information</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="VerifyReadyDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes" TrackDiskSpace="yes">
+ <Control Id="Install" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Install]">
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)]]></Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"]]></Publish>
+ <Publish Event="EnableRollback" Value="False"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfDiskDlg"><![CDATA[(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")]]></Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="UserRegistrationDlg">1</Publish>
+ </Control>
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>The [Wizard] is ready to begin the [InstallMode] installation</Text>
+ </Control>
+ <Control Id="Text" Type="Text" X="25" Y="70" Width="320" Height="20">
+ <Text>Click Install to begin the installation. If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard.</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Ready to Install</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="VerifyRemoveDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes" TrackDiskSpace="yes">
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
+ </Control>
+ <Control Id="Remove" Type="PushButton" X="236" Y="243" Width="56" Height="17" Text="[ButtonText_Remove]">
+ <Publish Event="Remove" Value="All"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)]]></Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"]]></Publish>
+ <Publish Event="EnableRollback" Value="False"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfDiskDlg"><![CDATA[(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")]]></Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>You have chosen to remove the program from your computer.</Text>
+ </Control>
+ <Control Id="Text" Type="Text" X="25" Y="70" Width="320" Height="30">
+ <Text>Click Remove to remove [ProductName] from your computer. If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard.</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Remove [ProductName]</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="VerifyRepairDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes" TrackDiskSpace="yes">
+ <Control Id="Repair" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Repair]">
+ <Publish Event="ReinstallMode" Value="ecmus"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="Reinstall" Value="All"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfRbDiskDlg"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)]]></Publish>
+ <Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"]]></Publish>
+ <Publish Event="EnableRollback" Value="False"><![CDATA[OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"]]></Publish>
+ <Publish Event="SpawnDialog" Value="OutOfDiskDlg"><![CDATA[(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")]]></Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="[BannerBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="[ButtonText_Back]">
+ <Publish Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
+ </Control>
+ <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>The [Wizard] is ready to begin the repair of [ProductName].</Text>
+ </Control>
+ <Control Id="Text" Type="Text" X="25" Y="70" Width="320" Height="30">
+ <Text>Click Repair to repair the installation of [ProductName]. If you want to review or change any of your installation settings, click Back. Click Cancel to exit the wizard.</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
+ <Text>[DlgTitleFont]Repair [ProductName]</Text>
+ </Control>
+ <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
+ </Dialog>
+
+ <Dialog Id="WaitForCostingDlg" Width="260" Height="85" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Return" Type="PushButton" X="102" Y="57" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_Return]">
+ <Publish Event="EndDialog" Value="Exit">1</Publish>
+ </Control>
+ <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30">
+ <Text>Please wait while the installer finishes determining your disk space requirements.</Text>
+ </Control>
+ <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Exclamation icon" FixedSize="yes" IconSize="32" Text="[ExclamationIcon]" />
+ </Dialog>
+
+ <Dialog Id="WelcomeDlg" Width="370" Height="270" Title="[ProductName] [Setup]" NoMinimize="yes">
+ <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="[ButtonText_Next]">
+ <Publish Event="NewDialog" Value="UserRegistrationDlg">1</Publish>
+ </Control>
+ <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="[ButtonText_Cancel]">
+ <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
+ </Control>
+ <Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[DialogBitmap]" />
+ <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="[ButtonText_Back]" />
+ <Control Id="Description" Type="Text" X="135" Y="70" Width="220" Height="30" Transparent="yes" NoPrefix="yes">
+ <Text>The [Wizard] will install [ProductName] on your computer. Click Next to continue or Cancel to exit the [Wizard].</Text>
+ </Control>
+ <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
+ <Control Id="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Transparent="yes" NoPrefix="yes">
+ <Text>{\VerdanaBold13}Welcome to the [ProductName] [Wizard]</Text>
+ </Control>
+ </Dialog>
+
+ <RadioButtonGroup Property="IAgree">
+ <RadioButton Text="{\DlgFont8}I &amp;accept the terms in the License Agreement" Value="Yes" X="5" Y="0" Width="250" Height="15" />
+ <RadioButton Text="{\DlgFont8}I &amp;do not accept the terms in the License Agreement" Value="No" X="5" Y="20" Width="250" Height="15" />
+ </RadioButtonGroup>
+
+ <TextStyle Id="DlgFont8" FaceName="Tahoma" Size="8" />
+ <TextStyle Id="DlgFontBold8" FaceName="Tahoma" Size="8" Bold="yes" />
+ <TextStyle Id="VerdanaBold13" FaceName="Verdana" Size="13" Bold="yes" />
+
+ <UIText Id="AbsentPath" />
+ <UIText Id="bytes">bytes</UIText>
+ <UIText Id="GB">GB</UIText>
+ <UIText Id="KB">KB</UIText>
+ <UIText Id="MB">MB</UIText>
+ <UIText Id="MenuAbsent">Entire feature will be unavailable</UIText>
+ <UIText Id="MenuAdvertise">Feature will be installed when required</UIText>
+ <UIText Id="MenuAllCD">Entire feature will be installed to run from CD</UIText>
+ <UIText Id="MenuAllLocal">Entire feature will be installed on local hard drive</UIText>
+ <UIText Id="MenuAllNetwork">Entire feature will be installed to run from network</UIText>
+ <UIText Id="MenuCD">Will be installed to run from CD</UIText>
+ <UIText Id="MenuLocal">Will be installed on local hard drive</UIText>
+ <UIText Id="MenuNetwork">Will be installed to run from network</UIText>
+ <UIText Id="ScriptInProgress">Gathering required information...</UIText>
+ <UIText Id="SelAbsentAbsent">This feature will remain uninstalled</UIText>
+ <UIText Id="SelAbsentAdvertise">This feature will be set to be installed when required</UIText>
+ <UIText Id="SelAbsentCD">This feature will be installed to run from CD</UIText>
+ <UIText Id="SelAbsentLocal">This feature will be installed on the local hard drive</UIText>
+ <UIText Id="SelAbsentNetwork">This feature will be installed to run from the network</UIText>
+ <UIText Id="SelAdvertiseAbsent">This feature will become unavailable</UIText>
+ <UIText Id="SelAdvertiseAdvertise">Will be installed when required</UIText>
+ <UIText Id="SelAdvertiseCD">This feature will be available to run from CD</UIText>
+ <UIText Id="SelAdvertiseLocal">This feature will be installed on your local hard drive</UIText>
+ <UIText Id="SelAdvertiseNetwork">This feature will be available to run from the network</UIText>
+ <UIText Id="SelCDAbsent">This feature will be uninstalled completely, you won't be able to run it from CD</UIText>
+ <UIText Id="SelCDAdvertise">This feature will change from run from CD state to set to be installed when required</UIText>
+ <UIText Id="SelCDCD">This feature will remain to be run from CD</UIText>
+ <UIText Id="SelCDLocal">This feature will change from run from CD state to be installed on the local hard drive</UIText>
+ <UIText Id="SelChildCostNeg">This feature frees up [1] on your hard drive.</UIText>
+ <UIText Id="SelChildCostPos">This feature requires [1] on your hard drive.</UIText>
+ <UIText Id="SelCostPending">Compiling cost for this feature...</UIText>
+ <UIText Id="SelLocalAbsent">This feature will be completely removed</UIText>
+ <UIText Id="SelLocalAdvertise">This feature will be removed from your local hard drive, but will be set to be installed when required</UIText>
+ <UIText Id="SelLocalCD">This feature will be removed from your local hard drive, but will be still available to run from CD</UIText>
+ <UIText Id="SelLocalLocal">This feature will remain on you local hard drive</UIText>
+ <UIText Id="SelLocalNetwork">This feature will be removed from your local hard drive, but will be still available to run from the network</UIText>
+ <UIText Id="SelNetworkAbsent">This feature will be uninstalled completely, you won't be able to run it from the network</UIText>
+ <UIText Id="SelNetworkAdvertise">This feature will change from run from network state to set to be installed when required</UIText>
+ <UIText Id="SelNetworkLocal">This feature will change from run from network state to be installed on the local hard drive</UIText>
+ <UIText Id="SelNetworkNetwork">This feature will remain to be run from the network</UIText>
+ <UIText Id="SelParentCostNegNeg">This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.</UIText>
+ <UIText Id="SelParentCostNegPos">This feature frees up [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.</UIText>
+ <UIText Id="SelParentCostPosNeg">This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures free up [4] on your hard drive.</UIText>
+ <UIText Id="SelParentCostPosPos">This feature requires [1] on your hard drive. It has [2] of [3] subfeatures selected. The subfeatures require [4] on your hard drive.</UIText>
+ <UIText Id="TimeRemaining">Time remaining: {[1] minutes }{[2] seconds}</UIText>
+ <UIText Id="VolumeCostAvailable">Available</UIText>
+ <UIText Id="VolumeCostDifference">Difference</UIText>
+ <UIText Id="VolumeCostRequired">Required</UIText>
+ <UIText Id="VolumeCostSize">Disk Size</UIText>
+ <UIText Id="VolumeCostVolume">Volume</UIText>
+ <ProgressText Action="CostFinalize">Computing space requirements</ProgressText>
+ <ProgressText Action="CostInitialize">Computing space requirements</ProgressText>
+ <ProgressText Action="FileCost">Computing space requirements</ProgressText>
+ <ProgressText Action="InstallValidate">Validating install</ProgressText>
+ <ProgressText Action="InstallFiles" Template="File: [1], Directory: [9], Size: [6]">Copying new files</ProgressText>
+ <ProgressText Action="InstallAdminPackage" Template="File: [1], Directory: [9], Size: [6]">Copying network install files</ProgressText>
+ <ProgressText Action="CreateShortcuts" Template="Shortcut: [1]">Creating shortcuts</ProgressText>
+ <ProgressText Action="PublishComponents" Template="Component ID: [1], Qualifier: [2]">Publishing Qualified Components</ProgressText>
+ <ProgressText Action="PublishFeatures" Template="Feature: [1]">Publishing Product Features</ProgressText>
+ <ProgressText Action="PublishProduct">Publishing product information</ProgressText>
+ <ProgressText Action="ClassInfo" Template="Class Id: [1]">Registering Class servers</ProgressText>
+ <ProgressText Action="RegisterExtensionInfo" Template="Extension: [1]">Registering extension servers</ProgressText>
+ <ProgressText Action="RegisterMIMEInfo" Template="MIME Content Type: [1], Extension: [2]">Registering MIME info</ProgressText>
+ <ProgressText Action="RegisterProgIdInfo" Template="ProgId: [1]">Registering program identifiers</ProgressText>
+ <ProgressText Action="AllocateRegistrySpace" Template="Free space: [1]">Allocating registry space</ProgressText>
+ <ProgressText Action="AppSearch" Template="Property: [1], Signature: [2]">Searching for installed applications</ProgressText>
+ <ProgressText Action="BindImage" Template="File: [1]">Binding executables</ProgressText>
+ <ProgressText Action="CCPSearch">Searching for qualifying products</ProgressText>
+ <ProgressText Action="CreateFolders" Template="Folder: [1]">Creating folders</ProgressText>
+ <ProgressText Action="DeleteServices" Template="Service: [1]">Deleting services</ProgressText>
+ <ProgressText Action="DuplicateFiles" Template="File: [1], Directory: [9], Size: [6]">Creating duplicate files</ProgressText>
+ <ProgressText Action="FindRelatedProducts" Template="Found application: [1]">Searching for related applications</ProgressText>
+ <ProgressText Action="InstallODBC">Installing ODBC components</ProgressText>
+ <ProgressText Action="InstallServices" Template="Service: [2]">Installing new services</ProgressText>
+ <ProgressText Action="LaunchConditions">Evaluating launch conditions</ProgressText>
+ <ProgressText Action="MigrateFeatureStates" Template="Application: [1]">Migrating feature states from related applications</ProgressText>
+ <ProgressText Action="MoveFiles" Template="File: [1], Directory: [9], Size: [6]">Moving files</ProgressText>
+ <ProgressText Action="PatchFiles" Template="File: [1], Directory: [2], Size: [3]">Patching files</ProgressText>
+ <ProgressText Action="ProcessComponents">Updating component registration</ProgressText>
+ <ProgressText Action="RegisterComPlus" Template="AppId: [1]{{, AppType: [2], Users: [3], RSN: [4]}}">Registering COM+ Applications and Components</ProgressText>
+ <ProgressText Action="RegisterFonts" Template="Font: [1]">Registering fonts</ProgressText>
+ <ProgressText Action="RegisterProduct" Template="[1]">Registering product</ProgressText>
+ <ProgressText Action="RegisterTypeLibraries" Template="LibID: [1]">Registering type libraries</ProgressText>
+ <ProgressText Action="RegisterUser" Template="[1]">Registering user</ProgressText>
+ <ProgressText Action="RemoveDuplicateFiles" Template="File: [1], Directory: [9]">Removing duplicated files</ProgressText>
+ <ProgressText Action="RemoveEnvironmentStrings" Template="Name: [1], Value: [2], Action [3]">Updating environment strings</ProgressText>
+ <ProgressText Action="RemoveExistingProducts" Template="Application: [1], Command line: [2]">Removing applications</ProgressText>
+ <ProgressText Action="RemoveFiles" Template="File: [1], Directory: [9]">Removing files</ProgressText>
+ <ProgressText Action="RemoveFolders" Template="Folder: [1]">Removing folders</ProgressText>
+ <ProgressText Action="RemoveIniValues" Template="File: [1], Section: [2], Key: [3], Value: [4]">Removing INI files entries</ProgressText>
+ <ProgressText Action="RemoveODBC">Removing ODBC components</ProgressText>
+ <ProgressText Action="RemoveRegistryValues" Template="Key: [1], Name: [2]">Removing system registry values</ProgressText>
+ <ProgressText Action="RemoveShortcuts" Template="Shortcut: [1]">Removing shortcuts</ProgressText>
+ <ProgressText Action="RMCCPSearch">Searching for qualifying products</ProgressText>
+ <ProgressText Action="SelfRegModules" Template="File: [1], Folder: [2]">Registering modules</ProgressText>
+ <ProgressText Action="SelfUnregModules" Template="File: [1], Folder: [2]">Unregistering modules</ProgressText>
+ <ProgressText Action="SetODBCFolders">Initializing ODBC directories</ProgressText>
+ <ProgressText Action="StartServices" Template="Service: [1]">Starting services</ProgressText>
+ <ProgressText Action="StopServices" Template="Service: [1]">Stopping services</ProgressText>
+ <ProgressText Action="UnpublishComponents" Template="Component ID: [1], Qualifier: [2]">Unpublishing Qualified Components</ProgressText>
+ <ProgressText Action="UnpublishFeatures" Template="Feature: [1]">Unpublishing Product Features</ProgressText>
+ <ProgressText Action="UnregisterClassInfo" Template="Class Id: [1]">Unregister Class servers</ProgressText>
+ <ProgressText Action="UnregisterComPlus" Template="AppId: [1]{{, AppType: [2]}}">Unregistering COM+ Applications and Components</ProgressText>
+ <ProgressText Action="UnregisterExtensionInfo" Template="Extension: [1]">Unregistering extension servers</ProgressText>
+ <ProgressText Action="UnregisterFonts" Template="Font: [1]">Unregistering fonts</ProgressText>
+ <ProgressText Action="UnregisterMIMEInfo" Template="MIME Content Type: [1], Extension: [2]">Unregistering MIME info</ProgressText>
+ <ProgressText Action="UnregisterProgIdInfo" Template="ProgId: [1]">Unregistering program identifiers</ProgressText>
+ <ProgressText Action="UnregisterTypeLibraries" Template="LibID: [1]">Unregistering type libraries</ProgressText>
+ <ProgressText Action="WriteEnvironmentStrings" Template="Name: [1], Value: [2], Action [3]">Updating environment strings</ProgressText>
+ <ProgressText Action="WriteIniValues" Template="File: [1], Section: [2], Key: [3], Value: [4]">Writing INI files values</ProgressText>
+ <ProgressText Action="WriteRegistryValues" Template="Key: [1], Name: [2], Value: [3]">Writing system registry values</ProgressText>
+ <ProgressText Action="Advertise">Advertising application</ProgressText>
+ <ProgressText Action="GenerateScript" Template="[1]">Generating script operations for action:</ProgressText>
+ <ProgressText Action="InstallSFPCatalogFile" Template="File: [1], Dependencies: [2]">Installing system catalog</ProgressText>
+ <ProgressText Action="MsiPublishAssemblies" Template="Application Context:[1], Assembly Name:[2]">Publishing assembly information</ProgressText>
+ <ProgressText Action="MsiUnpublishAssemblies" Template="Application Context:[1], Assembly Name:[2]">Unpublishing assembly information</ProgressText>
+ <ProgressText Action="Rollback" Template="[1]">Rolling back action:</ProgressText>
+ <ProgressText Action="RollbackCleanup" Template="File: [1]">Removing backup files</ProgressText>
+ <ProgressText Action="UnmoveFiles" Template="File: [1], Directory: [9]">Removing moved files</ProgressText>
+ <ProgressText Action="UnpublishProduct">Unpublishing product information</ProgressText>
+ <Error Id="0">{{Fatal error: }}</Error>
+ <Error Id="1">{{Error [1]. }}</Error>
+ <Error Id="2">Warning [1]. </Error>
+ <Error Id="3" />
+ <Error Id="4">Info [1]. </Error>
+ <Error Id="5">The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is [1]. {{The arguments are: [2], [3], [4]}}</Error>
+ <Error Id="6" />
+ <Error Id="7">{{Disk full: }}</Error>
+ <Error Id="8">Action [Time]: [1]. [2]</Error>
+ <Error Id="9">[ProductName]</Error>
+ <Error Id="10">{[2]}{, [3]}{, [4]}</Error>
+ <Error Id="11">Message type: [1], Argument: [2]</Error>
+ <Error Id="12">=== Logging started: [Date] [Time] ===</Error>
+ <Error Id="13">=== Logging stopped: [Date] [Time] ===</Error>
+ <Error Id="14">Action start [Time]: [1].</Error>
+ <Error Id="15">Action ended [Time]: [1]. Return value [2].</Error>
+ <Error Id="16">Time remaining: {[1] minutes }{[2] seconds}</Error>
+ <Error Id="17">Out of memory. Shut down other applications before retrying.</Error>
+ <Error Id="18">Installer is no longer responding.</Error>
+ <Error Id="19">Installer stopped prematurely.</Error>
+ <Error Id="20">Please wait while Windows configures [ProductName]</Error>
+ <Error Id="21">Gathering required information...</Error>
+ <Error Id="22">Removing older versions of this application...</Error>
+ <Error Id="23">Preparing to remove older versions of this application...</Error>
+ <Error Id="32">{[ProductName] }Setup completed successfully.</Error>
+ <Error Id="33">{[ProductName] }Setup failed.</Error>
+ <Error Id="1101">Error reading from file: [2]. {{ System error [3].}} Verify that the file exists and that you can access it.</Error>
+ <Error Id="1301">Cannot create the file '[2]'. A directory with this name already exists. Cancel the install and try installing to a different location.</Error>
+ <Error Id="1302">Please insert the disk: [2]</Error>
+ <Error Id="1303">The installer has insufficient privileges to access this directory: [2]. The installation cannot continue. Log on as administrator or contact your system administrator.</Error>
+ <Error Id="1304">Error writing to file: [2]. Verify that you have access to that directory.</Error>
+ <Error Id="1305">Error reading from file [2]. {{ System error [3].}} Verify that the file exists and that you can access it.</Error>
+ <Error Id="1306">Another application has exclusive access to the file '[2]'. Please shut down all other applications, then click Retry.</Error>
+ <Error Id="1307">There is not enough disk space to install this file: [2]. Free some disk space and click Retry, or click Cancel to exit.</Error>
+ <Error Id="1308">Source file not found: [2]. Verify that the file exists and that you can access it.</Error>
+ <Error Id="1309">Error reading from file: [3]. {{ System error [2].}} Verify that the file exists and that you can access it.</Error>
+ <Error Id="1310">Error writing to file: [3]. {{ System error [2].}} Verify that you have access to that directory.</Error>
+ <Error Id="1311">Source file not found{{(cabinet)}}: [2]. Verify that the file exists and that you can access it.</Error>
+ <Error Id="1312">Cannot create the directory '[2]'. A file with this name already exists. Please rename or remove the file and click retry, or click Cancel to exit.</Error>
+ <Error Id="1313">The volume [2] is currently unavailable. Please select another.</Error>
+ <Error Id="1314">The specified path '[2]' is unavailable.</Error>
+ <Error Id="1315">Unable to write to the specified folder: [2].</Error>
+ <Error Id="1316">A network error occurred while attempting to read from the file: [2]</Error>
+ <Error Id="1317">An error occurred while attempting to create the directory: [2]</Error>
+ <Error Id="1318">A network error occurred while attempting to create the directory: [2]</Error>
+ <Error Id="1319">A network error occurred while attempting to open the source file cabinet: [2]</Error>
+ <Error Id="1320">The specified path is too long: [2]</Error>
+ <Error Id="1321">The Installer has insufficient privileges to modify this file: [2].</Error>
+ <Error Id="1322">A portion of the folder path '[2]' is invalid. It is either empty or exceeds the length allowed by the system.</Error>
+ <Error Id="1323">The folder path '[2]' contains words that are not valid in folder paths.</Error>
+ <Error Id="1324">The folder path '[2]' contains an invalid character.</Error>
+ <Error Id="1325">'[2]' is not a valid short file name.</Error>
+ <Error Id="1326">Error getting file security: [3] GetLastError: [2]</Error>
+ <Error Id="1327">Invalid Drive: [2]</Error>
+ <Error Id="1328">Error applying patch to file [2]. It has probably been updated by other means, and can no longer be modified by this patch. For more information contact your patch vendor. {{System Error: [3]}}</Error>
+ <Error Id="1329">A file that is required cannot be installed because the cabinet file [2] is not digitally signed. This may indicate that the cabinet file is corrupt.</Error>
+ <Error Id="1330">A file that is required cannot be installed because the cabinet file [2] has an invalid digital signature. This may indicate that the cabinet file is corrupt.{{ Error [3] was returned by WinVerifyTrust.}}</Error>
+ <Error Id="1331">Failed to correctly copy [2] file: CRC error.</Error>
+ <Error Id="1332">Failed to correctly move [2] file: CRC error.</Error>
+ <Error Id="1333">Failed to correctly patch [2] file: CRC error.</Error>
+ <Error Id="1334">The file '[2]' cannot be installed because the file cannot be found in cabinet file '[3]'. This could indicate a network error, an error reading from the CD-ROM, or a problem with this package.</Error>
+ <Error Id="1335">The cabinet file '[2]' required for this installation is corrupt and cannot be used. This could indicate a network error, an error reading from the CD-ROM, or a problem with this package.</Error>
+ <Error Id="1336">There was an error creating a temporary file that is needed to complete this installation.{{ Folder: [3]. System error code: [2]}}</Error>
+ <Error Id="1401">Could not create key: [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. </Error>
+ <Error Id="1402">Could not open key: [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. </Error>
+ <Error Id="1403">Could not delete value [2] from key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel. </Error>
+ <Error Id="1404">Could not delete key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel. </Error>
+ <Error Id="1405">Could not read value [2] from key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel. </Error>
+ <Error Id="1406">Could not write value [2] to key [3]. {{ System error [4].}} Verify that you have sufficient access to that key, or contact your support personnel.</Error>
+ <Error Id="1407">Could not get value names for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</Error>
+ <Error Id="1408">Could not get sub key names for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</Error>
+ <Error Id="1409">Could not read security information for key [2]. {{ System error [3].}} Verify that you have sufficient access to that key, or contact your support personnel.</Error>
+ <Error Id="1410">Could not increase the available registry space. [2] KB of free registry space is required for the installation of this application.</Error>
+ <Error Id="1500">Another installation is in progress. You must complete that installation before continuing this one.</Error>
+ <Error Id="1501">Error accessing secured data. Please make sure the Windows Installer is configured properly and try the install again.</Error>
+ <Error Id="1502">User '[2]' has previously initiated an install for product '[3]'. That user will need to run that install again before they can use that product. Your current install will now continue.</Error>
+ <Error Id="1503">User '[2]' has previously initiated an install for product '[3]'. That user will need to run that install again before they can use that product.</Error>
+ <Error Id="1601">Out of disk space -- Volume: '[2]'; required space: [3] KB; available space: [4] KB. Free some disk space and retry.</Error>
+ <Error Id="1602">Are you sure you want to cancel?</Error>
+ <Error Id="1603">The file [2][3] is being held in use{ by the following process: Name: [4], Id: [5], Window Title: '[6]'}. Close that application and retry.</Error>
+ <Error Id="1604">The product '[2]' is already installed, preventing the installation of this product. The two products are incompatible.</Error>
+ <Error Id="1605">There is not enough disk space on the volume '[2]' to continue the install with recovery enabled. [3] KB are required, but only [4] KB are available. Click Ignore to continue the install without saving recovery information, click Retry to check for available space again, or click Cancel to quit the installation.</Error>
+ <Error Id="1606">Could not access network location [2].</Error>
+ <Error Id="1607">The following applications should be closed before continuing the install:</Error>
+ <Error Id="1608">Could not find any previously installed compliant products on the machine for installing this product.</Error>
+ <Error Id="1609">An error occurred while applying security settings. [2] is not a valid user or group. This could be a problem with the package, or a problem connecting to a domain controller on the network. Check your network connection and click Retry, or Cancel to end the install. {{Unable to locate the user's SID, system error [3]}}</Error>
+ <Error Id="1701">The key [2] is not valid. Verify that you entered the correct key.</Error>
+ <Error Id="1702">The installer must restart your system before configuration of [2] can continue. Click Yes to restart now or No if you plan to manually restart later.</Error>
+ <Error Id="1703">You must restart your system for the configuration changes made to [2] to take effect. Click Yes to restart now or No if you plan to manually restart later.</Error>
+ <Error Id="1704">An installation for [2] is currently suspended. You must undo the changes made by that installation to continue. Do you want to undo those changes?</Error>
+ <Error Id="1705">A previous installation for this product is in progress. You must undo the changes made by that installation to continue. Do you want to undo those changes?</Error>
+ <Error Id="1706">An installation package for the product [2] cannot be found. Try the installation again using a valid copy of the installation package '[3]'.</Error>
+ <Error Id="1707">Installation completed successfully.</Error>
+ <Error Id="1708">Installation failed.</Error>
+ <Error Id="1709">Product: [2] -- [3]</Error>
+ <Error Id="1710">You may either restore your computer to its previous state or continue the install later. Would you like to restore?</Error>
+ <Error Id="1711">An error occurred while writing installation information to disk. Check to make sure enough disk space is available, and click Retry, or Cancel to end the install.</Error>
+ <Error Id="1712">One or more of the files required to restore your computer to its previous state could not be found. Restoration will not be possible.</Error>
+ <Error Id="1713">[2] cannot install one of its required products. Contact your technical support group. {{System Error: [3].}}</Error>
+ <Error Id="1714">The older version of [2] cannot be removed. Contact your technical support group. {{System Error [3].}}</Error>
+ <Error Id="1715">Installed [2]</Error>
+ <Error Id="1716">Configured [2]</Error>
+ <Error Id="1717">Removed [2]</Error>
+ <Error Id="1718">File [2] was rejected by digital signature policy.</Error>
+ <Error Id="1719">The Windows Installer Service could not be accessed. This can occur if you are running Windows in safe mode, or if the Windows Installer is not correctly installed. Contact your support personnel for assistance.</Error>
+ <Error Id="1720">There is a problem with this Windows Installer package. A script required for this install to complete could not be run. Contact your support personnel or package vendor. {{Custom action [2] script error [3], [4]: [5] Line [6], Column [7], [8] }}</Error>
+ <Error Id="1721">There is a problem with this Windows Installer package. A program required for this install to complete could not be run. Contact your support personnel or package vendor. {{Action: [2], location: [3], command: [4] }}</Error>
+ <Error Id="1722">There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contact your support personnel or package vendor. {{Action [2], location: [3], command: [4] }}</Error>
+ <Error Id="1723">There is a problem with this Windows Installer package. A DLL required for this install to complete could not be run. Contact your support personnel or package vendor. {{Action [2], entry: [3], library: [4] }}</Error>
+ <Error Id="1724">Removal completed successfully.</Error>
+ <Error Id="1725">Removal failed.</Error>
+ <Error Id="1726">Advertisement completed successfully.</Error>
+ <Error Id="1727">Advertisement failed.</Error>
+ <Error Id="1728">Configuration completed successfully.</Error>
+ <Error Id="1729">Configuration failed.</Error>
+ <Error Id="1730">You must be an Administrator to remove this application. To remove this application, you can log on as an Administrator, or contact your technical support group for assistance.</Error>
+ <Error Id="1801">The path [2] is not valid. Please specify a valid path.</Error>
+ <Error Id="1802">Out of memory. Shut down other applications before retrying.</Error>
+ <Error Id="1803">There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to go back to the previously selected volume.</Error>
+ <Error Id="1804">There is no disk in drive [2]. Please insert one and click Retry, or click Cancel to return to the browse dialog and select a different volume.</Error>
+ <Error Id="1805">The folder [2] does not exist. Please enter a path to an existing folder.</Error>
+ <Error Id="1806">You have insufficient privileges to read this folder.</Error>
+ <Error Id="1807">A valid destination folder for the install could not be determined.</Error>
+ <Error Id="1901">Error attempting to read from the source install database: [2].</Error>
+ <Error Id="1902">Scheduling reboot operation: Renaming file [2] to [3]. Must reboot to complete operation.</Error>
+ <Error Id="1903">Scheduling reboot operation: Deleting file [2]. Must reboot to complete operation.</Error>
+ <Error Id="1904">Module [2] failed to register. HRESULT [3]. Contact your support personnel.</Error>
+ <Error Id="1905">Module [2] failed to unregister. HRESULT [3]. Contact your support personnel.</Error>
+ <Error Id="1906">Failed to cache package [2]. Error: [3]. Contact your support personnel.</Error>
+ <Error Id="1907">Could not register font [2]. Verify that you have sufficient permissions to install fonts, and that the system supports this font.</Error>
+ <Error Id="1908">Could not unregister font [2]. Verify that you that you have sufficient permissions to remove fonts.</Error>
+ <Error Id="1909">Could not create Shortcut [2]. Verify that the destination folder exists and that you can access it.</Error>
+ <Error Id="1910">Could not remove Shortcut [2]. Verify that the shortcut file exists and that you can access it.</Error>
+ <Error Id="1911">Could not register type library for file [2]. Contact your support personnel.</Error>
+ <Error Id="1912">Could not unregister type library for file [2]. Contact your support personnel.</Error>
+ <Error Id="1913">Could not update the ini file [2][3]. Verify that the file exists and that you can access it.</Error>
+ <Error Id="1914">Could not schedule file [2] to replace file [3] on reboot. Verify that you have write permissions to file [3].</Error>
+ <Error Id="1915">Error removing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.</Error>
+ <Error Id="1916">Error installing ODBC driver manager, ODBC error [2]: [3]. Contact your support personnel.</Error>
+ <Error Id="1917">Error removing ODBC driver: [4], ODBC error [2]: [3]. Verify that you have sufficient privileges to remove ODBC drivers.</Error>
+ <Error Id="1918">Error installing ODBC driver: [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.</Error>
+ <Error Id="1919">Error configuring ODBC data source: [4], ODBC error [2]: [3]. Verify that the file [4] exists and that you can access it.</Error>
+ <Error Id="1920">Service '[2]' ([3]) failed to start. Verify that you have sufficient privileges to start system services.</Error>
+ <Error Id="1921">Service '[2]' ([3]) could not be stopped. Verify that you have sufficient privileges to stop system services.</Error>
+ <Error Id="1922">Service '[2]' ([3]) could not be deleted. Verify that you have sufficient privileges to remove system services.</Error>
+ <Error Id="1923">Service '[2]' ([3]) could not be installed. Verify that you have sufficient privileges to install system services.</Error>
+ <Error Id="1924">Could not update environment variable '[2]'. Verify that you have sufficient privileges to modify environment variables.</Error>
+ <Error Id="1925">You do not have sufficient privileges to complete this installation for all users of the machine. Log on as administrator and then retry this installation.</Error>
+ <Error Id="1926">Could not set file security for file '[3]'. Error: [2]. Verify that you have sufficient privileges to modify the security permissions for this file.</Error>
+ <Error Id="1927">Component Services (COM+ 1.0) are not installed on this computer. This installation requires Component Services in order to complete successfully. Component Services are available on Windows 2000.</Error>
+ <Error Id="1928">Error registering COM+ Application. Contact your support personnel for more information.</Error>
+ <Error Id="1929">Error unregistering COM+ Application. Contact your support personnel for more information.</Error>
+ <Error Id="1930">The description for service '[2]' ([3]) could not be changed.</Error>
+ <Error Id="1931">The Windows Installer service cannot update the system file [2] because the file is protected by Windows. You may need to update your operating system for this program to work correctly. {{Package version: [3], OS Protected version: [4]}}</Error>
+ <Error Id="1932">The Windows Installer service cannot update the protected Windows file [2]. {{Package version: [3], OS Protected version: [4], SFP Error: [5]}}</Error>
+ <Error Id="1933">The Windows Installer service cannot update one or more protected Windows files. {{SFP Error: [2]. List of protected files:\r\n[3]}}</Error>
+ <Error Id="1934">User installations are disabled via policy on the machine.</Error>
+ <Error Id="1935">An error occured during the installation of assembly component [2]. HRESULT: [3]. {{assembly interface: [4], function: [5], assembly name: [6]}}</Error>
+
+ <AdminUISequence>
+ <Show Dialog="FatalError" OnExit="error" />
+ <Show Dialog="UserExit" OnExit="cancel" />
+ <Show Dialog="ExitDialog" OnExit="success" />
+ <Show Dialog="PrepareDlg" Before="CostInitialize"></Show>
+ <Show Dialog="AdminWelcomeDlg" After="CostFinalize" />
+ <Show Dialog="ProgressDlg" After="AdminWelcomeDlg" />
+ </AdminUISequence>
+
+ <InstallUISequence>
+ <Show Dialog="FatalError" OnExit="error" />
+ <Show Dialog="UserExit" OnExit="cancel" />
+ <Show Dialog="ExitDialog" OnExit="success" />
+ <Show Dialog="PrepareDlg" After="LaunchConditions" />
+ <Show Dialog="WelcomeDlg" After="MigrateFeatureStates">NOT Installed</Show>
+ <Show Dialog="ResumeDlg" After="WelcomeDlg">Installed AND (RESUME OR Preselected)</Show>
+ <Show Dialog="MaintenanceWelcomeDlg" After="ResumeDlg">Installed AND NOT RESUME AND NOT Preselected</Show>
+ <Show Dialog="ProgressDlg" After="MaintenanceWelcomeDlg" />
+ </InstallUISequence>
+ </UI>
+
+ <Property Id="ALLUSERS">2</Property>
+ <Property Id="ROOTDRIVE"><![CDATA[C:\]]></Property>
+ <Property Id="ButtonText_No">&amp;No</Property>
+ <Property Id="ButtonText_Install">&amp;Install</Property>
+ <Property Id="Setup">Setup</Property>
+ <Property Id="ButtonText_Browse">Br&amp;owse</Property>
+ <Property Id="CustomSetupIcon">custicon</Property>
+ <Property Id="ButtonText_Next">&amp;Next &gt;</Property>
+ <Property Id="ButtonText_Back">&lt; &amp;Back</Property>
+ <Property Id="InstallMode">Typical</Property>
+ <Property Id="Progress2">installs</Property>
+ <Property Id="IAgree">No</Property>
+ <Property Id="Wizard">Setup Wizard</Property>
+ <Property Id="RemoveIcon">removico</Property>
+ <Property Id="ExclamationIcon">exclamic</Property>
+ <Property Id="ShowUserRegistrationDlg">1</Property>
+ <Property Id="ProductID">none</Property>
+ <Property Id="ButtonText_Reset">&amp;Reset</Property>
+ <Property Id="ButtonText_Remove">&amp;Remove</Property>
+ <Property Id="CompleteSetupIcon">completi</Property>
+ <Property Id="ButtonText_Yes">&amp;Yes</Property>
+ <Property Id="ButtonText_Exit">&amp;Exit</Property>
+ <Property Id="ButtonText_Return">&amp;Return</Property>
+ <Property Id="DialogBitmap">dlgbmp</Property>
+ <Property Id="DlgTitleFont">{&amp;DlgFontBold8}</Property>
+ <Property Id="ButtonText_Ignore">&amp;Ignore</Property>
+ <Property Id="RepairIcon">repairic</Property>
+ <Property Id="ButtonText_Resume">&amp;Resume</Property>
+ <Property Id="InstallerIcon">insticon</Property>
+ <Property Id="ButtonText_Finish">&amp;Finish</Property>
+ <Property Id="PROMPTROLLBACKCOST">P</Property>
+ <Property Id="PortTemplate"><![CDATA[12345<######>@@@@@]]></Property>
+ <Property Id="Progress1">Installing</Property>
+ <Property Id="ButtonText_Cancel">Cancel</Property>
+ <Property Id="INSTALLLEVEL">3</Property>
+ <Property Id="InfoIcon">info</Property>
+ <Property Id="ButtonText_Repair">&amp;Repair</Property>
+ <Property Id="ButtonText_Retry">&amp;Retry</Property>
+ <Property Id="BannerBitmap">bannrbmp</Property>
+ <Property Id="ButtonText_OK">OK</Property>
+
+ <AdminExecuteSequence />
+
+ <InstallExecuteSequence>
+ <RemoveExistingProducts After='InstallFinalize' />
+ </InstallExecuteSequence>
+
+ <Binary Id="Up" src="Binary\Up.ico" />
+ <Binary Id="New" src="Binary\New.ico" />
+ <Binary Id="custicon" src="Binary\Custom.ico" />
+ <Binary Id="repairic" src="Binary\Repair.ico" />
+ <Binary Id="exclamic" src="Binary\Exclam.ico" />
+ <Binary Id="removico" src="Binary\Remove.ico" />
+ <Binary Id="completi" src="Binary\Complete.ico" />
+ <Binary Id="insticon" src="Binary\Typical.ico" />
+ <Binary Id="info" src="Binary\Info.ico" />
+ <Binary Id="bannrbmp" src="Binary\Banner.bmp" />
+ <Binary Id="dlgbmp" src="Binary\Dialog.bmp" />
+ <Icon Id="PassSync.exe" src="passsync.exe" />
+ </Product>
+</Wix>
diff --git a/ldap/synctools/passwordsync/wix/README.txt b/ldap/synctools/passwordsync/wix/README.txt
new file mode 100644
index 00000000..883d5a41
--- /dev/null
+++ b/ldap/synctools/passwordsync/wix/README.txt
@@ -0,0 +1,2 @@
+1. Download Wix and unzip into this folder.
+2. run build.bat in Password Sync folder. \ No newline at end of file