// Detruit une clé de registre et ses sous-clé BOOL RegDelTree (HKEY hKeyRoot, LPCTSTR lpSubKey) { TCHAR lpEnd[MAX_PATH]; LONG lResult; DWORD dwSize; TCHAR szName[MAX_PATH]; HKEY hKey; FILETIME ftWrite; // First, see if we can delete the key without having // to recurse. lResult = RegDeleteKey(hKeyRoot, lpSubKey); if (lResult == ERROR_SUCCESS) return TRUE; lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey) ; if (lResult != ERROR_SUCCESS) { if (lResult == ERROR_FILE_NOT_FOUND) { printf("Key not found.\n"); return TRUE; } else {printf("Error opening key.\n");return FALSE;} } // Enumerate the keys dwSize = MAX_PATH; lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL, NULL, NULL, &ftWrite) ; if (lResult == ERROR_SUCCESS) { do { //StringCchCopy (lpEnd, MAX_PATH*2, szName); sprintf(lpEnd, "%s\\%s", lpSubKey, szName); //if( !RegDelTree( hKeyRoot, lpSubKey ) ) { break ; } if( !RegDelTree( hKeyRoot, lpEnd ) ) { break ; } dwSize = MAX_PATH; lResult = RegEnumKeyEx(hKey, 0, szName, &dwSize, NULL, NULL, NULL, &ftWrite) ; } while ( lResult == ERROR_SUCCESS ) ; } RegCloseKey(hKey) ; // Try again to delete the key. lResult = RegDeleteKey(hKeyRoot, lpSubKey); if (lResult == ERROR_SUCCESS) return TRUE; return FALSE; }
// Nettoie la clé de PuTTY pour enlever les clés et valeurs spécifique à KiTTY BOOL RegCleanPuTTY( void ) { HKEY hKey, hSubKey ; DWORD retCode, i; TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name DWORD cbName; // size of name string TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name DWORD cchClassName = MAX_PATH; // size of class string DWORD cSubKeys=0; // number of subkeys DWORD cbMaxSubKey; // longest subkey size DWORD cchMaxClass; // longest class string DWORD cValues; // number of values for key DWORD cchMaxValue; // longest value name DWORD cbMaxValueData; // longest value data DWORD cbSecurityDescriptor; // size of security descriptor FILETIME ftLastWriteTime; // last write time char *buffer = NULL ; #ifdef FDJ return 1 ; #endif if( (retCode = RegOpenKeyEx ( HKEY_CURRENT_USER, "Software\\SimonTatham\\PuTTY", 0, KEY_WRITE, &hSubKey)) == ERROR_SUCCESS ) { RegDeleteValue( hSubKey, "Build" ) ; RegDeleteValue( hSubKey, "Folders" ) ; RegDeleteValue( hSubKey, "KiCount" ) ; RegDeleteValue( hSubKey, "KiLastSe" ) ; RegDeleteValue( hSubKey, "KiLastUH" ) ; RegDeleteValue( hSubKey, "KiLastUp" ) ; RegDeleteValue( hSubKey, "KiPath" ) ; RegDeleteValue( hSubKey, "KiSess" ) ; RegDeleteValue( hSubKey, "KiVers" ) ; RegDeleteValue( hSubKey, "CtHelperPath" ) ; RegDeleteValue( hSubKey, "PSCPPath" ) ; RegDeleteValue( hSubKey, "WinSCPPath" ) ; RegDeleteValue( hSubKey, "KiClassName" ) ; RegCloseKey(hSubKey) ; } RegDelTree (HKEY_CURRENT_USER, "Software\\SimonTatham\\PuTTY\\Commands" ) ; RegDelTree (HKEY_CURRENT_USER, "Software\\SimonTatham\\PuTTY\\Folders" ) ; RegDelTree (HKEY_CURRENT_USER, "Software\\SimonTatham\\PuTTY\\Launcher" ) ; // On ouvre la clé if( RegOpenKeyEx( HKEY_CURRENT_USER, "Software\\SimonTatham\\PuTTY\\Sessions", 0, KEY_READ|KEY_WRITE, &hKey) != ERROR_SUCCESS ) return 0; retCode = RegQueryInfoKey( hKey, // key handle achClass, // buffer for class name &cchClassName, // size of class string NULL, // reserved &cSubKeys, // number of subkeys &cbMaxSubKey, // longest subkey size &cchMaxClass, // longest class string &cValues, // number of values for this key &cchMaxValue, // longest value name &cbMaxValueData, // longest value data &cbSecurityDescriptor, // security descriptor &ftLastWriteTime); // Enumerate the subkeys, until RegEnumKeyEx fails. if (cSubKeys) { //printf( "\nNumber of subkeys: %d\n", cSubKeys); for (i=0; i<cSubKeys; i++) { cbName = MAX_KEY_LENGTH; if( ( retCode = RegEnumKeyEx(hKey, i, achKey, &cbName,NULL,NULL,NULL, &ftLastWriteTime) ) == ERROR_SUCCESS ) { buffer = (char*) malloc( strlen( achKey ) + 50 ) ; sprintf( buffer, "Software\\SimonTatham\\PuTTY\\Sessions\\%s\\Commands", achKey ) ; RegDelTree( HKEY_CURRENT_USER, buffer ); sprintf( buffer, "Software\\SimonTatham\\PuTTY\\Sessions\\%s", achKey ) ; if( (retCode = RegOpenKeyEx ( HKEY_CURRENT_USER, buffer, 0, KEY_WRITE, &hSubKey)) == ERROR_SUCCESS ) { RegDeleteValue( hSubKey, "BCDelay" ) ; RegDeleteValue( hSubKey, "BgOpacity" ) ; RegDeleteValue( hSubKey, "BgSlideshow" ) ; RegDeleteValue( hSubKey, "BgType" ) ; RegDeleteValue( hSubKey, "BgImageFile" ) ; RegDeleteValue( hSubKey, "BgImageStyle" ) ; RegDeleteValue( hSubKey, "BgImageAbsoluteX" ) ; RegDeleteValue( hSubKey, "BgImageAbsoluteY" ) ; RegDeleteValue( hSubKey, "BgImagePlacement" ) ; RegDeleteValue( hSubKey, "Maximize" ) ; RegDeleteValue( hSubKey, "SendToTray" ) ; RegDeleteValue( hSubKey, "SaveOnExit" ) ; RegDeleteValue( hSubKey, "Folder" ) ; RegDeleteValue( hSubKey, "Icone" ) ; RegDeleteValue( hSubKey, "IconeFile" ) ; RegDeleteValue( hSubKey, "InitDelay" ) ; RegDeleteValue( hSubKey, "Password" ) ; RegDeleteValue( hSubKey, "Autocommand" ) ; RegDeleteValue( hSubKey, "AutocommandOut" ) ; RegDeleteValue( hSubKey, "AntiIdle" ) ; RegDeleteValue( hSubKey, "LogTimestamp" ) ; RegDeleteValue( hSubKey, "Notes" ) ; RegDeleteValue( hSubKey, "CygtermCommand" ) ; RegDeleteValue( hSubKey, "WakeupReconnect" ) ; RegDeleteValue( hSubKey, "FailureReconnect" ) ; RegDeleteValue( hSubKey, "Scriptfile" ) ; RegDeleteValue( hSubKey, "TransparencyValue" ) ; RegDeleteValue( hSubKey, "TermXPos" ) ; RegDeleteValue( hSubKey, "TermYPos" ) ; RegDeleteValue( hSubKey, "AuthPKCS11" ) ; RegDeleteValue( hSubKey, "PKCS11LibFile" ) ; RegDeleteValue( hSubKey, "PKCS11TokenLabel" ) ; RegDeleteValue( hSubKey, "PKCS11CertLabel" ) ; RegDeleteValue( hSubKey, "CopyURLDetection" ) ; RegDeleteValue( hSubKey, "HyperlinkUnderline" ) ; RegDeleteValue( hSubKey, "HyperlinkUseCtrlClick" ) ; RegDeleteValue( hSubKey, "HyperlinkBrowserUseDefault" ) ; RegDeleteValue( hSubKey, "HyperlinkBrowser" ) ; RegDeleteValue( hSubKey, "HyperlinkRegularExpressionUseDefault" ) ; RegDeleteValue( hSubKey, "HyperlinkRegularExpression" ) ; RegDeleteValue( hSubKey, "rzCommand" ) ; RegDeleteValue( hSubKey, "rzOptions" ) ; RegDeleteValue( hSubKey, "szCommand" ) ; RegDeleteValue( hSubKey, "szOptions" ) ; RegDeleteValue( hSubKey, "zDownloadDir" ) ; RegDeleteValue( hSubKey, "SaveWindowPos" ) ; //RegDeleteValue( hSubKey, "" ) ; RegCloseKey(hSubKey) ; } free( buffer ); } } } RegCloseKey( hKey ) ; return 1; }
// Inititalise la clé de registre Launcher avec les sessions enregistrées void InitLauncherRegistry( void ) { HKEY hKey ; char buffer[MAX_VALUE_NAME] ; int i; if( (IniFileFlag == SAVEMODE_REG)||(IniFileFlag == SAVEMODE_FILE) ) { TCHAR achValue[MAX_VALUE_NAME], folder[MAX_VALUE_NAME], achClass[MAX_PATH] = TEXT(""); DWORD cchClassName=MAX_PATH,cSubKeys=0,cbMaxSubKey,cchMaxClass; DWORD cValues,cchMaxValue,cbMaxValueData,cbSecurityDescriptor; FILETIME ftLastWriteTime; sprintf( buffer, "%s\\Launcher", PUTTY_REG_POS ) ; RegDelTree (HKEY_CURRENT_USER, buffer ) ; RegTestOrCreate( HKEY_CURRENT_USER, buffer, NULL, NULL ) ; sprintf( buffer, "%s\\Sessions", PUTTY_REG_POS ) ; if( RegOpenKeyEx( HKEY_CURRENT_USER, buffer, 0, KEY_READ, &hKey) != ERROR_SUCCESS ) return ; RegQueryInfoKey(hKey,achClass,&cchClassName,NULL,&cSubKeys,&cbMaxSubKey,&cchMaxClass,&cValues,&cchMaxValue,&cbMaxValueData,&cbSecurityDescriptor,&ftLastWriteTime); if( cSubKeys>0 ) for (i=0; i<cSubKeys; i++) { DWORD cchValue = MAX_VALUE_NAME; DWORD dwDataSize=4096 ; char lpData[4096] ; dwDataSize = 4096 ; achValue[0] = '\0'; if( RegEnumKeyEx(hKey, i, lpData, &cchValue, NULL, NULL, NULL, &ftLastWriteTime) == ERROR_SUCCESS ) { sprintf( buffer,"%s\\Sessions\\%s", TEXT(PUTTY_REG_POS), lpData ) ; if( !GetValueData(HKEY_CURRENT_USER, buffer, "Folder", folder ) ) { strcpy( folder, "Default" ) ; } CleanFolderName( folder ) ; if( !strcmp( folder, "Default" ) || (strlen(folder)<=0) ) sprintf( buffer, "%s\\Launcher", TEXT(PUTTY_REG_POS) ) ; else sprintf( buffer, "%s\\Launcher\\%s", TEXT(PUTTY_REG_POS), folder ) ; strcpy( folder, "" ) ; unmungestr( lpData, folder, MAX_VALUE_NAME ) ; if( strlen(folder) > 0 ) RegTestOrCreate( HKEY_CURRENT_USER, buffer, folder, folder ) ; } } RegCloseKey( hKey ) ; } else if( (IniFileFlag == SAVEMODE_DIR)&&(DirectoryBrowseFlag==0) ) { char fullpath[MAX_VALUE_NAME], folder[MAX_VALUE_NAME] ; DIR * dir ; struct dirent * de ; FILE * fp ; sprintf( fullpath, "%s\\Launcher", ConfigDirectory ) ; DelDir( fullpath ) ; MakeDir( fullpath ) ; sprintf( fullpath, "%s\\Sessions", ConfigDirectory ) ; if( (dir=opendir(fullpath)) != NULL ) { while( (de=readdir(dir)) != NULL ) if( strcmp(de->d_name,".") && strcmp(de->d_name,"..") ) { sprintf( fullpath, "%s\\Sessions\\%s", ConfigDirectory, de->d_name ) ; if( !(GetFileAttributes( fullpath ) & FILE_ATTRIBUTE_DIRECTORY) ) { strcpy( folder, "" ) ; unmungestr( de->d_name, buffer, MAX_VALUE_NAME) ; GetSessionFolderName( buffer, folder ) ; CleanFolderName( folder ) ; sprintf( buffer, "%s\\Launcher\\%s", ConfigDirectory, folder ) ; if( strcmp(folder,"Default") ) { MakeDir( buffer ) ; sprintf( buffer, "%s\\Launcher\\%s\\%s", ConfigDirectory, folder, de->d_name ) ; } else sprintf( buffer, "%s\\Launcher\\%s", ConfigDirectory, de->d_name ) ; if( (fp=fopen(buffer,"wb")) != NULL ) { unmungestr( de->d_name, buffer, MAX_VALUE_NAME) ; fprintf( fp, "%s\\%s\\", buffer, buffer ) ; fclose( fp ) ; } } } closedir(dir) ; } } else if( (IniFileFlag == SAVEMODE_DIR)&&DirectoryBrowseFlag ) { char fullpath[MAX_VALUE_NAME] ; sprintf( fullpath, "%s\\Launcher", ConfigDirectory ) ; DelDir( fullpath ) ; MakeDir( fullpath ) ; InitLauncherDir( "" ) ; } }