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.
 
 
 
 
 
 

103 lines
2.6 KiB

use Win32::Registry;
my ($type, $value, $uc, $urt);
my $version = "";
my $ms = "";
###
### It appears that if you install recent URT builds and then uninstall,
### the entire .NETFramework key gets blown away. Thus, we'll create it if
### so necessary.
###
if (!$::HKEY_LOCAL_MACHINE->Open('SOFTWARE\Microsoft\.NETFramework', $urt)) {
###
### This cannot fail (right?).
###
if (!$::HKEY_LOCAL_MACHINE->Open('SOFTWARE\Microsoft', $ms)) {
die "Couldn't open HKLM\Software\Microsoft key: $!\n";
}
$ms->Create('.NETFramework', $value);
$::HKEY_LOCAL_MACHINE->Open('SOFTWARE\Microsoft\.NETFramework', $urt);
}
if ($urt->Open('policy\v1.0', $policy)) {
###
### This machine has some version of the URT installed.
###
$policy->GetValues(\%values);
foreach (sort(keys(%values))) {
if (/^\d+$/) {
$version = $_;
if ($_ == $ARGV[1]) {
last;
}
}
}
###
### If no "backup" of this key exists, make one.
###
if (!$::HKEY_LOCAL_MACHINE->Open('SOFTWARE\Microsoft\.NETFramework.BAK', $uc)) {
$::HKEY_LOCAL_MACHINE->Open('SOFTWARE\Microsoft', $ms) unless ($ms);
$ms->Create('.NETFramework.BAK', $target);
&BackupKey($urt, $target);
}
if ($urt->QueryValueEx("InstallRoot", $type, $value)) {
if ($value eq $ARGV[0]) {
if ($version != $ARGV[1]) {
###
### The InstallRoot matches ours but the version is different, nuke the
### GAC of things we might have stored there.
system("$ENV{'URTINSTALL'}\\gacclean.cmd");
exit(0);
}
#
# InstallRoot matches as does version - we're done.
#
exit(2);
} else {
if ($version == $ARGV[1]) {
#
# InstallRoot differs, but version matches - assume all is well for now.
#
exit (2);
}
}
}
}
# No record of install or the install path and version doesn't match.
exit(0);
###
### Makes a deep copy of a particular reg key.
###
sub BackupKey($$)
{
my $srckey = shift;
my $targetkey = shift;
my ($subskey, $subtkey, @keys, %values);
$srckey->GetKeys(\@keys);
foreach (@keys) {
$srckey->Open($_, $subskey);
$targetkey->Create($_, $subtkey);
BackupKey($subskey, $subtkey);
}
$srckey->GetValues(\%values);
foreach (keys(%values)) {
$targetkey->SetValueEx($_, 0, $values{$_}->[1], $values{$_}->[2]);
}
}
__END__