+
    ni!  c                   s^   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RItRtRt	]P                  ! R4      t]P                  ! 4         ^RIHt  ! R R]4      t ! R R	]4      t ! R
 R]4      t ! R R]4      t ! R R4      t. ROtRRRR/tR#   ] d    Rt]P!                  R4        L^i ; i)zP
Windows Portable Executable (PE) icon extractor.

.. include:: ../LIB-USAGE.md
NZ
icoextract)__version__Zunknownz*icoextract: failed to read program versionc                   s    ] tR t^tRtRtR# )IconExtractorErrorz2Superclass for exceptions raised by IconExtractor. N__name__
__module____qualname____firstlineno____doc____static_attributes__r       8/usr/lib/python3.14/site-packages/icoextract/__init__.pyr   r      s    <r
   r   c                   s    ] tR t^"tRtRtR# )IconNotFoundErrorzRException raised when extracting an icon index or resource ID that does not exist.r   Nr   r   r
   r   r   r   "   s    \r
   r   c                   s    ] tR t^%tRtRtR# )NoIconsAvailableErrorz>Exception raised when the input program has no icon resources.r   Nr   r   r
   r   r   r   %   s    Hr
   r   c                   s    ] tR t^(tRtRtR# )InvalidIconDefinitionErrorzEException raised when the input program has an invalid icon resource.r   Nr   r   r
   r   r   r   (   s    Or
   r   c                   s   a  ] tR t^+t o RR ltV 3R lR ltRV 3R lR lltRR ltRR ltRV 3R	 lR
 llt	]
R 4       tRtV tR# )IconExtractorNc                sB   \         P                  ! WRR7      V n        V P                  P                  \         P                  R,          4       \        V P                  R4      '       g   \        R4      h\        V P                  P                  P                  4       Uu/ uF  q3P                  VbK  	  ppVP                  \         P                  R,          4      V n        V P                  '       g?   V'       d,   \        P                  ! 4       R8X  d   V P!                  V4       \        R4      hVP                  \         P                  R	,          4      V n        \%        V P                  P&                  P                  4       UUu/ uF  w  rVVP(                  P*                  VbK  	  uppV n        V P"                  P&                  P                   Uu/ uF+  pVP                  VP&                  P                  ^ ,          bK-  	  upV n        R
# u upi u uppi u upi )z
Loads an executable from the given `filename` or `data` (raw bytes).
As with pefile, if both `filename` and `data` are given, `filename` takes precedence.

If the executable has contains no icons, this will raise `NoIconsAvailableError`.
T)namedataZ	fast_loadZIMAGE_DIRECTORY_ENTRY_RESOURCEDIRECTORY_ENTRY_RESOURCEzFile has no resourcesZRT_GROUP_ICONZWindowsz File has no group icon resourcesZRT_ICONN)pefileZPE_peZparse_data_directoriesZDIRECTORY_ENTRYZhasattrr   Zreversedr   entriesZidZgetZRESOURCE_TYPE_groupiconresplatformZsystem_print_windows_usage_hint
_rticonresZ	enumerate	directorystructName_group_icons_icons)selffilenamer   ZrsrcZ	resourcesZidxZentryZicon_entry_lists   &&&     r   __init__ZIconExtractor.__init__,   s    99(F''(>(>?_(`atxx!;<<'(?@@
 088Y8Y8a8a/bc/btWWd]/b	c&]]6+?+?+PQ!!!HOO-:..x8'(JKK#--(<(<Y(GH GPPTPbPbPlPlPtPtFuvFu
U\\..3Fuv.2oo.G.G.O.OQ.O? '))?+D+D+L+LQ+OO.OQ d wQs    H	"H1Hc                sF   < V ^8  d   QhRS[ S[S[S[3,          ,          /# i   Zreturn)listtupleZintZformat__classdict__   "r   __annotate__IconExtractor.__annotate__L   s!     ? ?$uS#X"7 ?r
   c                s    V P                   P                  P                   Uu. uF/  pVP                  P                  VP                  P
                  3NK1  	  up# u upi )zK
Returns all group icon entries as a list of (resource ID, offset) tuples.
)r   r   r   r   r   OffsetToData)r   Zes   & r   list_group_iconsZIconExtractor.list_group_iconsL   sR    
 ++55==?=A  5 56=? 	? ?s   5Ac                sZ   < V ^8  d   QhRS[ S[S[P                  S[3,          ,          /# r"   )r#   r$   r   Z	StructureZbytesr%   r'   r   r(   r)   S   s)     0 0Dv/?/?/F)G$H 0r
   c                s    V P                   P                  P                  V,          pTP
                  P                  pRpTP
                  P                  '       dJ   TP                  P                  ^ ,          pTP
                  P                  p\        P                  RT4       TP                  P
                  P                  pT P                  P                  YRP                  P
                  P                  4      pT P                  P                  T4      pT P                  P!                  \"        Yg4      p\        P                  RYTP$                  T4       TP&                  '       d&   \)        R\+        TP&                  4      ,          4      h. p	TP-                  4       p
\/        TP$                  4       EF  pT P                  P!                  \0        YjR Yz,           4      pYP-                  4       ,          p
\        P                  RY4       T P2                  TP4                  ,          pT P                  P                  TP                  P
                  P                  TP                  P
                  P                  4      p\        P                  RTP4                  TP                  P
                  4       T	P7                  Y34       EK  	  T	#   \         d    \	        RT 24      Rhi ; i)zp
Returns the specified group icon in the binary.

Result is a list of (group icon structure, icon data) tuples.
zNo icon exists at index NzPicking first language %sz)Group icon %d has ID %s and %d images: %sz<Invalid group icon definition (got Reserved=%s instead of 0)zGot group icon entry %d: %szGot icon data for ID %d: %s)r   r   r   Z
IndexErrorr   r   r   ZDataIsDirectoryloggerZdebugr   r*   r   Zget_dataZSizeZget_offset_from_rvaZ__unpack_data__GRPICONDIR_FORMATZCountZReservedr   ZhexZsizeofZrangeGRPICONDIRENTRY_FORMATr   ZIDZappend)r   indexZ	groupiconresource_idZ	icon_langZrvaZgrp_icon_dataZfile_offsetZgrp_icon_dirZ	grp_iconsZicon_offsetZgrp_icon_indexZgrp_iconZ
icon_entry	icon_datas   &&             r   	_get_iconZIconExtractor._get_iconS   sM   	R**44<<UCI  &&++	+++!++33A6I!((--ILL4i@ nn##00))#~~/D/D/I/IJhh2237xx//0A=^@););\	K
    ,-kl++,.- . .
 	"))+#L$6$67Nxx//&l(C[E\^H??,,KLL6QX[[1J))*//*@*@*M*MzOeOeOjOjkILL6Z__E[E[\h23 8 Q  	R#&>ug$FGTQ	Rs   'K K1c                s   Ve    V P                   V,          pV P                  VR7      pVP	                  R4       VP	                  \
        P                  ! R^4      4       VP	                  \
        P                  ! R\        V4      4      4       ^\        V4      ^,          ,           pV Fe  pVw  rxVP	                  VP                  4       R,          4       VP	                  \
        P                  ! RV4      4       V\        V4      ,          pKg  	  V F  pVw  rxVP	                  V4       K  	  R#   \         d    \        RT 24      Rhi ; i)z'
Writes ICO data to a file descriptor.
Nz No icon exists with resource ID )r/   s     z<H:Ni   Nz<I)	r   ZKeyErrorr   r2   Zwriter   ZpackZlenZ__pack__)	r   Zfdnumr0   ZiconsZ
dataoffsetZdatapairZ
group_iconr1   s	   &&&&     r   
_write_icoZIconExtractor._write_ico   s    "d''4 S)

T1%&
T3u:./#e*r/*
H$,!J HHZ((*3/0HHV[[z23#i.(J  H$,!JHHY )  d'*J;-(XY_ccds   D5 5Ec                s    \        VR4      ;_uu_ 4       pV P                  WBVR7       RRR4       R#   + '       g   i     R# ; i)z
Exports ICO data for the requested group icon to `filename`.

Icons can be selected by index (`num`) or resource ID. By default, the first icon in the binary is exported.
Zwbr3   r0   N)Zopenr4   )r   r    r3   r0   fs   &&&& r   export_iconZIconExtractor.export_icon   s2     (D!!QOOAKO@ "!!!s	   3A	c                s4   < V ^8  d   QhRS[ P                  /# r"   )ioBytesIOr%   r'   r   r(   r)      s      2:: r
   c                sV    \         P                  ! 4       pV P                  W1VR7       V# )z
Exports ICO data for the requested group icon as a `io.BytesIO` instance.

Icons can be selected by index (`num`) or resource ID. By default, the first icon in the binary is exported.
r5   )r8   r9   r4   )r   r3   r0   r6   s   &&& r   get_iconZIconExtractor.get_icon   s$     JJL<r
   c                s   \         P                  ! V 4      p\         P                  ! \        P                  ! R 4      4      pVP	                  VR,          4      '       g   VP	                  VR,          4      '       df   \         P                  ! VR,          VP
                  R,           ,          4      pVP                  4       '       d   \        P                  RV4       R# R# R# )Z
SYSTEMROOTZSystem32ZSysWOW64ZSystemResourcesz.munz]System DLL files in Windows 10 1903+ no longer contain icons. Try extracting from %s instead.N)	pathlibZPathosZgetenvZis_relative_tor   Zis_filer,   Zwarning)r    ZpathZ
systemrootZmun_paths   &   r   r   Z'IconExtractor._print_windows_usage_hint   s    ||H%\\"))L"9:
zJ677##J$;<<||J1B$BdiiRXFX$YZH!!67?A " =r
   )r   r   r   r   r   )NN)    )r=   N)r   r   r   r   r!   r+   r2   r4   r7   r:   Zstaticmethodr   r	   Z__classdictcell__)r&   s   @r   r   r   +   sL     Q@? ?0 0d >A  	A 	Ar
   r   ZscriptsFversion)ZGRPICONDIRENTRY)zB,WidthzB,HeightzB,ColorCountz
B,ReservedzH,Planesz
H,BitCountzI,BytesInReszH,ID)Z
GRPICONDIR)z
H,ReservedzH,TypezH,Count)r   r   r   r   r   )r   r8   Zloggingr<   r;   r   r   r   r.   r-   Z	getLoggerr,   ZbasicConfigr>   r    ZImportErrorZinfoZ	Exceptionr   r   r   r   r   Z__all__Z__pdoc__r   r
   r   <module>r?      s    
  	    5  G 			<	(    >$
= =]* ]I. IP!3 PVA VAp uua  >K
KK<=>s   B B,+B,