-
-
Save mesarvagya/49dbd847c0572f109dac to your computer and use it in GitHub Desktop.
Residue Remove Snippet
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
UINT __stdcall DeleteResidue(MSIHANDLE hInstall) | |
{ | |
HRESULT hr = S_OK; | |
UINT er = ERROR_SUCCESS; | |
SC_HANDLE sHandleLPA, sHandleLPAM; | |
SERVICE_STATUS servStatusLPA, servStatusLPAM; | |
SHFILEOPSTRUCT shFileCommFolder, shFileInstalledFolder; | |
LPWSTR lpaCommFolder, lpaInstalledFolder; | |
std::wstring wlpaCommFolder, wlpaInstalledFolder; | |
std::string errorCode; | |
hr = WcaInitialize(hInstall, "DeleteResidue"); | |
ExitOnFailure(hr, "Failed to initialize"); | |
//Stop the LPA and LPA Monitor Service. Then delete the residue. | |
WcaLog(LOGMSG_STANDARD, "Doing Delete Residue"); // Fails after printing this log | |
hr = WcaGetProperty(L"LPCOMMAPPFOLDER",&lpaCommFolder); | |
ExitOnFailure(hr, "Failure in Common Folder"); // Getting the %ProgramData%\SomeFolder here | |
hr = WcaGetProperty(L"INSTALLFOLDER",&lpaInstalledFolder); | |
ExitOnFailure(hr, "Failure in getting Installed Folder"); // Getting Installed Folder here | |
//Path should be double Terminated for SHFILEOPSTRUCT.pFrom | |
wlpaCommFolder = std::wstring(lpaCommFolder); | |
wlpaCommFolder.push_back(L'\0'); | |
wlpaInstalledFolder = std::wstring(lpaInstalledFolder); | |
wlpaInstalledFolder.push_back(L'\0'); | |
try | |
{ | |
sHandleLPAM = OpenSCManager(NULL,NULL, SC_MANAGER_ALL_ACCESS); | |
if(sHandleLPAM == NULL) | |
{ | |
WcaLog(LOGMSG_STANDARD, "OpenSCManager NULL Handle"); | |
} | |
sHandleLPAM = OpenService(sHandleLPAM, L"SomeServiceOne",SERVICE_ALL_ACCESS); | |
if(sHandleLPAM == NULL) | |
{ | |
WcaLog(LOGMSG_STANDARD, "OpenService NULL Handle"); | |
} | |
bool res = ControlService(sHandleLPAM, SERVICE_CONTROL_STOP,(LPSERVICE_STATUS) &servStatusLPAM); | |
if(!res) | |
{ | |
WcaLog(LOGMSG_STANDARD, "ControlService Cannot Stop the service"); | |
} | |
// Free the service Handler | |
CloseServiceHandle(sHandleLPAM); | |
} | |
catch(std::exception& e) | |
{ | |
WcaLog(LOGMSG_STANDARD, e.what()); | |
} | |
try | |
{ | |
sHandleLPA = OpenSCManager(NULL,NULL, SC_MANAGER_ALL_ACCESS); | |
if(sHandleLPA == NULL) | |
{ | |
WcaLog(LOGMSG_STANDARD, "OpenSCManager NULL Handle"); | |
} | |
sHandleLPA = OpenService(sHandleLPA, L"SomeServiceTwo",SERVICE_ALL_ACCESS); | |
if(sHandleLPA == NULL) | |
{ | |
WcaLog(LOGMSG_STANDARD, "OpenService NULL Handle"); | |
} | |
bool res = ControlService(sHandleLPA, SERVICE_CONTROL_STOP,(LPSERVICE_STATUS) &servStatusLPA); | |
if(!res) | |
{ | |
WcaLog(LOGMSG_STANDARD, "ControlService Cannot Stop the service"); | |
} | |
// Free the service Handler | |
CloseServiceHandle(sHandleLPA); | |
} | |
catch(std::exception& e) | |
{ | |
WcaLog(LOGMSG_STANDARD, e.what()); | |
} | |
ZeroMemory(&shFileCommFolder, sizeof(SHFILEOPSTRUCT)); | |
shFileCommFolder.hwnd = NULL; | |
shFileCommFolder.wFunc = FO_DELETE; | |
shFileCommFolder.pFrom = wlpaCommFolder.c_str(); | |
shFileCommFolder.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI; | |
BOOL res = DirectoryExists(lpaCommFolder); | |
if(res) | |
{ | |
WcaLog(LOGMSG_STANDARD, "The directory exist"); | |
int result = SHFileOperation(&shFileCommFolder); | |
if(!result) | |
WcaLog(LOGMSG_STANDARD, "The directory should have deleted by now"); | |
else | |
{ | |
errorCode = GetLastErrorStdStr(); | |
WcaLog(LOGMSG_STANDARD, "The directory could not be deleted %s", errorCode); | |
} | |
} | |
else | |
{ | |
WcaLog(LOGMSG_STANDARD, "It Seems the Installed Folder is No more there"); | |
} | |
ZeroMemory(&shFileInstalledFolder, sizeof(SHFILEOPSTRUCT)); | |
shFileInstalledFolder.hwnd = NULL; | |
shFileInstalledFolder.wFunc = FO_DELETE; | |
shFileInstalledFolder.pFrom = wlpaInstalledFolder.c_str(); | |
shFileInstalledFolder.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI; | |
res = DirectoryExists(lpaInstalledFolder); | |
if(res) | |
{ | |
WcaLog(LOGMSG_STANDARD, "The directory exist"); | |
int result = SHFileOperation(&shFileInstalledFolder); | |
if(!result) | |
WcaLog(LOGMSG_STANDARD, "The directory should have deleted by now"); | |
else | |
{ | |
errorCode = GetLastErrorStdStr(); | |
WcaLog(LOGMSG_STANDARD, "The directory could not be deleted %s", errorCode); | |
} | |
} | |
else | |
{ | |
WcaLog(LOGMSG_STANDARD, "It Seems the Installed Folder is No more there"); | |
} | |
LExit: | |
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; | |
return WcaFinalize(er); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment