… | |
… | |
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. |
31 | - minor doc fxes. |
33 | - minor doc fxes. |
|
|
34 | - disable use of perldoc for help, doesn't work well. |
32 | |
35 | |
33 | 1.4 Thu Aug 22 10:48:22 CEST 2019 |
36 | 1.4 Thu Aug 22 10:48:22 CEST 2019 |
34 | - new "create" subcommand. |
37 | - new "create" subcommand. |
35 | - "create" and "edit" try to save and restore ownership/permissions |
38 | - "create" and "edit" try to save and restore ownership/permissions |
36 | of bcd hives when writing the new file. |
39 | of bcd hives when writing the new file. |
… | |
… | |
330 | |
333 | |
331 | =head2 The C<meta> key |
334 | =head2 The C<meta> key |
332 | |
335 | |
333 | 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 |
334 | by PBCDEDIT. It is always generated when exporting, and importing will |
337 | by PBCDEDIT. It is always generated when exporting, and importing will |
335 | 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 |
336 | the JSON schema version of PBCDEDIT. This ensures that different and |
339 | the JSON schema version of PBCDEDIT. This ensures that different and |
337 | incompatible versions of PBCDEDIT will not read and misinterpret each |
340 | incompatible versions of PBCDEDIT will not read and misinterpret each |
338 | others data. |
341 | others data. |
339 | |
342 | |
340 | =head2 The object keys |
343 | =head2 The object keys |
… | |
… | |
349 | |
352 | |
350 | 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 |
351 | 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 |
352 | as C<{7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}>. |
355 | as C<{7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}>. |
353 | |
356 | |
354 | Each BCD, object has an associated type. For example, |
357 | Each BCD object has an associated type. For example, |
355 | C<application::osloader> for objects loading Windows via F<winload.exe>, |
358 | C<application::osloader> for objects loading Windows via F<winload.exe>, |
356 | C<application::bootsector> for real mode applications and so on. |
359 | C<application::bootsector> for real mode applications and so on. |
357 | |
360 | |
358 | 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 |
359 | section). |
362 | section). |
… | |
… | |
710 | |
713 | |
711 | Probably not yet implemented. Tell me of your needs... |
714 | Probably not yet implemented. Tell me of your needs... |
712 | |
715 | |
713 | =back |
716 | =back |
714 | |
717 | |
|
|
718 | =back |
|
|
719 | |
715 | =head4 Examples |
720 | =head4 Examples |
716 | |
721 | |
717 | This concludes the syntax overview for device elements, but probably |
722 | This concludes the syntax overview for device elements, but probably |
718 | 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 |
719 | 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 |
720 | complex aspects. |
725 | complex aspects. |
|
|
726 | |
|
|
727 | =over |
721 | |
728 | |
722 | =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 >> |
723 | |
730 | |
724 | Just like with C declarations, you best treat device descriptors as |
731 | Just like with C declarations, you best treat device descriptors as |
725 | 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: |
… | |
… | |
797 | 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 |
798 | seems to be always there on this kind of entry. |
805 | seems to be always there on this kind of entry. |
799 | |
806 | |
800 | 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. |
801 | |
808 | |
|
|
809 | =back |
|
|
810 | |
802 | |
811 | |
803 | =head1 EDITING BCD STORES |
812 | =head1 EDITING BCD STORES |
804 | |
813 | |
805 | 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 |
806 | 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 |
… | |
… | |
825 | |
834 | |
826 | Example: change the bootmgr default too |
835 | Example: change the bootmgr default too |
827 | C<{b097d2ad-bc00-11e9-8a9a-525400123456}>: |
836 | C<{b097d2ad-bc00-11e9-8a9a-525400123456}>: |
828 | |
837 | |
829 | 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. |
830 | |
843 | |
831 | =item C<eval> I<perlcode> |
844 | =item C<eval> I<perlcode> |
832 | |
845 | |
833 | This takes the next argument, interprets it as Perl code and |
846 | This takes the next argument, interprets it as Perl code and |
834 | evaluates it. This allows you to do more complicated modifications or |
847 | evaluates it. This allows you to do more complicated modifications or |
… | |
… | |
2469 | |
2482 | |
2470 | $object = $object eq "{default}" ? $default : dec_wguid enc_wguid $object; |
2483 | $object = $object eq "{default}" ? $default : dec_wguid enc_wguid $object; |
2471 | |
2484 | |
2472 | $bcd->{$object}{$elem} = $value; |
2485 | $bcd->{$object}{$elem} = $value; |
2473 | |
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 | |
2474 | } elsif ($insn eq "eval") { |
2495 | } elsif ($insn eq "eval") { |
2475 | my $perl = shift @insns; |
2496 | my $perl = shift @insns; |
2476 | bcd_edit_eval "#line 1 'eval'\n$perl"; |
2497 | bcd_edit_eval "#line 1 'eval'\n$perl"; |
2477 | |
2498 | |
2478 | } elsif ($insn eq "do") { |
2499 | } elsif ($insn eq "do") { |
2479 | my $path = shift @insns; |
2500 | my $path = shift @insns; |
2480 | my $file = file_load $path; |
2501 | my $file = file_load $path; |
2481 | bcd_edit_eval "#line 1 '$path'\n$file"; |
2502 | bcd_edit_eval "#line 1 '$path'\n$file"; |
2482 | |
2503 | |
2483 | } else { |
2504 | } else { |
2484 | die "$insn: not a recognized instruction for edit/parse\n"; |
2505 | die "$insn: not a recognized instruction for create/edit/parse\n"; |
2485 | } |
2506 | } |
2486 | } |
2507 | } |
2487 | |
2508 | |
2488 | } |
2509 | } |
2489 | |
2510 | |
… | |
… | |
2552 | # command line parser |
2573 | # command line parser |
2553 | |
2574 | |
2554 | our %CMD = ( |
2575 | our %CMD = ( |
2555 | help => sub { |
2576 | help => sub { |
2556 | require Pod::Usage; |
2577 | require Pod::Usage; |
2557 | Pod::Usage::pod2usage (-verbose => 2); |
2578 | Pod::Usage::pod2usage (-verbose => 2, -quotes => "none", -noperldoc => 1); |
2558 | }, |
2579 | }, |
2559 | |
2580 | |
2560 | objects => sub { |
2581 | objects => sub { |
2561 | my %rbcd_types = reverse %bcd_types; |
2582 | my %rbcd_types = reverse %bcd_types; |
2562 | $_ = sprintf "%08x", $_ for values %rbcd_types; |
2583 | $_ = sprintf "%08x", $_ for values %rbcd_types; |