952 lines
25 KiB
C++
952 lines
25 KiB
C++
// msimeth.cpp : Defines the entry point for the application.
|
|
|
|
//
|
|
|
|
// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
|
|
#include <precomp.h>
|
|
#include "classfac.h"
|
|
#include "methods.h"
|
|
#include "msimethod.h"
|
|
|
|
DWORD g_ProductRegister = 0;
|
|
DWORD g_SoftwareFeatureRegister = 0;
|
|
|
|
long g_lRunning = 0;
|
|
BOOL s_Exiting = FALSE ;
|
|
BOOL gbShowIcon = FALSE;
|
|
HANDLE g_hMutex = NULL;
|
|
HANDLE g_hTerminateEvent = NULL;
|
|
HANDLE g_hMethodAdd = NULL;
|
|
HANDLE g_hMethodRelease = NULL;
|
|
UINT g_uiResult = 0;
|
|
HANDLE g_hPipe = NULL;
|
|
bool g_bPipe = true;
|
|
|
|
DEFINE_GUID(CLSID_MsiProductMethods,0x3E6A93E0, 0xFDAD, 0x11D2, 0xa9, 0x7B, 0x0, 0xA0, 0xC9, 0x95, 0x49, 0x21);
|
|
// {3E6A93E0-FDAD-11D2-A97B-00A0C9954921}
|
|
|
|
DEFINE_GUID(CLSID_MsiSoftwareFeatureMethods,0xE293BA80, 0xFDAD, 0x11D2, 0xa9, 0x7B, 0x0, 0xA0, 0xC9, 0x95, 0x49, 0x21);
|
|
// {E293BA80-FDAD-11D2-A97B-00A0C9954921}
|
|
|
|
|
|
BOOL IsNT()
|
|
{
|
|
OSVERSIONINFO OSInfo;
|
|
|
|
OSInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
|
|
if(GetVersionEx(&OSInfo) && OSInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
|
return TRUE ;
|
|
|
|
return FALSE ;
|
|
}
|
|
/*
|
|
LRESULT CALLBACK WndProc(IN HWND hWnd, IN UINT message,
|
|
IN WPARAM wParam, IN LPARAM lParam)
|
|
{
|
|
switch (message) {
|
|
|
|
case WM_QUERYOPEN: //todo, queryend session
|
|
return 0;
|
|
|
|
case WM_QUERYENDSESSION:
|
|
return TRUE;
|
|
|
|
case WM_ENDSESSION:
|
|
if(wParam == TRUE){
|
|
|
|
SetEvent(g_hTerminateEvent);
|
|
}
|
|
return 0;
|
|
|
|
case WM_DESTROY:
|
|
PostQuitMessage(0);
|
|
SetEvent(g_hTerminateEvent);
|
|
break;
|
|
|
|
default:
|
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
*//*
|
|
HWND CreateMsiMethWindow(IN HINSTANCE hInstance)
|
|
{
|
|
WNDCLASS wndclass;
|
|
wndclass.style = 0;
|
|
wndclass.lpfnWndProc = WndProc;
|
|
wndclass.cbClsExtra = 0;
|
|
wndclass.cbWndExtra = 0;
|
|
wndclass.hInstance = hInstance;
|
|
wndclass.hIcon = LoadIcon(hInstance, TEXT("MsiMeth"));
|
|
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wndclass.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
|
|
wndclass.lpszMenuName = NULL;
|
|
wndclass.lpszClassName = TEXT("MSIMETHCLASS");
|
|
|
|
if(!RegisterClass(&wndclass)) return NULL;
|
|
|
|
HWND hWnd = CreateWindow(TEXT("MSIMETHCLASS"),
|
|
TEXT("MSIMETH"),
|
|
WS_OVERLAPPED | WS_SYSMENU,
|
|
CW_USEDEFAULT,
|
|
CW_USEDEFAULT,
|
|
CW_USEDEFAULT,
|
|
CW_USEDEFAULT,
|
|
NULL, NULL, hInstance, NULL);
|
|
|
|
if(hWnd == NULL)return NULL;
|
|
|
|
// This program is visible only for debug builds.
|
|
|
|
if(gbShowIcon){
|
|
ShowWindow(hWnd,SW_MINIMIZE);
|
|
UpdateWindow(hWnd);
|
|
HMENU hMenu = GetSystemMenu(hWnd, FALSE);
|
|
|
|
if(hMenu) DeleteMenu(hMenu, SC_RESTORE, MF_BYCOMMAND);
|
|
}
|
|
|
|
return hWnd;
|
|
}
|
|
*//*
|
|
HRESULT UninitComServer ()
|
|
{
|
|
if(g_ProductRegister) CoRevokeClassObject(g_ProductRegister);
|
|
|
|
if(g_SoftwareFeatureRegister) CoRevokeClassObject(g_SoftwareFeatureRegister);
|
|
|
|
CoUninitialize();
|
|
|
|
return S_OK ;
|
|
}
|
|
*//*
|
|
HRESULT InitInstanceProvider()
|
|
{
|
|
CMethodsFactory *pClassFactory = new CMethodsFactory();
|
|
|
|
HRESULT hrResult = S_OK;
|
|
|
|
if(SUCCEEDED(hrResult = CoRegisterClassObject(CLSID_MsiProductMethods,
|
|
(IUnknown *)pClassFactory,
|
|
CLSCTX_LOCAL_SERVER,
|
|
REGCLS_MULTIPLEUSE,
|
|
&g_ProductRegister))){
|
|
|
|
hrResult = CoRegisterClassObject(CLSID_MsiSoftwareFeatureMethods,
|
|
(IUnknown *)pClassFactory,
|
|
CLSCTX_LOCAL_SERVER,
|
|
REGCLS_MULTIPLEUSE,
|
|
&g_SoftwareFeatureRegister);
|
|
}
|
|
|
|
return hrResult ;
|
|
}
|
|
*//*
|
|
HRESULT InitComServer ( DWORD a_AuthenticationLevel , DWORD a_ImpersonationLevel )
|
|
{
|
|
HRESULT t_Result = S_OK ;
|
|
|
|
t_Result = CoInitializeEx(0, COINIT_MULTITHREADED);
|
|
|
|
if(SUCCEEDED(t_Result)){
|
|
|
|
t_Result = CoInitializeSecurity(NULL, -1, NULL, NULL,
|
|
a_AuthenticationLevel, a_ImpersonationLevel,
|
|
NULL, EOAC_NONE, 0);
|
|
|
|
if(FAILED(t_Result)){
|
|
|
|
CoUninitialize();
|
|
return t_Result;
|
|
}
|
|
|
|
}
|
|
|
|
if(SUCCEEDED(t_Result)) t_Result = InitInstanceProvider();
|
|
|
|
if(FAILED(t_Result)){
|
|
|
|
UninitComServer () ;
|
|
}
|
|
|
|
return t_Result ;
|
|
}
|
|
*//*
|
|
void WindowsDispatch()
|
|
{
|
|
BOOL bWaitAll = FALSE;
|
|
HANDLE hEvents[] = {g_hTerminateEvent, g_hMethodAdd, g_hMethodRelease};
|
|
int iNumEvents = sizeof(hEvents) / sizeof(HANDLE);
|
|
DWORD dwWait = 60000; //60 seconds
|
|
|
|
while(1){
|
|
|
|
// listen for server events...exit if dwTime elapses without any requests
|
|
DWORD dwObj = WaitForMultipleObjects(iNumEvents, hEvents, bWaitAll, dwWait);
|
|
|
|
switch(dwObj){
|
|
|
|
case WAIT_TIMEOUT: // time expired
|
|
//we timed out so if there are no active threads it's safe to exit.
|
|
if(g_cObj < 1) return;
|
|
break;
|
|
|
|
case WAIT_OBJECT_0: //terminate
|
|
if(g_cObj < 1) return;
|
|
|
|
dwWait = 2000;
|
|
break;
|
|
|
|
case WAIT_OBJECT_0 + 1: //method started
|
|
g_lRunning++;
|
|
break;
|
|
|
|
case WAIT_OBJECT_0 + 2: //method ended
|
|
g_lRunning--;
|
|
break;
|
|
|
|
}
|
|
|
|
if(s_Exiting) return ;
|
|
}
|
|
}
|
|
*//*
|
|
HRESULT Process ()
|
|
{
|
|
DWORD t_ImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE ;
|
|
DWORD t_AuthenticationLevel = RPC_C_AUTHN_LEVEL_CONNECT ;
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
if(SUCCEEDED(hr = InitComServer(t_ImpersonationLevel, t_AuthenticationLevel))){
|
|
|
|
WindowsDispatch();
|
|
UninitComServer();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
*/
|
|
void TerminateRunning()
|
|
{
|
|
DWORD dwFlag = EVENT_MODIFY_STATE;
|
|
|
|
if(IsNT()) dwFlag |= SYNCHRONIZE;
|
|
|
|
HANDLE hTerm = OpenEvent(EVENT_MODIFY_STATE, FALSE, TEXT("MSIPROV_METHODS_SERVER_TERMINATE"));
|
|
|
|
if(hTerm){
|
|
|
|
SetEvent(hTerm);
|
|
CloseHandle(hTerm);
|
|
}
|
|
|
|
return;
|
|
}
|
|
/*
|
|
BOOL ParseCommandLine ()
|
|
{
|
|
BOOL t_Exit = FALSE;
|
|
|
|
LPTSTR t_CommandLine = GetCommandLine();
|
|
|
|
if(t_CommandLine)
|
|
{
|
|
TCHAR *t_Arg = NULL;
|
|
TCHAR *t_ApplicationArg = NULL;
|
|
t_ApplicationArg = _tcstok(t_CommandLine, _TEXT(" \t"));
|
|
t_Arg = _tcstok(NULL, _TEXT(" \t"));
|
|
|
|
if(t_Arg){
|
|
if(_tcsicmp(t_Arg, _TEXT ("/RegServer")) == 0){
|
|
|
|
t_Exit = TRUE;
|
|
DllRegisterServer();
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/UnRegServer")) == 0){
|
|
|
|
t_Exit = TRUE;
|
|
DllUnregisterServer();
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/kill")) == 0){
|
|
|
|
t_Exit = TRUE;
|
|
TerminateRunning();
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/admin")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" ")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" "));
|
|
TCHAR ptcOptions[1000];
|
|
_tcscpy(ptcOptions, _T(""));
|
|
|
|
TCHAR *token = _tcstok(NULL, _TEXT(" "));
|
|
while(token != NULL){
|
|
|
|
_tcscat(ptcOptions, _T(" "));
|
|
_tcscat(ptcOptions, token);
|
|
|
|
token = _tcstok(NULL, _TEXT(" "));
|
|
}
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Admin((LPWSTR)ptcPackage, (LPWSTR)ptcOptions, &g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/advertise")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" ")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" "));
|
|
TCHAR ptcOptions[1000];
|
|
_tcscpy(ptcOptions, _T(""));
|
|
|
|
TCHAR *token = _tcstok(NULL, _TEXT(" "));
|
|
while(token != NULL){
|
|
|
|
_tcscat(ptcOptions, _T(" "));
|
|
_tcscat(ptcOptions, token);
|
|
|
|
token = _tcstok(NULL, _TEXT(" "));
|
|
}
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Advertise((LPWSTR)ptcPackage, (LPWSTR)ptcOptions, &g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/configure")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
int iInstallLevel = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
int iInstallState = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Configure((LPWSTR)ptcPackage, iInstallLevel, iInstallState, &g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/install")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" ")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" "));
|
|
TCHAR ptcOptions[1000];
|
|
_tcscpy(ptcOptions, _T(""));
|
|
|
|
TCHAR *token = _tcstok(NULL, _TEXT(" "));
|
|
while(token != NULL){
|
|
|
|
_tcscat(ptcOptions, _T(" "));
|
|
_tcscat(ptcOptions, token);
|
|
|
|
token = _tcstok(NULL, _TEXT(" "));
|
|
}
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Install((LPWSTR)ptcPackage, (LPWSTR)ptcOptions, &g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/reinstall")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
DWORD dwReinstallMode = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Reinstall((LPWSTR)ptcPackage, dwReinstallMode, &g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/uninstall")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Uninstall((LPWSTR)ptcPackage, &g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/upgrade")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" ")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" "));
|
|
TCHAR ptcOptions[1000];
|
|
_tcscpy(ptcOptions, _T(""));
|
|
|
|
TCHAR *token = _tcstok(NULL, _TEXT(" "));
|
|
while(token != NULL){
|
|
|
|
_tcscat(ptcOptions, _T(" "));
|
|
_tcscat(ptcOptions, token);
|
|
|
|
token = _tcstok(NULL, _TEXT(" "));
|
|
}
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Upgrade((LPWSTR)ptcPackage, (LPWSTR)ptcOptions, &g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/sfconfigure")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
TCHAR *ptcFeature = _tcstok(NULL, _TEXT(" \t"));
|
|
int iInstallState = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->ConfigureSF((LPWSTR)ptcPackage, (LPWSTR)ptcFeature, iInstallState,
|
|
&g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/sfreinstall")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
TCHAR *ptcFeature = _tcstok(NULL, _TEXT(" \t"));
|
|
DWORD dwReinstallMode = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->ReinstallSF((LPWSTR)ptcPackage, (LPWSTR)ptcFeature, dwReinstallMode,
|
|
&g_uiResult, iThread);
|
|
t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
}
|
|
}
|
|
}
|
|
|
|
return t_Exit ;
|
|
}
|
|
*/
|
|
|
|
int APIENTRY WinMain(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
// BOOL t_Exit = FALSE;
|
|
g_uiResult = 0;
|
|
|
|
LPTSTR t_CommandLine = GetCommandLine();
|
|
|
|
if(t_CommandLine)
|
|
{
|
|
TCHAR *t_Arg = NULL;
|
|
TCHAR *t_ApplicationArg = NULL;
|
|
t_ApplicationArg = _tcstok(t_CommandLine, _TEXT(" \t"));
|
|
t_Arg = _tcstok(NULL, _TEXT(" \t"));
|
|
|
|
if(t_Arg){
|
|
if(_tcsicmp(t_Arg, _TEXT ("/RegServer")) == 0){
|
|
|
|
// t_Exit = TRUE;
|
|
DllRegisterServer();
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/UnRegServer")) == 0){
|
|
|
|
// t_Exit = TRUE;
|
|
DllUnregisterServer();
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/kill")) == 0){
|
|
|
|
// t_Exit = TRUE;
|
|
TerminateRunning();
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/admin")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" ")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" "));
|
|
TCHAR ptcOptions[1000];
|
|
_tcscpy(ptcOptions, _T(""));
|
|
|
|
TCHAR *token = _tcstok(NULL, _TEXT(" "));
|
|
while(token != NULL){
|
|
|
|
_tcscat(ptcOptions, _T(" "));
|
|
_tcscat(ptcOptions, token);
|
|
|
|
token = _tcstok(NULL, _TEXT(" "));
|
|
}
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Admin((LPWSTR)ptcPackage, (LPWSTR)ptcOptions, &g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/advertise")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" ")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" "));
|
|
TCHAR ptcOptions[1000];
|
|
_tcscpy(ptcOptions, _T(""));
|
|
|
|
TCHAR *token = _tcstok(NULL, _TEXT(" "));
|
|
while(token != NULL){
|
|
|
|
_tcscat(ptcOptions, _T(" "));
|
|
_tcscat(ptcOptions, token);
|
|
|
|
token = _tcstok(NULL, _TEXT(" "));
|
|
}
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Advertise((LPWSTR)ptcPackage, (LPWSTR)ptcOptions, &g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/configure")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
int iInstallLevel = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
int iInstallState = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Configure((LPWSTR)ptcPackage, iInstallLevel, iInstallState, &g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/install")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" ")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" "));
|
|
TCHAR ptcOptions[1000];
|
|
_tcscpy(ptcOptions, _T(""));
|
|
|
|
TCHAR *token = _tcstok(NULL, _TEXT(" "));
|
|
while(token != NULL){
|
|
|
|
_tcscat(ptcOptions, _T(" "));
|
|
_tcscat(ptcOptions, token);
|
|
|
|
token = _tcstok(NULL, _TEXT(" "));
|
|
}
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Install((LPWSTR)ptcPackage, (LPWSTR)ptcOptions, &g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/reinstall")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
DWORD dwReinstallMode = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Reinstall((LPWSTR)ptcPackage, dwReinstallMode, &g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/uninstall")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Uninstall((LPWSTR)ptcPackage, &g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/upgrade")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" ")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" "));
|
|
TCHAR ptcOptions[1000];
|
|
_tcscpy(ptcOptions, _T(""));
|
|
|
|
TCHAR *token = _tcstok(NULL, _TEXT(" "));
|
|
while(token != NULL){
|
|
|
|
_tcscat(ptcOptions, _T(" "));
|
|
_tcscat(ptcOptions, token);
|
|
|
|
token = _tcstok(NULL, _TEXT(" "));
|
|
}
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->Upgrade((LPWSTR)ptcPackage, (LPWSTR)ptcOptions, &g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/sfconfigure")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
TCHAR *ptcFeature = _tcstok(NULL, _TEXT(" \t"));
|
|
int iInstallState = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->ConfigureSF((LPWSTR)ptcPackage, (LPWSTR)ptcFeature, iInstallState,
|
|
&g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
|
|
}else if(_tcsicmp(t_Arg, _TEXT("/sfreinstall")) == 0){
|
|
|
|
int iThread = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
TCHAR *ptcPackage = _tcstok(NULL, _TEXT(" \t"));
|
|
TCHAR *ptcFeature = _tcstok(NULL, _TEXT(" \t"));
|
|
DWORD dwReinstallMode = _ttoi(_tcstok(NULL, _TEXT(" \t")));
|
|
|
|
SetFileApisToOEM();
|
|
|
|
g_hPipe = CreateFileW(L"\\\\.\\pipe\\msimeth_pipe", GENERIC_WRITE, 0, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
|
//synchronize us with the parent process
|
|
g_hMutex = CreateMutex(NULL, FALSE, TEXT("MSIPROV_METHODS_SERVER"));
|
|
|
|
if(g_hMutex)
|
|
WaitForSingleObject(g_hMutex, INFINITE);
|
|
|
|
ReleaseMutex(g_hMutex);
|
|
|
|
// call the server with a pipe set up to deal with
|
|
//status messages
|
|
CMethods *pMeth = new CMethods();
|
|
|
|
pMeth->ReinstallSF((LPWSTR)ptcPackage, (LPWSTR)ptcFeature, dwReinstallMode,
|
|
&g_uiResult, iThread);
|
|
// t_Exit = TRUE;
|
|
|
|
CloseHandle(g_hPipe);
|
|
|
|
delete pMeth;
|
|
}
|
|
}
|
|
}
|
|
|
|
return g_uiResult;
|
|
} |