ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/pbcdedit/pbcdedit
(Generate patch)

Comparing pbcdedit/pbcdedit (file contents):
Revision 1.68 by root, Sun Sep 1 15:57:48 2019 UTC vs.
Revision 1.76 by root, Tue Aug 9 11:44:54 2022 UTC

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
22use 5.016; # numerous features need 5.14, __SUB__ needs 5.16 22use 5.016; # numerous features need 5.14, __SUB__ needs 5.16
23 23
24our $VERSION = '1.4'; 24our $VERSION = '1.5';
25our $JSON_VERSION = 3; # the version of the json objects generated by this program 25our $JSON_VERSION = 3; # the version of the json objects generated by this program
26 26
27our $CHANGELOG = <<EOF; 27our $CHANGELOG = <<EOF;
28 28
291.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
321.4 Thu Aug 22 10:48:22 CEST 2019 361.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
332The C<meta> key is not stored in the BCD data store but is used only 336The C<meta> key is not stored in the BCD data store but is used only
333by PBCDEDIT. It is always generated when exporting, and importing will 337by PBCDEDIT. It is always generated when exporting, and importing will
334be refused when it exists and the version stored inside doesn't store 338be refused when it exists and the version stored inside doesn't match
335the JSON schema version of PBCDEDIT. This ensures that different and 339the JSON schema version of PBCDEDIT. This ensures that different and
336incompatible versions of PBCDEDIT will not read and misinterpret each 340incompatible versions of PBCDEDIT will not read and misinterpret each
337others data. 341others data.
338 342
339=head2 The object keys 343=head2 The object keys
348 352
349Some of these GUIDs are fixed well known GUIDs which PBCDEDIT will decode 353Some of these GUIDs are fixed well known GUIDs which PBCDEDIT will decode
350into human-readable strings such as C<{globalsettings}>, which is the same 354into human-readable strings such as C<{globalsettings}>, which is the same
351as C<{7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}>. 355as C<{7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}>.
352 356
353Each BCD, object has an associated type. For example, 357Each BCD object has an associated type. For example,
354C<application::osloader> for objects loading Windows via F<winload.exe>, 358C<application::osloader> for objects loading Windows via F<winload.exe>,
355C<application::bootsector> for real mode applications and so on. 359C<application::bootsector> for real mode applications and so on.
356 360
357The type of a object is stored in the pseudo BCD element C<type> (see next 361The type of a object is stored in the pseudo BCD element C<type> (see next
358section). 362section).
509 [{GUID}]type[<flags>][=arg,arg...] 513 [{GUID}]type[<flags>][=arg,arg...]
510 514
511Here are some examples: 515Here 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
710Probably not yet implemented. Tell me of your needs... 714Probably 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
716This concludes the syntax overview for device elements, but probably 722This concludes the syntax overview for device elements, but probably
717leaves many questions open. I can't help with most of them, as I also have 723leaves many questions open. I can't help with most of them, as I also have
718many questions, but I can walk you through some actual examples using more 724many questions, but I can walk you through some actual examples using more
719complex aspects. 725complex 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
723Just like with C declarations, you best treat device descriptors as 731Just like with C declarations, you best treat device descriptors as
724instructions to find your device and work your way from the inside out: 732instructions to find your device and work your way from the inside out:
796I don't know what the purpose of the C<< <1> >> flag value is, but it 804I don't know what the purpose of the C<< <1> >> flag value is, but it
797seems to be always there on this kind of entry. 805seems to be always there on this kind of entry.
798 806
799If you have some good examples to add here, feel free to mail me. 807If 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
804The C<edit> and C<parse> subcommands allow you to read a BCD data store 814The C<edit> and C<parse> subcommands allow you to read a BCD data store
805and modify it or extract data from it. This is done by executing a series 815and modify it or extract data from it. This is done by executing a series
824 834
825Example: change the bootmgr default too 835Example: change the bootmgr default too
826C<{b097d2ad-bc00-11e9-8a9a-525400123456}>: 836C<{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
842Similar 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
832This takes the next argument, interprets it as Perl code and 846This takes the next argument, interprets it as Perl code and
833evaluates it. This allows you to do more complicated modifications or 847evaluates it. This allows you to do more complicated modifications or
1874our @part_type = qw(gpt mbr raw); 1888our @part_type = qw(gpt mbr raw);
1875 1889
1876our $NULL_DEVICE = "\x00" x 16; 1890our $NULL_DEVICE = "\x00" x 16;
1877 1891
1878# biggest bitch to decode, ever 1892# biggest bitch to decode, ever
1879# this decoded a device portion after the GUID 1893# this decodes a device portion after the GUID
1880sub dec_device_($$); 1894sub dec_device_($$);
1881sub dec_device_($$) { 1895sub dec_device_($$) {
1882 my ($device, $type) = @_; 1896 my ($device, $type) = @_;
1883 1897
1884 my $res; 1898 my $res;
2468 2482
2469 $object = $object eq "{default}" ? $default : dec_wguid enc_wguid $object; 2483 $object = $object eq "{default}" ? $default : dec_wguid enc_wguid $object;
2470 2484
2471 $bcd->{$object}{$elem} = $value; 2485 $bcd->{$object}{$elem} = $value;
2472 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
2473 } elsif ($insn eq "eval") { 2495 } elsif ($insn eq "eval") {
2474 my $perl = shift @insns; 2496 my $perl = shift @insns;
2475 bcd_edit_eval "#line 1 'eval'\n$perl"; 2497 bcd_edit_eval "#line 1 'eval'\n$perl";
2476 2498
2477 } elsif ($insn eq "do") { 2499 } elsif ($insn eq "do") {
2478 my $path = shift @insns; 2500 my $path = shift @insns;
2479 my $file = file_load $path; 2501 my $file = file_load $path;
2480 bcd_edit_eval "#line 1 '$path'\n$file"; 2502 bcd_edit_eval "#line 1 '$path'\n$file";
2481 2503
2482 } else { 2504 } else {
2483 die "$insn: not a recognized instruction for edit/parse\n"; 2505 die "$insn: not a recognized instruction for create/edit/parse\n";
2484 } 2506 }
2485 } 2507 }
2486 2508
2487} 2509}
2488 2510
2551# command line parser 2573# command line parser
2552 2574
2553our %CMD = ( 2575our %CMD = (
2554 help => sub { 2576 help => sub {
2555 require Pod::Usage; 2577 require Pod::Usage;
2556 Pod::Usage::pod2usage (-verbose => 2); 2578 Pod::Usage::pod2usage (-verbose => 2, -quotes => "none", -noperldoc => 1);
2557 }, 2579 },
2558 2580
2559 objects => sub { 2581 objects => sub {
2560 my %rbcd_types = reverse %bcd_types; 2582 my %rbcd_types = reverse %bcd_types;
2561 $_ = sprintf "%08x", $_ for values %rbcd_types; 2583 $_ = sprintf "%08x", $_ for values %rbcd_types;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines