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.

137 lines
4.1 KiB

  1. ######################################################################
  2. # Routines used for converting dirid/path combinations to a
  3. # regular form.
  4. #
  5. package CanonDir;
  6. use Logmsg;
  7. require Exporter;
  8. @ISA = qw(Exporter);
  9. @EXPORT = qw(addPrefix removePrefix);
  10. @EXPORT_OK = qw(%scanids %updids %revids %misses);
  11. local %scanids;
  12. local %updids;
  13. local %revids;
  14. local %misses;
  15. sub reverseHash {
  16. my (%old) = @_;
  17. my %new;
  18. foreach my $key (keys %old) {
  19. $new{$old{$key}} = $key;
  20. }
  21. return %new;
  22. }
  23. sub setup {
  24. my ($archd, $arch) = @_;
  25. %scanids = ( # List of dirid definitions from infscan.lst.
  26. 10 => "",
  27. 23 => "system32\\spool\\drivers\\color",
  28. 25 => "",
  29. 30 => "..",
  30. 50 => "system",
  31. 53 => "..\\documents and settings\\default user",
  32. 54 => "..",
  33. 16419 => "..\\documents and settings\\all users\\application data",
  34. 16422 => "..\\program files",
  35. 16425 => "syswow64",
  36. 16426 => "..\\program files (x86)",
  37. 16427 => "..\\program files\\common files",
  38. 16428 => "..\\program files (x86)\\common files",
  39. 16437 => "..\\documents and settings\\all users\\documents\\my music",
  40. 16438 => "..\\documents and settings\\all users\\documents\\my pictures",
  41. 32768 => "system32\\inetsrv",
  42. 32770 => "..\\inetpub\\wwwroot",
  43. 32771 => "..\\inetpub\\iissamples",
  44. 32773 => "..\\inetpub",
  45. 40002 => "..\\program files\\common files\\microsoft shared\\web server extensions",
  46. 40003 => "..\\program files\\microsoft frontpage",
  47. 49005 => "msagent",
  48. 49500 => "..\\program files\\msn\\msncorefiles",
  49. # 49600 =>
  50. 65618 => "..\\program files",
  51. 65619 => "system32\\dllcache",
  52. 65620 => "..\\program files\\common files",
  53. 65690 => "system32\\spool\\drivers\\$archd",
  54. 66000 => "system32\\spool\\drivers\\$archd\\3",
  55. 66002 => "system32",
  56. 66003 => "system32\\spool\\drivers\\color",
  57. 66004 => "web\\printers"
  58. # 123174 =>
  59. # 123175 =>
  60. );
  61. %updids = ( # List of dirid definitions from inf template.
  62. -1 => "!",
  63. 10 => "",
  64. 11 => "system32",
  65. 12 => "system32\\drivers",
  66. 17 => "inf",
  67. 20 => "fonts",
  68. 54 => "..",
  69. 16408 => "..\\all users\\start menu\programs\startup",
  70. 16425 => "syswow64",
  71. 16426 => "..\\program files (x86)",
  72. 16428 => "..\\program files (x86)\\common files",
  73. 65535 => "\\", # Used for special sections.
  74. 65618 => "..\\program files",
  75. 65619 => "system32\\dllcache",
  76. 65620 => "..\\program files\\common files",
  77. 65690 => "system32\\spool\\drivers\\$archd",
  78. # Destination determined at run time (hotfix.inf).
  79. 65601 => "!65601",
  80. 65602 => "!65602",
  81. 65603 => "!65603",
  82. 65604 => "!65604",
  83. 65605 => "!65605",
  84. 65606 => "!65606",
  85. 65607 => "!65607",
  86. 65609 => "!65609",
  87. 65615 => "!65615",
  88. 65622 => "!65622",
  89. 65623 => "driver cache\\$arch",
  90. 65624 => "!65624",
  91. 65625 => "!65625",
  92. 65626 => "!65626",
  93. 65628 => "!65628"
  94. );
  95. %revids = reverseHash(%updids); # Reverse lookup for %updids.
  96. }
  97. # Interpret the dirid and generate a full path.
  98. sub addPrefix {
  99. my ($dirid, $path, %prefixes) = @_;
  100. if ( !exists $prefixes{$dirid} ) {
  101. if ( !exists $misses{$dirid} ) {
  102. $misses{$dirid} = 1;
  103. } else {
  104. $misses{$dirid}++;
  105. }
  106. return "!$dirid\\$path";
  107. }
  108. my $dir = $prefixes{$dirid};
  109. $dir = "$dir\\" if $path ne "" and $dir ne "";
  110. return "$dir$path";
  111. }
  112. # Change a full path to a dirid with a relative path.
  113. sub removePrefix {
  114. my ($path, %prefixes) = @_;
  115. my $dir = $path;
  116. my $fname = "";
  117. while ( !exists $prefixes{$dir} ) {
  118. $dir =~ /((.*)\\)?([^\\]*)/;
  119. $fname = "\\$fname" if $fname ne "";
  120. $fname = "$3$fname";
  121. $dir = $2;
  122. }
  123. return ($prefixes{$dir}, $fname);
  124. }
  125. 1;