![]() |
Delphi XE's DCP format: Auslesen einiger Basisinformationen
Hi,
Da ich kürzlich für ein internes Projekt ein bisschen in die DCPs von Delphi XE gucken musste(und ich die Frage schon Öfter bei Google, ohne Antwort, gefunden habe), wollte ich mal meine Erkenntnisse mit euch teilen. Bisher war es mir möglich folgendes auszulesen: TargetBPL mit der gelinkt wird(für Name.dcp heißt die BPL mitunter z.B. Name150.bpl) RequiredDCPs Contained units Link zu meinem Blog-Artikel: ![]() Ich scheine auch schon rauszuhaben, wie ich an die aufgelisteten Exports komme, das ist hier aber noch nicht enthalten. MFG Memnarch |
AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
Wozu brauchst Du Kenntnisse über DCP-Files?
Vielleicht kannst Du mit folgenden Zeilen was anfangen... Ein DCP-File beginnt mit MagicBytes.
Delphi-Quellcode:
Delphi Compilied Package (vv. 2.0-8.0,2005-2010,XE1-XE7), Kylix (vv. 1.0-3.0)(DCP.rfh):
Class: Executable and Object, Status: Guess Work, Last change: 09.02.2015 12:54:12 data 0x0000 array[4]of Char Magic %$IF (Magic='PKG4'); //Delphi3.0 package const Ver=4; descr ('Borland Delphi 3.0 package file.') %$ELSIF (Magic='PKG5'); //Delphi5.0 package const Ver=5; descr ('Borland Delphi 5.0 package file.') %$ELSIF (Magic='PKG6'); //Delphi6.0 package? const Ver=6; descr ('Borland Delphi 6.0 package file?') %$ELSIF (Magic='PKG7'); //Delphi6.0 7.0 package const Ver=7; descr ('Borland Delphi 6.0 or 7.0 package file.') %$ELSIF (Magic='PKG9'); //Delphi 2005 package const Ver=9; descr ('Borland Delphi 2005 package file.') %$ELSIF (Magic='PKX0'); //Delphi 2006 MSIL and later versions package const Ver=10; descr ('Borland Delphi 2006 MSIL package file.') %$ELSE assert 0; //fail %$END %$IF not defined MSIL; const MSIL=0; %$END descr (NL, 'Info Src: Partially reconstructed by me (Alexei Hmelnov (mailto:alex@monster.icc.ru)).',NL) type PUnitData ^TUnitData near=ulong TUnitData struc ulong Magic ulong FileSize raw[] at &@.Magic; Data ends:[@:Size=@.FileSize] TUnitInfo(NXX) struc PUnitData pData ulong F ulong FT ulong bplCode//bplOfs0 %$IF Ver>4; //Not checked for D4 ulong bplBSS //bplOfs1 %$END ulong bplData %$IF (Ver>=9)or MSIL; ulong X %$END array[@:NXX] of ulong XX PChar Name %$IF Ver>=9; PChar Name1 %$END ends:autoname=('unit_',@.Name); TUnitTbl(Cnt,NXX) array[@:Cnt]of TUnitInfo(@:NXX) PUnitTbl(Cnt,NXX) ^TUnitTbl(@:Cnt,@:NXX) near=ulong type TDCPHdr(NXX) struc %$IF MSIL; ulong X0 %$END long nRequires long nContains ulong SzContains PUnitTbl(@.nContains,@:NXX) pContains ulong Flags %$IF Ver>5; //Not checked for D6 ulong Sz2 ulong szBplName %$IF MSIL; ulong X1 ulong X2 %$END // array[@.szBplName+1]of Char,<0; BplName PChar BplName %$IF MSIL; PChar BplVer %$END %$ELSE PChar BplName word X byte Y %$END array[@.nRequires] of PChar Requires ends %$IF (Ver>=10); //They forgot to change the DCP signature when the format was changed in Delphi XE, //so we have to detect the size by other means %$IF MSIL; const NXX=6; %$ELSIF DataAt(4,TDCPHdr(5)).pContains^:Size=DataAt(4,TDCPHdr(5)).SzContains; const NXX=5; %$ELSE const NXX=8; %$END %$ELSE const NXX=0; %$END data 0x0004 TDCPHdr(NXX) Hdr |
AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
Das ist aber komischer Delphi Source Code. :stupid:
|
AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
Das ist doch
![]() |
AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
Zitat:
Zitat:
Zitat:
|
AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:
|
AW: Delphi XE's DCP format: Auslesen einiger Basisinformationen
Bei den Russen findest du noch eine etwas brutalere Version von dem FlexT-Zeugs
![]() Ansonsten gibt es ein älteres Projektchen aus DCU32INT, was wohl aus diesem RFI generiert wurde (einige ältere und andere Dinge ala Kylix weggelassen) ![]() bzw. ![]() Das Auslesen von Required und Contains ist schon recht einfach. (die Definition des FileHeaders und des Records für die Contains findest du hier in der kurzen RFI aus der #2) Die zusätzlichen Unit-Infos sind perverser, aber die brauchtest du ja nicht. (deren Definition in der großen FlexT) Bei mir hab ich nun auch das Kylix rausgeworfen und hab mir die Infos der FlexT zusammengefasst. (eine Definition der Records mit allen Versionen und nicht je Version nebeneinander und Sonderfälle von Uraltversionen auch weg) Achtung: beim Lesen mit dem "aktuellen" Format folgen die Contains direkt auf den Requires und die Uses direkt nach den Contains, aber falls sich das Format mal ändert (neue Werte angehängt) solltest du besser die Adressen auslesen. * Contains-Start und -Länge steht im FileHeader (TDCPHdr.pContains) * und die jeweiligen UnitDefinitionen sind in den Contains-Items verlinkt (TUnitInfo.pData) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz