… | |
… | |
19 | # along with this program. If not, see <https://www.gnu.org/licenses/>. |
19 | # along with this program. If not, see <https://www.gnu.org/licenses/>. |
20 | # |
20 | # |
21 | |
21 | |
22 | use 5.016; # numerous features need 5.14, __SUB__ needs 5.16 |
22 | use 5.016; # numerous features need 5.14, __SUB__ needs 5.16 |
23 | |
23 | |
24 | our $VERSION = '1.4'; |
24 | our $VERSION = '1.5'; |
25 | our $JSON_VERSION = 3; # the version of the json objects generated by this program |
25 | our $JSON_VERSION = 3; # the version of the json objects generated by this program |
26 | |
26 | |
27 | our $CHANGELOG = <<EOF; |
27 | our $CHANGELOG = <<EOF; |
28 | |
28 | |
|
|
29 | 1.5 Mon Nov 25 15:54:34 CET 2019 |
|
|
30 | - add "del" edit instruction. |
29 | - work around lsblk bug sometimes giving dos pttype for gpt partitions. |
31 | - work around lsblk bug sometimes giving "dos" pttype for gpt partitions. |
30 | - bootmenupolicy in synopsis must be set to 0 for text menu. |
32 | - bootmenupolicy in synopsis must be set to 0 to get the text menu. |
|
|
33 | - minor doc fxes. |
|
|
34 | - disable use of perldoc for help, doesn't work well. |
31 | |
35 | |
32 | 1.4 Thu Aug 22 10:48:22 CEST 2019 |
36 | 1.4 Thu Aug 22 10:48:22 CEST 2019 |
33 | - new "create" subcommand. |
37 | - new "create" subcommand. |
34 | - "create" and "edit" try to save and restore ownership/permissions |
38 | - "create" and "edit" try to save and restore ownership/permissions |
35 | of bcd hives when writing the new file. |
39 | of bcd hives when writing the new file. |
… | |
… | |
329 | |
333 | |
330 | =head2 The C<meta> key |
334 | =head2 The C<meta> key |
331 | |
335 | |
332 | The C<meta> key is not stored in the BCD data store but is used only |
336 | The C<meta> key is not stored in the BCD data store but is used only |
333 | by PBCDEDIT. It is always generated when exporting, and importing will |
337 | by PBCDEDIT. It is always generated when exporting, and importing will |
334 | be refused when it exists and the version stored inside doesn't store |
338 | be refused when it exists and the version stored inside doesn't match |
335 | the JSON schema version of PBCDEDIT. This ensures that different and |
339 | the JSON schema version of PBCDEDIT. This ensures that different and |
336 | incompatible versions of PBCDEDIT will not read and misinterpret each |
340 | incompatible versions of PBCDEDIT will not read and misinterpret each |
337 | others data. |
341 | others data. |
338 | |
342 | |
339 | =head2 The object keys |
343 | =head2 The object keys |
… | |
… | |
348 | |
352 | |
349 | Some of these GUIDs are fixed well known GUIDs which PBCDEDIT will decode |
353 | Some of these GUIDs are fixed well known GUIDs which PBCDEDIT will decode |
350 | into human-readable strings such as C<{globalsettings}>, which is the same |
354 | into human-readable strings such as C<{globalsettings}>, which is the same |
351 | as C<{7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}>. |
355 | as C<{7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}>. |
352 | |
356 | |
353 | Each BCD, object has an associated type. For example, |
357 | Each BCD object has an associated type. For example, |
354 | C<application::osloader> for objects loading Windows via F<winload.exe>, |
358 | C<application::osloader> for objects loading Windows via F<winload.exe>, |
355 | C<application::bootsector> for real mode applications and so on. |
359 | C<application::bootsector> for real mode applications and so on. |
356 | |
360 | |
357 | The type of a object is stored in the pseudo BCD element C<type> (see next |
361 | The type of a object is stored in the pseudo BCD element C<type> (see next |
358 | section). |
362 | section). |
… | |
… | |
509 | [{GUID}]type[<flags>][=arg,arg...] |
513 | [{GUID}]type[<flags>][=arg,arg...] |
510 | |
514 | |
511 | Here are some examples: |
515 | Here are some examples: |
512 | |
516 | |
513 | boot |
517 | boot |
514 | {b097d29f-bc00-11e9-8a9a-525400123456}block=file,<boot>,\\EFI" |
518 | {b097d29f-bc00-11e9-8a9a-525400123456}block=file,<boot>,\EFI |
515 | locate=<null>,element,systemroot |
519 | locate=<null>,element,systemroot |
516 | partition=<null>,harddisk,mbr,47cbc08a,1048576 |
520 | partition=<null>,harddisk,mbr,47cbc08a,1048576 |
517 | partition=<null>,harddisk,gpt,9742e468-9206-48a0-b4e4-c4e9745a356a,76d39e5f-ad1b-407e-9c05-c81eb83b57dd |
521 | partition=<null>,harddisk,gpt,9742e468-9206-48a0-b4e4-c4e9745a356a,76d39e5f-ad1b-407e-9c05-c81eb83b57dd |
518 | block<1>=ramdisk,<partition=<null>,harddisk,mbr,47cbc08a,68720525312>,0,0,0,\Recovery\b097d29e-bc00-11e9-8a9a-525400123456\Winre.wim |
522 | block<1>=ramdisk,<partition=<null>,harddisk,mbr,47cbc08a,68720525312>,0,0,0,\Recovery\b097d29e-bc00-11e9-8a9a-525400123456\Winre.wim |
519 | block=file,<partition=<null>,harddisk,gpt,9742e468-9206-48a0-b4e4-c4e9745a356a,ee3a393a-f0de-4057-9946-88584245ed48>,\ |
523 | block=file,<partition=<null>,harddisk,gpt,9742e468-9206-48a0-b4e4-c4e9745a356a,ee3a393a-f0de-4057-9946-88584245ed48>,\ |
… | |
… | |
709 | |
713 | |
710 | Probably not yet implemented. Tell me of your needs... |
714 | Probably not yet implemented. Tell me of your needs... |
711 | |
715 | |
712 | =back |
716 | =back |
713 | |
717 | |
|
|
718 | =back |
|
|
719 | |
714 | =head4 Examples |
720 | =head4 Examples |
715 | |
721 | |
716 | This concludes the syntax overview for device elements, but probably |
722 | This concludes the syntax overview for device elements, but probably |
717 | leaves many questions open. I can't help with most of them, as I also have |
723 | leaves many questions open. I can't help with most of them, as I also have |
718 | many questions, but I can walk you through some actual examples using more |
724 | many questions, but I can walk you through some actual examples using more |
719 | complex aspects. |
725 | complex aspects. |
|
|
726 | |
|
|
727 | =over |
720 | |
728 | |
721 | =item C<< locate=<block=vhd,<block=file,<locate=<null>,path,\disk.vhdx>,\disk.vhdx>>,element,path >> |
729 | =item C<< locate=<block=vhd,<block=file,<locate=<null>,path,\disk.vhdx>,\disk.vhdx>>,element,path >> |
722 | |
730 | |
723 | Just like with C declarations, you best treat device descriptors as |
731 | Just like with C declarations, you best treat device descriptors as |
724 | instructions to find your device and work your way from the inside out: |
732 | instructions to find your device and work your way from the inside out: |
… | |
… | |
796 | I don't know what the purpose of the C<< <1> >> flag value is, but it |
804 | I don't know what the purpose of the C<< <1> >> flag value is, but it |
797 | seems to be always there on this kind of entry. |
805 | seems to be always there on this kind of entry. |
798 | |
806 | |
799 | If you have some good examples to add here, feel free to mail me. |
807 | If you have some good examples to add here, feel free to mail me. |
800 | |
808 | |
|
|
809 | =back |
|
|
810 | |
801 | |
811 | |
802 | =head1 EDITING BCD STORES |
812 | =head1 EDITING BCD STORES |
803 | |
813 | |
804 | The C<edit> and C<parse> subcommands allow you to read a BCD data store |
814 | The C<edit> and C<parse> subcommands allow you to read a BCD data store |
805 | and modify it or extract data from it. This is done by executing a series |
815 | and modify it or extract data from it. This is done by executing a series |
… | |
… | |
824 | |
834 | |
825 | Example: change the bootmgr default too |
835 | Example: change the bootmgr default too |
826 | C<{b097d2ad-bc00-11e9-8a9a-525400123456}>: |
836 | C<{b097d2ad-bc00-11e9-8a9a-525400123456}>: |
827 | |
837 | |
828 | pbcdedit edit BCD set "{bootmgr}" default "{b097d2ad-bc00-11e9-8a9a-525400123456}" |
838 | pbcdedit edit BCD set "{bootmgr}" default "{b097d2ad-bc00-11e9-8a9a-525400123456}" |
|
|
839 | |
|
|
840 | =item C<del> I<object> I<element> |
|
|
841 | |
|
|
842 | Similar to C<get>, but removed the BCD element from the specified BCD object. |
829 | |
843 | |
830 | =item C<eval> I<perlcode> |
844 | =item C<eval> I<perlcode> |
831 | |
845 | |
832 | This takes the next argument, interprets it as Perl code and |
846 | This takes the next argument, interprets it as Perl code and |
833 | evaluates it. This allows you to do more complicated modifications or |
847 | evaluates it. This allows you to do more complicated modifications or |
… | |
… | |
1169 | my ($rname, $root) = $decode_key->($rootcell); |
1183 | my ($rname, $root) = $decode_key->($rootcell); |
1170 | |
1184 | |
1171 | [$rname, $root] |
1185 | [$rname, $root] |
1172 | } |
1186 | } |
1173 | |
1187 | |
1174 | # return a binary windows fILETIME struct |
1188 | # return a binary windows FILETIME struct |
1175 | sub filetime_now { |
1189 | sub filetime_now { |
1176 | my ($s, $ms) = Time::HiRes::gettimeofday; |
1190 | my ($s, $ms) = Time::HiRes::gettimeofday; |
1177 | |
1191 | |
1178 | pack "Q<", $s = ($s * 1_000_000 + $ms) * 10 + 116_444_736_000_000_000 |
1192 | pack "Q<", ($s * 1_000_000 + $ms) * 10 |
|
|
1193 | + 116_444_736_000_000_000 # 1970-01-01 00:00:00 |
1179 | } |
1194 | } |
1180 | |
1195 | |
1181 | # encode a registry hive |
1196 | # encode a registry hive |
1182 | sub regf_encode($) { |
1197 | sub regf_encode($) { |
1183 | my ($hive) = @_; |
1198 | my ($hive) = @_; |
… | |
… | |
1186 | |
1201 | |
1187 | # the filetime is apparently used to verify log file validity, |
1202 | # the filetime is apparently used to verify log file validity, |
1188 | # so by generating a new timestamp the log files *should* automatically |
1203 | # so by generating a new timestamp the log files *should* automatically |
1189 | # become invalidated and windows would "self-heal" them. |
1204 | # become invalidated and windows would "self-heal" them. |
1190 | # (update: has been verified by reverse engineering) |
1205 | # (update: has been verified by reverse engineering) |
1191 | # possibly the fact that the two sequence numbes match might also |
1206 | # possibly the fact that the two sequence numbers match might also |
1192 | # make windows think that the hive is not dirty and ignore logs. |
1207 | # make windows think that the hive is not dirty and ignore logs. |
1193 | # (update: has been verified by reverse engineering) |
1208 | # (update: has been verified by reverse engineering) |
1194 | |
1209 | |
1195 | my $now = filetime_now; |
1210 | my $now = filetime_now; |
1196 | |
1211 | |
… | |
… | |
1351 | } |
1366 | } |
1352 | |
1367 | |
1353 | ############################################################################# |
1368 | ############################################################################# |
1354 | # bcd stuff |
1369 | # bcd stuff |
1355 | |
1370 | |
1356 | # human-readable alises for GUID object identifiers |
1371 | # human-readable aliases for GUID object identifiers |
1357 | our %bcd_objects = ( |
1372 | our %bcd_objects = ( |
1358 | '{0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}' => '{emssettings}', |
1373 | '{0ce4991b-e6b3-4b16-b23c-5e0d9250e5d9}' => '{emssettings}', |
1359 | '{1afa9c49-16ab-4a5c-4a90-212802da9460}' => '{resumeloadersettings}', |
1374 | '{1afa9c49-16ab-4a5c-4a90-212802da9460}' => '{resumeloadersettings}', |
1360 | '{1cae1eb7-a0df-4d4d-9851-4860e34ef535}' => '{default}', |
1375 | '{1cae1eb7-a0df-4d4d-9851-4860e34ef535}' => '{default}', |
1361 | '{313e8eed-7098-4586-a9bf-309c61f8d449}' => '{kerneldbgsettings}', |
1376 | '{313e8eed-7098-4586-a9bf-309c61f8d449}' => '{kerneldbgsettings}', |
… | |
… | |
1491 | BCDE_FORMAT_STRING , sub { shift }, |
1506 | BCDE_FORMAT_STRING , sub { shift }, |
1492 | BCDE_FORMAT_GUID , sub { dec_wguid enc_wguid shift }, |
1507 | BCDE_FORMAT_GUID , sub { dec_wguid enc_wguid shift }, |
1493 | BCDE_FORMAT_GUID_LIST , sub { join " ", map dec_wguid enc_wguid $_, @{+shift} }, |
1508 | BCDE_FORMAT_GUID_LIST , sub { join " ", map dec_wguid enc_wguid $_, @{+shift} }, |
1494 | BCDE_FORMAT_INTEGER , sub { unpack "Q", pack "a8", pack "H*", shift }, # integer might be 4 or 8 bytes - caused by ms coding bugs |
1509 | BCDE_FORMAT_INTEGER , sub { unpack "Q", pack "a8", pack "H*", shift }, # integer might be 4 or 8 bytes - caused by ms coding bugs |
1495 | BCDE_FORMAT_BOOLEAN , sub { shift eq "00" ? 0 : 1 }, |
1510 | BCDE_FORMAT_BOOLEAN , sub { shift eq "00" ? 0 : 1 }, |
1496 | BCDE_FORMAT_INTEGER_LIST, sub { join " ", unpack "Q*", pack "H*", shift }, # not sure if this cna be 4 bytes |
1511 | BCDE_FORMAT_INTEGER_LIST, sub { join " ", unpack "Q*", pack "H*", shift }, # not sure if this can be 4 bytes |
1497 | ); |
1512 | ); |
1498 | |
1513 | |
1499 | our %bcde_enc = ( |
1514 | our %bcde_enc = ( |
1500 | BCDE_FORMAT_DEVICE , sub { binary => enc_device $_[0], $_[1] }, |
1515 | BCDE_FORMAT_DEVICE , sub { binary => enc_device $_[0], $_[1] }, |
1501 | BCDE_FORMAT_STRING , sub { sz => shift }, |
1516 | BCDE_FORMAT_STRING , sub { sz => shift }, |
… | |
… | |
1507 | ); |
1522 | ); |
1508 | |
1523 | |
1509 | # BCD Elements |
1524 | # BCD Elements |
1510 | our %bcde_byclass = ( |
1525 | our %bcde_byclass = ( |
1511 | any => { |
1526 | any => { |
1512 | 0x11000001 => 'device', |
1527 | 0x11000001 => 'device', |
1513 | 0x12000002 => 'path', |
1528 | 0x12000002 => 'path', |
1514 | 0x12000004 => 'description', |
1529 | 0x12000004 => 'description', |
1515 | 0x12000005 => 'locale', |
1530 | 0x12000005 => 'locale', |
1516 | 0x14000006 => 'inherit', |
1531 | 0x14000006 => 'inherit', |
1517 | 0x15000007 => 'truncatememory', |
1532 | 0x15000007 => 'truncatememory', |
1518 | 0x14000008 => 'recoverysequence', |
1533 | 0x14000008 => 'recoverysequence', |
1519 | 0x16000009 => 'recoveryenabled', |
1534 | 0x16000009 => 'recoveryenabled', |
1520 | 0x1700000a => 'badmemorylist', |
1535 | 0x1700000a => 'badmemorylist', |
1521 | 0x1600000b => 'badmemoryaccess', |
1536 | 0x1600000b => 'badmemoryaccess', |
1522 | 0x1500000c => 'firstmegabytepolicy', |
1537 | 0x1500000c => 'firstmegabytepolicy', |
1523 | 0x1500000d => 'relocatephysical', |
1538 | 0x1500000d => 'relocatephysical', |
1524 | 0x1500000e => 'avoidlowmemory', |
1539 | 0x1500000e => 'avoidlowmemory', |
1525 | 0x1600000f => 'traditionalkseg', |
1540 | 0x1600000f => 'traditionalkseg', |
1526 | 0x16000010 => 'bootdebug', |
1541 | 0x16000010 => 'bootdebug', |
1527 | 0x15000011 => 'debugtype', |
1542 | 0x15000011 => 'debugtype', |
1528 | 0x15000012 => 'debugaddress', |
1543 | 0x15000012 => 'debugaddress', |
1529 | 0x15000013 => 'debugport', |
1544 | 0x15000013 => 'debugport', |
1530 | 0x15000014 => 'baudrate', |
1545 | 0x15000014 => 'baudrate', |
1531 | 0x15000015 => 'channel', |
1546 | 0x15000015 => 'channel', |
1532 | 0x12000016 => 'targetname', |
1547 | 0x12000016 => 'targetname', |
1533 | 0x16000017 => 'noumex', |
1548 | 0x16000017 => 'noumex', |
1534 | 0x15000018 => 'debugstart', |
1549 | 0x15000018 => 'debugstart', |
1535 | 0x12000019 => 'busparams', |
1550 | 0x12000019 => 'busparams', |
1536 | 0x1500001a => 'hostip', |
1551 | 0x1500001a => 'hostip', |
1537 | 0x1500001b => 'port', |
1552 | 0x1500001b => 'port', |
1538 | 0x1600001c => 'dhcp', |
1553 | 0x1600001c => 'dhcp', |
1539 | 0x1200001d => 'key', |
1554 | 0x1200001d => 'key', |
1540 | 0x1600001e => 'vm', |
1555 | 0x1600001e => 'vm', |
1541 | 0x16000020 => 'bootems', |
1556 | 0x16000020 => 'bootems', |
1542 | 0x15000022 => 'emsport', |
1557 | 0x15000022 => 'emsport', |
1543 | 0x15000023 => 'emsbaudrate', |
1558 | 0x15000023 => 'emsbaudrate', |
1544 | 0x12000030 => 'loadoptions', |
1559 | 0x12000030 => 'loadoptions', |
1545 | 0x16000040 => 'advancedoptions', |
1560 | 0x16000040 => 'advancedoptions', |
1546 | 0x16000041 => 'optionsedit', |
1561 | 0x16000041 => 'optionsedit', |
1547 | 0x15000042 => 'keyringaddress', |
1562 | 0x15000042 => 'keyringaddress', |
1548 | 0x11000043 => 'bootstatdevice', |
1563 | 0x11000043 => 'bootstatdevice', |
1549 | 0x12000044 => 'bootstatfilepath', |
1564 | 0x12000044 => 'bootstatfilepath', |
1550 | 0x16000045 => 'preservebootstat', |
1565 | 0x16000045 => 'preservebootstat', |
1551 | 0x16000046 => 'graphicsmodedisabled', |
1566 | 0x16000046 => 'graphicsmodedisabled', |
1552 | 0x15000047 => 'configaccesspolicy', |
1567 | 0x15000047 => 'configaccesspolicy', |
1553 | 0x16000048 => 'nointegritychecks', |
1568 | 0x16000048 => 'nointegritychecks', |
1554 | 0x16000049 => 'testsigning', |
1569 | 0x16000049 => 'testsigning', |
1555 | 0x1200004a => 'fontpath', |
1570 | 0x1200004a => 'fontpath', |
1556 | 0x1500004b => 'integrityservices', |
1571 | 0x1500004b => 'integrityservices', |
1557 | 0x1500004c => 'volumebandid', |
1572 | 0x1500004c => 'volumebandid', |
1558 | 0x16000050 => 'extendedinput', |
1573 | 0x16000050 => 'extendedinput', |
1559 | 0x15000051 => 'initialconsoleinput', |
1574 | 0x15000051 => 'initialconsoleinput', |
1560 | 0x15000052 => 'graphicsresolution', |
1575 | 0x15000052 => 'graphicsresolution', |
1561 | 0x16000053 => 'restartonfailure', |
1576 | 0x16000053 => 'restartonfailure', |
1562 | 0x16000054 => 'highestmode', |
1577 | 0x16000054 => 'highestmode', |
1563 | 0x16000060 => 'isolatedcontext', |
1578 | 0x16000060 => 'isolatedcontext', |
1564 | 0x15000065 => 'displaymessage', |
1579 | 0x15000065 => 'displaymessage', |
1565 | 0x15000066 => 'displaymessageoverride', |
1580 | 0x15000066 => 'displaymessageoverride', |
1566 | 0x16000068 => 'nobootuxtext', |
1581 | 0x16000068 => 'nobootuxtext', |
1567 | 0x16000069 => 'nobootuxprogress', |
1582 | 0x16000069 => 'nobootuxprogress', |
1568 | 0x1600006a => 'nobootuxfade', |
1583 | 0x1600006a => 'nobootuxfade', |
1569 | 0x1600006b => 'bootuxreservepooldebug', |
1584 | 0x1600006b => 'bootuxreservepooldebug', |
1570 | 0x1600006c => 'bootuxdisabled', |
1585 | 0x1600006c => 'bootuxdisabled', |
1571 | 0x1500006d => 'bootuxfadeframes', |
1586 | 0x1500006d => 'bootuxfadeframes', |
1572 | 0x1600006e => 'bootuxdumpstats', |
1587 | 0x1600006e => 'bootuxdumpstats', |
1573 | 0x1600006f => 'bootuxshowstats', |
1588 | 0x1600006f => 'bootuxshowstats', |
1574 | 0x16000071 => 'multibootsystem', |
1589 | 0x16000071 => 'multibootsystem', |
1575 | 0x16000072 => 'nokeyboard', |
1590 | 0x16000072 => 'nokeyboard', |
1576 | 0x15000073 => 'aliaswindowskey', |
1591 | 0x15000073 => 'aliaswindowskey', |
1577 | 0x16000074 => 'bootshutdowndisabled', |
1592 | 0x16000074 => 'bootshutdowndisabled', |
1578 | 0x15000075 => 'performancefrequency', |
1593 | 0x15000075 => 'performancefrequency', |
1579 | 0x15000076 => 'securebootrawpolicy', |
1594 | 0x15000076 => 'securebootrawpolicy', |
1580 | 0x17000077 => 'allowedinmemorysettings', |
1595 | 0x17000077 => 'allowedinmemorysettings', |
1581 | 0x15000079 => 'bootuxtransitiontime', |
1596 | 0x15000079 => 'bootuxtransitiontime', |
1582 | 0x1600007a => 'mobilegraphics', |
1597 | 0x1600007a => 'mobilegraphics', |
1583 | 0x1600007b => 'forcefipscrypto', |
1598 | 0x1600007b => 'forcefipscrypto', |
1584 | 0x1500007d => 'booterrorux', |
1599 | 0x1500007d => 'booterrorux', |
1585 | 0x1600007e => 'flightsigning', |
1600 | 0x1600007e => 'flightsigning', |
1586 | 0x1500007f => 'measuredbootlogformat', |
1601 | 0x1500007f => 'measuredbootlogformat', |
1587 | 0x15000080 => 'displayrotation', |
1602 | 0x15000080 => 'displayrotation', |
1588 | 0x15000081 => 'logcontrol', |
1603 | 0x15000081 => 'logcontrol', |
1589 | 0x16000082 => 'nofirmwaresync', |
1604 | 0x16000082 => 'nofirmwaresync', |
1590 | 0x11000084 => 'windowssyspart', |
1605 | 0x11000084 => 'windowssyspart', |
1591 | 0x16000087 => 'numlock', |
1606 | 0x16000087 => 'numlock', |
1592 | 0x26000202 => 'skipffumode', |
1607 | 0x26000202 => 'skipffumode', |
1593 | 0x26000203 => 'forceffumode', |
1608 | 0x26000203 => 'forceffumode', |
1594 | 0x25000510 => 'chargethreshold', |
1609 | 0x25000510 => 'chargethreshold', |
1595 | 0x26000512 => 'offmodecharging', |
1610 | 0x26000512 => 'offmodecharging', |
1596 | 0x25000aaa => 'bootflow', |
1611 | 0x25000aaa => 'bootflow', |
1597 | 0x45000001 => 'devicetype', |
1612 | 0x45000001 => 'devicetype', |
1598 | 0x42000002 => 'applicationrelativepath', |
1613 | 0x42000002 => 'applicationrelativepath', |
1599 | 0x42000003 => 'ramdiskdevicerelativepath', |
1614 | 0x42000003 => 'ramdiskdevicerelativepath', |
1600 | 0x46000004 => 'omitosloaderelements', |
1615 | 0x46000004 => 'omitosloaderelements', |
1601 | 0x47000006 => 'elementstomigrate', |
1616 | 0x47000006 => 'elementstomigrate', |
1602 | 0x46000010 => 'recoveryos', |
1617 | 0x46000010 => 'recoveryos', |
1603 | }, |
1618 | }, |
1604 | bootapp => { |
1619 | bootapp => { |
1605 | 0x26000145 => 'enablebootdebugpolicy', |
1620 | 0x26000145 => 'enablebootdebugpolicy', |
1606 | 0x26000146 => 'enablebootorderclean', |
1621 | 0x26000146 => 'enablebootorderclean', |
1607 | 0x26000147 => 'enabledeviceid', |
1622 | 0x26000147 => 'enabledeviceid', |
1608 | 0x26000148 => 'enableffuloader', |
1623 | 0x26000148 => 'enableffuloader', |
1609 | 0x26000149 => 'enableiuloader', |
1624 | 0x26000149 => 'enableiuloader', |
1610 | 0x2600014a => 'enablemassstorage', |
1625 | 0x2600014a => 'enablemassstorage', |
1611 | 0x2600014b => 'enablerpmbprovisioning', |
1626 | 0x2600014b => 'enablerpmbprovisioning', |
1612 | 0x2600014c => 'enablesecurebootpolicy', |
1627 | 0x2600014c => 'enablesecurebootpolicy', |
1613 | 0x2600014d => 'enablestartcharge', |
1628 | 0x2600014d => 'enablestartcharge', |
1614 | 0x2600014e => 'enableresettpm', |
1629 | 0x2600014e => 'enableresettpm', |
1615 | }, |
1630 | }, |
1616 | bootmgr => { |
1631 | bootmgr => { |
1617 | 0x24000001 => 'displayorder', |
1632 | 0x24000001 => 'displayorder', |
1618 | 0x24000002 => 'bootsequence', |
1633 | 0x24000002 => 'bootsequence', |
1619 | 0x23000003 => 'default', |
1634 | 0x23000003 => 'default', |
1620 | 0x25000004 => 'timeout', |
1635 | 0x25000004 => 'timeout', |
1621 | 0x26000005 => 'resume', |
1636 | 0x26000005 => 'resume', |
1622 | 0x23000006 => 'resumeobject', |
1637 | 0x23000006 => 'resumeobject', |
1623 | 0x24000007 => 'startupsequence', |
1638 | 0x24000007 => 'startupsequence', |
1624 | 0x24000010 => 'toolsdisplayorder', |
1639 | 0x24000010 => 'toolsdisplayorder', |
1625 | 0x26000020 => 'displaybootmenu', |
1640 | 0x26000020 => 'displaybootmenu', |
1626 | 0x26000021 => 'noerrordisplay', |
1641 | 0x26000021 => 'noerrordisplay', |
1627 | 0x21000022 => 'bcddevice', |
1642 | 0x21000022 => 'bcddevice', |
1628 | 0x22000023 => 'bcdfilepath', |
1643 | 0x22000023 => 'bcdfilepath', |
1629 | 0x26000024 => 'hormenabled', |
1644 | 0x26000024 => 'hormenabled', |
1630 | 0x26000025 => 'hiberboot', |
1645 | 0x26000025 => 'hiberboot', |
1631 | 0x22000026 => 'passwordoverride', |
1646 | 0x22000026 => 'passwordoverride', |
1632 | 0x22000027 => 'pinpassphraseoverride', |
1647 | 0x22000027 => 'pinpassphraseoverride', |
1633 | 0x26000028 => 'processcustomactionsfirst', |
1648 | 0x26000028 => 'processcustomactionsfirst', |
1634 | 0x27000030 => 'customactions', |
1649 | 0x27000030 => 'customactions', |
1635 | 0x26000031 => 'persistbootsequence', |
1650 | 0x26000031 => 'persistbootsequence', |
1636 | 0x26000032 => 'skipstartupsequence', |
1651 | 0x26000032 => 'skipstartupsequence', |
1637 | 0x22000040 => 'fverecoveryurl', |
1652 | 0x22000040 => 'fverecoveryurl', |
1638 | 0x22000041 => 'fverecoverymessage', |
1653 | 0x22000041 => 'fverecoverymessage', |
1639 | }, |
1654 | }, |
1640 | device => { |
1655 | device => { |
1641 | 0x35000001 => 'ramdiskimageoffset', |
1656 | 0x35000001 => 'ramdiskimageoffset', |
1642 | 0x35000002 => 'ramdisktftpclientport', |
1657 | 0x35000002 => 'ramdisktftpclientport', |
1643 | 0x31000003 => 'ramdisksdidevice', |
1658 | 0x31000003 => 'ramdisksdidevice', |
1644 | 0x32000004 => 'ramdisksdipath', |
1659 | 0x32000004 => 'ramdisksdipath', |
1645 | 0x35000005 => 'ramdiskimagelength', |
1660 | 0x35000005 => 'ramdiskimagelength', |
1646 | 0x36000006 => 'exportascd', |
1661 | 0x36000006 => 'exportascd', |
1647 | 0x35000007 => 'ramdisktftpblocksize', |
1662 | 0x35000007 => 'ramdisktftpblocksize', |
1648 | 0x35000008 => 'ramdisktftpwindowsize', |
1663 | 0x35000008 => 'ramdisktftpwindowsize', |
1649 | 0x36000009 => 'ramdiskmcenabled', |
1664 | 0x36000009 => 'ramdiskmcenabled', |
1650 | 0x3600000a => 'ramdiskmctftpfallback', |
1665 | 0x3600000a => 'ramdiskmctftpfallback', |
1651 | 0x3600000b => 'ramdisktftpvarwindow', |
1666 | 0x3600000b => 'ramdisktftpvarwindow', |
1652 | }, |
1667 | }, |
1653 | memdiag => { |
1668 | memdiag => { |
1654 | 0x25000001 => 'passcount', |
1669 | 0x25000001 => 'passcount', |
1655 | 0x25000002 => 'testmix', |
1670 | 0x25000002 => 'testmix', |
1656 | 0x25000003 => 'failurecount', |
1671 | 0x25000003 => 'failurecount', |
1657 | 0x26000003 => 'cacheenable', |
1672 | 0x26000003 => 'cacheenable', |
1658 | 0x25000004 => 'testtofail', |
1673 | 0x25000004 => 'testtofail', |
1659 | 0x26000004 => 'failuresenabled', |
1674 | 0x26000004 => 'failuresenabled', |
1660 | 0x25000005 => 'stridefailcount', |
1675 | 0x25000005 => 'stridefailcount', |
1661 | 0x26000005 => 'cacheenable', |
1676 | 0x26000005 => 'cacheenable', |
1662 | 0x25000006 => 'invcfailcount', |
1677 | 0x25000006 => 'invcfailcount', |
1663 | 0x25000007 => 'matsfailcount', |
1678 | 0x25000007 => 'matsfailcount', |
1664 | 0x25000008 => 'randfailcount', |
1679 | 0x25000008 => 'randfailcount', |
1665 | 0x25000009 => 'chckrfailcount', |
1680 | 0x25000009 => 'chckrfailcount', |
1666 | }, |
1681 | }, |
1667 | ntldr => { |
1682 | ntldr => { |
1668 | 0x22000001 => 'bpbstring', |
1683 | 0x22000001 => 'bpbstring', |
1669 | }, |
1684 | }, |
1670 | osloader => { |
1685 | osloader => { |
1671 | 0x21000001 => 'osdevice', |
1686 | 0x21000001 => 'osdevice', |
1672 | 0x22000002 => 'systemroot', |
1687 | 0x22000002 => 'systemroot', |
1673 | 0x23000003 => 'resumeobject', |
1688 | 0x23000003 => 'resumeobject', |
1674 | 0x26000004 => 'stampdisks', |
1689 | 0x26000004 => 'stampdisks', |
1675 | 0x26000010 => 'detecthal', |
1690 | 0x26000010 => 'detecthal', |
1676 | 0x22000011 => 'kernel', |
1691 | 0x22000011 => 'kernel', |
1677 | 0x22000012 => 'hal', |
1692 | 0x22000012 => 'hal', |
1678 | 0x22000013 => 'dbgtransport', |
1693 | 0x22000013 => 'dbgtransport', |
1679 | 0x25000020 => 'nx', |
1694 | 0x25000020 => 'nx', |
1680 | 0x25000021 => 'pae', |
1695 | 0x25000021 => 'pae', |
1681 | 0x26000022 => 'winpe', |
1696 | 0x26000022 => 'winpe', |
1682 | 0x26000024 => 'nocrashautoreboot', |
1697 | 0x26000024 => 'nocrashautoreboot', |
1683 | 0x26000025 => 'lastknowngood', |
1698 | 0x26000025 => 'lastknowngood', |
1684 | 0x26000026 => 'oslnointegritychecks', |
1699 | 0x26000026 => 'oslnointegritychecks', |
1685 | 0x26000027 => 'osltestsigning', |
1700 | 0x26000027 => 'osltestsigning', |
1686 | 0x26000030 => 'nolowmem', |
1701 | 0x26000030 => 'nolowmem', |
1687 | 0x25000031 => 'removememory', |
1702 | 0x25000031 => 'removememory', |
1688 | 0x25000032 => 'increaseuserva', |
1703 | 0x25000032 => 'increaseuserva', |
1689 | 0x25000033 => 'perfmem', |
1704 | 0x25000033 => 'perfmem', |
1690 | 0x26000040 => 'vga', |
1705 | 0x26000040 => 'vga', |
1691 | 0x26000041 => 'quietboot', |
1706 | 0x26000041 => 'quietboot', |
1692 | 0x26000042 => 'novesa', |
1707 | 0x26000042 => 'novesa', |
1693 | 0x26000043 => 'novga', |
1708 | 0x26000043 => 'novga', |
1694 | 0x25000050 => 'clustermodeaddressing', |
1709 | 0x25000050 => 'clustermodeaddressing', |
1695 | 0x26000051 => 'usephysicaldestination', |
1710 | 0x26000051 => 'usephysicaldestination', |
1696 | 0x25000052 => 'restrictapiccluster', |
1711 | 0x25000052 => 'restrictapiccluster', |
1697 | 0x22000053 => 'evstore', |
1712 | 0x22000053 => 'evstore', |
1698 | 0x26000054 => 'uselegacyapicmode', |
1713 | 0x26000054 => 'uselegacyapicmode', |
1699 | 0x26000060 => 'onecpu', |
1714 | 0x26000060 => 'onecpu', |
1700 | 0x25000061 => 'numproc', |
1715 | 0x25000061 => 'numproc', |
1701 | 0x26000062 => 'maxproc', |
1716 | 0x26000062 => 'maxproc', |
1702 | 0x25000063 => 'configflags', |
1717 | 0x25000063 => 'configflags', |
1703 | 0x26000064 => 'maxgroup', |
1718 | 0x26000064 => 'maxgroup', |
1704 | 0x26000065 => 'groupaware', |
1719 | 0x26000065 => 'groupaware', |
1705 | 0x25000066 => 'groupsize', |
1720 | 0x25000066 => 'groupsize', |
1706 | 0x26000070 => 'usefirmwarepcisettings', |
1721 | 0x26000070 => 'usefirmwarepcisettings', |
1707 | 0x25000071 => 'msi', |
1722 | 0x25000071 => 'msi', |
1708 | 0x25000072 => 'pciexpress', |
1723 | 0x25000072 => 'pciexpress', |
1709 | 0x25000080 => 'safeboot', |
1724 | 0x25000080 => 'safeboot', |
1710 | 0x26000081 => 'safebootalternateshell', |
1725 | 0x26000081 => 'safebootalternateshell', |
1711 | 0x26000090 => 'bootlog', |
1726 | 0x26000090 => 'bootlog', |
1712 | 0x26000091 => 'sos', |
1727 | 0x26000091 => 'sos', |
1713 | 0x260000a0 => 'debug', |
1728 | 0x260000a0 => 'debug', |
1714 | 0x260000a1 => 'halbreakpoint', |
1729 | 0x260000a1 => 'halbreakpoint', |
1715 | 0x260000a2 => 'useplatformclock', |
1730 | 0x260000a2 => 'useplatformclock', |
1716 | 0x260000a3 => 'forcelegacyplatform', |
1731 | 0x260000a3 => 'forcelegacyplatform', |
1717 | 0x260000a4 => 'useplatformtick', |
1732 | 0x260000a4 => 'useplatformtick', |
1718 | 0x260000a5 => 'disabledynamictick', |
1733 | 0x260000a5 => 'disabledynamictick', |
1719 | 0x250000a6 => 'tscsyncpolicy', |
1734 | 0x250000a6 => 'tscsyncpolicy', |
1720 | 0x260000b0 => 'ems', |
1735 | 0x260000b0 => 'ems', |
1721 | 0x250000c0 => 'forcefailure', |
1736 | 0x250000c0 => 'forcefailure', |
1722 | 0x250000c1 => 'driverloadfailurepolicy', |
1737 | 0x250000c1 => 'driverloadfailurepolicy', |
1723 | 0x250000c2 => 'bootmenupolicy', |
1738 | 0x250000c2 => 'bootmenupolicy', |
1724 | 0x260000c3 => 'onetimeadvancedoptions', |
1739 | 0x260000c3 => 'onetimeadvancedoptions', |
1725 | 0x260000c4 => 'onetimeoptionsedit', |
1740 | 0x260000c4 => 'onetimeoptionsedit', |
1726 | 0x250000e0 => 'bootstatuspolicy', |
1741 | 0x250000e0 => 'bootstatuspolicy', |
1727 | 0x260000e1 => 'disableelamdrivers', |
1742 | 0x260000e1 => 'disableelamdrivers', |
1728 | 0x250000f0 => 'hypervisorlaunchtype', |
1743 | 0x250000f0 => 'hypervisorlaunchtype', |
1729 | 0x220000f1 => 'hypervisorpath', |
1744 | 0x220000f1 => 'hypervisorpath', |
1730 | 0x260000f2 => 'hypervisordebug', |
1745 | 0x260000f2 => 'hypervisordebug', |
1731 | 0x250000f3 => 'hypervisordebugtype', |
1746 | 0x250000f3 => 'hypervisordebugtype', |
1732 | 0x250000f4 => 'hypervisordebugport', |
1747 | 0x250000f4 => 'hypervisordebugport', |
1733 | 0x250000f5 => 'hypervisorbaudrate', |
1748 | 0x250000f5 => 'hypervisorbaudrate', |
1734 | 0x250000f6 => 'hypervisorchannel', |
1749 | 0x250000f6 => 'hypervisorchannel', |
1735 | 0x250000f7 => 'bootux', |
1750 | 0x250000f7 => 'bootux', |
1736 | 0x260000f8 => 'hypervisordisableslat', |
1751 | 0x260000f8 => 'hypervisordisableslat', |
1737 | 0x220000f9 => 'hypervisorbusparams', |
1752 | 0x220000f9 => 'hypervisorbusparams', |
1738 | 0x250000fa => 'hypervisornumproc', |
1753 | 0x250000fa => 'hypervisornumproc', |
1739 | 0x250000fb => 'hypervisorrootprocpernode', |
1754 | 0x250000fb => 'hypervisorrootprocpernode', |
1740 | 0x260000fc => 'hypervisoruselargevtlb', |
1755 | 0x260000fc => 'hypervisoruselargevtlb', |
1741 | 0x250000fd => 'hypervisorhostip', |
1756 | 0x250000fd => 'hypervisorhostip', |
1742 | 0x250000fe => 'hypervisorhostport', |
1757 | 0x250000fe => 'hypervisorhostport', |
1743 | 0x250000ff => 'hypervisordebugpages', |
1758 | 0x250000ff => 'hypervisordebugpages', |
1744 | 0x25000100 => 'tpmbootentropy', |
1759 | 0x25000100 => 'tpmbootentropy', |
1745 | 0x22000110 => 'hypervisorusekey', |
1760 | 0x22000110 => 'hypervisorusekey', |
1746 | 0x22000112 => 'hypervisorproductskutype', |
1761 | 0x22000112 => 'hypervisorproductskutype', |
1747 | 0x25000113 => 'hypervisorrootproc', |
1762 | 0x25000113 => 'hypervisorrootproc', |
1748 | 0x26000114 => 'hypervisordhcp', |
1763 | 0x26000114 => 'hypervisordhcp', |
1749 | 0x25000115 => 'hypervisoriommupolicy', |
1764 | 0x25000115 => 'hypervisoriommupolicy', |
1750 | 0x26000116 => 'hypervisorusevapic', |
1765 | 0x26000116 => 'hypervisorusevapic', |
1751 | 0x22000117 => 'hypervisorloadoptions', |
1766 | 0x22000117 => 'hypervisorloadoptions', |
1752 | 0x25000118 => 'hypervisormsrfilterpolicy', |
1767 | 0x25000118 => 'hypervisormsrfilterpolicy', |
1753 | 0x25000119 => 'hypervisormmionxpolicy', |
1768 | 0x25000119 => 'hypervisormmionxpolicy', |
1754 | 0x2500011a => 'hypervisorschedulertype', |
1769 | 0x2500011a => 'hypervisorschedulertype', |
1755 | 0x25000120 => 'xsavepolicy', |
1770 | 0x25000120 => 'xsavepolicy', |
1756 | 0x25000121 => 'xsaveaddfeature0', |
1771 | 0x25000121 => 'xsaveaddfeature0', |
1757 | 0x25000122 => 'xsaveaddfeature1', |
1772 | 0x25000122 => 'xsaveaddfeature1', |
1758 | 0x25000123 => 'xsaveaddfeature2', |
1773 | 0x25000123 => 'xsaveaddfeature2', |
1759 | 0x25000124 => 'xsaveaddfeature3', |
1774 | 0x25000124 => 'xsaveaddfeature3', |
1760 | 0x25000125 => 'xsaveaddfeature4', |
1775 | 0x25000125 => 'xsaveaddfeature4', |
1761 | 0x25000126 => 'xsaveaddfeature5', |
1776 | 0x25000126 => 'xsaveaddfeature5', |
1762 | 0x25000127 => 'xsaveaddfeature6', |
1777 | 0x25000127 => 'xsaveaddfeature6', |
1763 | 0x25000128 => 'xsaveaddfeature7', |
1778 | 0x25000128 => 'xsaveaddfeature7', |
1764 | 0x25000129 => 'xsaveremovefeature', |
1779 | 0x25000129 => 'xsaveremovefeature', |
1765 | 0x2500012a => 'xsaveprocessorsmask', |
1780 | 0x2500012a => 'xsaveprocessorsmask', |
1766 | 0x2500012b => 'xsavedisable', |
1781 | 0x2500012b => 'xsavedisable', |
1767 | 0x2500012c => 'kerneldebugtype', |
1782 | 0x2500012c => 'kerneldebugtype', |
1768 | 0x2200012d => 'kernelbusparams', |
1783 | 0x2200012d => 'kernelbusparams', |
1769 | 0x2500012e => 'kerneldebugaddress', |
1784 | 0x2500012e => 'kerneldebugaddress', |
1770 | 0x2500012f => 'kerneldebugport', |
1785 | 0x2500012f => 'kerneldebugport', |
1771 | 0x25000130 => 'claimedtpmcounter', |
1786 | 0x25000130 => 'claimedtpmcounter', |
1772 | 0x25000131 => 'kernelchannel', |
1787 | 0x25000131 => 'kernelchannel', |
1773 | 0x22000132 => 'kerneltargetname', |
1788 | 0x22000132 => 'kerneltargetname', |
1774 | 0x25000133 => 'kernelhostip', |
1789 | 0x25000133 => 'kernelhostip', |
1775 | 0x25000134 => 'kernelport', |
1790 | 0x25000134 => 'kernelport', |
1776 | 0x26000135 => 'kerneldhcp', |
1791 | 0x26000135 => 'kerneldhcp', |
1777 | 0x22000136 => 'kernelkey', |
1792 | 0x22000136 => 'kernelkey', |
1778 | 0x22000137 => 'imchivename', |
1793 | 0x22000137 => 'imchivename', |
1779 | 0x21000138 => 'imcdevice', |
1794 | 0x21000138 => 'imcdevice', |
1780 | 0x25000139 => 'kernelbaudrate', |
1795 | 0x25000139 => 'kernelbaudrate', |
1781 | 0x22000140 => 'mfgmode', |
1796 | 0x22000140 => 'mfgmode', |
1782 | 0x26000141 => 'event', |
1797 | 0x26000141 => 'event', |
1783 | 0x25000142 => 'vsmlaunchtype', |
1798 | 0x25000142 => 'vsmlaunchtype', |
1784 | 0x25000144 => 'hypervisorenforcedcodeintegrity', |
1799 | 0x25000144 => 'hypervisorenforcedcodeintegrity', |
1785 | 0x21000150 => 'systemdatadevice', |
1800 | 0x21000150 => 'systemdatadevice', |
1786 | 0x21000151 => 'osarcdevice', |
1801 | 0x21000151 => 'osarcdevice', |
1787 | 0x21000153 => 'osdatadevice', |
1802 | 0x21000153 => 'osdatadevice', |
1788 | 0x21000154 => 'bspdevice', |
1803 | 0x21000154 => 'bspdevice', |
1789 | 0x21000155 => 'bspfilepath', |
1804 | 0x21000155 => 'bspfilepath', |
1790 | }, |
1805 | }, |
1791 | resume => { |
1806 | resume => { |
1792 | 0x21000001 => 'filedevice', |
1807 | 0x21000001 => 'filedevice', |
1793 | 0x22000002 => 'filepath', |
1808 | 0x22000002 => 'filepath', |
1794 | 0x26000003 => 'customsettings', |
1809 | 0x26000003 => 'customsettings', |
1795 | 0x26000004 => 'pae', |
1810 | 0x26000004 => 'pae', |
1796 | 0x21000005 => 'associatedosdevice', |
1811 | 0x21000005 => 'associatedosdevice', |
1797 | 0x26000006 => 'debugoptionenabled', |
1812 | 0x26000006 => 'debugoptionenabled', |
1798 | 0x25000007 => 'bootux', |
1813 | 0x25000007 => 'bootux', |
1799 | 0x25000008 => 'bootmenupolicy', |
1814 | 0x25000008 => 'bootmenupolicy', |
1800 | 0x26000024 => 'hormenabled', |
1815 | 0x26000024 => 'hormenabled', |
1801 | }, |
1816 | }, |
1802 | startup => { |
1817 | startup => { |
1803 | 0x26000001 => 'pxesoftreboot', |
1818 | 0x26000001 => 'pxesoftreboot', |
1804 | 0x22000002 => 'applicationname', |
1819 | 0x22000002 => 'applicationname', |
1805 | }, |
1820 | }, |
1806 | ); |
1821 | ); |
1807 | |
1822 | |
1808 | # mask, value => class |
1823 | # mask, value => class |
1809 | our @bcde_typeclass = ( |
1824 | our @bcde_typeclass = ( |
… | |
… | |
1873 | our @part_type = qw(gpt mbr raw); |
1888 | our @part_type = qw(gpt mbr raw); |
1874 | |
1889 | |
1875 | our $NULL_DEVICE = "\x00" x 16; |
1890 | our $NULL_DEVICE = "\x00" x 16; |
1876 | |
1891 | |
1877 | # biggest bitch to decode, ever |
1892 | # biggest bitch to decode, ever |
1878 | # this decoded a device portion after the GUID |
1893 | # this decodes a device portion after the GUID |
1879 | sub dec_device_($$); |
1894 | sub dec_device_($$); |
1880 | sub dec_device_($$) { |
1895 | sub dec_device_($$) { |
1881 | my ($device, $type) = @_; |
1896 | my ($device, $type) = @_; |
1882 | |
1897 | |
1883 | my $res; |
1898 | my $res; |
… | |
… | |
2467 | |
2482 | |
2468 | $object = $object eq "{default}" ? $default : dec_wguid enc_wguid $object; |
2483 | $object = $object eq "{default}" ? $default : dec_wguid enc_wguid $object; |
2469 | |
2484 | |
2470 | $bcd->{$object}{$elem} = $value; |
2485 | $bcd->{$object}{$elem} = $value; |
2471 | |
2486 | |
|
|
2487 | } elsif ($insn eq "del") { |
|
|
2488 | my $object = shift @insns; |
|
|
2489 | my $elem = shift @insns; |
|
|
2490 | |
|
|
2491 | $object = $object eq "{default}" ? $default : dec_wguid enc_wguid $object; |
|
|
2492 | |
|
|
2493 | delete $bcd->{$object}{$elem}; |
|
|
2494 | |
2472 | } elsif ($insn eq "eval") { |
2495 | } elsif ($insn eq "eval") { |
2473 | my $perl = shift @insns; |
2496 | my $perl = shift @insns; |
2474 | bcd_edit_eval "#line 1 'eval'\n$perl"; |
2497 | bcd_edit_eval "#line 1 'eval'\n$perl"; |
2475 | |
2498 | |
2476 | } elsif ($insn eq "do") { |
2499 | } elsif ($insn eq "do") { |
2477 | my $path = shift @insns; |
2500 | my $path = shift @insns; |
2478 | my $file = file_load $path; |
2501 | my $file = file_load $path; |
2479 | bcd_edit_eval "#line 1 '$path'\n$file"; |
2502 | bcd_edit_eval "#line 1 '$path'\n$file"; |
2480 | |
2503 | |
2481 | } else { |
2504 | } else { |
2482 | die "$insn: not a recognized instruction for edit/parse\n"; |
2505 | die "$insn: not a recognized instruction for create/edit/parse\n"; |
2483 | } |
2506 | } |
2484 | } |
2507 | } |
2485 | |
2508 | |
2486 | } |
2509 | } |
2487 | |
2510 | |
… | |
… | |
2550 | # command line parser |
2573 | # command line parser |
2551 | |
2574 | |
2552 | our %CMD = ( |
2575 | our %CMD = ( |
2553 | help => sub { |
2576 | help => sub { |
2554 | require Pod::Usage; |
2577 | require Pod::Usage; |
2555 | Pod::Usage::pod2usage (-verbose => 2); |
2578 | Pod::Usage::pod2usage (-verbose => 2, -quotes => "none", -noperldoc => 1); |
2556 | }, |
2579 | }, |
2557 | |
2580 | |
2558 | objects => sub { |
2581 | objects => sub { |
2559 | my %rbcd_types = reverse %bcd_types; |
2582 | my %rbcd_types = reverse %bcd_types; |
2560 | $_ = sprintf "%08x", $_ for values %rbcd_types; |
2583 | $_ = sprintf "%08x", $_ for values %rbcd_types; |