[REGEDIT] Support exporting registry to text file (#5619)

- Add txtproc.c source file.
- Add some resource strings.
- Add *.txt filter to export on a text file.
CORE-16910
This commit is contained in:
Katayama Hirofumi MZ 2023-08-30 21:43:09 +09:00 committed by GitHub
parent 8c0c2e2be7
commit c16f93c5f3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
35 changed files with 945 additions and 16 deletions

View file

@ -20,6 +20,7 @@ list(APPEND SOURCE
security.c
settings.c
treeview.c
txtproc.c
regedit.h)
file(GLOB regedit_rc_deps res/*.*)

View file

@ -230,8 +230,7 @@ static BOOL CheckCommDlgError(HWND hWnd)
return TRUE;
}
WCHAR FileNameBuffer[_MAX_PATH];
WCHAR FileTitleBuffer[_MAX_PATH];
WCHAR FileNameBuffer[MAX_PATH];
typedef struct
{
@ -255,9 +254,9 @@ BuildFilterStrings(WCHAR *Filter, PFILTERPAIR Pairs, int PairCount)
Filter[++c] = L'\0';
}
static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn)
static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn, BOOL bSave)
{
FILTERPAIR FilterPairs[4];
FILTERPAIR FilterPairs[5];
static WCHAR Filter[1024];
memset(pofn, 0, sizeof(OPENFILENAME));
@ -272,17 +271,31 @@ static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn)
FilterPairs[1].FilterID = IDS_FLT_HIVFILES_FLT;
FilterPairs[2].DisplayID = IDS_FLT_REGEDIT4;
FilterPairs[2].FilterID = IDS_FLT_REGEDIT4_FLT;
FilterPairs[3].DisplayID = IDS_FLT_ALLFILES;
FilterPairs[3].FilterID = IDS_FLT_ALLFILES_FLT;
BuildFilterStrings(Filter, FilterPairs, ARRAY_SIZE(FilterPairs));
if (bSave)
{
FilterPairs[3].DisplayID = IDS_FLT_TXTFILES;
FilterPairs[3].FilterID = IDS_FLT_TXTFILES_FLT;
FilterPairs[4].DisplayID = IDS_FLT_ALLFILES;
FilterPairs[4].FilterID = IDS_FLT_ALLFILES_FLT;
}
else
{
FilterPairs[3].DisplayID = IDS_FLT_ALLFILES;
FilterPairs[3].FilterID = IDS_FLT_ALLFILES_FLT;
}
BuildFilterStrings(Filter, FilterPairs, ARRAY_SIZE(FilterPairs) - !bSave);
pofn->lpstrFilter = Filter;
pofn->lpstrFile = FileNameBuffer;
pofn->nMaxFile = _MAX_PATH;
pofn->lpstrFileTitle = FileTitleBuffer;
pofn->nMaxFileTitle = _MAX_PATH;
pofn->nMaxFile = _countof(FileNameBuffer);
pofn->Flags = OFN_EXPLORER | OFN_HIDEREADONLY;
pofn->lpstrDefExt = L"reg";
if (bSave)
pofn->Flags |= OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST;
else
pofn->Flags |= OFN_FILEMUSTEXIST;
return TRUE;
}
@ -354,7 +367,7 @@ static BOOL LoadHive(HWND hWnd)
/* get the item key to load the hive in */
pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey);
/* initialize the "open file" dialog */
InitOpenFileName(hWnd, &ofn);
InitOpenFileName(hWnd, &ofn, FALSE);
/* build the "All Files" filter up */
filter.DisplayID = IDS_FLT_ALLFILES;
filter.FilterID = IDS_FLT_ALLFILES_FLT;
@ -364,7 +377,7 @@ static BOOL LoadHive(HWND hWnd)
LoadStringW(hInst, IDS_LOAD_HIVE, Caption, ARRAY_SIZE(Caption));
ofn.lpstrTitle = Caption;
ofn.Flags |= OFN_ENABLESIZING;
/* ofn.lCustData = ;*/
/* now load the hive */
if (GetOpenFileName(&ofn))
{
@ -442,11 +455,11 @@ static BOOL ImportRegistryFile(HWND hWnd)
/* Figure out in which key path we are importing */
pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
InitOpenFileName(hWnd, &ofn);
InitOpenFileName(hWnd, &ofn, FALSE);
LoadStringW(hInst, IDS_IMPORT_REG_FILE, Caption, ARRAY_SIZE(Caption));
ofn.lpstrTitle = Caption;
ofn.Flags |= OFN_ENABLESIZING;
/* ofn.lCustData = ;*/
if (GetOpenFileName(&ofn))
{
/* Look at the extension of the file to determine its type */
@ -590,7 +603,7 @@ BOOL ExportRegistryFile(HWND hWnd)
pszKeyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
GetKeyName(ExportKeyPath, ARRAY_SIZE(ExportKeyPath), hKeyRoot, pszKeyPath);
InitOpenFileName(hWnd, &ofn);
InitOpenFileName(hWnd, &ofn, TRUE);
LoadStringW(hInst, IDS_EXPORT_REG_FILE, Caption, ARRAY_SIZE(Caption));
ofn.lpstrTitle = Caption;
@ -599,7 +612,7 @@ BOOL ExportRegistryFile(HWND hWnd)
{
ofn.lCustData = (LPARAM) ExportKeyPath;
}
ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_OVERWRITEPROMPT;
ofn.Flags |= OFN_ENABLETEMPLATE | OFN_ENABLEHOOK;
ofn.lpfnHook = ExportRegistryFile_OFNHookProc;
ofn.lpTemplateName = MAKEINTRESOURCEW(IDD_EXPORTRANGE);
if (GetSaveFileName(&ofn))
@ -677,6 +690,19 @@ BOOL ExportRegistryFile(HWND hWnd)
break;
}
case 4: /* Text File */
{
bRet = txt_export_registry_key(ofn.lpstrFile, ExportKeyPath);
if (!bRet)
{
/* Error creating the file */
LoadStringW(hInst, IDS_APP_TITLE, szTitle, ARRAY_SIZE(szTitle));
LoadStringW(hInst, IDS_EXPORT_ERROR, szText, ARRAY_SIZE(szText));
InfoMessageBox(hWnd, MB_OK | MB_ICONERROR, szTitle, szText, ofn.lpstrFile);
}
break;
}
}
}
else

View file

@ -426,6 +426,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Всички файлове (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -521,6 +523,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Неизвестен вид интерфейс"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Všechny soubory (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Neznámý typ rozhraní"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Alle Dateien (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unbekannter Schnittstellentyp"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Όλα τα αρχεία (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "All Files (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -424,6 +424,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Todos los archivos (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -519,6 +521,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Tipo de interfaz desconocido"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Tous les fichiers (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "כל הקבצים (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "All Files (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Semua Berkas (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Tutti i file (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Tipologia interfaccia sconosciuta"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "すべてのファイル (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -423,6 +423,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "모든 파일 (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -518,6 +520,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "All Files (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Alle Filer (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -431,6 +431,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Wszystkie pliki (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -526,6 +528,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Nieznany typ interfejsu"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Todos os arquivos (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Todos os ficheiros (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -431,6 +431,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Orice fișier (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -526,6 +528,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Nespecificat"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Все файлы (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Неизвестный тип интерфейса"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -426,6 +426,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Všetky súbory (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -521,6 +523,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "All Files (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -425,6 +425,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Gjith Dokumentat (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -520,6 +522,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -421,6 +421,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Alla filer (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -516,6 +518,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -423,6 +423,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "All Files (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -518,6 +520,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -423,6 +423,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Tüm Dosyalar (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -518,6 +520,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Bilinmeyen Arayüz Türü"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -423,6 +423,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "Усі файли (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -518,6 +520,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "Unknown Interface Type"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -431,6 +431,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "所有文件 (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -526,6 +528,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "未知的接口类型"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -429,6 +429,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "所有檔案 (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -524,6 +526,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "不明介面類型"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -430,6 +430,8 @@ BEGIN
IDS_FLT_REGEDIT4_FLT "*.reg"
IDS_FLT_ALLFILES "所有檔案 (*.*)"
IDS_FLT_ALLFILES_FLT "*.*"
IDS_FLT_TXTFILES "Text Files (*.txt)"
IDS_FLT_TXTFILES_FLT "*.txt"
END
STRINGTABLE
@ -525,6 +527,20 @@ BEGIN
IDS_BUS_UNKNOWNTYPE "不明介面類型"
END
STRINGTABLE
BEGIN
IDS_FIELD_KEY_NAME "Key Name:"
IDS_FIELD_CLASS_NAME "Class Name:"
IDS_NO_CLASS_NAME "<NO CLASS>"
IDS_NULL_TIMESTAMP "<NULL>"
IDS_FIELD_NAME " Name:"
IDS_FIELD_TYPE " Type:"
IDS_FIELD_DATA " Data:"
IDS_FIELD_LASTWRITE "Last Write Time:"
IDS_UNKNOWN "<UNKNOWN>"
IDS_VALUE_INDEX "Value %d"
END
/*****************************************************************/
/* Dialogs */

View file

@ -163,4 +163,7 @@ void DestroyTreeView(HWND hwndTV);
void DestroyListView(HWND hwndLV);
void DestroyMainMenu(void);
/* txtproc.c */
BOOL txt_export_registry_key(LPCWSTR file_name, LPCWSTR path);
/* EOF */

View file

@ -168,6 +168,8 @@
#define IDS_FLT_REGEDIT4_FLT 31006
#define IDS_FLT_ALLFILES 31007
#define IDS_FLT_ALLFILES_FLT 31008
#define IDS_FLT_TXTFILES 31009
#define IDS_FLT_TXTFILES_FLT 31010
#define IDS_ACCESS_FULLCONTROL 31100
#define IDS_ACCESS_READ 31101
@ -244,6 +246,17 @@
#define IDS_BUS_PNPBUS 31546
#define IDS_BUS_UNKNOWNTYPE 31547
#define IDS_FIELD_KEY_NAME 31600
#define IDS_FIELD_CLASS_NAME 31601
#define IDS_NO_CLASS_NAME 31602
#define IDS_NULL_TIMESTAMP 31603
#define IDS_FIELD_NAME 31604
#define IDS_FIELD_TYPE 31605
#define IDS_FIELD_DATA 31606
#define IDS_FIELD_LASTWRITE 31607
#define IDS_UNKNOWN 31608
#define IDS_VALUE_INDEX 31609
#define IDD_EDIT_STRING 2000
#define IDC_VALUE_NAME 2001
#define IDC_VALUE_DATA 2002

View file

@ -0,0 +1,406 @@
/*
* PROJECT: ReactOS Registry Editor
* LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
* PURPOSE: Exporting registry data to a text file
* COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#include "regedit.h"
static HKEY reg_class_keys[] =
{
HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT,
HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_DYN_DATA
};
static LPWSTR load_str(INT id)
{
/* Use rotation buffer */
static WCHAR s_asz[3][MAX_PATH];
static INT s_index = 0;
LPWSTR psz;
LoadStringW(hInst, id, s_asz[s_index], MAX_PATH);
psz = s_asz[s_index];
s_index = (s_index + 1) % _countof(s_asz);
return psz;
}
static void txt_fputs(FILE *fp, LPCWSTR str)
{
fwrite(str, lstrlenW(str) * sizeof(WCHAR), 1, fp);
}
static void txt_newline(FILE *fp)
{
txt_fputs(fp, L"\r\n");
}
static void txt_fprintf(FILE *fp, LPCWSTR format, ...)
{
WCHAR line[1024];
va_list va;
va_start(va, format);
StringCchVPrintfW(line, _countof(line), format, va);
txt_fputs(fp, line);
va_end(va);
}
static HKEY txt_parse_key_name(LPCWSTR key_name, WCHAR **key_path)
{
unsigned int i;
if (!key_name) return 0;
*key_path = wcschr(key_name, '\\');
if (*key_path)
(*key_path)++;
for (i = 0; i < _countof(reg_class_keys); i++)
{
int len = lstrlenW(reg_class_namesW[i]);
if (!_wcsnicmp(key_name, reg_class_namesW[i], len) &&
(key_name[len] == 0 || key_name[len] == '\\'))
{
return reg_class_keys[i];
}
}
return 0;
}
static void txt_export_binary(FILE *fp, const void *data, size_t size)
{
const BYTE *pb = data;
for (DWORD addr = 0; addr < size; addr += 0x10)
{
txt_fprintf(fp, L"%08X ", addr);
for (size_t column = 0; column < 16; ++column)
{
if (addr + column >= size)
{
if (column == 8)
txt_fputs(fp, L" ");
txt_fputs(fp, L" ");
}
else
{
if (column == 8)
txt_fputs(fp, L" -");
txt_fprintf(fp, L" %02x", (pb[addr + column] & 0xFF));
}
}
txt_fputs(fp, L" ");
for (size_t column = 0; column < 16; ++column)
{
if (addr + column >= size)
{
break;
}
else
{
BYTE b = pb[addr + column];
if (isprint(b) || IsCharAlphaNumericW(b))
txt_fprintf(fp, L"%c", b);
else
txt_fputs(fp, L".");
}
}
txt_newline(fp);
}
}
static void txt_export_field(FILE *fp, LPCWSTR label, LPCWSTR value)
{
txt_fprintf(fp, L"%-19s%s\r\n", label, value);
}
static void txt_export_multi_sz(FILE *fp, const void *data, size_t size)
{
LPCWSTR pch;
for (pch = data; *pch; pch += lstrlenW(pch) + 1)
{
if (pch == data)
txt_export_field(fp, load_str(IDS_FIELD_DATA), pch);
else
txt_export_field(fp, L"", pch);
}
}
static void txt_export_type(FILE *fp, LPCWSTR type)
{
txt_export_field(fp, load_str(IDS_FIELD_TYPE), type);
}
static void txt_export_name(FILE *fp, LPCWSTR name)
{
txt_export_field(fp, load_str(IDS_FIELD_NAME), name);
}
static void
txt_export_data(FILE *fp, INT i, LPCWSTR value_name, DWORD value_len, DWORD type,
const void *data, size_t size)
{
LPCWSTR pszType;
txt_fprintf(fp, load_str(IDS_VALUE_INDEX), i);
txt_newline(fp);
txt_export_name(fp, value_name);
switch (type)
{
case REG_SZ:
txt_export_type(fp, L"REG_SZ");
txt_export_field(fp, load_str(IDS_FIELD_DATA), data);
break;
case REG_DWORD:
txt_export_type(fp, L"REG_DWORD");
txt_fprintf(fp, L"%-19s0x%lx\r\n", load_str(IDS_FIELD_DATA), *(DWORD*)data);
break;
case REG_EXPAND_SZ:
txt_export_type(fp, L"REG_EXPAND_SZ");
txt_export_field(fp, load_str(IDS_FIELD_DATA), data);
break;
case REG_MULTI_SZ:
txt_export_type(fp, L"REG_MULTI_SZ");
txt_export_multi_sz(fp, data, size);
break;
case REG_BINARY:
case REG_QWORD:
case REG_NONE:
default:
if (type == REG_BINARY)
pszType = L"REG_BINARY";
else if (type == REG_QWORD)
pszType = L"REG_QWORD";
else if (type == REG_NONE)
pszType = L"REG_NONE";
else
pszType = load_str(IDS_UNKNOWN);
txt_export_type(fp, pszType);
txt_export_field(fp, load_str(IDS_FIELD_DATA), L"");
txt_export_binary(fp, data, size);
break;
}
txt_newline(fp);
}
static WCHAR *
txt_build_subkey_path(LPCWSTR path, DWORD path_len, LPCWSTR subkey_name, DWORD subkey_len)
{
WCHAR *subkey_path;
subkey_path = malloc((path_len + subkey_len + 2) * sizeof(WCHAR));
swprintf(subkey_path, L"%s\\%s", path, subkey_name);
return subkey_path;
}
static void txt_export_key_name(FILE *fp, LPCWSTR name)
{
txt_export_field(fp, load_str(IDS_FIELD_KEY_NAME), name);
}
static void txt_export_class_and_last_write(FILE *fp, HKEY key)
{
WCHAR szClassName[MAX_PATH];
DWORD cchClassName = _countof(szClassName);
FILETIME ftLastWrite, ftLocal, ftNull = { 0 };
SYSTEMTIME stLastWrite;
WCHAR sz1[64], sz2[64];
LONG error;
error = RegQueryInfoKeyW(key, szClassName, &cchClassName, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, &ftLastWrite);
if (error != ERROR_SUCCESS)
{
cchClassName = 0;
ftLastWrite = ftNull;
}
szClassName[_countof(szClassName) - 1] = UNICODE_NULL;
if (cchClassName > 0)
txt_export_field(fp, load_str(IDS_FIELD_CLASS_NAME), szClassName);
else
txt_export_field(fp, load_str(IDS_FIELD_CLASS_NAME), load_str(IDS_NO_CLASS_NAME));
if (memcmp(&ftLastWrite, &ftNull, sizeof(ftNull)) == 0)
{
txt_export_field(fp, load_str(IDS_FIELD_LASTWRITE), load_str(IDS_NULL_TIMESTAMP));
return;
}
FileTimeToLocalFileTime(&ftLastWrite, &ftLocal);
FileTimeToSystemTime(&ftLocal, &stLastWrite);
GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &stLastWrite, NULL, sz1, _countof(sz1));
GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &stLastWrite, NULL, sz2, _countof(sz2));
txt_fprintf(fp, L"%-19s%s - %s\r\n", load_str(IDS_FIELD_LASTWRITE), sz1, sz2);
}
static void txt_export_registry_data(FILE *fp, HKEY key, LPCWSTR path)
{
LONG rc;
DWORD max_value_len = MAX_PATH, value_len;
DWORD max_data_bytes = 2048, data_size;
DWORD subkey_len;
DWORD i, type, path_len;
WCHAR *value_name, *subkey_name, *subkey_path;
BYTE *data;
HKEY subkey;
txt_export_key_name(fp, path);
txt_export_class_and_last_write(fp, key);
value_name = malloc(max_value_len * sizeof(WCHAR));
data = malloc(max_data_bytes);
i = 0;
for (;;)
{
value_len = max_value_len;
data_size = max_data_bytes;
rc = RegEnumValueW(key, i, value_name, &value_len, NULL, &type, data, &data_size);
if (rc == ERROR_SUCCESS)
{
txt_export_data(fp, i, value_name, value_len, type, data, data_size);
i++;
}
else if (rc == ERROR_MORE_DATA)
{
if (data_size > max_data_bytes)
{
max_data_bytes = data_size;
data = realloc(data, max_data_bytes);
}
else
{
max_value_len *= 2;
value_name = realloc(value_name, max_value_len * sizeof(WCHAR));
}
}
else break;
}
free(data);
free(value_name);
subkey_name = malloc(MAX_PATH * sizeof(WCHAR));
path_len = lstrlenW(path);
i = 0;
for (;;)
{
subkey_len = MAX_PATH;
rc = RegEnumKeyExW(key, i, subkey_name, &subkey_len, NULL, NULL, NULL, NULL);
if (rc == ERROR_SUCCESS)
{
if (i == 0)
txt_newline(fp);
subkey_path = txt_build_subkey_path(path, path_len, subkey_name, subkey_len);
if (!RegOpenKeyExW(key, subkey_name, 0, KEY_READ, &subkey))
{
txt_newline(fp);
txt_export_registry_data(fp, subkey, subkey_path);
RegCloseKey(subkey);
}
free(subkey_path);
i++;
}
else break;
}
free(subkey_name);
}
static FILE *txt_open_export_file(LPCWSTR file_name)
{
FILE *file = _wfopen(file_name, L"wb");
if (file)
fwrite("\xFF\xFE", 2, 1, file);
return file;
}
static HKEY txt_open_export_key(HKEY key_class, LPCWSTR subkey, LPCWSTR path)
{
HKEY key;
if (RegOpenKeyExW(key_class, subkey, 0, KEY_READ, &key) != ERROR_SUCCESS)
return NULL;
return key;
}
static BOOL txt_export_key(LPCWSTR file_name, LPCWSTR path)
{
HKEY key_class, key;
WCHAR *subkey;
FILE *fp;
if (!(key_class = txt_parse_key_name(path, &subkey)))
{
if (subkey) *(subkey - 1) = 0;
return FALSE;
}
if (!(key = txt_open_export_key(key_class, subkey, path)))
return FALSE;
fp = txt_open_export_file(file_name);
if (fp)
{
txt_export_registry_data(fp, key, path);
txt_newline(fp);
fclose(fp);
}
RegCloseKey(key);
return fp != NULL;
}
static BOOL txt_export_all(LPCWSTR file_name, LPCWSTR path)
{
FILE *fp;
int i;
HKEY classes[] = {HKEY_LOCAL_MACHINE, HKEY_USERS}, key;
WCHAR *class_name;
fp = txt_open_export_file(file_name);
if (!fp)
return FALSE;
for (i = 0; i < _countof(classes); i++)
{
if (!(key = txt_open_export_key(classes[i], NULL, path)))
{
fclose(fp);
return FALSE;
}
class_name = malloc((lstrlenW(reg_class_namesW[i]) + 1) * sizeof(WCHAR));
lstrcpyW(class_name, reg_class_namesW[i]);
txt_export_registry_data(fp, classes[i], class_name);
free(class_name);
RegCloseKey(key);
}
txt_newline(fp);
fclose(fp);
return TRUE;
}
BOOL txt_export_registry_key(LPCWSTR file_name, LPCWSTR path)
{
if (path && *path)
return txt_export_key(file_name, path);
else
return txt_export_all(file_name, path);
}