From 8f5d90c7cf6137fc5fde1e4063ceb62aeb1abcd1 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 13 Jun 2005 02:06:57 +0000 Subject: [PATCH] windows-installer-updates-20050612 Add asetkey.exe Add uninstall.exe and associated shortcut to Wix Fix ability to uninstall loopback adapter on non-English Windows versions ==================== This delta was composed from multiple commits as part of the CVS->Git migration. The checkin message with each commit was inconsistent. The following are the additional commit messages. ==================== add clean rule ==================== use "uninst" for rule instead of "uninstall" ==================== build wix/uninstall directory ==================== add OpenAFS logo icon --- src/WINNT/install/NSIS/OpenAFS.nsi | 2 + src/WINNT/install/loopback/loopbackutils.cpp | 153 ++++++++++++++++++++------- src/WINNT/install/wix/Icon/ico_OpenAFS.ico | Bin 0 -> 32966 bytes src/WINNT/install/wix/NTMakefile | 17 ++- src/WINNT/install/wix/feature.wxi | 2 + src/WINNT/install/wix/files.wxi | 9 ++ src/WINNT/install/wix/lang/en_US/strings.wxl | 2 +- src/WINNT/install/wix/lang/en_US/ui.wxi | 1 + src/WINNT/install/wix/uninstall/NTMakefile | 32 ++++++ src/WINNT/install/wix/uninstall/uninstall.c | 23 ++++ src/WINNT/install/wix/uninstall/uninstall.rc | 19 ++++ src/config/NTMakefile | 3 + 12 files changed, 220 insertions(+), 43 deletions(-) create mode 100644 src/WINNT/install/wix/Icon/ico_OpenAFS.ico create mode 100644 src/WINNT/install/wix/uninstall/NTMakefile create mode 100644 src/WINNT/install/wix/uninstall/uninstall.c create mode 100644 src/WINNT/install/wix/uninstall/uninstall.rc diff --git a/src/WINNT/install/NSIS/OpenAFS.nsi b/src/WINNT/install/NSIS/OpenAFS.nsi index e7577b2..3fd63f0 100644 --- a/src/WINNT/install/NSIS/OpenAFS.nsi +++ b/src/WINNT/install/NSIS/OpenAFS.nsi @@ -787,6 +787,7 @@ skipCheck: SetOutPath "$INSTDIR\Server\usr\afs\bin" File "${AFS_SERVER_BUILDDIR}\afskill.exe" File "${AFS_SERVER_BUILDDIR}\afssvrcfg.exe" + File "${AFS_SERVER_BUILDDIR}\asetkey.exe" File "${AFS_SERVER_BUILDDIR}\bosctlsvc.exe" File "${AFS_SERVER_BUILDDIR}\bosserver.exe" File "${AFS_SERVER_BUILDDIR}\buserver.exe" @@ -1155,6 +1156,7 @@ DoServer: SetOutPath "$INSTDIR\Server\usr\afs\bin" File "${AFS_SERVER_BUILDDIR}\afskill.pdb" File "${AFS_SERVER_BUILDDIR}\afssvrcfg.pdb" + File "${AFS_SERVER_BUILDDIR}\asetkey.pdb" File "${AFS_SERVER_BUILDDIR}\bosctlsvc.pdb" File "${AFS_SERVER_BUILDDIR}\bosserver.pdb" File "${AFS_SERVER_BUILDDIR}\buserver.pdb" diff --git a/src/WINNT/install/loopback/loopbackutils.cpp b/src/WINNT/install/loopback/loopbackutils.cpp index 72256a5..01248d2 100644 --- a/src/WINNT/install/loopback/loopbackutils.cpp +++ b/src/WINNT/install/loopback/loopbackutils.cpp @@ -57,7 +57,6 @@ extern "C" DWORD UnInstallLoopBack(void) GUID netGuid; HDEVINFO hDeviceInfo = INVALID_HANDLE_VALUE; SP_DEVINFO_DATA DeviceInfoData; - TCHAR* deviceDesc; DWORD index = 0; BOOL found = FALSE; DWORD size = 0; @@ -74,45 +73,80 @@ extern "C" DWORD UnInstallLoopBack(void) if (hDeviceInfo == INVALID_HANDLE_VALUE) return GetLastError(); - deviceDesc = (TCHAR *)malloc(MAX_PATH*sizeof(TCHAR)); // enumerate the driver info list - while (SetupDiEnumDeviceInfo(hDeviceInfo, index, &DeviceInfoData)) + while (TRUE) { + TCHAR * deviceHwid; + + ok = SetupDiEnumDeviceInfo(hDeviceInfo, index, &DeviceInfoData); + + if(!ok) + { + if(GetLastError() == ERROR_NO_MORE_ITEMS) + break; + else + { + index++; + continue; + } + } + // try to get the DeviceDesc registry property - ok = SetupDiGetDeviceRegistryProperty(hDeviceInfo, &DeviceInfoData, - SPDRP_DEVICEDESC, - NULL, (PBYTE)deviceDesc, - MAX_PATH * sizeof(TCHAR), &size); + ok = SetupDiGetDeviceRegistryProperty(hDeviceInfo, + &DeviceInfoData, + SPDRP_HARDWAREID, + NULL, + NULL, + 0, + &size); if (!ok) { ret = GetLastError(); - if (ret != ERROR_INSUFFICIENT_BUFFER) - break; - // if the buffer is too small, reallocate - free(deviceDesc); - deviceDesc = (TCHAR *)malloc(size); + if (ret != ERROR_INSUFFICIENT_BUFFER) { + index++; + continue; + } + + deviceHwid = (TCHAR *)malloc(size); ok = SetupDiGetDeviceRegistryProperty(hDeviceInfo, &DeviceInfoData, - SPDRP_DEVICEDESC, - NULL, (PBYTE)deviceDesc, - size, NULL); - if (!ok) - break; - } + SPDRP_HARDWAREID, + NULL, + (PBYTE)deviceHwid, + size, + NULL); + if (!ok) { + free(deviceHwid); + deviceHwid = NULL; + index++; + continue; + } + } else { + // something is wrong. This shouldn't have worked with a NULL buffer + ReportMessage(0, "GetDeviceRegistryProperty succeeded with a NULL buffer", NULL, NULL, 0); + index++; + continue; + } - // case insensitive comparison - _tcslwr(deviceDesc); - if( _tcsstr(deviceDesc, DRIVER)) - { - found = TRUE; - break; - } + for (TCHAR *t = deviceHwid; t && *t && t < &deviceHwid[size / sizeof(TCHAR)]; t += _tcslen(t) + 1) + { + if(!_tcsicmp(DRIVERHWID, t)) { + found = TRUE; + break; + } + } + + if (deviceHwid) { + free(deviceHwid); + deviceHwid = NULL; + } + if (found) + break; + index++; } - free(deviceDesc); - if (found == FALSE) { ret = GetLastError(); @@ -126,6 +160,7 @@ extern "C" DWORD UnInstallLoopBack(void) ret = GetLastError(); goto cleanup; } + ok = SetupDiCallClassInstaller(DIF_REMOVE, hDeviceInfo, &DeviceInfoData); if (!ok) { @@ -133,6 +168,8 @@ extern "C" DWORD UnInstallLoopBack(void) goto cleanup; } + ret = 0; + cleanup: // clean up the device info set if (hDeviceInfo != INVALID_HANDLE_VALUE) @@ -143,7 +180,6 @@ cleanup: BOOL IsLoopbackInstalled(void) { - TCHAR * hwid = _T("*MSLOOP"); HDEVINFO DeviceInfoSet; SP_DEVINFO_DATA DeviceInfoData; DWORD i,err; @@ -163,11 +199,21 @@ BOOL IsLoopbackInstalled(void) // found = FALSE; DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); - for (i=0; SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData); i++) + for (i=0; ;i++) { + BOOL ok; DWORD DataT; TCHAR *p, *buffer = NULL; DWORD buffersize = 0; + + ok = SetupDiEnumDeviceInfo(DeviceInfoSet, i, &DeviceInfoData); + + if(!ok) { + if(GetLastError() == ERROR_NO_MORE_ITEMS) + break; + else + continue; + } // // We won't know the size of the HardwareID buffer until we call @@ -175,7 +221,13 @@ BOOL IsLoopbackInstalled(void) // use the required buffer size to Alloc the nessicary space. // Keep calling we have success or an unknown failure. // - while (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,&DeviceInfoData,SPDRP_HARDWAREID,&DataT,(PBYTE)buffer,buffersize,&buffersize)) + while (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, + &DeviceInfoData, + SPDRP_HARDWAREID, + &DataT, + (PBYTE)buffer, + buffersize, + &buffersize)) { if (GetLastError() == ERROR_INVALID_DATA) { @@ -191,25 +243,32 @@ BOOL IsLoopbackInstalled(void) } else { + if (buffer) + LocalFree(buffer); goto cleanup_DeviceInfo; - } + } } - if (GetLastError() == ERROR_INVALID_DATA) + if (GetLastError() == ERROR_INVALID_DATA) { + if (buffer) + LocalFree(buffer); continue; + } // Compare each entry in the buffer multi-sz list with our hwid. for (p=buffer; *p && (p < &buffer[buffersize]); p += _tcslen(p)+1) { - if (!_tcsicmp(hwid,p)) + if (!_tcsicmp(DRIVERHWID,p)) { found = TRUE; break; } } - if (buffer) LocalFree(buffer); - if (found) break; + if (buffer) + LocalFree(buffer); + if (found) + break; } // Cleanup. @@ -323,16 +382,28 @@ extern "C" DWORD InstallLoopBack(LPCTSTR pConnectionName, LPCTSTR ip, LPCTSTR ma // if we successfully find the hardware ID and it turns out to // be the one for the loopback driver, then we are done. - if(SetupDiGetDriverInfoDetail(hDeviceInfo, + if (SetupDiGetDriverInfoDetail(hDeviceInfo, &DeviceInfoData, &DriverInfoData, pDriverInfoDetail, sizeof(detailBuf), - NULL) && - !_tcsicmp(pDriverInfoDetail->HardwareID, DRIVERHWID)) { - - found = TRUE; - break; + NULL)) { + TCHAR * t; + + // pDriverInfoDetail->HardwareID is a MULTISZ string. Go through the + // whole list and see if there is a match somewhere. + t = pDriverInfoDetail->HardwareID; + while (t && *t && t < (TCHAR *) &detailBuf[sizeof(detailBuf)/sizeof(detailBuf[0])]) { + if (!_tcsicmp(t, DRIVERHWID)) + break; + + t += _tcslen(t) + 1; + } + + if (t && *t && t < (TCHAR *) &detailBuf[sizeof(detailBuf)/sizeof(detailBuf[0])]) { + found = TRUE; + break; + } } index++; diff --git a/src/WINNT/install/wix/Icon/ico_OpenAFS.ico b/src/WINNT/install/wix/Icon/ico_OpenAFS.ico new file mode 100644 index 0000000000000000000000000000000000000000..3c434f1ea0db90955a7f6a2a7940cb6522dbf7b1 GIT binary patch literal 32966 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 literal 0 HcmV?d00001 diff --git a/src/WINNT/install/wix/NTMakefile b/src/WINNT/install/wix/NTMakefile index b335a43..d8868af 100644 --- a/src/WINNT/install/wix/NTMakefile +++ b/src/WINNT/install/wix/NTMakefile @@ -1,3 +1,10 @@ +# Copyright 2004, OpenAFS.ORG and others. +# All Rights Reserved. +# +# This software has been released under the terms of the IBM Public +# License. For details, see the LICENSE file in the top-level source +# directory or online at http://www.openafs.org/dl/license10.html + RELDIR=WINNT\install\wix !INCLUDE ..\..\..\config\NTMakefile.$(SYS_NAME) !INCLUDE ..\..\..\config\NTMakefile.version @@ -32,12 +39,17 @@ languages: lang:: lang_clean $(MSIFILE) +uninst: + $(CD) uninstall + $(MAKE) /f NTMakefile /nologo install + $(CD) .. + customactions: $(CD) custom $(MAKE) /f NTMakefile /nologo install $(CD) .. -install: customactions languages +install: uninst customactions languages $(MSIFILE): $(WIXOBJ) light -nologo -out $(MSIFILE) \ @@ -67,6 +79,9 @@ clean:: $(CD) custom $(MAKE) /f NTMakefile /nologo clean $(CD) .. + $(CD) uninstall + $(MAKE) /f NTMakefile /nologo clean + $(CD) .. lang_clean: -$(DEL) $(WIXOBJ) diff --git a/src/WINNT/install/wix/feature.wxi b/src/WINNT/install/wix/feature.wxi index 7d647ce..1c4302b 100644 --- a/src/WINNT/install/wix/feature.wxi +++ b/src/WINNT/install/wix/feature.wxi @@ -5,6 +5,7 @@ Title="OpenAFS"> + @@ -124,6 +125,7 @@ + diff --git a/src/WINNT/install/wix/files.wxi b/src/WINNT/install/wix/files.wxi index de2f811..7acc16c 100644 --- a/src/WINNT/install/wix/files.wxi +++ b/src/WINNT/install/wix/files.wxi @@ -32,6 +32,11 @@ + + + + + @@ -1219,6 +1224,9 @@ + + + @@ -1277,6 +1285,7 @@ + diff --git a/src/WINNT/install/wix/lang/en_US/strings.wxl b/src/WINNT/install/wix/lang/en_US/strings.wxl index 45c1273..dab8cee 100644 --- a/src/WINNT/install/wix/lang/en_US/strings.wxl +++ b/src/WINNT/install/wix/lang/en_US/strings.wxl @@ -54,5 +54,5 @@ Removing existing installation of OpenAFS Installation of OpenAFS for Windows was prematurely terminated because OpenAFS [NSISVERSION] was already installed. - + Uninstall OpenAFS from the local machine. diff --git a/src/WINNT/install/wix/lang/en_US/ui.wxi b/src/WINNT/install/wix/lang/en_US/ui.wxi index 4e458dc..98555f4 100644 --- a/src/WINNT/install/wix/lang/en_US/ui.wxi +++ b/src/WINNT/install/wix/lang/en_US/ui.wxi @@ -1084,4 +1084,5 @@ + diff --git a/src/WINNT/install/wix/uninstall/NTMakefile b/src/WINNT/install/wix/uninstall/NTMakefile new file mode 100644 index 0000000..ff266cd --- /dev/null +++ b/src/WINNT/install/wix/uninstall/NTMakefile @@ -0,0 +1,32 @@ +# Copyright 2004, OpenAFS.ORG and others. +# All Rights Reserved. +# +# This software has been released under the terms of the IBM Public +# License. For details, see the LICENSE file in the top-level source +# directory or online at http://www.openafs.org/dl/license10.html + +RELDIR=WINNT\install\wix\uninstall +!INCLUDE ..\..\..\..\config\NTMakefile.$(SYS_NAME) +!INCLUDE ..\..\..\..\config\NTMakefile.version + +UNINSTALL = $(DESTDIR)\root.client\usr\vice\etc\uninstall.exe + +OBJECTS = $(OUT)\uninstall.obj + +$(OBJECTS): $$(@B).c + $(C2OBJ) $** + +$(OUT)\uninstall.res: uninstall.rc AFS_component_version_number.h + +$(UNINSTALL): $(OBJECTS) $(OUT)\uninstall.res + $(EXECONLINK) msi.lib + $(EXEPREP) + +install: $(UNINSTALL) + +# Cleanup +clean:: + -$(DEL) AFS_component_version_number.h + -$(DEL) $(OUT)\uninstall.obj + -$(DEL) $(OUT)\uninstall.res + -$(DEL) $(UNINSTALL) diff --git a/src/WINNT/install/wix/uninstall/uninstall.c b/src/WINNT/install/wix/uninstall/uninstall.c new file mode 100644 index 0000000..4295a97 --- /dev/null +++ b/src/WINNT/install/wix/uninstall/uninstall.c @@ -0,0 +1,23 @@ +#define _WIN32_MSI 200 +#include +#include + +#define OAFW_UPGRADE_CODE TEXT("{6823EEDD-84FC-4204-ABB3-A80D25779833}") +int main(void) +{ + UINT rc = ERROR_SUCCESS; + DWORD iProduct = 0; + CHAR szProductCode[39]; + + MsiSetInternalUI(INSTALLUILEVEL_PROGRESSONLY, NULL); + + do { + rc = MsiEnumRelatedProducts(OAFW_UPGRADE_CODE, 0, iProduct, szProductCode); + if ( rc == ERROR_SUCCESS ) { + MsiConfigureProduct(szProductCode, 0 /* ignored */, INSTALLSTATE_ABSENT); + iProduct++; + } + } while ( rc == ERROR_SUCCESS ); + + return (rc == ERROR_NO_MORE_ITEMS ? 0 : 1); +} diff --git a/src/WINNT/install/wix/uninstall/uninstall.rc b/src/WINNT/install/wix/uninstall/uninstall.rc new file mode 100644 index 0000000..d846dfd --- /dev/null +++ b/src/WINNT/install/wix/uninstall/uninstall.rc @@ -0,0 +1,19 @@ +/* + * Copyright 2000, International Business Machines Corporation and others. + * All Rights Reserved. + * + * This software has been released under the terms of the IBM Public + * License. For details, see the LICENSE file in the top-level source + * directory or online at http://www.openafs.org/dl/license10.html + */ + +/* Define VERSIONINFO resource */ + +#define AFS_VERINFO_FILE_DESCRIPTION "AFS Uninstall Command" +#define AFS_VERINFO_NAME "uninstall" +#define AFS_VERINFO_FILENAME "uninstall.exe" + +#include "AFS_component_version_number.h" +#include "..\..\..\..\config\NTVersioninfo.rc" + +100 ICON DISCARDABLE "..\Icon\ico_OpenAFS.ico" \ No newline at end of file diff --git a/src/config/NTMakefile b/src/config/NTMakefile index 57fa76c..f90a4ba 100644 --- a/src/config/NTMakefile +++ b/src/config/NTMakefile @@ -359,6 +359,9 @@ idirs: doclink ! IF (!EXIST($(OJT)\WINNT\install\wix\custom)) $(MKDIR) $(OJT)\WINNT\install\wix\custom ! ENDIF +! IF (!EXIST($(OJT)\WINNT\install\wix\uninstall)) + $(MKDIR) $(OJT)\WINNT\install\wix\uninstall +! ENDIF ! IF (!EXIST($(OJT)\WINNT\install\Win9x)) $(MKDIR) $(OJT)\WINNT\install\Win9x ! ENDIF -- 1.9.4