Added rundll32 utility.
This commit is contained in:
parent
d41581dbde
commit
15e8e0a2f1
|
@ -1511,6 +1511,7 @@ programs/regapi/Makefile
|
||||||
programs/regedit/Makefile
|
programs/regedit/Makefile
|
||||||
programs/regsvr32/Makefile
|
programs/regsvr32/Makefile
|
||||||
programs/regtest/Makefile
|
programs/regtest/Makefile
|
||||||
|
programs/rundll32/Makefile
|
||||||
programs/uninstaller/Makefile
|
programs/uninstaller/Makefile
|
||||||
programs/view/Makefile
|
programs/view/Makefile
|
||||||
programs/wcmd/Makefile
|
programs/wcmd/Makefile
|
||||||
|
|
|
@ -17,6 +17,7 @@ SUBDIRS = \
|
||||||
regedit \
|
regedit \
|
||||||
regsvr32 \
|
regsvr32 \
|
||||||
regtest \
|
regtest \
|
||||||
|
rundll32 \
|
||||||
uninstaller \
|
uninstaller \
|
||||||
view \
|
view \
|
||||||
wcmd \
|
wcmd \
|
||||||
|
@ -38,6 +39,7 @@ INSTALLSUBDIRS = \
|
||||||
progman \
|
progman \
|
||||||
regedit \
|
regedit \
|
||||||
regsvr32 \
|
regsvr32 \
|
||||||
|
rundll32 \
|
||||||
uninstaller \
|
uninstaller \
|
||||||
wcmd \
|
wcmd \
|
||||||
wineconsole \
|
wineconsole \
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Makefile
|
||||||
|
rundll32.exe.dbg.c
|
||||||
|
rundll32.exe.spec.c
|
|
@ -0,0 +1,14 @@
|
||||||
|
TOPSRCDIR = @top_srcdir@
|
||||||
|
TOPOBJDIR = ../..
|
||||||
|
SRCDIR = @srcdir@
|
||||||
|
VPATH = @srcdir@
|
||||||
|
MODULE = rundll32.exe
|
||||||
|
APPMODE = cui
|
||||||
|
IMPORTS = kernel32
|
||||||
|
|
||||||
|
C_SRCS = \
|
||||||
|
rundll32.c
|
||||||
|
|
||||||
|
@MAKE_PROG_RULES@
|
||||||
|
|
||||||
|
### Dependencies:
|
|
@ -0,0 +1,128 @@
|
||||||
|
/*
|
||||||
|
* PURPOSE: Load a DLL and run an entry point with the specified parameters
|
||||||
|
*
|
||||||
|
* Copyright 2002 Alberto Massari
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* This version deliberately differs in error handling compared to the
|
||||||
|
* windows version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* rundll32 dllname,entrypoint [arguments]
|
||||||
|
*
|
||||||
|
* Documentation for this utility found on KB Q164787
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FIXME - currently receives command-line parameters in ASCII only and later
|
||||||
|
* converts to Unicode. Ideally the function should have wWinMain entry point
|
||||||
|
* and then work in Unicode only, but it seems Wine does not have necessary
|
||||||
|
* support.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "wine/port.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
typedef void (*EntryPointW) (HWND hWnd, HINSTANCE hInst, LPWSTR lpszCmdLine, int nCmdShow);
|
||||||
|
typedef void (*EntryPointA) (HWND hWnd, HINSTANCE hInst, LPSTR lpszCmdLine, int nCmdShow);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
static FARPROC LoadProc(char* strDll, char* procName, HMODULE* DllHandle)
|
||||||
|
{
|
||||||
|
FARPROC proc;
|
||||||
|
|
||||||
|
*DllHandle = LoadLibrary(strDll);
|
||||||
|
if(!*DllHandle)
|
||||||
|
{
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
proc = GetProcAddress(*DllHandle, procName);
|
||||||
|
if(!proc)
|
||||||
|
{
|
||||||
|
FreeLibrary(*DllHandle);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return proc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
char szDllName[MAX_PATH],szEntryPoint[64],szCmdLine[2048];
|
||||||
|
char* comma;
|
||||||
|
EntryPointW pfEntryPointW;
|
||||||
|
EntryPointA pfEntryPointA;
|
||||||
|
HMODULE DllHandle=NULL;
|
||||||
|
|
||||||
|
comma=strchr(argv[1],',');
|
||||||
|
if(comma==NULL)
|
||||||
|
return 0;
|
||||||
|
/* Extract the name of the DLL */
|
||||||
|
memset(szDllName,0,MAX_PATH);
|
||||||
|
strncpy(szDllName,argv[1],(comma-argv[1]));
|
||||||
|
/* Merge the other paramters into one big command line */
|
||||||
|
memset(szCmdLine,0,2048);
|
||||||
|
if(argc>2)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i=2;i<argc;i++)
|
||||||
|
{
|
||||||
|
strcat(szCmdLine,argv[i]);
|
||||||
|
if(i+1<argc) strcat(szCmdLine," ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try loading the UNICODE version first */
|
||||||
|
strcpy(szEntryPoint,comma+1);
|
||||||
|
strcat(szEntryPoint,"W");
|
||||||
|
pfEntryPointW=LoadProc(szDllName, szEntryPoint, &DllHandle);
|
||||||
|
if(pfEntryPointW!=NULL)
|
||||||
|
{
|
||||||
|
WCHAR wszCmdLine[2048];
|
||||||
|
MultiByteToWideChar(CP_ACP,0,szCmdLine,-1,wszCmdLine,2048);
|
||||||
|
pfEntryPointW(NULL,DllHandle,wszCmdLine,SW_HIDE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strcpy(szEntryPoint,comma+1);
|
||||||
|
strcat(szEntryPoint,"A");
|
||||||
|
pfEntryPointA=LoadProc(szDllName, szEntryPoint, &DllHandle);
|
||||||
|
if(pfEntryPointA==NULL)
|
||||||
|
{
|
||||||
|
strcpy(szEntryPoint,comma+1);
|
||||||
|
pfEntryPointA=LoadProc(szDllName, szEntryPoint, &DllHandle);
|
||||||
|
if(pfEntryPointA==NULL)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
pfEntryPointA(NULL,DllHandle,szCmdLine,SW_HIDE);
|
||||||
|
}
|
||||||
|
if(DllHandle)
|
||||||
|
FreeLibrary(DllHandle);
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue