Implemented regsvr32 tool. Based on ReactOS implementation.
This commit is contained in:
parent
a88289500c
commit
2f0d85c202
|
@ -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" ;;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -14,6 +14,7 @@ SUBDIRS = \
|
|||
progman \
|
||||
regapi \
|
||||
regedit \
|
||||
regsvr32 \
|
||||
regtest \
|
||||
uninstaller \
|
||||
view \
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Makefile
|
||||
regsvr32.spec.c
|
|
@ -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:
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
name regsvr32
|
||||
type win32
|
||||
mode cuiexe
|
||||
init main
|
||||
|
||||
import msvcrt.dll
|
||||
import kernel32.dll
|
||||
import ntdll.dll
|
Loading…
Reference in New Issue