Leaked source code of windows server 2003
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.
 
 
 
 
 
 

319 lines
9.7 KiB

//#--------------------------------------------------------------
//
// File: shortcut.cpp
//
// Synopsis: Implementation the custom action to add/remove the
// "Remote Administration Tools" to/from the start menu
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//----------------------------------------------------------------
#include "precomp.h"
#include <satrace.h>
#include <msi.h>
#include <string>
#include <shlobj.h>
#include <shellapi.h>
#include <shortcutresource.h>
#undef _ATL_NO_DEBUG_CRT
#include <atlbase.h>
//
// Web Interface for Remote Administration
// Manage a Web or file server using a Web browser interface
//
using namespace std;
//
// Constants for creating a shortcut to the Administration site
//
WCHAR SHORTCUT_EXT [] = L".lnk";
WCHAR SECURELAUNCH_PATH [] = L"\\ServerAppliance\\SecureLaunch.vbs";
WCHAR WSCRIPT_PATH[] = L"\\wscript.exe";
//
// note - the following is just a file name and does not need to be localized
//
WCHAR SHORTCUT_FILE_NAME [] = L"Remote Administration Tools";
WCHAR RESOURCE_FILE_NAME [] = L"\\sainstall.dll";
WCHAR SYSTEM_32_PATH [] = L"%systemroot%\\system32";
//++--------------------------------------------------------------
//
// Function: CreateSAKShortcut
//
// Synopsis: This is export function to add "Remote Administration Tools" shortcut
// to the start menu
//
// Arguments:
// [in] HANDLE - handle passed in by MSI
//
// Returns: DWORD - success/failure
//
// History: MKarki Created 12/04/2002
//
//----------------------------------------------------------------
DWORD __stdcall
CreateSAKShortcut (
/*[in]*/ MSIHANDLE hInstall
)
{
CSATraceFunc objTraceFunc ("CreateSAKShortCut");
DWORD dwRetVal = -1;
do
{
//
// Get the path to %System32%
//
WCHAR pwsSystemPath[MAX_PATH+1];
HRESULT hr = SHGetFolderPath(
NULL,
CSIDL_SYSTEM,
NULL,
SHGFP_TYPE_CURRENT,
pwsSystemPath);
if (FAILED(hr))
{
SATracePrintf ("SHGetFolderPath failed getting the System32 path with error:%x", hr);
OutputDebugString (L"SHGetFolderPath failed getting the System32 path with error\n");
break;
}
//
// Construct the path to wscript.exe
//
wstring wsWScriptPath(pwsSystemPath);
wsWScriptPath += WSCRIPT_PATH;
SATracePrintf ("WScript Path = %ws", wsWScriptPath.data());
//
// Construct the path to SecureLaunch.vbs
//
wstring wsLaunchPath(pwsSystemPath);
wsLaunchPath += SECURELAUNCH_PATH;
SATracePrintf ("Secure Launch Path = %ws", wsLaunchPath.data());
//
//Construct the path where the shortcut will be stored in the Startup folder
//
//
//Get the path to the Administrators Tools folder
//
WCHAR pwsStartMenuPath[MAX_PATH+1];
hr = SHGetFolderPath(NULL,
CSIDL_COMMON_ADMINTOOLS,
NULL,
SHGFP_TYPE_CURRENT,
pwsStartMenuPath);
if (FAILED(hr))
{
SATracePrintf ("SHGetFolderPath failed getting the Start Menu path with error:%x", hr);
OutputDebugString (L"SHGetFolderPath failed getting the System32 path with error");
break;
}
wstring wsPathLink(pwsStartMenuPath);
wsPathLink += L"\\";
wsPathLink += SHORTCUT_FILE_NAME;
wsPathLink += SHORTCUT_EXT;
SATracePrintf(" PathLink = %ws", wsPathLink.data());
//
// Now that the shortcut information has been constructed,
// create the shortcut object.
//
CComPtr <IShellLink> psl;
//
// Get a pointer to the IShellLink interface.
//
hr = CoCreateInstance (
CLSID_ShellLink,
NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink,
(LPVOID *)&psl);
if (FAILED(hr))
{
SATracePrintf ("ShellLink CoCreateInstance Failed with error:%x",hr);
OutputDebugString (L"ShellLink CoCreateInstance Failed");
break;
}
WCHAR wszShortcutResourceID [MAX_PATH +1];
_itow (IDS_SAK_SHORTCUT_DESCRIPTION, wszShortcutResourceID, 10);
wstring wsShortcutDescription (L"@");
wsShortcutDescription += pwsSystemPath;
wsShortcutDescription += RESOURCE_FILE_NAME;
wsShortcutDescription += L",-";
wsShortcutDescription += wszShortcutResourceID;
SATracePrintf ("ShortCut Description:%ws", wsShortcutDescription.data ());
//
// Set the information for the shortcut
//
psl->SetPath(wsWScriptPath.data());
psl->SetArguments(wsLaunchPath.data());
psl->SetDescription(wsShortcutDescription.data ());
//
// the following really doesn't get the icon - because there is no icon in this DLL
// it is too late to add an icon for .NET Server
//
psl->SetIconLocation(L"sasetupca.dll", 0);
SATraceString ("Saving shortcut to file");
//
// Query IShellLink for the IPersistFile interface for saving the
// shortcut in persistent storage.
//
CComPtr <IPersistFile> ppf;
hr = psl->QueryInterface(
IID_IPersistFile,
(LPVOID*)&ppf
);
if (FAILED(hr))
{
SATracePrintf ("QueryInterface failed for IPersistFile with error:%x",hr);
OutputDebugString (L"QueryInterface failed for IPersistFile\n");
break;
}
SATraceString ("Pointer to IPersistFile retrieved");
//
// Save the link by calling IPersistFile::Save.
//
hr = ppf->Save(wsPathLink.data(), TRUE);
if (FAILED(hr))
{
SATracePrintf ("Failed to save shortcut with error:%x", hr);
OutputDebugString (L"Failed to save shortcut\n");
break;
}
SATraceString ("Successfully saved shortcut");
OutputDebugString (L"Successfully saved shortcut");
wstring wsLocalizedFileNameResource (SYSTEM_32_PATH);
wsLocalizedFileNameResource += RESOURCE_FILE_NAME;
//
// set the localized name of the shortcut
//
hr = SHSetLocalizedName (
(LPWSTR) wsPathLink.data (),
wsLocalizedFileNameResource.data (),
IDS_SAK_SHORTCUT_NAME
);
if (FAILED (hr))
{
SATracePrintf ("Failed on SHSetLocalizedFilaName with error:%x", hr);
OutputDebugString (L"Failed on SHSetLocalizedFilaName");
break;
}
SATraceString ("Successfully created shortcut");
OutputDebugString (L"Successfully created shortcut");
//
// done creating the shortcut
//
dwRetVal = ERROR_SUCCESS;
}
while (false);
return (dwRetVal);
} // end of CreateSAKShortcut function
//++--------------------------------------------------------------
//
// Function: RemoveSAKShortcut
//
// Synopsis: This is export function to remove "Remote Administration Tools" shortcut
// to the start menu
//
// Arguments:
// [in] HANDLE - handle passed in by MSI
//
// Returns: DWORD - success/failure
//
// History: MKarki Created 12/04/2002
//
//----------------------------------------------------------------
DWORD __stdcall
RemoveSAKShortcut (
/*[in]*/ MSIHANDLE hInstall
)
{
CSATraceFunc objTraceFunc ("RemoveSAKShortcut");
DWORD dwRetVal = -1;
do
{
//
//Construct the path where the shortcut will be stored in the Startup folder
//
//
//Get the path to the Administrators Tools folder
//
WCHAR pwsStartMenuPath[MAX_PATH +1];
HRESULT hr = SHGetFolderPath(NULL,
CSIDL_COMMON_ADMINTOOLS,
NULL,
SHGFP_TYPE_CURRENT,
pwsStartMenuPath);
if (FAILED(hr))
{
SATracePrintf ("SHGetFolderPath failed getting the Start Menu path with error:%x", hr);
break;
}
wstring wsPathLink(pwsStartMenuPath);
wsPathLink += L"\\";
wsPathLink += SHORTCUT_FILE_NAME;
wsPathLink += SHORTCUT_EXT;
SATracePrintf(" PathLink = %ws", wsPathLink.data());
//
// delete the shortcut now -
//
BOOL bRetVal = DeleteFile (wsPathLink.data ());
if (FALSE == bRetVal)
{
SATracePrintf ("Failed to Delete File with error:%x", GetLastError ());
break;
}
//
// success
//
dwRetVal = ERROR_SUCCESS;
}
while (false);
return (dwRetVal);
} // end of RemoveSAKShortcut function