From 2f0d85c202ceaf8e15e2fba2b18c85f18cde5275 Mon Sep 17 00:00:00 2001
From: Andriy Palamarchuk <apa3a@yahoo.com>
Date: Mon, 29 Apr 2002 23:47:39 +0000
Subject: [PATCH] Implemented regsvr32 tool. Based on ReactOS implementation.

---
 configure                       |   3 +-
 configure.ac                    |   1 +
 programs/Makefile.in            |   1 +
 programs/regsvr32/.cvsignore    |   2 +
 programs/regsvr32/Makefile.in   |  13 ++
 programs/regsvr32/regsvr32.c    | 261 ++++++++++++++++++++++++++++++++
 programs/regsvr32/regsvr32.spec |   8 +
 7 files changed, 288 insertions(+), 1 deletion(-)
 create mode 100644 programs/regsvr32/.cvsignore
 create mode 100644 programs/regsvr32/Makefile.in
 create mode 100644 programs/regsvr32/regsvr32.c
 create mode 100644 programs/regsvr32/regsvr32.spec

diff --git a/configure b/configure
index f1c9499823e..c45ffeff325 100755
--- a/configure
+++ b/configure
@@ -12398,7 +12398,7 @@ MAKE_DLL_RULES=dlls/Makedll.rules
 MAKE_PROG_RULES=programs/Makeprog.rules
 
 
-ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules programs/Makeprog.rules Makefile controls/Makefile debugger/Makefile dlls/Makefile dlls/advapi32/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/comctl32/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dsound/Makefile dlls/gdi/Makefile dlls/glu32/Makefile dlls/icmp/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/kernel/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msg711/Makefile dlls/msdmo/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt20/Makefile dlls/msvideo/Makefile dlls/netapi32/Makefile dlls/ntdll/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/oleaut32/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/snmpapi/Makefile dlls/sti/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/user/Makefile dlls/version/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winspool/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile files/Makefile graphics/Makefile graphics/x11drv/Makefile if1632/Makefile include/Makefile library/Makefile libtest/Makefile loader/Makefile loader/ne/Makefile memory/Makefile misc/Makefile miscemu/Makefile msdos/Makefile objects/Makefile ole/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/notepad/Makefile programs/osversioncheck/Makefile programs/progman/Makefile programs/regapi/Makefile programs/regedit/Makefile programs/regtest/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineconsole/Makefile programs/winemine/Makefile programs/winetest/Makefile programs/winhelp/Makefile programs/winver/Makefile relay32/Makefile scheduler/Makefile server/Makefile tools/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/wmc/Makefile tools/wrc/Makefile tsx11/Makefile unicode/Makefile win32/Makefile windows/Makefile windows/x11drv/Makefile"
+ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules programs/Makeprog.rules Makefile controls/Makefile debugger/Makefile dlls/Makefile dlls/advapi32/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/comctl32/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dsound/Makefile dlls/gdi/Makefile dlls/glu32/Makefile dlls/icmp/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/kernel/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msg711/Makefile dlls/msdmo/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt20/Makefile dlls/msvideo/Makefile dlls/netapi32/Makefile dlls/ntdll/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/oleaut32/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/snmpapi/Makefile dlls/sti/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/user/Makefile dlls/version/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winspool/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile files/Makefile graphics/Makefile graphics/x11drv/Makefile if1632/Makefile include/Makefile library/Makefile libtest/Makefile loader/Makefile loader/ne/Makefile memory/Makefile misc/Makefile miscemu/Makefile msdos/Makefile objects/Makefile ole/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/notepad/Makefile programs/osversioncheck/Makefile programs/progman/Makefile programs/regapi/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/regtest/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineconsole/Makefile programs/winemine/Makefile programs/winetest/Makefile programs/winhelp/Makefile programs/winver/Makefile relay32/Makefile scheduler/Makefile server/Makefile tools/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/wmc/Makefile tools/wrc/Makefile tsx11/Makefile unicode/Makefile win32/Makefile windows/Makefile windows/x11drv/Makefile"
 
 
 cat >confcache <<\_ACEOF
@@ -12996,6 +12996,7 @@ do
   "programs/progman/Makefile" ) CONFIG_FILES="$CONFIG_FILES programs/progman/Makefile" ;;
   "programs/regapi/Makefile" ) CONFIG_FILES="$CONFIG_FILES programs/regapi/Makefile" ;;
   "programs/regedit/Makefile" ) CONFIG_FILES="$CONFIG_FILES programs/regedit/Makefile" ;;
+  "programs/regsvr32/Makefile" ) CONFIG_FILES="$CONFIG_FILES programs/regsvr32/Makefile" ;;
   "programs/regtest/Makefile" ) CONFIG_FILES="$CONFIG_FILES programs/regtest/Makefile" ;;
   "programs/uninstaller/Makefile" ) CONFIG_FILES="$CONFIG_FILES programs/uninstaller/Makefile" ;;
   "programs/view/Makefile" ) CONFIG_FILES="$CONFIG_FILES programs/view/Makefile" ;;
diff --git a/configure.ac b/configure.ac
index 9350ee851cd..c58f980808a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1363,6 +1363,7 @@ programs/osversioncheck/Makefile
 programs/progman/Makefile
 programs/regapi/Makefile
 programs/regedit/Makefile
+programs/regsvr32/Makefile
 programs/regtest/Makefile
 programs/uninstaller/Makefile
 programs/view/Makefile
diff --git a/programs/Makefile.in b/programs/Makefile.in
index fb12ead5a5f..1eae1292d7c 100644
--- a/programs/Makefile.in
+++ b/programs/Makefile.in
@@ -14,6 +14,7 @@ SUBDIRS = \
 	progman \
 	regapi \
 	regedit \
+	regsvr32 \
 	regtest \
 	uninstaller \
 	view \
diff --git a/programs/regsvr32/.cvsignore b/programs/regsvr32/.cvsignore
new file mode 100644
index 00000000000..07ce01a23dc
--- /dev/null
+++ b/programs/regsvr32/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+regsvr32.spec.c
diff --git a/programs/regsvr32/Makefile.in b/programs/regsvr32/Makefile.in
new file mode 100644
index 00000000000..21364d65325
--- /dev/null
+++ b/programs/regsvr32/Makefile.in
@@ -0,0 +1,13 @@
+EXTRAINCL = -I$(TOPSRCDIR)/include/msvcrt
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = regsvr32
+
+C_SRCS = \
+	regsvr32.c
+
+@MAKE_PROG_RULES@
+
+### Dependencies:
diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c
new file mode 100644
index 00000000000..587e6fbacff
--- /dev/null
+++ b/programs/regsvr32/regsvr32.c
@@ -0,0 +1,261 @@
+/*
+ * PURPOSE: Register an OLE component in the registry
+ *
+ * Copyright 2001 ReactOS project
+ * Copyright 2001 Jurgen Van Gael [jurgen.vangael@student.kuleuven.ac.be]
+ * Copyright 2002 Andriy Palamarchuk
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+/*
+ *
+ *  regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname
+ *  [/u]    unregister server
+ *  [/s]    silent (no message boxes)
+ *  [/i]    Call DllInstall passing it an optional [cmdline];
+ *          when used with /u calls dll uninstall.
+ *  [/n]    Do not call DllRegisterServer; this option must be used with [/i]
+ */
+
+/**
+ * FIXME - currently receives command-line parameters in ASCII only and later
+ * converts to Unicode. Ideally the function should have wWinMain etry point
+ * and then work in Unicode only, but it seems Wine does not have necessary
+ * support.
+ */
+
+#include <stdio.h>
+#include <windows.h>
+
+typedef HRESULT (*DLLREGISTER)          (void);
+typedef HRESULT (*DLLUNREGISTER)        (void);
+typedef HRESULT (*DLLINSTALL)           (BOOL,LPCWSTR);
+
+int Silent = 0;
+
+int Usage()
+{
+    printf("regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname\n");
+    printf("\t[/u]  unregister server\n");
+    printf("\t[/s]  silent (no message boxes)\n");
+    printf("\t[/i]  Call DllInstall passing it an optional [cmdline];\n");
+    printf("\t      when used with /u calls dll uninstall\n");
+    printf("\t[/n]  Do not call DllRegisterServer; this option "
+           "must be used with [/i]\n");
+    return 0;
+}
+
+/**
+ * Loads procedure.
+ *
+ * Parameters:
+ * strDll - name of the dll.
+ * procName - name of the procedure to load from dll
+ * pDllHanlde - output variable receives handle of the loaded dll.
+ */
+VOID *LoadProc(char* strDll, char* procName, HMODULE* DllHandle)
+{
+    VOID* (*proc)(void);
+
+    *DllHandle = LoadLibrary(strDll);
+    if(!*DllHandle)
+    {
+        if(!Silent)
+            printf("Dll %s not found\n", strDll);
+
+        exit(-1);
+    }
+    proc = (VOID *) GetProcAddress(*DllHandle, procName);
+    if(!proc)
+    {
+        if(!Silent)
+            printf("%s not implemented in dll %s\n", procName, strDll);
+        FreeLibrary(*DllHandle);
+        exit(-1);
+    }
+    return proc;
+}
+
+int RegisterDll(char* strDll)
+{
+    HRESULT hr;
+    DLLREGISTER pfRegister;
+    HMODULE DllHandle = NULL;
+
+    pfRegister = LoadProc(strDll, "DllRegisterServer", &DllHandle);
+
+    hr = pfRegister();
+    if(FAILED(hr))
+    {
+        if(!Silent)
+            printf("Failed to register dll %s\n", strDll);
+
+        return -1;
+    }
+    if(!Silent)
+        printf("Succesfully registered dll %s\n", strDll);
+
+    if(DllHandle)
+        FreeLibrary(DllHandle);
+    return 0;
+}
+
+int UnregisterDll(char* strDll)
+{
+    HRESULT hr;
+    DLLUNREGISTER pfUnregister;
+    HMODULE DllHandle = NULL;
+
+    pfUnregister = LoadProc(strDll, "DllUnregisterServer", &DllHandle);
+    hr = pfUnregister();
+    if(FAILED(hr))
+    {
+        if(!Silent)
+            printf("Failed to unregister dll %s\n", strDll);
+
+        return -1;
+    }
+    if(!Silent)
+        printf("Succesfully unregistered dll %s\n", strDll);
+
+    if(DllHandle)
+        FreeLibrary(DllHandle);
+    return 0;
+}
+
+int InstallDll(BOOL install, char *strDll, WCHAR *command_line) 
+{
+    HRESULT hr;
+    DLLINSTALL pfInstall;
+    HMODULE DllHandle = NULL;
+
+    pfInstall = LoadProc(strDll, "DllInstall", &DllHandle);
+    hr = pfInstall(install, command_line);
+    if(FAILED(hr))
+    {
+        if(!Silent)
+            printf("Failed to %s dll %s\n", install ? "install" : "uninstall",
+                   strDll);
+        return -1;
+    }
+    if(!Silent)
+        printf("Succesfully %s dll %s\n",  install ? "installed" : "uninstalled",
+               strDll);
+
+    if(DllHandle)
+        FreeLibrary(DllHandle);
+    return 0;
+}
+
+int main(int argc, char* argv[])
+{
+    int             i;
+    BOOL            CallRegister = TRUE;
+    BOOL            CallInstall = FALSE;
+    BOOL            Unregister = FALSE;
+    BOOL            DllFound = FALSE;
+    WCHAR*          wsCommandLine = NULL;
+    WCHAR           EmptyLine[1] = {0};
+    
+
+    for(i = 1; i < argc; i++)
+    {
+        if (!stricmp(argv[i], "/u"))
+                Unregister = TRUE;
+        else if (!stricmp(argv[i], "/s"))
+                Silent = 1;
+        else if (!strnicmp(argv[i], "/i", strlen("/i")))
+        {
+            CHAR* command_line = argv[i] + strlen("/i");
+            
+            CallInstall = TRUE;
+            if (command_line[0] == ':' && command_line[1]) 
+            {
+                int len = strlen(command_line);
+
+                command_line++;
+                len--;
+                /* remove double quotes */
+                if (command_line[0] == '"')
+                {
+                    command_line++;
+                    len--;
+                    if (command_line[0])
+                    {
+                        len--;
+                        command_line[len] = 0;
+                    }
+                }
+                if (command_line[0])
+                {
+                    len = MultiByteToWideChar(CP_ACP, 0, command_line, -1,
+                                              NULL, 0);
+                    wsCommandLine = HeapAlloc(GetProcessHeap(), 0,
+                                              len * sizeof(WCHAR));
+                    if (wsCommandLine)
+                        MultiByteToWideChar(CP_ACP, 0, command_line, -1,
+                                            wsCommandLine, len);
+                }
+                else
+                {
+                    wsCommandLine = EmptyLine;
+                }
+            }
+            else 
+            {
+                wsCommandLine = EmptyLine;
+            }
+        }
+        else if(!stricmp(argv[i], "/n"))
+            CallRegister = FALSE;
+        else if (argv[i][0] == '/' && (!argv[i][2] || argv[i][2] == ':'))
+            printf("Unrecognized switch %s\n", argv[i]);
+        else
+        {
+            char *DllName = argv[i];
+            int res = 0;
+
+            DllFound = TRUE;
+            if (!CallInstall || (CallInstall && CallRegister))
+            {
+                if(Unregister)
+                    res = UnregisterDll(DllName);
+                else
+                    res = RegisterDll(DllName);
+            }
+            
+            if (res)
+                return res;
+
+            if (CallInstall)
+            {
+                res = InstallDll(!Unregister, DllName, wsCommandLine);
+            }
+            
+            return res;
+        }
+    }
+
+    if (!DllFound)
+    {
+        if(!Silent)
+            return Usage();
+        else
+            return -1;
+    }
+
+    return 0;
+}
diff --git a/programs/regsvr32/regsvr32.spec b/programs/regsvr32/regsvr32.spec
new file mode 100644
index 00000000000..4296e9fea8c
--- /dev/null
+++ b/programs/regsvr32/regsvr32.spec
@@ -0,0 +1,8 @@
+name    regsvr32
+type    win32
+mode    cuiexe
+init    main
+
+import msvcrt.dll
+import kernel32.dll
+import ntdll.dll
-- 
GitLab