// Copyright (C) 2011 Fog Creek Software
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 2 of the License, or
// (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "stdafx.h"
#include "THgStatus.h"
#include <tlhelp32.h>
#define TIMEOUT_VALUE 5000
#define EXECUTABLE_NAME "TortoiseHgOverlayServer.exe"
// This library implements a custom action for Windows Installer that terminates
// the overlay icon server.
extern "C" UINT __stdcall TerminateIconServer()
{
// Enumerate processes to attempt to find the overlay icon server.
HANDLE hProcess = NULL;
HANDLE hSnapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0L);
if (hSnapshot != NULL)
{
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if (::Process32First(hSnapshot, &pe))
{
do
{
CString strExeName(pe.szExeFile);
if (strExeName.CompareNoCase(EXECUTABLE_NAME) == 0)
{
hProcess = ::OpenProcess(SYNCHRONIZE, FALSE, pe.th32ProcessID);
break;
}
} while(::Process32Next(hSnapshot, &pe));
}
::CloseHandle(hSnapshot);
}
// Attempt to terminate the server.
if(CTHgStatus::Terminate() == 0)
{
if (hProcess != NULL)
{
::WaitForSingleObject(hProcess, TIMEOUT_VALUE);
::CloseHandle(hProcess);
}
else
{
// If a process handle is not available but the server was running,
// stall for a brief time to allow the server to terminate.
::Sleep(TIMEOUT_VALUE);
}
}
return ERROR_SUCCESS;
}
|
Loading...