Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

952 lines
24 KiB

// 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;
}