BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s) { TCHAR filename[MAX_PATH]; TCHAR reg_key_name[KEY_MAX_LEN]; switch (action) { case ACTION_ADD: get_file_name(&s, filename, MAX_PATH); if (!filename[0]) { printf("No file name is specified\n%s", usage); return FALSE; //exit(1); } while (filename[0]) { if (!import_registry_file(filename)) { perror(""); printf("Can't open file \"%s\"\n", filename); return FALSE; //exit(1); } get_file_name(&s, filename, MAX_PATH); } break; case ACTION_DELETE: get_file_name(&s, reg_key_name, KEY_MAX_LEN); if (!reg_key_name[0]) { printf("No registry key is specified for removal\n%s", usage); return FALSE; //exit(1); } delete_registry_key(reg_key_name); break; case ACTION_EXPORT: filename[0] = '\0'; get_file_name(&s, filename, MAX_PATH); if (!filename[0]) { printf("No file name is specified\n%s", usage); return FALSE; //exit(1); } if (s[0]) { get_file_name(&s, reg_key_name, KEY_MAX_LEN); export_registry_key(filename, reg_key_name); } else { export_registry_key(filename, NULL); } break; default: printf("Unhandled action!\n"); return FALSE; } return TRUE; }
BOOL ExportRegistryFile(HWND hWnd) { OPENFILENAME ofn; TCHAR ExportKeyPath[_MAX_PATH]; TCHAR Caption[128]; HKEY hKeyRoot; LPCTSTR pszKeyPath; /* Figure out which key path we are exporting */ pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); GetKeyName(ExportKeyPath, COUNT_OF(ExportKeyPath), hKeyRoot, pszKeyPath); InitOpenFileName(hWnd, &ofn); LoadString(hInst, IDS_EXPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR)); ofn.lpstrTitle = Caption; /* Only set the path if a key (not the root node) is selected */ if (hKeyRoot != 0) { ofn.lCustData = (LPARAM) ExportKeyPath; } ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT; ofn.lpfnHook = ExportRegistryFile_OFNHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORTRANGE); if (GetSaveFileName(&ofn)) { BOOL result; DWORD format; if (ofn.nFilterIndex == 1) format = REG_FORMAT_5; else format = REG_FORMAT_4; result = export_registry_key(ofn.lpstrFile, ExportKeyPath, format); if (!result) { LPSTR p = GetMultiByteString(ofn.lpstrFile); fprintf(stderr, "Can't open file \"%s\"\n", p); HeapFree(GetProcessHeap(), 0, p); return FALSE; } } else { CheckCommDlgError(hWnd); } return TRUE; }
static BOOL PerformRegAction(REGEDIT_ACTION action, LPSTR s) { switch (action) { case ACTION_ADD: { CHAR filename[MAX_PATH]; FILE *reg_file; get_file_name(&s, filename); if (!filename[0]) { fprintf(stderr,"%s: No file name was specified\n", getAppName()); fprintf(stderr,usage); exit(1); } while(filename[0]) { char* realname = NULL; if (strcmp(filename, "-") == 0) { reg_file=stdin; } else { int size; size=SearchPath(NULL, filename, NULL,0, NULL, NULL); if (size>0) { realname=HeapAlloc(GetProcessHeap(), 0, size); size=SearchPath(NULL, filename, NULL, size, realname, NULL); } if (size==0) { fprintf(stderr, "%s: File not found \"%s\" (%d)\n", getAppName(), filename, GetLastError()); exit(1); } reg_file = fopen(realname, "r"); if (reg_file==NULL) { perror(""); fprintf(stderr,"%s: Can't open file \"%s\"\n", getAppName(), filename); exit(1); } } import_registry_file(reg_file); if (realname) { HeapFree(GetProcessHeap(),0,realname); fclose(reg_file); } get_file_name(&s, filename); } break; } case ACTION_DELETE: { CHAR reg_key_name[KEY_MAX_LEN]; get_file_name(&s, reg_key_name); if (!reg_key_name[0]) { fprintf(stderr,"%s: No registry key was specified for removal\n", getAppName()); fprintf(stderr,usage); exit(1); } else { WCHAR* reg_key_nameW = GetWideString(reg_key_name); delete_registry_key(reg_key_nameW); HeapFree(GetProcessHeap(), 0, reg_key_nameW); } break; } case ACTION_EXPORT: { CHAR filename[MAX_PATH]; WCHAR* filenameW; filename[0] = '\0'; get_file_name(&s, filename); if (!filename[0]) { fprintf(stderr,"%s: No file name was specified\n", getAppName()); fprintf(stderr,usage); exit(1); } filenameW = GetWideString(filename); if (s[0]) { CHAR reg_key_name[KEY_MAX_LEN]; WCHAR* reg_key_nameW; get_file_name(&s, reg_key_name); reg_key_nameW = GetWideString(reg_key_name); export_registry_key(filenameW, reg_key_nameW, REG_FORMAT_4); HeapFree(GetProcessHeap(), 0, reg_key_nameW); } else { export_registry_key(filenameW, NULL, REG_FORMAT_4); } HeapFree(GetProcessHeap(), 0, filenameW); break; } default: fprintf(stderr,"%s: Unhandled action!\n", getAppName()); exit(1); break; } return TRUE; }
BOOL ExportRegistryFile(HWND hWnd) { BOOL bRet = FALSE; OPENFILENAME ofn; WCHAR ExportKeyPath[_MAX_PATH] = {0}; WCHAR Caption[128], szTitle[512], szText[512]; HKEY hKeyRoot; LPCWSTR pszKeyPath; /* Figure out which key path we are exporting */ pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); GetKeyName(ExportKeyPath, COUNT_OF(ExportKeyPath), hKeyRoot, pszKeyPath); InitOpenFileName(hWnd, &ofn); LoadStringW(hInst, IDS_EXPORT_REG_FILE, Caption, COUNT_OF(Caption)); ofn.lpstrTitle = Caption; /* Only set the path if a key (not the root node) is selected */ if (hKeyRoot != 0) { ofn.lCustData = (LPARAM) ExportKeyPath; } ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT; ofn.lpfnHook = ExportRegistryFile_OFNHookProc; ofn.lpTemplateName = MAKEINTRESOURCEW(IDD_EXPORTRANGE); if (GetSaveFileName(&ofn)) { switch (ofn.nFilterIndex) { case 2: /* Registry Hive Files */ { LONG lResult; HKEY hSubKey; /* Open the subkey */ lResult = RegOpenKeyExW(hKeyRoot, pszKeyPath, 0, KEY_READ, &hSubKey); if (lResult == ERROR_SUCCESS) { /* Enable the 'backup' privilege, save the hive then disable the privilege */ EnablePrivilege(SE_BACKUP_NAME, NULL, TRUE); lResult = RegSaveKeyW(hSubKey, ofn.lpstrFile, NULL); if (lResult == ERROR_ALREADY_EXISTS) { /* * We are here, that means that we already said "yes" to the confirmation dialog. * So we absolutely want to replace the hive file. */ if (DeleteFileW(ofn.lpstrFile)) { /* Try again */ lResult = RegSaveKeyW(hSubKey, ofn.lpstrFile, NULL); } } EnablePrivilege(SE_BACKUP_NAME, NULL, FALSE); if (lResult != ERROR_SUCCESS) { /* * If we are here, it's because RegSaveKeyW has failed for any reason. * The problem is that even if it has failed, it has created or * replaced the exported hive file with a new empty file. We don't * want to keep this file, so we delete it. */ DeleteFileW(ofn.lpstrFile); } /* Close the subkey */ RegCloseKey(hSubKey); } /* Set the return value */ bRet = (lResult == ERROR_SUCCESS); /* Display error, if any */ if (!bRet) ErrorMessageBox(hWnd, Caption, lResult); break; } case 1: /* Windows Registry Editor Version 5.00 */ case 3: /* REGEDIT4 */ default: /* All files ==> use Windows Registry Editor Version 5.00 */ { if (!export_registry_key(ofn.lpstrFile, ExportKeyPath, (ofn.nFilterIndex == 3 ? REG_FORMAT_4 : REG_FORMAT_5))) { /* Error creating the file */ LoadStringW(hInst, IDS_APP_TITLE, szTitle, COUNT_OF(szTitle)); LoadStringW(hInst, IDS_EXPORT_ERROR, szText, COUNT_OF(szText)); InfoMessageBox(hWnd, MB_OK | MB_ICONERROR, szTitle, szText, ofn.lpstrFile); bRet = FALSE; } else { bRet = TRUE; } break; } } } else { CheckCommDlgError(hWnd); } return bRet; }
BOOL PerformRegAction(REGEDIT_ACTION action, LPWSTR s, BOOL silent) { switch (action) { case ACTION_ADD: { WCHAR szTitle[512], szText[512]; WCHAR filename[MAX_PATH]; FILE *fp; get_file_name(&s, filename); if (!filename[0]) { InfoMessageBox(NULL, MB_OK | MB_ICONINFORMATION, NULL, L"No file name is specified."); InfoMessageBox(NULL, MB_OK | MB_ICONINFORMATION, NULL, usage); exit(4); } LoadStringW(hInst, IDS_APP_TITLE, szTitle, COUNT_OF(szTitle)); while (filename[0]) { /* Request import confirmation */ if (!silent) { int choice; LoadStringW(hInst, IDS_IMPORT_PROMPT, szText, COUNT_OF(szText)); choice = InfoMessageBox(NULL, MB_YESNOCANCEL | MB_ICONWARNING, szTitle, szText, filename); switch (choice) { case IDNO: goto cont; case IDCANCEL: /* The cancel case is useful if the user is importing more than one registry file at a time, and wants to back out anytime during the import process. This way, the user doesn't have to resort to ending the regedit process abruptly just to cancel the operation. */ return TRUE; default: break; } } /* Open the file */ fp = _wfopen(filename, L"r"); /* Import it */ if (fp == NULL || !import_registry_file(fp)) { /* Error opening the file */ if (!silent) { LoadStringW(hInst, IDS_IMPORT_ERROR, szText, COUNT_OF(szText)); InfoMessageBox(NULL, MB_OK | MB_ICONERROR, szTitle, szText, filename); } } else { /* Show successful import */ if (!silent) { LoadStringW(hInst, IDS_IMPORT_OK, szText, COUNT_OF(szText)); InfoMessageBox(NULL, MB_OK | MB_ICONINFORMATION, szTitle, szText, filename); } } /* Close the file */ if (fp) fclose(fp); cont: get_file_name(&s, filename); } break; } case ACTION_DELETE: { WCHAR reg_key_name[KEY_MAX_LEN]; get_file_name(&s, reg_key_name); if (!reg_key_name[0]) { InfoMessageBox(NULL, MB_OK | MB_ICONINFORMATION, NULL, L"No registry key is specified for removal."); InfoMessageBox(NULL, MB_OK | MB_ICONINFORMATION, NULL, usage); exit(6); } delete_registry_key(reg_key_name); break; } case ACTION_EXPORT: { WCHAR filename[MAX_PATH]; filename[0] = L'\0'; get_file_name(&s, filename); if (!filename[0]) { InfoMessageBox(NULL, MB_OK | MB_ICONINFORMATION, NULL, L"No file name is specified."); InfoMessageBox(NULL, MB_OK | MB_ICONINFORMATION, NULL, usage); exit(7); } if (s[0]) { WCHAR reg_key_name[KEY_MAX_LEN]; get_file_name(&s, reg_key_name); export_registry_key(filename, reg_key_name, REG_FORMAT_4); } else { export_registry_key(filename, NULL, REG_FORMAT_4); } break; } default: fwprintf(stderr, L"%s: Unhandled action!\n", getAppName()); exit(8); break; } return TRUE; }