Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

233 lines
7.4 KiB

@rem = '
@goto endofperl
';
$USAGE = "
Usage: $0 USN_dump_file
This script scans a usn dump file produced by
\\\\sudarc-dev\\tools\\usnread d:
and reformats it to a single line per entry, pitching some of
the less interesting fields.
Parameters are set via environment vars.
USN_FID File ID of the form xxxxxxxxxxxxxxxx (no leading zeros)
USN_PFID Parent File ID of the form xxxxxxxxxxxxxxxx (no leading zeros)
USN_FNAME Filename
USN_DATE All records for a given day e.g. May 1,2000
USN_START Only records between the given start and end USNs are processed (default is all)
USN_END
USN_REASON All records with any selected flag set. (default CLOSE)
USN_REASON_OR Set to 1 if USN_REASON filter is an OR condtion. (default is AND condition)
A null env var means the log is not filtered on that parameter.
Each env var can have multiple values separated by a comma. These params
are used as search patterns and the , is replaced by a |
Watch out for left over trailing commas. They will foul up the search.
USN_REASON_DATA_OVERWRITE (0x00000001)
USN_REASON_DATA_EXTEND (0x00000002)
USN_REASON_DATA_TRUNCATION (0x00000004)
USN_REASON_NAMED_DATA_OVERWRITE (0x00000010)
USN_REASON_NAMED_DATA_EXTEND (0x00000020)
USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
USN_REASON_FILE_CREATE (0x00000100)
USN_REASON_FILE_DELETE (0x00000200)
USN_REASON_EA_CHANGE (0x00000400)
USN_REASON_SECURITY_CHANGE (0x00000800)
USN_REASON_RENAME_OLD_NAME (0x00001000)
USN_REASON_RENAME_NEW_NAME (0x00002000)
USN_REASON_INDEXABLE_CHANGE (0x00004000)
USN_REASON_BASIC_INFO_CHANGE (0x00008000)
USN_REASON_HARD_LINK_CHANGE (0x00010000)
USN_REASON_COMPRESSION_CHANGE (0x00020000)
USN_REASON_ENCRYPTION_CHANGE (0x00040000)
USN_REASON_OBJECT_ID_CHANGE (0x00080000)
USN_REASON_REPARSE_POINT_CHANGE (0x00100000)
USN_REASON_STREAM_CHANGE (0x00200000)
USN_REASON_CLOSE (0x80000000)
USN_SOURCE_DATA_MANAGEMENT (0x00000001)
USN_SOURCE_AUXILIARY_DATA (0x00000002)
USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004)
FILE_ATTRIBUTE_READONLY 0x00000001
FILE_ATTRIBUTE_HIDDEN 0x00000002
FILE_ATTRIBUTE_SYSTEM 0x00000004
OLD DOS VOLID 0x00000008
FILE_ATTRIBUTE_DIRECTORY 0x00000010
FILE_ATTRIBUTE_ARCHIVE 0x00000020
FILE_ATTRIBUTE_DEVICE 0x00000040
FILE_ATTRIBUTE_NORMAL 0x00000080
FILE_ATTRIBUTE_TEMPORARY 0x00000100
FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
FILE_ATTRIBUTE_COMPRESSED 0x00000800
FILE_ATTRIBUTE_OFFLINE 0x00001000
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
FILE_ATTRIBUTE_ENCRYPTED 0x00004000
";
die $USAGE unless @ARGV;
$InFile = "";
$iusn_start = 0;
$iusn_end = 0xFFFFFFFF;
$ireason = 0x80000000;
$fid = $ENV{'USN_FID'}; printf("USN_FID: %s\n", $fid);
$pfid = $ENV{'USN_PFID'}; printf("USN_PFID: %s\n", $pfid);
$fname = $ENV{'USN_FNAME'}; printf("USN_FNAME: %s\n", $fname);
$date = $ENV{'USN_DATE'}; printf("USN_DATE: %s\n", $date);
$usn_start = $ENV{'USN_START'}; printf("USN_START: %s\n", $usn_start);
$usn_end = $ENV{'USN_END'}; printf("USN_END: %s\n", $usn_end);
$reason = $ENV{'USN_REASON'}; printf("USN_REASON: %s\n", $reason);
$reason_or = $ENV{'USN_REASON_OR'}; printf("USN_REASON_OR: %s\n", $reason_or);
#
# replace commas with | for pattern matching.
#
if ($fname ne "") { $fname = "($fname)"; $fname =~ s/,/\|/g; }
if ($fid ne "") { $fid = "($fid)"; $fid =~ s/,/\|/g; }
if ($pfid ne "") { $pfid = "($pfid)"; $pfid =~ s/,/\|/g; }
if ($date ne "") { $date = "($date)"; $date =~ s/,/\|/g; }
if ($usn_start ne "") { $iusn_start = hex($usn_start); }
if ($usn_end ne "") { $iusn_end = hex($usn_end); }
if ($reason ne "") { $ireason = hex($reason); }
printf("\n\n");
print $0 @argv;
printf("fname: %s\n", $fname) if ($fname ne "");
printf("fid: %s\n", $fid) if ($fid ne "");
printf("pfid: %s\n", $pfid) if ($pfid ne "");
printf("date: %s\n", $date) if ($date ne "");
printf("usn_start: 0x%08x\n", $iusn_start) if ($usn_start ne "");
printf("usn_end: 0x%08x\n", $iusn_end) if ($usn_end ne "");
printf("usn_reason: 0x%08x\n", $ireason) if ($ireason != 0);
printf("usn_reason_or: %s\n", $reason_or) if ($reason_or ne "");
printf("\n\n\n");
printf(" Usn Event Time File ID Parent File ID Usn Reason SrcInfo Attrib Filename\n\n");
$recstart = 0;
$recprint = 0;
if (($usn_start ne "") || ($usn_end ne "")) {$usn_check = 1};
while (<>) {
if ($InFile ne $ARGV) {
$InFile = $ARGV;
#printf("- - - - - %s - - - - -\n\n", $InFile);
}
chop;
($field, $value) = split(/:/, $_);
if (m/timestamp:/) {
# get the whole value.
$value = $_;
$value =~ s/timestamp: //i;
}
#
# Get field values.
#
if ((m/fileref:/) || (m/parentref:/) ||
(m/usn:/) || (m/timestamp:/) ||
(m/reason:/) || (m/SourceInfo:/) ||
(m/attributes:/) || (m/filename:/) ) {
$rec{$field} = $value;
} else {
next;
}
if (m/usn:/ || m/reason:/) {
$value =~ s/h//g;
$value =~ s/ //g;
$value = hex($value);
$rec{$field} = $value;
}
#
# check this entry against filter.
#
if ((($fname ne "") && (m/filename: $fname/o)) ||
(($fid ne "") && (m/fileref: $fid/io)) ||
(($pfid ne "") && (m/parentref: $pfid/io)) ||
(($ireason != 0 ) && (m/reason: /o) && ($reason_or ne "")
&& (($value & $ireason) != 0)) ||
(($date ne "") && (m/timestamp: .*$date/io))) {
$recprint = 1;
}
if (m/filename: /) {
#
# End of entry. Dump it out if filter matched
# if reason_or is not set then reason match is an AND condtion.
# So only print if a selected reason mask bit is set.
# Only print if in selected USN range.
#
if (($ireason != 0) && ($reason_or eq "") && (($rec{" reason"} & $ireason) == 0)) {
$recprint = 0;
}
$usn = $rec{" usn"};
if (($usn_check == 1) && (($usn < $iusn_start) || ($usn > $iusn_end))) {
$recprint = 0;
}
if ($recprint == 1) {
printf("%08x %s %18s %18s %08x %4s %9s %s\n",
$usn, $rec{" timestamp"}, $rec{" fileref"},
$rec{" parentref"}, $rec{" reason"}, $rec{" SourceInfo"},
$rec{" attributes"}, $rec{" filename"});
}
$recprint = 0;
}
}
__END__
:endofperl
@perl %0.cmd %*
@goto :QUIT
RECORD: 2
reclen: 98h
Major ver: 2
Minor ver: 0
fileref: BFEA0000000001B0h
parentref: 1000000000025h
usn: 1BD00098h
timestamp: Mon May 1, 2000 06:03:42
reason: 102h
SourceInfo: 0h
security-id: 11Ah
attributes: 22h
filename length: 56h
filename offset: 3Ch
filename: NTFRS_G_39b9bb65-952f-4a72-997c6672bc460073
---------------------------------------
@:QUIT