📄 global.cpp
字号:
if (m_dwClearSettings & CLEAR_TEMP)
{
if (GetTempPath(MAX_PATH, szPath))
{
EmptyDirectory(szPath, TRUE);
}
}
if (m_dwClearSettings & CLEAR_RECYCLEBIN)
{
SHEmptyRecycleBin(NULL, NULL,
SHERB_NOCONFIRMATION | SHERB_NOPROGRESSUI | SHERB_NOSOUND);
}
if (m_dwClearSettings & CLEAR_RUN_HISTORY)
{
SHDeleteKey(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU"));
}
if (m_dwClearSettings & CLEAR_RECENT_DOCUMENTS)
{
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_RECENT, FALSE))
{
EmptyDirectory(szPath);
}
SHDeleteKey(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RecentDocs"));
}
if (m_dwClearSettings & CLEAR_LAST_LOGON_USER)
{
SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
_T("DefaultUserName"));
SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
_T("AltDefaultUserName"));
SHDeleteValue(HKEY_LOCAL_MACHINE,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon"),
_T("DefaultUserName"));
}
if (m_dwClearSettings & CLEAR_FIND_FILES_HISTORY)
{
SHDeleteKey(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Doc Find Spec MRU"));
SHDeleteKey(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Internet Explorer\\Explorer Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}\\ContainingTextMRU"));
SHDeleteKey(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Internet Explorer\\Explorer Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}\\FilesNamedMRU"));
}
if (m_dwClearSettings & CLEAR_FIND_COMPUTER_HISTORY)
{
SHDeleteKey(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FindComputerMRU"));
SHDeleteKey(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Internet Explorer\\Explorer Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}\\ComputerNameMRU"));
}
if (m_dwClearSettings & CLEAR_NETWORK_HISTORY)
{
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_NETHOOD, FALSE))
{
EmptyDirectory(szPath);
}
}
if (m_dwClearSettings & CLEAR_TELNET_HISTORY)
{
for (int i=1; i<=8; i++)
{
sKey.Format(_T("Machine%d"), i);
SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Telnet"), sKey);
sKey.Format(_T("Service%d"), i);
SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Telnet"), sKey);
sKey.Format(_T("TermType%d"), i);
SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Telnet"), sKey);
}
SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Telnet"), _T("LastMachine"));
SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Telnet"), _T("LastService"));
SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Telnet"), _T("LastTermType"));
}
if (m_dwClearSettings & CLEAR_URL_HISTORY)
{
IUrlHistoryStg2* pUrlHistoryStg2 = NULL;
hr = CoCreateInstance(CLSID_CUrlHistory, NULL,
CLSCTX_INPROC_SERVER, IID_IUrlHistoryStg2,
(void**)&pUrlHistoryStg2);
if (SUCCEEDED(hr))
{
hr = pUrlHistoryStg2->ClearHistory();
pUrlHistoryStg2->Release();
}
// I found the above code can't clear the URL history sometimes.
// I use following code to work around this, not perfect, but worked.
GetWindowsDirectory(szPath, MAX_PATH);
_tcscat(szPath, _T("\\History"));
EmptyDirectory(szPath, FALSE, TRUE);
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_HISTORY, FALSE))
{
EmptyDirectory(szPath, FALSE, TRUE);
}
}
}
BOOL CGlobal::EmptyDirectory(LPCTSTR szPath, BOOL bDeleteDesktopIni,
BOOL bWipeIndexDat)
{
WIN32_FIND_DATA wfd;
HANDLE hFind;
CString sFullPath;
CString sFindFilter;
DWORD dwAttributes = 0;
sFindFilter = szPath;
sFindFilter += _T("\\*.*");
if ((hFind = FindFirstFile(sFindFilter, &wfd)) == INVALID_HANDLE_VALUE)
{
return FALSE;
}
do
{
if (_tcscmp(wfd.cFileName, _T(".")) == 0 ||
_tcscmp(wfd.cFileName, _T("..")) == 0 ||
(bDeleteDesktopIni == FALSE && _tcsicmp(wfd.cFileName, _T("desktop.ini")) == 0))
{
continue;
}
sFullPath = szPath;
sFullPath += _T('\\');
sFullPath += wfd.cFileName;
//remove readonly attributes
dwAttributes = GetFileAttributes(sFullPath);
if (dwAttributes & FILE_ATTRIBUTE_READONLY)
{
dwAttributes &= ~FILE_ATTRIBUTE_READONLY;
SetFileAttributes(sFullPath, dwAttributes);
}
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
EmptyDirectory(sFullPath, bDeleteDesktopIni, bWipeIndexDat);
RemoveDirectory(sFullPath);
}
else
{
if (bWipeIndexDat && _tcsicmp(wfd.cFileName, _T("index.dat")) == 0)
{
WipeFile(szPath, wfd.cFileName);
}
DeleteFile(sFullPath);
}
}
while (FindNextFile(hFind, &wfd));
FindClose(hFind);
return TRUE;
}
BOOL CGlobal::DeleteUrlCache(DEL_CACHE_TYPE type)
{
BOOL bRet = FALSE;
HANDLE hEntry;
// HANDLE hGroup;
// GROUPID GroupID;
LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
DWORD dwEntrySize;
//delete the groups
/* if (type == File && IsIE5())
{
hGroup = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL, NULL, 0, &GroupID, 0);
if (hGroup)
{
do
{
DeleteUrlCacheGroup(GroupID, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, NULL);
}
while (FindNextUrlCacheGroup(hGroup, &GroupID, NULL));
}
}
*/
//delete the files
dwEntrySize = 0;
hEntry = FindFirstUrlCacheEntry(NULL, NULL, &dwEntrySize);
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
hEntry = FindFirstUrlCacheEntry(NULL, lpCacheEntry, &dwEntrySize);
if (!hEntry)
{
goto cleanup;
}
do
{
if (type == File &&
!(lpCacheEntry->CacheEntryType & COOKIE_CACHE_ENTRY))
{
DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);
}
else if (type == Cookie &&
(lpCacheEntry->CacheEntryType & COOKIE_CACHE_ENTRY))
{
DeleteUrlCacheEntry(lpCacheEntry->lpszSourceUrlName);
}
dwEntrySize = 0;
FindNextUrlCacheEntry(hEntry, NULL, &dwEntrySize);
delete [] lpCacheEntry;
lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwEntrySize];
}
while (FindNextUrlCacheEntry(hEntry, lpCacheEntry, &dwEntrySize));
bRet = TRUE;
cleanup:
if (lpCacheEntry)
{
delete [] lpCacheEntry;
}
return bRet;
}
BOOL CGlobal::UpdateAutorun()
{
DWORD dwRet;
if (m_bAutorun)
{
dwRet = SHSetValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),
APP_NAME, REG_SZ, m_sModuleFilePath, m_sModuleFilePath.GetLength());
}
else
{
dwRet = SHDeleteValue(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), APP_NAME);
}
return (dwRet == ERROR_SUCCESS);
}
BOOL CGlobal::GetOldSD(HKEY hKey, LPCTSTR pszSubKey, BYTE** pSD)
{
BOOL bRet = FALSE;
HKEY hNewKey = NULL;
DWORD dwSize = 0;
LONG lRetCode;
*pSD = NULL;
lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, READ_CONTROL, &hNewKey);
if(lRetCode != ERROR_SUCCESS)
goto cleanup;
lRetCode = RegGetKeySecurity(hNewKey,
(SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, *pSD, &dwSize);
if (lRetCode == ERROR_INSUFFICIENT_BUFFER)
{
*pSD = new BYTE[dwSize];
lRetCode = RegGetKeySecurity(hNewKey,
(SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, *pSD, &dwSize);
if(lRetCode != ERROR_SUCCESS)
{
delete *pSD;
*pSD = NULL;
goto cleanup;
}
}
else if (lRetCode != ERROR_SUCCESS)
goto cleanup;
bRet = TRUE; // indicate success
cleanup:
if (hNewKey)
{
RegCloseKey(hNewKey);
}
return bRet;
}
BOOL CGlobal::CreateNewSD(PSID pSid, SECURITY_DESCRIPTOR* pSD, PACL* ppDacl)
{
BOOL bRet = FALSE;
PSID pSystemSid = NULL;
SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
ACCESS_ALLOWED_ACE* pACE = NULL;
DWORD dwAclSize;
DWORD dwAceSize;
// prepare a Sid representing local system account
if(!AllocateAndInitializeSid(&sia, 1, SECURITY_LOCAL_SYSTEM_RID,
0, 0, 0, 0, 0, 0, 0, &pSystemSid))
{
goto cleanup;
}
// compute size of new acl
dwAclSize = sizeof(ACL) + 2 * (sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD)) +
GetLengthSid(pSid) + GetLengthSid(pSystemSid);
// allocate storage for Acl
*ppDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize);
if(*ppDacl == NULL)
goto cleanup;
if(!InitializeAcl(*ppDacl, dwAclSize, ACL_REVISION))
goto cleanup;
// if(!AddAccessAllowedAce(pDacl, ACL_REVISION, KEY_WRITE, pSid))
// goto cleanup;
// add current user
dwAceSize = sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + GetLengthSid(pSid);
pACE = (ACCESS_ALLOWED_ACE *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwAceSize);
pACE->Mask = KEY_READ | KEY_WRITE | KEY_ALL_ACCESS;
pACE->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
pACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE;
pACE->Header.AceSize = dwAceSize;
memcpy(&pACE->SidStart, pSid, GetLengthSid(pSid));
if (!AddAce(*ppDacl, ACL_REVISION, MAXDWORD, pACE, dwAceSize))
goto cleanup;
// add local system account
HeapFree(GetProcessHeap(), 0, pACE);
pACE = NULL;
dwAceSize = sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + GetLengthSid(pSystemSid);
pACE = (ACCESS_ALLOWED_ACE *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwAceSize);
pACE->Mask = KEY_READ | KEY_WRITE | KEY_ALL_ACCESS;
pACE->Header.AceType = ACCESS_ALLOWED_ACE_TYPE;
pACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE;
pACE->Header.AceSize = dwAceSize;
memcpy(&pACE->SidStart, pSystemSid, GetLengthSid(pSystemSid));
if (!AddAce(*ppDacl, ACL_REVISION, MAXDWORD, pACE, dwAceSize))
goto cleanup;
if(!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION))
goto cleanup;
if(!SetSecurityDescriptorDacl(pSD, TRUE, *ppDacl, FALSE))
goto cleanup;
bRet = TRUE; // indicate success
cleanup:
if(pACE != NULL)
HeapFree(GetProcessHeap(), 0, pACE);
if(pSystemSid != NULL)
FreeSid(pSystemSid);
return bRet;
}
BOOL CGlobal::RegSetPrivilege(HKEY hKey, LPCTSTR pszSubKey,
SECURITY_DESCRIPTOR* pSD, BOOL bRecursive)
{
BOOL bRet = FALSE;
HKEY hSubKey = NULL;
LONG lRetCode;
LPTSTR pszKeyName = NULL;;
DWORD dwSubKeyCnt;
DWORD dwMaxSubKey;
DWORD dwValueCnt;
DWORD dwMaxValueName;
DWORD dwMaxValueData;
DWORD i;
if (!pszSubKey)
goto cleanup;
// open the key for WRITE_DAC access
lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, WRITE_DAC, &hSubKey);
if(lRetCode != ERROR_SUCCESS)
goto cleanup;
// apply the security descriptor to the registry key
lRetCode = RegSetKeySecurity(hSubKey,
(SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, pSD);
if( lRetCode != ERROR_SUCCESS )
goto cleanup;
if (bRecursive)
{
// reopen the key for KEY_READ access
RegCloseKey(hSubKey);
hSubKey = NULL;
lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, KEY_READ, &hSubKey);
if(lRetCode != ERROR_SUCCESS)
goto cleanup;
// first get an info about this subkey ...
lRetCode = RegQueryInfoKey(hSubKey, 0, 0, 0, &dwSubKeyCnt, &dwMaxSubKey,
0, &dwValueCnt, &dwMaxValueName, &dwMaxValueData, 0, 0);
if( lRetCode != ERROR_SUCCESS )
goto cleanup;
// enumerate the subkeys and call RegTreeWalk() recursivly
pszKeyName = new TCHAR [MAX_PATH + 1];
for (i=0 ; i<dwSubKeyCnt; i++)
{
lRetCode = RegEnumKey(hSubKey, i, pszKeyName, MAX_PATH + 1);
if(lRetCode == ERROR_SUCCESS)
{
RegSetPrivilege(hSubKey, pszKeyName, pSD, TRUE);
}
else if(lRetCode == ERROR_NO_MORE_ITEMS)
{
break;
}
}
delete [] pszKeyName ;
}
bRet = TRUE; // indicate success
cleanup:
if (hSubKey)
{
RegCloseKey(hSubKey);
}
return bRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -