Skip to content

Instantly share code, notes, and snippets.

@mesarvagya
Created August 4, 2015 14:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mesarvagya/49dbd847c0572f109dac to your computer and use it in GitHub Desktop.
Save mesarvagya/49dbd847c0572f109dac to your computer and use it in GitHub Desktop.
Residue Remove Snippet
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