mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[misc] disable new drive notification while app is running
* new drive notifications from explorer are annoying * use Local Group Policy to temporarily disable them * also fixed missing SetupDiDestroyDeviceInfoList call
This commit is contained in:
parent
df7a0b1fc3
commit
72485b7568
3 changed files with 160 additions and 8 deletions
150
src/rufus.c
150
src/rufus.c
|
@ -556,6 +556,7 @@ static BOOL GetUSBDevices(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SetupDiDestroyDeviceInfoList(dev_info);
|
||||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDeviceList, 0));
|
IGNORE_RETVAL(ComboBox_SetCurSel(hDeviceList, 0));
|
||||||
SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE<<16) | IDC_DEVICE, 0);
|
SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE<<16) | IDC_DEVICE, 0);
|
||||||
SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE<<16) | IDC_FILESYSTEM,
|
SendMessage(hMainDialog, WM_COMMAND, (CBN_SELCHANGE<<16) | IDC_FILESYSTEM,
|
||||||
|
@ -659,6 +660,146 @@ void UpdateProgress(int op, float percent)
|
||||||
SendMessage(hProgress, PBM_SETPOS, (WPARAM)pos, 0);
|
SendMessage(hProgress, PBM_SETPOS, (WPARAM)pos, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set or restore a Local Group Policy DWORD key indexed by szPath/SzPolicy
|
||||||
|
*/
|
||||||
|
typedef enum _GROUP_POLICY_OBJECT_TYPE {
|
||||||
|
GPOTypeLocal = 0,GPOTypeRemote,GPOTypeDS
|
||||||
|
} GROUP_POLICY_OBJECT_TYPE,*PGROUP_POLICY_OBJECT_TYPE;
|
||||||
|
|
||||||
|
#define REGISTRY_EXTENSION_GUID { 0x35378EAC,0x683F,0x11D2, {0xA8,0x9A,0x00,0xC0,0x4F,0xBB,0xCF,0xA2} }
|
||||||
|
#define GPO_OPEN_LOAD_REGISTRY 0x00000001
|
||||||
|
#define GPO_SECTION_MACHINE 2
|
||||||
|
|
||||||
|
#undef INTERFACE
|
||||||
|
#define INTERFACE IGroupPolicyObject
|
||||||
|
DECLARE_INTERFACE_(IGroupPolicyObject,IUnknown) {
|
||||||
|
STDMETHOD(QueryInterface) (THIS_ REFIID riid,LPVOID *ppvObj) PURE;
|
||||||
|
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
|
||||||
|
STDMETHOD_(ULONG,Release) (THIS) PURE;
|
||||||
|
STDMETHOD(New) (THIS_ LPOLESTR pszDomainName,LPOLESTR pszDisplayName,DWORD dwFlags) PURE;
|
||||||
|
STDMETHOD(OpenDSGPO) (THIS_ LPOLESTR pszPath,DWORD dwFlags) PURE;
|
||||||
|
STDMETHOD(OpenLocalMachineGPO) (THIS_ DWORD dwFlags) PURE;
|
||||||
|
STDMETHOD(OpenRemoteMachineGPO) (THIS_ LPOLESTR pszComputerName,DWORD dwFlags) PURE;
|
||||||
|
STDMETHOD(Save) (THIS_ BOOL bMachine, BOOL bAdd,GUID *pGuidExtension,GUID *pGuid) PURE;
|
||||||
|
STDMETHOD(Delete) (THIS) PURE;
|
||||||
|
STDMETHOD(GetName) (THIS_ LPOLESTR pszName,int cchMaxLength) PURE;
|
||||||
|
STDMETHOD(GetDisplayName) (THIS_ LPOLESTR pszName,int cchMaxLength) PURE;
|
||||||
|
STDMETHOD(SetDisplayName) (THIS_ LPOLESTR pszName) PURE;
|
||||||
|
STDMETHOD(GetPath) (THIS_ LPOLESTR pszPath,int cchMaxPath) PURE;
|
||||||
|
STDMETHOD(GetDSPath) (THIS_ DWORD dwSection,LPOLESTR pszPath,int cchMaxPath) PURE;
|
||||||
|
STDMETHOD(GetFileSysPath) (THIS_ DWORD dwSection,LPOLESTR pszPath,int cchMaxPath) PURE;
|
||||||
|
STDMETHOD(GetRegistryKey) (THIS_ DWORD dwSection,HKEY *hKey) PURE;
|
||||||
|
STDMETHOD(GetOptions) (THIS_ DWORD *dwOptions) PURE;
|
||||||
|
STDMETHOD(SetOptions) (THIS_ DWORD dwOptions,DWORD dwMask) PURE;
|
||||||
|
STDMETHOD(GetType) (THIS_ GROUP_POLICY_OBJECT_TYPE *gpoType) PURE;
|
||||||
|
STDMETHOD(GetMachineName) (THIS_ LPOLESTR pszName,int cchMaxLength) PURE;
|
||||||
|
STDMETHOD(GetPropertySheetPages) (THIS_ HPROPSHEETPAGE **hPages,UINT *uPageCount) PURE;
|
||||||
|
};
|
||||||
|
typedef IGroupPolicyObject *LPGROUPPOLICYOBJECT;
|
||||||
|
|
||||||
|
BOOL SetLGP(BOOL bRestore, const char* szPath, const char* szPolicy, DWORD dwValue)
|
||||||
|
{
|
||||||
|
OSVERSIONINFO os_version;
|
||||||
|
LONG r;
|
||||||
|
DWORD disp, regtype, val, val_size=sizeof(DWORD);
|
||||||
|
HRESULT hr;
|
||||||
|
IGroupPolicyObject* pLGPO;
|
||||||
|
// These statuc values are used to restore initial state
|
||||||
|
static BOOL key_was_present = FALSE;
|
||||||
|
static DWORD original_val;
|
||||||
|
HKEY path_key = NULL, policy_key = NULL;
|
||||||
|
// MSVC is finicky about these ones => redefine them
|
||||||
|
const IID my_IID_IGroupPolicyObject =
|
||||||
|
{ 0xea502723, 0xa23d, 0x11d1, { 0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3 } };
|
||||||
|
const IID my_CLSID_GroupPolicyObject =
|
||||||
|
{ 0xea502722, 0xa23d, 0x11d1, { 0xa7, 0xd3, 0x0, 0x0, 0xf8, 0x75, 0x71, 0xe3 } };
|
||||||
|
GUID ext_guid = REGISTRY_EXTENSION_GUID;
|
||||||
|
// Can be anything really
|
||||||
|
GUID snap_guid = { 0x3D271CFC, 0x2BC6, 0x4AC2, {0xB6, 0x33, 0x3B, 0xDF, 0xF5, 0xBD, 0xAB, 0x2A} };
|
||||||
|
|
||||||
|
// Vista or later
|
||||||
|
// TODO: should we do this on XP too?
|
||||||
|
memset(&os_version, 0, sizeof(OSVERSIONINFO));
|
||||||
|
os_version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
||||||
|
if ((GetVersionEx(&os_version) != 0) && (os_version.dwPlatformId == VER_PLATFORM_WIN32_NT)) {
|
||||||
|
if (os_version.dwMajorVersion < 6) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We need an IGroupPolicyObject instance to set a Local Group Policy
|
||||||
|
hr = CoCreateInstance(&my_CLSID_GroupPolicyObject, NULL, CLSCTX_INPROC_SERVER, &my_IID_IGroupPolicyObject, (LPVOID*)&pLGPO);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
uprintf("SetLGP: CoCreateInstance failed; hr = %x\n", hr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = pLGPO->lpVtbl->OpenLocalMachineGPO(pLGPO, GPO_OPEN_LOAD_REGISTRY);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
uprintf("SetLGP: OpenLocalMachineGPO failed - error %x\n", hr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = pLGPO->lpVtbl->GetRegistryKey(pLGPO, GPO_SECTION_MACHINE, &path_key);
|
||||||
|
if (FAILED(hr)) {
|
||||||
|
uprintf("SetLGP: GetRegistryKey failed - error %x\n", hr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The DisableSystemRestore is set in Software\Policies\Microsoft\Windows\DeviceInstall\Settings
|
||||||
|
r = RegCreateKeyExA(path_key, szPath, 0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE,
|
||||||
|
NULL, &policy_key, &disp);
|
||||||
|
if (r != ERROR_SUCCESS) {
|
||||||
|
uprintf("SetLGP: Failed to open LGPO path %s - error %x\n", szPath, hr);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((disp == REG_OPENED_EXISTING_KEY) && (!bRestore) && (!key_was_present)) {
|
||||||
|
// backup existing value for restore
|
||||||
|
key_was_present = TRUE;
|
||||||
|
regtype = REG_DWORD;
|
||||||
|
r = RegQueryValueExA(policy_key, szPolicy, NULL, ®type, (LPBYTE)&original_val, &val_size);
|
||||||
|
if (r == ERROR_FILE_NOT_FOUND) {
|
||||||
|
// The Key exists but not its value, which is OK
|
||||||
|
key_was_present = FALSE;
|
||||||
|
} else if (r != ERROR_SUCCESS) {
|
||||||
|
uprintf("SetLGP: Failed to read original %s policy value - error %x\n", szPolicy, r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!bRestore) || (key_was_present)) {
|
||||||
|
val = (bRestore)?original_val:dwValue;
|
||||||
|
r = RegSetValueExA(policy_key, szPolicy, 0, REG_DWORD, (BYTE*)&val, sizeof(val));
|
||||||
|
} else {
|
||||||
|
r = RegDeleteValueA(policy_key, szPolicy);
|
||||||
|
}
|
||||||
|
if (r != ERROR_SUCCESS) {
|
||||||
|
uprintf("SetLGP: RegSetValueEx / RegDeleteValue failed - error %x\n", r);
|
||||||
|
}
|
||||||
|
RegCloseKey(policy_key);
|
||||||
|
policy_key = NULL;
|
||||||
|
|
||||||
|
// Apply policy
|
||||||
|
hr = pLGPO->lpVtbl->Save(pLGPO, TRUE, (bRestore)?FALSE:TRUE, &ext_guid, &snap_guid);
|
||||||
|
if (r != S_OK) {
|
||||||
|
uprintf("SetLGP: Unable to apply %s policy - error %x\n", szPolicy, hr);
|
||||||
|
goto error;
|
||||||
|
} else {
|
||||||
|
uprintf("SetLGP: Successfully %s %s policy\n", (bRestore)?"restored":"disabled", szPolicy);
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(path_key);
|
||||||
|
pLGPO->lpVtbl->Release(pLGPO);
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (path_key != NULL) RegCloseKey(path_key);
|
||||||
|
if (policy_key != NULL) RegCloseKey(policy_key);
|
||||||
|
if (pLGPO != NULL) pLGPO->lpVtbl->Release(pLGPO);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Toggle controls according to operation
|
* Toggle controls according to operation
|
||||||
*/
|
*/
|
||||||
|
@ -917,6 +1058,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
||||||
// Initialize COM for folder selection
|
// Initialize COM for folder selection
|
||||||
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
|
||||||
|
|
||||||
|
#ifdef DISABLE_AUTORUN
|
||||||
|
// We use local group policies rather than direct registry manipulation
|
||||||
|
// 0x9e disables removable and fixed drive notifications
|
||||||
|
SetLGP(FALSE, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0x9e);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Create the main Window
|
// Create the main Window
|
||||||
if ( (hDlg = CreateDialogA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG), NULL, MainCallback)) == NULL ) {
|
if ( (hDlg = CreateDialogA(hInstance, MAKEINTRESOURCEA(IDD_DIALOG), NULL, MainCallback)) == NULL ) {
|
||||||
MessageBoxA(NULL, "Could not create Window", "DialogBox failure", MB_ICONSTOP);
|
MessageBoxA(NULL, "Could not create Window", "DialogBox failure", MB_ICONSTOP);
|
||||||
|
@ -933,6 +1080,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
#ifdef DISABLE_AUTORUN
|
||||||
|
SetLGP(TRUE, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer", "NoDriveTypeAutorun", 0);
|
||||||
|
#endif
|
||||||
CloseHandle(mutex);
|
CloseHandle(mutex);
|
||||||
uprintf("*** RUFUS EXIT ***\n");
|
uprintf("*** RUFUS EXIT ***\n");
|
||||||
|
|
||||||
|
|
|
@ -16,11 +16,13 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <winioctl.h> // for DISK_GEOMETRY
|
#include <winioctl.h> // for DISK_GEOMETRY
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define RUFUS_DEBUG
|
/* Program options */
|
||||||
|
#define RUFUS_DEBUG // print debug info to Debug facility (use debugview to consult)
|
||||||
|
#define DISABLE_AUTORUN // disable new USB drive notification from explorer when application is running
|
||||||
|
|
||||||
#define STR_NO_LABEL "NO_LABEL"
|
#define STR_NO_LABEL "NO_LABEL"
|
||||||
#define RUFUS_CANCELBOX_TITLE "Rufus - Cancellation"
|
#define RUFUS_CANCELBOX_TITLE "Rufus - Cancellation"
|
||||||
|
|
12
src/rufus.rc
12
src/rufus.rc
|
@ -30,7 +30,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 206, 278
|
IDD_DIALOG DIALOGEX 12, 12, 206, 278
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_APPWINDOW
|
EXSTYLE WS_EX_APPWINDOW
|
||||||
CAPTION "Rufus v1.0.2.88 (Beta)"
|
CAPTION "Rufus v1.0.2.89 (Beta)"
|
||||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||||
BEGIN
|
BEGIN
|
||||||
DEFPUSHBUTTON "Start",IDC_START,94,236,50,14
|
DEFPUSHBUTTON "Start",IDC_START,94,236,50,14
|
||||||
|
@ -64,7 +64,7 @@ BEGIN
|
||||||
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP
|
DEFPUSHBUTTON "OK",IDOK,231,175,50,14,WS_GROUP
|
||||||
CONTROL "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL,
|
CONTROL "<a href=""http://rufus.akeo.ie"">http://rufus.akeo.ie</a>",IDC_ABOUT_RUFUS_URL,
|
||||||
"SysLink",WS_TABSTOP,46,47,114,9
|
"SysLink",WS_TABSTOP,46,47,114,9
|
||||||
LTEXT "Version 1.0.2 (Build 88)",IDC_STATIC,46,19,78,8
|
LTEXT "Version 1.0.2 (Build 89)",IDC_STATIC,46,19,78,8
|
||||||
PUSHBUTTON "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP
|
PUSHBUTTON "License...",IDC_ABOUT_LICENSE,46,175,50,14,WS_GROUP
|
||||||
EDITTEXT IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL
|
EDITTEXT IDC_ABOUT_COPYRIGHTS,46,107,235,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL
|
||||||
LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8
|
LTEXT "Report bugs or request enhancements at:",IDC_STATIC,46,66,187,8
|
||||||
|
@ -163,8 +163,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,0,2,88
|
FILEVERSION 1,0,2,89
|
||||||
PRODUCTVERSION 1,0,2,88
|
PRODUCTVERSION 1,0,2,89
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -181,13 +181,13 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "akeo.ie"
|
VALUE "CompanyName", "akeo.ie"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "1.0.2.88"
|
VALUE "FileVersion", "1.0.2.89"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
||||||
VALUE "OriginalFilename", "rufus.exe"
|
VALUE "OriginalFilename", "rufus.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "1.0.2.88"
|
VALUE "ProductVersion", "1.0.2.89"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Reference in a new issue