00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#include <nt.h>
00029
#include <ntrtl.h>
00030
#include <nturtl.h>
00031
00032
#include "cmp.h"
00033
#include <stdio.h>
00034
#include <stdlib.h>
00035
#include <string.h>
00036
00037 #define WORK_SIZE 1024
00038
00039
void __cdecl
main(
int,
char *[]);
00040
void processargs();
00041
00042 UNICODE_STRING
KeyPath;
00043 WCHAR
KeyPathBuffer[
WORK_SIZE];
00044
00045 UNICODE_STRING
FileName;
00046 WCHAR
FileNameBuffer[
WORK_SIZE];
00047
00048
void
00049 __cdecl
main(
00050
int argc,
00051
char *argv[]
00052 )
00053 {
00054
NTSTATUS status;
00055 OBJECT_ATTRIBUTES
ObjectAttributes;
00056 IO_STATUS_BLOCK IoStatus;
00057 HANDLE FileHandle;
00058 HANDLE KeyHandle;
00059 BOOLEAN WasEnabled;
00060
00061
00062
00063
00064
00065
KeyPath.MaximumLength =
WORK_SIZE;
00066
KeyPath.Length = 0
L;
00067
KeyPath.Buffer = &(
KeyPathBuffer[0]);
00068
00069
FileName.MaximumLength =
WORK_SIZE;
00070
FileName.Length = 0
L;
00071
FileName.Buffer = &(
FileNameBuffer[0]);
00072
00073
processargs(argc, argv);
00074
00075
00076
00077
00078
00079
00080 printf(
"rtsave: starting\n");
00081 printf(
"rtsave: saving hive rooted at\n\t'%ws'\nto file\n\t'%ws'\n",
00082
KeyPath.Buffer,
FileName.Buffer);
00083
00084 InitializeObjectAttributes(
00085 &
ObjectAttributes,
00086 &
FileName,
00087 0,
00088 (HANDLE)
NULL,
00089
NULL
00090 );
00091
ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE;
00092
00093
00094 status =
NtCreateFile(
00095 &FileHandle,
00096 GENERIC_WRITE | SYNCHRONIZE,
00097 &
ObjectAttributes,
00098 &IoStatus,
00099
NULL,
00100 FILE_ATTRIBUTE_NORMAL,
00101 FILE_SHARE_READ,
00102 FILE_CREATE,
00103 FILE_SYNCHRONOUS_IO_NONALERT,
00104
NULL,
00105 0
00106 );
00107
00108
if (!
NT_SUCCESS(status)) {
00109
if (status == STATUS_OBJECT_NAME_COLLISION) {
00110 printf(
"rtsave: file '%ws' already exists!\n",
00111
FileName.Buffer);
00112
exit(1);
00113 }
00114 printf(
"rtsave: file open failed status = %08lx\n", status);
00115
exit(1);
00116 }
00117
00118 InitializeObjectAttributes(
00119 &
ObjectAttributes,
00120 &
KeyPath,
00121 0,
00122 (HANDLE)
NULL,
00123
NULL
00124 );
00125
ObjectAttributes.Attributes |= OBJ_CASE_INSENSITIVE;
00126
00127 status =
NtOpenKey(
00128 &KeyHandle,
00129 MAXIMUM_ALLOWED,
00130 &
ObjectAttributes
00131 );
00132
if (!
NT_SUCCESS(status)) {
00133 printf(
"rtsave: key open failed status = %08lx\n", status);
00134
exit(1);
00135 }
00136
00137
RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE,
TRUE,
FALSE, &WasEnabled);
00138
00139 status =
NtSaveKey(KeyHandle, FileHandle);
00140
00141
RtlAdjustPrivilege(SE_BACKUP_PRIVILEGE, WasEnabled,
FALSE, &WasEnabled);
00142
00143
if (!
NT_SUCCESS(status)) {
00144 printf(
"rtsave: NtSaveKey failed status = %08lx\n", status);
00145
exit(1);
00146 }
00147
00148 printf(
"rtsave: success\n");
00149
exit(0);
00150 }
00151
00152
void
00153 processargs(
00154
int argc,
00155
char *argv[]
00156 )
00157 {
00158 ANSI_STRING temp;
00159 UNICODE_STRING DosFileName;
00160
00161
if ( (argc != 3) )
00162 {
00163 printf(
"Usage: %s <KeyName> <FileName>\nWhere <FileName> does NOT already exist\n",
00164 argv[0]);
00165 printf(
"Example: %s \\registry\\machine\\security d:\\backups\\security\n",
00166 argv[0]);
00167
exit(1);
00168 }
00169
00170
RtlInitAnsiString(
00171 &temp,
00172 argv[1]
00173 );
00174
00175
RtlAnsiStringToUnicodeString(
00176 &
KeyPath,
00177 &temp,
00178
TRUE
00179 );
00180
00181
RtlInitAnsiString(
00182 &temp,
00183 argv[2]
00184 );
00185
00186
RtlAnsiStringToUnicodeString(
00187 &DosFileName,
00188 &temp,
00189
TRUE
00190 );
00191
00192
RtlDosPathNameToNtPathName_U( DosFileName.Buffer,
00193 &
FileName,
00194
NULL,
00195
NULL );
00196
00197
return;
00198 }