VeraCrypt
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMounir IDRASSI <mounir.idrassi@idrix.fr>2015-01-31 23:49:01 +0100
committerMounir IDRASSI <mounir.idrassi@idrix.fr>2015-02-08 10:07:44 +0100
commit96b39a5973d354bf759fefc13e551fb75e1c25c7 (patch)
treeeff49cc60f967517f998418dfc06a7ce0b7cae0d
parentb16cfa959da8836028a74194ce4f1d33a1dbef46 (diff)
downloadVeraCrypt-96b39a5973d354bf759fefc13e551fb75e1c25c7.tar.gz
VeraCrypt-96b39a5973d354bf759fefc13e551fb75e1c25c7.zip
Windows: retry UAC prompt operation in case of failure. This avoids cancel the whole operation if the user is not in front of the machine during UAC prompt (this happens ofter during in-place encryption of big NTFS partitions).
-rw-r--r--src/Common/BaseCom.cpp23
-rw-r--r--src/Common/Dlgcode.c5
-rw-r--r--src/Common/Dlgcode.h1
-rw-r--r--src/Format/Tcformat.c18
4 files changed, 36 insertions, 11 deletions
diff --git a/src/Common/BaseCom.cpp b/src/Common/BaseCom.cpp
index 349edabc..9a0c26f7 100644
--- a/src/Common/BaseCom.cpp
+++ b/src/Common/BaseCom.cpp
@@ -43,12 +43,27 @@ BOOL ComGetInstanceBase (HWND hWnd, REFCLSID clsid, REFIID iid, void **tcServer)
BOOL r;
if (IsUacSupported ())
- r = CreateElevatedComObject (hWnd, clsid, iid, tcServer) == S_OK;
+ {
+ while (true)
+ {
+ r = CreateElevatedComObject (hWnd, clsid, iid, tcServer) == S_OK;
+ if (r)
+ break;
+ else
+ {
+ if (IDRETRY == ErrorRetryCancel ("UAC_INIT_ERROR", hWnd))
+ continue;
+ else
+ break;
+ }
+ }
+ }
else
+ {
r = CoCreateInstance (clsid, NULL, CLSCTX_LOCAL_SERVER, iid, tcServer) == S_OK;
-
- if (!r)
- Error ("UAC_INIT_ERROR", hWnd);
+ if (!r)
+ Error ("UAC_INIT_ERROR", hWnd);
+ }
return r;
}
diff --git a/src/Common/Dlgcode.c b/src/Common/Dlgcode.c
index a6354fd2..d4f68134 100644
--- a/src/Common/Dlgcode.c
+++ b/src/Common/Dlgcode.c
@@ -8089,6 +8089,11 @@ int Error (char *stringId, HWND hwnd)
return MessageBoxW (hwnd, GetString (stringId), lpszTitle, MB_ICONERROR);
}
+int ErrorRetryCancel (char *stringId, HWND hwnd)
+{
+ if (Silent) return 0;
+ return MessageBoxW (hwnd, GetString (stringId), lpszTitle, MB_ICONERROR | MB_RETRYCANCEL);
+}
int ErrorTopMost (char *stringId, HWND hwnd)
{
diff --git a/src/Common/Dlgcode.h b/src/Common/Dlgcode.h
index 601871ce..4b371c05 100644
--- a/src/Common/Dlgcode.h
+++ b/src/Common/Dlgcode.h
@@ -385,6 +385,7 @@ int Warning (char *stringId, HWND hwnd);
int WarningTopMost (char *stringId, HWND hwnd);
int WarningDirect (const wchar_t *warnMsg, HWND hwnd);
int Error (char *stringId, HWND hwnd);
+int ErrorRetryCancel (char *stringId, HWND hwnd);
int ErrorDirect (const wchar_t *errMsg, HWND hwnd);
int ErrorTopMost (char *stringId, HWND hwnd);
int AskYesNo (char *stringId, HWND hwnd);
diff --git a/src/Format/Tcformat.c b/src/Format/Tcformat.c
index d55cc064..4984e6cc 100644
--- a/src/Format/Tcformat.c
+++ b/src/Format/Tcformat.c
@@ -266,14 +266,18 @@ static BOOL ElevateWholeWizardProcess (string arguments)
GetModuleFileName (NULL, modPath, sizeof (modPath));
- if ((int)ShellExecute (MainDlg, "runas", modPath, (string("/q UAC ") + arguments).c_str(), NULL, SW_SHOWNORMAL) > 32)
- {
- exit (0);
- }
- else
+ while (true)
{
- Error ("UAC_INIT_ERROR", MainDlg);
- return FALSE;
+ if ((int)ShellExecute (MainDlg, "runas", modPath, (string("/q UAC ") + arguments).c_str(), NULL, SW_SHOWNORMAL) > 32)
+ {
+ exit (0);
+ }
+ else
+ {
+ if (IDRETRY == ErrorRetryCancel ("UAC_INIT_ERROR", MainDlg))
+ continue;
+ return FALSE;
+ }
}
}