Subversion Repositories autosfx

Rev

Blame | Last modification | View Log | RSS feed

  1. unit ZMStructs19;
  2.  
  3. (*
  4.   ZMStructs19.pas - Zip file internal structures
  5.     Copyright (C) 2009, 2010  by Russell J. Peters, Roger Aelbrecht,
  6.       Eric W. Engler and Chris Vleghert.
  7.  
  8.         This file is part of TZipMaster Version 1.9.
  9.  
  10.     TZipMaster is free software: you can redistribute it and/or modify
  11.     it under the terms of the GNU Lesser General Public License as published by
  12.     the Free Software Foundation, either version 3 of the License, or
  13.     (at your option) any later version.
  14.  
  15.     TZipMaster is distributed in the hope that it will be useful,
  16.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.     GNU Lesser General Public License for more details.
  19.  
  20.     You should have received a copy of the GNU Lesser General Public License
  21.     along with TZipMaster.  If not, see <http://www.gnu.org/licenses/>.
  22.  
  23.     contact: problems@delphizip.org (include ZipMaster in the subject).
  24.     updates: http://www.delphizip.org
  25.     DelphiZip maillist subscribe at http://www.freelists.org/list/delphizip
  26.  
  27.   modified 2007-06-07
  28. ---------------------------------------------------------------------------*)
  29.  
  30. interface
  31.                      
  32. {$I '.\ZipVers19.inc'}
  33. uses Windows;//, ZMCompat19;
  34.  
  35. type
  36.   TWordRec = packed record
  37.     Lo, Hi: Byte;
  38.   end;
  39.  
  40. type
  41.   TZipSystem = (zsMSDOS, zsAMIGA, zsVMS, zsUNIX, zsVM_CMS, zsATARI, zsHPFS,
  42.     zsMACOS, zsZSYSTEM, zsCPM, zsTOPS20, zsNTFS, zsQDOS, zsRISCOS,
  43.     zsVFAT, zsMVS, zsBEOS, zsTANDEM, zsTHEOS);
  44.  
  45. const
  46.   Invalid_Handle = -1;
  47.   PathDelimAlt = '/';
  48.   WILD_MULTI = '*';
  49.   WILD_CHAR = '?';
  50.   WILD_ALL = '*.*';
  51.   DIR_PARENT = '..';
  52.   DIR_THIS = '.';
  53.   SPEC_SEP = '|';
  54. {$IFNDEF VERD7up}
  55.   PathDelim = '\';
  56.   DriveDelim = ':';
  57. {$ENDIF}
  58.  
  59. type
  60.   TZipLocalHeader = packed record
  61.     HeaderSig: Longword;          // (4)
  62.     VersionNeeded: Word;          // (2)
  63.     Flag: Word;                   // (2)
  64.     ComprMethod: Word;            // (2)
  65. //    ModifTime: Word;              // (2)
  66. //    ModifDate: Word;              // (2)
  67.     ModifDateTime: LongWord;
  68.     CRC32: Longword;              // (4)
  69.     ComprSize: Longword;          // (4)
  70.     UnComprSize: Longword;        // (4)
  71.     FileNameLen: Word;            // (2)
  72.     ExtraLen: Word;               // (2)
  73.   end;
  74.   PZipLocalHeader = ^TZipLocalHeader;
  75.  
  76. // An entry in the central dir:
  77. type
  78.   TZipCentralHeader = packed record    //fixed part size : 42 bytes
  79.     HeaderSig: Longword;            // hex: 02014B50(4)
  80. //    VersionMadeBy0: Byte;           //version made by(1)
  81. //    VersionMadeBy1: Byte;           //host number(1)
  82.     VersionMadeBy: Word;            // host number and version
  83.     VersionNeeded: Word;            // version needed to extract(2)
  84.     Flag: Word;                     //generalPurpose bitflag(2)
  85.     ComprMethod: Word;              //compression method(2)
  86. //    ModifTime: Word;                // modification time(2)
  87. //    ModifDate: Word;                // modification date(2)
  88.     ModifDateTime: LongWord;        // dos date/time
  89.     CRC32: Longword;                //Cycling redundancy check (4)
  90.     ComprSize: Longword;            //compressed file size  (4)
  91.     UncomprSize: Longword;          //uncompressed file size (4)
  92.     FileNameLen: Word;              //(2)
  93.     ExtraLen: Word;                 //(2)
  94.     FileComLen: Word;               //(2)
  95.     DiskStart: Word;                //starts on disk number xx(2)
  96.     IntFileAtt: Word;               //internal file attributes(2)
  97.     ExtFileAtt: Longword;           //external file attributes(4)
  98.     RelOffLocal: Longword;          //relative offset of local file header(4)
  99.     // not used as part of this record structure:
  100.     // filename, extra data, file comment
  101.   end;
  102.   PZipCentralHeader = ^TZipCentralHeader;
  103.  
  104. type
  105.   TZipDataDescriptor = packed record
  106.     DataDescSig: Longword;          // Should be 0x08074B50 (4)
  107.     CRC32: Longword;                // (4)
  108.     ComprSize: Longword;            // (4)
  109.     UnComprSize: Longword;          // (4)
  110.   end;
  111.  
  112. type
  113.   TZipDataDescriptor64 = packed record
  114.     DataDescSig: Longword;          // Should be 0x08074B50 (4)
  115.     CRC32: Longword;                // (4)
  116.     ComprSize: Int64;              // (8)
  117.     UnComprSize: Int64;            // (8)
  118.   end;
  119.  
  120. type
  121.   TZipEndOfCentral = packed record       //Fixed part size : 22 bytes
  122.     HeaderSig: Longword;                //(4)  hex=06054B50
  123.     ThisDiskNo: Word;                   //(2)This disk's number
  124.     CentralDiskNo: Word;                //(2)Disk number central dir start
  125.     CentralEntries: Word;               //(2)Number of central dir entries on this disk
  126.     TotalEntries: Word;                 //(2)Number of entries in central dir
  127.     CentralSize: Longword;              //(4)Size of central directory
  128.     CentralOffset: Longword;            //(4)offset of central dir on 1st disk
  129.     ZipCommentLen: Word;                //(2)
  130.     // not used as part of this record structure:
  131.     // ZipComment
  132.   end;
  133.   PZipEndOfCentral = ^TZipEndOfCentral;
  134.  
  135. type
  136.   // must be same disk as EOC
  137.   TZip64EOCLocator = packed record
  138.     LocSig: Longword;             // (4) Should be 0x07064B50
  139.     EOC64DiskStt: Longword;       // (4)
  140.     EOC64RelOfs: Int64;          // (8) relative to start of it's disk
  141.     NumberDisks: Longword;        // (4) total disks
  142.   end;
  143.   PZip64EOCLocator = ^TZip64EOCLocator;
  144.  
  145. type
  146.   TZipEOC64 = packed record
  147.     EOC64Sig: LongWord;           // (4) should be 0x06064b50
  148.     vsize: Int64;                // (8)    size of variable part
  149.     // variable part   - fields as needed? (old field = 0XFFFF or 0XFF)
  150.     VersionMade: Word;            // (2)
  151.     VersionNeed: Word;            // (2)
  152.     ThisDiskNo: LongWord;         // (4)
  153.     CentralDiskNo: LongWord;      // (4)
  154.     CentralEntries: Int64;       // (8) Number of central dir entries on this disk
  155.     TotalEntries: Int64;         // (8) Number of entries in central dir
  156.     CentralSize: Int64;          // (8) Size of central directory
  157.     CentralOffset: Int64;        // (8) offsett of central dir on 1st disk
  158. //  zip64 extensible data sector    (variable size)
  159.   end;
  160.  
  161. type
  162.   TZipCentralDigitSignature = packed record
  163.     CenDigSig: LongWord;          // (4) should be 0x05054b50
  164.     vsize: Word;                  // (2)
  165. //    data[vsize]
  166.   end;
  167.  
  168. const                      { these are stored in reverse order }
  169.   CentralFileHeaderSig = $02014B50;  { 'PK'12 }
  170.   LocalFileHeaderSig = $04034B50;    { 'PK'34  (in file: 504b0304) }
  171.   CentralDigSig = $05054B50;         { 'PK'55 }
  172.   EndCentralDirSig = $06054B50;      { 'PK'56 }
  173.   ExtLocalSig     = $08074B50;       { 'PK'78 }  // also 'span' mark
  174.   EndCentral64Sig = $06064B50;       { 'PK'66 }
  175.   EOC64LocatorSig = $07064B50;       { 'PK'67 }
  176.  
  177.   Zip64_data_tag = $0001;     // Zip64 extra field tag
  178.   NTFS_data_tag = $000A;      // NTFS date stamps
  179.   UPath_Data_Tag = $7075;     // Info-Zip UTF8 path field
  180.   UCmnt_Data_Tag = $6375;     // Info-Zip UTF8 comment field
  181. // Tag - 2 byte
  182. // total size - 2 byte
  183. // version - 1 byte = 1
  184. // crc -4 bytes = crc of orig field
  185. // utf8 string - total size - 9
  186.  
  187. type
  188.   PUString_Data_Header = ^TUString_Data_Header;
  189.   TUString_Data_Header = packed record
  190.     tag: word;
  191.     totsiz: word;
  192.     version: byte;
  193.     origcrc: DWORD;
  194.   end;
  195.  
  196. const
  197.   MAX_UNSIGNED = $FFFFFFFF;
  198.   MAX_WORD = $FFFF;
  199.   MAX_BYTE = $FF;
  200.  
  201. const
  202.   CRYPT_HEAD_SIZE = 12;
  203.  
  204. const
  205.   FS_FAT = 0;
  206.   FS_HPFS = 6;
  207.   FS_NTFS = 11;
  208.   FLAG_UTF8_BIT = $0800;
  209.  
  210.   ZIP64_VER = 45;
  211.   OSMask = $FF00;
  212.   VerMask = $00FF;
  213.  
  214. type
  215.   TZM_StreamHeader = packed record
  216.     Method: WORD;
  217.     CRC: DWORD;
  218.   end;
  219.   // compression method values
  220. const
  221.   TZMDeflateEncrypt = 1024; // or-ed with METHOD_DEFLATED in Stream Header
  222.   METHOD_DEFLATED = 8;
  223.   METHOD_STORED = 0;
  224.  
  225. (*          
  226. const
  227.   // 'DZ'#0#1;  // header signature
  228.   SFX_HEADER_SIG = $01005A44;
  229.   // 'DZ'#10#1; // end of header signature
  230.   SFX_HEADER_END_SIG = $010A5A44;
  231.  
  232.   // 'DZ'#20#1; // detached header signature
  233.  // SFX_DETACHED_HEADER_SIG = $01145A44;
  234.   // 'DZ'#20#2; // end of detached header signature
  235.  // SFX_DETACHED_HEADER_END_SIG = $02145A44;
  236.  
  237. type      
  238.   { sfx file header }
  239.   PSFXFileHeader = ^TSFXFileHeader;
  240.   TSFXFileHeader = packed record
  241.   // signature: DZ#0#1 = version 01
  242.   Signature: DWORD;//Cardinal;
  243.   // overall header size (must be DWORD-Aligned!)
  244.   Size: word;
  245.   // flags
  246.   Options: DWORD;//TSFXOpts;//TSFXOptions;
  247.   // default overwrite mode
  248.   DefOVW: DWORD;//TZMOvrOpts;//TSFXOverwriteMode;
  249.   // length of the sfx dialog caption (0=default caption)
  250.   CaptionSize,
  251.   // length of the sfx default extraction path (0=current dir)
  252.   PathSize,
  253.   // length of the command line (0=no command line)
  254.   CmdLineSize,
  255.   // length of the extract path to be used if HK... failed (0=%temp%)
  256.   RegFailPathSize,
  257.   // length of the startup message (0=no message)
  258.   StartMsgSize: byte;
  259.   // MB_... (only used if StartMsgSize > 0)
  260.   StartMsgType: DWORD;//Cardinal;
  261.   {
  262.   Caption: string;    if CaptionSize > 0, contains the caption of the sfx dialog (not #0-terminated)
  263.  
  264.                       + will be expanded if it contains % signs and soExpandEnvStrings is set
  265.  
  266.   Path: string;       if PathSize > 0, contains the default extraction path (not #0-terminated)
  267.  
  268.                       + will be expanded if it contains % signs and soExpandEnvStrings is set
  269.  
  270.                       + if set to "><", then use  temp-dir
  271.  
  272.                       + If the first two characters are "HK" the extraction-path //##FR
  273.                         will be read from the registry. If the registry-key doesn't exist, the
  274.                         default path will be set to the temp path. Either full names
  275.                         (HKEY_CURRENT_USER\...) or abbreviations (as known from INF-files)
  276.                         for the root keys HKCU, HKLM and HKU are supported.
  277.                         examples:
  278.                           "HKEY_CURRENT_USER\Software\Borland\Delphi\2.0\Library\SearchPath"
  279.                           "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ProgramFilesDir"
  280.                           "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Personal"
  281.                           "HKCU\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\AddIn Path"
  282.                         For subdirectories to be created use the pipe symbol "|", e.g.
  283.                           "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SystemRoot|NewDir"
  284.                         will parse to : "C:\Windows\NewDir" (or whereever your system root is).
  285.  
  286.   CmdLine: string;    if CmdLineSize > 0, contains a command to execute after extraction completed
  287.                       (not #0-terminated)
  288.  
  289.                       + will be expanded if it contains % signs and soExpandEnvStrings is set
  290.  
  291.                       + CmdLine has a special format:
  292.                         all occurrences of  "><" (greather than+less than) in this string will be replaced by
  293.                         the actual extraction path, e.g. :
  294.                         if the archive has been extracted to "c:\Program Files\foo", a CmdLine
  295.                         of "><bar\some.txt" will parse to "c:\Progra~1\foo\bar\some.txt"
  296.                         (because of limitations of the ShellExecute API on some platforms when using long
  297.                         filenames the short filename is generated by delzipsfx)
  298.  
  299.                         if the pipe char "|" is found in the CmdLine, the part to the left of it is used as
  300.                         the application to run and the part to the right as its command line, e.g.:
  301.  
  302.                         extraction path = "d:\unpack", CmdLine = "><setup.exe|><install.inf"
  303.                         -> exec "d:\unpack\setup.exe" with args "d:\unpack\install.inf"
  304.  
  305.                         extraction path = "d:\unpack", CmdLine = "><readme.txt":
  306.                         -> open "d:\unpack\readme.txt" with its associated program, if there is any.
  307.  
  308.                         extraction path = "d:\unpack", CmdLine = "><setup.exe":
  309.                         -> exec "d:\unpack\setup.exe" without special parameters.
  310.  
  311.                         additionally, if soExpandEnvStrings is set in the Options field:
  312.                         extraction path = "d:\unpack", CmdLine = "%windir%notepad.exe|><readme.txt",
  313.                         Windows Dir="c:\Windows"
  314.                         -> exec "c:\windows\notepad.exe" with args "d:\unpack\readme.txt"
  315.  
  316.                       + INF-scripts are accepted as well //##FR
  317.                         "><setup.inf" will run the [DefaultInstall] section of "d:\unpack\setup.inf".
  318.                         "><setup.inf|.ntx86" will run the [DefaultInstall] section if Win95 (98?),
  319.                         but [DefaultInstall.ntx86] section if WinNT.
  320.  
  321.   RegFailPath:        string if RegFailPathSize > 0, contains the default extraction path,
  322.                       if reading path from registry failed (not #0-terminated)
  323.  
  324.                       + will be expanded if it contains % signs and soExpandEnvStrings is set
  325.  
  326.                       + if set to "><", then use  temp-dir
  327.  
  328.   StartMsg: string;   if StartMsgSize > 0, contains a message to display before showing the main dialog.
  329.                       (not #0-terminated)
  330.  
  331.                       + will be expanded if it contains % signs and soExpandEnvStrings is set
  332.  
  333.                       if this messagebox is closed by pressing either IDCANCEL, IDABORT, IDNO or IDCLOSE button,
  334.                       sfx terminates.
  335.  
  336.   }
  337.   end;
  338.  
  339.   // the following record is only used by TZipSFX20 and TZipMasterSFX to quickly find the
  340.   // TSFXFileHeader in the file, it's not used by the sfx itself.
  341.   // it's immediately stored after the TSFXFileHeader record
  342.   PSFXFileEndOfHeader= ^TSFXFileEndOfHeader;
  343.   TSFXFileEndOfHeader= packed record
  344.     Signature: DWORD;    //must be SFX_HEADER_END_SIG
  345.     HeaderSize: DWORD;   //must be equal to TSFXFileHeader.Size (dword for alignment issuses)
  346.   end;
  347. (*
  348.   // in detached sfx archives, the sfx contains an additional record following the header
  349.   PSFXDetachedHeader= ^TSFXDetachedHeader;
  350.   TSFXDetachedHeader= packed record
  351.     Signature: DWORD; // must be SFX_DETACHED_HEADER_SIG or SFX_DETACHED_HEADER_END_SIG
  352.     NameLen,
  353.     ExtLen: DWORD; // contains the length of the filename/fileext of the archive (without path)
  354.     {
  355.     Name: string      if NameLen > 0, Name contains the file name (without extension) of
  356.                           the detached archive
  357.     Ext: string      if ExtLen > 0, Ext contains the file Ext (without leading .) of
  358.                           the detached archive
  359.     }
  360.   end;
  361. *)
  362. { the structure of a zipsfx-file :
  363.   - zipsfx-executable code (0-xxxxx)
  364.   - TSFXFileHeader record (see above)
  365.   - possibly one or more strings (depending on the headers' properties) (not #0 terminated)
  366.   Caption                             sfx dialog caption
  367.   Path                                sfx default extraction path
  368.   CmdLine                             command line to execute after extraction
  369.   RegFailPath                         default extract path if Path could not be read from registry
  370.   StartMsg                            startup message
  371.  
  372.   NOTE: the complete header (including the strings) must be DWORD-aligned!
  373.  
  374.   if not detached from the archive:
  375.   - the zip archive
  376.  
  377.   if detached from the archive:
  378.   - TSFXDetachedHeader + filename + TSFXDetachedHeader
  379.   - centraldirectories[] + endofcentraldir of the zip archive
  380. }
  381. (*
  382. type
  383.   PSFXDetachedHeader = ^TSFXDetachedHeader;
  384.   TSFXDetachedHeader= packed record
  385.     Signature: DWORD; // must be SFX_DETACHED_HEADER_SIG or SFX_DETACHED_HEADER_END_SIG
  386.     NameLen,
  387.     ExtLen: Cardinal; // contains the length of the filename/fileext of the archive (without path)
  388.     {
  389.     Name: string      if NameLen > 0, Name contains the file name (without extension) of
  390.                           the detached archive
  391.     Ext: string      if ExtLen > 0, Ext contains the file Ext (without leading .) of
  392.                           the detached archive
  393.     }
  394.   end;
  395. *)
  396. type
  397.   PImageResourceDirectory = ^_IMAGE_RESOURCE_DIRECTORY;
  398.   _IMAGE_RESOURCE_DIRECTORY = packed record
  399.     Characteristics      : DWORD;
  400.     TimeDateStamp        : DWORD;
  401.     MajorVersion         : Word;
  402.     MinorVersion         : Word;
  403.     NumberOfNamedEntries : Word;
  404.     NumberOfIdEntries    : Word;
  405.   end;
  406.   TImageResourceDirectory = _IMAGE_RESOURCE_DIRECTORY;
  407.  
  408.   PImageResourceDirectoryEntry = ^_IMAGE_RESOURCE_DIRECTORY_ENTRY;
  409.   _IMAGE_RESOURCE_DIRECTORY_ENTRY = packed record
  410.     un1: record
  411.       case Integer of
  412.         1: (NameIsString: DWORD); // Bit 31
  413.         2: (NameOffset: DWORD); // Bits 30..0
  414.         3: (Name: DWORD);
  415.         4: (Id: Word);
  416.     end;
  417.     un2: record
  418.       case Integer of
  419.         1: (OffsetToData: DWORD);
  420.         2: (DataIsDirectory: DWORD); // Bit 31
  421.         3: (OffsetToDirectory: DWORD); // Bits 30..0
  422.     end;
  423.   end;
  424.   TImageResourceDirectoryEntry = _IMAGE_RESOURCE_DIRECTORY_ENTRY;
  425.  
  426.   PImageResourceDataEntry = ^_IMAGE_RESOURCE_DATA_ENTRY;
  427.   _IMAGE_RESOURCE_DATA_ENTRY = packed record
  428.     OffsetToData : DWORD;
  429.     Size         : DWORD;
  430.     CodePage     : DWORD;
  431.     Reserved     : DWORD;
  432.   end;
  433.   TImageResourceDataEntry = _IMAGE_RESOURCE_DATA_ENTRY;
  434.  
  435.  
  436.   PIconDir = ^ICONDIR;
  437.   ICONDIR = packed record
  438.     Reserved : Word;
  439.     ResType  : Word;
  440.     ResCount : Word;
  441.     // idEntries[]: ICONDIRENTRY
  442.   end;
  443.   TIconDir = ICONDIR;
  444.  
  445.   PIconDirEntry = ^ICONDIRENTRY;
  446.   ICONDIRENTRY = packed record
  447.     bWidth,
  448.     bHeight,
  449.     bColorCount,
  450.     bReserved : Byte;
  451.     wPlanes,
  452.     wBitCount : Word;
  453.     dwBytesInRes,
  454.     dwImageOffset : DWORD;
  455.   end;
  456.   TIconDirEntry = ICONDIRENTRY;
  457.  
  458. const
  459.   IMAGE_RESOURCE_DATA_IS_DIRECTORY    = $80000000;
  460.  
  461. const
  462.   IMAGE_PE_SIGNATURE = $00004550;
  463.  
  464.  
  465. //----------------Icon resource info  needed SFX -----------------------------------
  466. (*{$IFDEF VERD2D3}
  467. const
  468.   IMAGE_DIRECTORY_ENTRY_RESOURCE = 2;
  469.   IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
  470.   IMAGE_SIZEOF_SHORT_NAME = 8;
  471.   IMAGE_DOS_SIGNATURE     = $5A4D;
  472.   IMAGE_NT_SIGNATURE      = $00004550;
  473.  
  474. type
  475.   pIMAGE_DOS_HEADER = ^IMAGE_DOS_HEADER;
  476.  
  477.   IMAGE_DOS_HEADER = packed record      { DOS .EXE header }
  478.     e_magic: Word;                      { Magic number }
  479.     e_cblp: Word;                       { Bytes on last page of file }
  480.     e_cp: Word;                         { Pages in file }
  481.     e_crlc: Word;                       { Relocations }
  482.     e_cparhdr: Word;                    { Size of header in paragraphs }
  483.     e_minalloc: Word;                   { Minimum extra paragraphs needed }
  484.     e_maxalloc: Word;                   { Maximum extra paragraphs needed }
  485.     e_ss: Word;                         { Initial (relative) SS value }
  486.     e_sp: Word;                         { Initial SP value }
  487.     e_csum: Word;                       { Checksum }
  488.     e_ip: Word;                         { Initial IP value }
  489.     e_cs: Word;                         { Initial (relative) CS value }
  490.     e_lfarlc: Word;                     { File address of relocation table }
  491.     e_ovno: Word;                       { Overlay number }
  492.     e_res: packed array[0..3] of Word;  { Reserved words }
  493.     e_oemid: Word;                      { OEM identifier (for e_oeminfo) }
  494.     e_oeminfo: Word;                    { OEM information; e_oemid specific }
  495.     e_res2: packed array[0..9] of Word; { Reserved words }
  496.     _lfanew: Longint;                   { File address of new exe header }
  497.   end;
  498.  
  499. type
  500.   pImageDataDirectory = ^IMAGE_DATA_DIRECTORY;
  501.  
  502.   _IMAGE_DATA_DIRECTORY = record
  503.     VirtualAddress: DWORD;
  504.     Size: DWORD;
  505.   end;
  506.   IMAGE_DATA_DIRECTORY = _IMAGE_DATA_DIRECTORY;
  507.  
  508. type
  509.   pImageFileHeader = ^IMAGE_FILE_HEADER;
  510.  
  511.   _IMAGE_FILE_HEADER = packed record
  512.     Machine: Word;
  513.     NumberOfSections: Word;
  514.     TimeDateStamp: DWORD;
  515.     PointerToSymbolTable: DWORD;
  516.     NumberOfSymbols: DWORD;
  517.     SizeOfOptionalHeader: Word;
  518.     Characteristics: Word;
  519.   end;
  520.   IMAGE_FILE_HEADER = _IMAGE_FILE_HEADER;
  521.  
  522. type
  523.   pImageOptionalHeader = ^IMAGE_OPTIONAL_HEADER;
  524.  
  525.   _IMAGE_OPTIONAL_HEADER = packed record
  526.     { Standard fields. }
  527.     Magic: Word;
  528.     MajorLinkerVersion: Byte;
  529.     MinorLinkerVersion: Byte;
  530.     SizeOfCode: DWORD;
  531.     SizeOfInitializedData: DWORD;
  532.     SizeOfUninitializedData: DWORD;
  533.     AddressOfEntryPoint: DWORD;
  534.     BaseOfCode: DWORD;
  535.     BaseOfData: DWORD;
  536.     { NT additional fields. }
  537.     ImageBase: DWORD;
  538.     SectionAlignment: DWORD;
  539.     FileAlignment: DWORD;
  540.     MajorOperatingSystemVersion: Word;
  541.     MinorOperatingSystemVersion: Word;
  542.     MajorImageVersion: Word;
  543.     MinorImageVersion: Word;
  544.     MajorSubsystemVersion: Word;
  545.     MinorSubsystemVersion: Word;
  546.     Win32VersionValue: DWORD;
  547.     SizeOfImage: DWORD;
  548.     SizeOfHeaders: DWORD;
  549.     CheckSum: DWORD;
  550.     Subsystem: Word;
  551.     DllCharacteristics: Word;
  552.     SizeOfStackReserve: DWORD;
  553.     SizeOfStackCommit: DWORD;
  554.     SizeOfHeapReserve: DWORD;
  555.     SizeOfHeapCommit: DWORD;
  556.     LoaderFlags: DWORD;
  557.     NumberOfRvaAndSizes: DWORD;
  558.     DataDirectory: packed array[0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES - 1] of
  559.     IMAGE_DATA_DIRECTORY;
  560.   end;
  561.   IMAGE_OPTIONAL_HEADER = _IMAGE_OPTIONAL_HEADER;
  562.  
  563. type
  564.   TISHMisc = packed record
  565.     case Integer of
  566.       0: (PhysicalAddress: DWORD);
  567.       1: (VirtualSize: DWORD);
  568.   end;
  569.  
  570.   pImageSectionHeader = ^IMAGE_SECTION_HEADER;
  571.  
  572.   _IMAGE_SECTION_HEADER = packed record
  573.     Name: packed array[0..IMAGE_SIZEOF_SHORT_NAME - 1] of Byte;
  574.     Misc: TISHMisc;
  575.     VirtualAddress: DWORD;
  576.     SizeOfRawData: DWORD;
  577.     PointerToRawData: DWORD;
  578.     PointerToRelocations: DWORD;
  579.     PointerToLinenumbers: DWORD;
  580.     NumberOfRelocations: Word;
  581.     NumberOfLinenumbers: Word;
  582.     Characteristics: DWORD;
  583.   end;
  584.   IMAGE_SECTION_HEADER = _IMAGE_SECTION_HEADER;
  585. {$ENDIF}  *)
  586.  
  587. type
  588.   PISH = ^IMAGE_SECTION_HEADER;
  589.  
  590.   PEheader = packed record
  591.     signature: DWord;
  592.     _head: IMAGE_FILE_HEADER;
  593.     opt_head: IMAGE_OPTIONAL_HEADER;
  594.     section_header: IMAGE_SECTION_HEADER;
  595.   end;
  596.  
  597.   IMAGE_RESOURCE_DIR_STRING_U = packed record
  598.     Length: Word;
  599.     NameString: array[0..0] of WChar;
  600.   end;
  601.   PIRDSU = ^IMAGE_RESOURCE_DIR_STRING_U;
  602.  
  603.   IMAGE_RESOURCE_DIRECTORY_ENTRY = packed record
  604.     un1: record
  605.       case Integer of
  606.         1: (NameIsString: DWord); // Bit 32
  607.         2: (NameOffset: DWord);   // Bits 31..0
  608.         3: (Name: DWord);
  609.         4: (Id: Word);
  610.     end;
  611.     un2: record
  612.       case Integer of
  613.         1: (OffsetToData: DWord);
  614.         2: (DataIsDirectory: Dword);   // Bit 32
  615.         3: (OffsetToDirectory: DWord); // Bits 31..0
  616.     end;
  617.   end;
  618.   PIRDirE = ^IMAGE_RESOURCE_DIRECTORY_ENTRY;
  619.  
  620.   PIDD = ^IMAGE_DATA_DIRECTORY;
  621.  
  622.   IMAGE_RESOURCE_DIRECTORY = packed record
  623.     Characteristics: DWord;
  624.     TimeDateStamp: DWord;
  625.     MajorVersion:  Word;
  626.     MinorVersion:  Word;
  627.     NumberOfNamedEntries: Word;
  628.     NumberOfIdEntries: Word;
  629.   end;
  630.   PIRD = ^IMAGE_RESOURCE_DIRECTORY;
  631.  
  632.   IMAGE_RESOURCE_DATA_ENTRY = packed record
  633.     OffsetToData: DWord;
  634.     Size: DWord;
  635.     CodePage: DWord;
  636.     Reserved: DWord;
  637.   end;
  638.   PIRDatE = ^IMAGE_RESOURCE_DATA_ENTRY;
  639.  // ---- end SFX needed
  640.  // ---- ===== ----- =====  end of implementation data ===== ----- ===== -----
  641.  
  642. implementation
  643.  
  644. end.
  645.  
  646.