|
|
#include "stdinc.h"
#pragma hdrstop
#include "sxsservice.h"
#include "stdlib.h"
#include "stdio.h"
EXTERN_C RPC_IF_HANDLE SxsStoreManager_ClientIfHandle;
//
// In the client, we parse the commandline, get a connection to the server, and
// go to town. We implement some things like recursive directory walking ourselves,
// because the server knows nothing more than "where a manifest is" and what installation
// reference to use when installing it.
//
RPC_STATUS __cdecl wmain(INT argc, PWSTR argv[]) { PWSTR pcwszUuid = NULL; PWSTR pcwszProtocolSequence = L"ncacn_np"; PWSTR pcwszNetworkAddress = NULL; PWSTR pcwszEndpoint = SXS_STORE_SERVICE_NAME; PWSTR pcwszOptions = NULL; PWSTR pcwszBindingString = NULL; handle_t BindingHandle; RPC_STATUS status; SXS_INSTALL_DATA InstallData = {0}; SXS_INSTALL_RESULT InstallResult;
for (INT i = 1; i < argc; i++) { PCWSTR arg = argv[i];
if (lstrcmpiW(arg, L"-rpcuuid") == 0) { pcwszUuid = argv[++i]; } else if (lstrcmpiW(arg, L"-rpcprotocol") == 0) { pcwszProtocolSequence = argv[++i]; } else if (lstrcmpiW(arg, L"-rpcaddress") == 0) { pcwszNetworkAddress = argv[++i]; } else if (lstrcmpiW(arg, L"-rpcendpoint") == 0) { pcwszEndpoint = argv[++i]; } else if (lstrcmpiW(arg, L"-rpcoptions") == 0) { pcwszOptions = argv[++i]; } else if (lstrcmpiW(arg, L"-storeid") == 0) { UNICODE_STRING us; RtlInitUnicodeString(&us, argv[++i]); if (!NT_SUCCESS(RtlGUIDFromString(&us, &InstallData.StoreIdentifier))) { wprintf(L"Unable to convert store id %wZ to a guid.\n", &us); return ERROR_INVALID_PARAMETER; } } else if (lstrcmpiW(arg, L"-manifestpath") == 0) { InstallData.pcwszManifestPath = argv[++i]; } else if (lstrcmpiW(arg, L"-reftype") == 0) { UNICODE_STRING us; RtlInitUnicodeString(&us, argv[++i]); if (!NT_SUCCESS(RtlGUIDFromString(&us, &InstallData.AssemblyReference.InstallationReferenceType))) { wprintf(L"Unable to convert reference type %wZ to a guid.\n", &us); return ERROR_INVALID_PARAMETER; } } else if (lstrcmpiW(arg, L"-refdata") == 0) { InstallData.AssemblyReference.pcwszReferenceData = argv[++i]; } else if (lstrcmpiW(arg, L"-refsubdata") == 0) { InstallData.AssemblyReference.pcwszReferenceSubData = argv[++i]; } }
status = RpcStringBindingComposeW( pcwszUuid, pcwszProtocolSequence, pcwszNetworkAddress, pcwszEndpoint, pcwszOptions, &pcwszBindingString);
if (status != RPC_S_OK) { return status; }
status = RpcBindingFromStringBindingW(pcwszBindingString, &BindingHandle); RpcStringFreeW(&pcwszBindingString);
if (status != RPC_S_OK) { return status; }
if (!SxsProtectedInstall( BindingHandle, 0, 1, &InstallData, &InstallResult)) { wprintf(L"Installation failed - lasterror = 0x%08lx (%ld)\n", ::GetLastError(), ::GetLastError()); } else { wprintf(L"Installation succeeded - disposition %d\n", InstallResult); } }
|