|
备份注册表的例子 (From strarc):- void
- CreateRegistrySnapshots()
- {
- HKEY hKeyHiveList;
- LONG lRegErr;
- lRegErr = RegOpenKey(HKEY_LOCAL_MACHINE,
- L"SYSTEM\\CurrentControlSet\\Control\\hivelist",
- &hKeyHiveList);
- if (lRegErr != ERROR_SUCCESS)
- {
- WErrMsgA errmsg(lRegErr);
- oem_printf(stderr,
- "Error getting registry hive list: %1%%n"
- "No registry snapshots will be backed up.%%n", errmsg);
- return;
- }
- LPWSTR wczKeyName = (LPWSTR) Buffer;
- DWORD dwKeyNameSize = 32767;
- LPWSTR wczFileName = wczFullPathBuffer;
- DWORD dwFileNameSize = 32767 -
- sizeof(wczFullPathBuffer) / sizeof(*wczFullPathBuffer);
- DWORD dwIndex = 0;
- for(;;)
- {
- Sleep(0);
- DWORD dwKeyNameReturnedSize = dwKeyNameSize;
- DWORD dwFileNameReturnedSize = dwFileNameSize -
- sizeof(REGISTRY_SNAPSHOT_FILE_EXTENSION) /
- sizeof(*REGISTRY_SNAPSHOT_FILE_EXTENSION);
- DWORD dwReturnedDataType;
- lRegErr = RegEnumValue(hKeyHiveList,
- dwIndex++,
- wczKeyName,
- &dwKeyNameReturnedSize,
- NULL,
- &dwReturnedDataType,
- (LPBYTE) wczFileName,
- &dwFileNameReturnedSize);
- if (lRegErr == ERROR_NO_MORE_ITEMS)
- break;
- if ((lRegErr != ERROR_SUCCESS) & (lRegErr != ERROR_MORE_DATA))
- {
- WErrMsgA errmsg(lRegErr);
- oem_printf(stderr,
- "Error getting registry hive list: %1%%n"
- "Some of the snapshots will not be backed up.%%n",
- errmsg);
- break;
- }
- if (dwReturnedDataType != REG_SZ)
- {
- oem_printf(stderr,
- "Wrong data type %1!u! for hive %2!ws!. "
- "Should be %3!u!. This hive will not be backed up.%%n",
- dwReturnedDataType, wczKeyName, REG_SZ);
- continue;
- }
- if (*wczFileName == 0)
- continue;
- wcscat(wczFileName, REGISTRY_SNAPSHOT_FILE_EXTENSION);
- if (bVerbose)
- oem_printf(stderr, "'%1!ws!' -> '%2!ws!'%%n", wczKeyName, wczFileName);
- else if (bListFiles)
- oem_printf(stdout, "%1!ws!%%n", wczKeyName);
- NTSTATUS status;
- IO_STATUS_BLOCK io_status;
- UNICODE_STRING name;
- OBJECT_ATTRIBUTES object_attributes;
- HANDLE hKey;
- HANDLE hFile;
- RtlInitUnicodeString(&name, wczKeyName);
- InitializeObjectAttributes(&object_attributes,
- &name,
- OBJ_CASE_INSENSITIVE | OBJ_OPENIF,
- NULL,
- NULL);
- status = NtCreateKey(&hKey,
- KEY_READ,
- &object_attributes,
- 0,
- NULL,
- REG_OPTION_BACKUP_RESTORE,
- NULL);
- if (!NT_SUCCESS(status))
- {
- WNTErrMsgA errmsg(status);
- oem_printf(stderr, "Error opening key '%1!ws!': %2%%n",
- wczKeyName, errmsg);
- continue;
- }
- RtlInitUnicodeString(&name, wczFileName);
- InitializeObjectAttributes(&object_attributes,
- &name,
- OBJ_CASE_INSENSITIVE | OBJ_OPENIF,
- NULL,
- NULL);
- status = NtCreateFile(&hFile,
- GENERIC_WRITE | SYNCHRONIZE,
- &object_attributes,
- &io_status,
- NULL,
- FILE_ATTRIBUTE_NORMAL,
- 0,
- FILE_SUPERSEDE,
- FILE_NON_DIRECTORY_FILE |
- FILE_SYNCHRONOUS_IO_NONALERT,
- NULL,
- 0);
- if (!NT_SUCCESS(status))
- {
- NtClose(hKey);
- WNTErrMsgA errmsg(status);
- oem_printf(stderr, "Error creating file '%1!ws!': %2%%n",
- wczFileName, errmsg);
- continue;
- }
- status = NtSaveKey(hKey, hFile);
- NtClose(hKey);
- NtClose(hFile);
- if (!NT_SUCCESS(status))
- {
- WNTErrMsgA errmsg(status);
- oem_printf(stderr, "Error creating snapshot for '%1!ws!': %2%%n",
- wczKeyName, errmsg);
- continue;
- }
- }
- RegCloseKey(hKeyHiveList);
- }
复制代码
[ 本帖最后由 yuanlixg 于 2008-12-5 20:39 编辑 ] |
|