§
    ˜M­j,  ã                   óî   — d Z ddlZddlZddlZddlmZmZ 	 ddlZdZn# e	$ r dZdZY nw xY wdZ
dZ G d„ d	ej        ¦  «        Zd
edee         fd„Zdefd„Zdee         fd„Zdedefd„Zdedefd„ZdS )uÁ  ThÆ° viá»‡n dÃ¹ng chung quáº£n lÃ½ tiáº¿n trÃ¬nh Win32 cho Path of Exile 2.

Cung cáº¥p cÃ¡c hÃ m kiá»ƒm tra tráº¡ng thÃ¡i hoáº¡t Ä‘á»™ng, trÃ­ch xuáº¥t Process ID (PID)
vÃ  tÃ¬m kiáº¿m tiáº¿n trÃ¬nh theo tÃªn thá»±c thi. Há»— trá»£ cáº£ thÆ° viá»‡n psutil vÃ  Win32 Toolhelp32
Snapshot API vá»›i cÆ¡ cháº¿ giáº£i phÃ³ng tÃ i nguyÃªn triá»‡t Ä‘á»ƒ trong khá»‘i finally.
TuÃ¢n thá»§ nghiÃªm ngáº·t chuáº©n tÃ i liá»‡u Google Docstrings theo Rule 16.
é    N)ÚListÚOptionalTF)zpathofexile.exezpathofexilesteam.exezpathofexile_x64.exezpathofexile_x64steam.exezpathofexile2.exeé   c                   ó  — e Zd Zdej        j        fdej        j        fdej        j        fd ej        ej        ¦  «        fdej        j        fdej        j        fdej        j        fdej        fd	ej        j        fd
ej	        dz  fg
Z
dS )Ú_PROCESSENTRY32WÚdwSizeÚcntUsageÚth32ProcessIDÚth32DefaultHeapIDÚth32ModuleIDÚ
cntThreadsÚth32ParentProcessIDÚpcPriClassBaseÚdwFlagsÚ	szExeFilei  N)Ú__name__Ú
__module__Ú__qualname__ÚctypesÚwintypesÚDWORDÚPOINTERÚc_ulongÚc_longÚc_wcharÚ_fields_© ó    ú0C:\Projects\AutoPOE2\src\common\win32_process.pyr   r       sŸ   € € € € € à	�6”?Ô(Ð)Ø	�V”_Ô*Ð+Ø	˜&œ/Ô/Ð0Ø	˜n˜fœn¨V¬^Ñ<Ô<Ð=Ø	˜œÔ.Ð/Ø	�v”Ô,Ð-Ø	 ¤Ô 5Ð6Ø	˜6œ=Ð)Ø	�F”OÔ)Ð*Ø	�f”n sÑ*Ð+ð€H€H€Hr   r   ÚnameÚreturnc                 ó�  — |                       ¦   «         }g }t          �Ë	 t          j        ddg¦  «        D ]¡}	 |j                             d¦  «        }|rV|                      ¦   «         |k    r>|j                             d¦  «        }|�"|                     t          |¦  «        ¦  «         Œv# t          j        t          j        t          j	        f$ r Y Œžw xY w|S # t          $ r Y nw xY wt          j        dk    �rLt          j        j        }|                     t"          d¦  «        }t          j                             d¦  «        j        }|rú||k    rô	 t+          ¦   «         }	t          j        t*          ¦  «        |	_        |                     |t          j        |	¦  «        ¦  «        ro	 |	j                              ¦   «         |k    r'|                     t          |	j        ¦  «        ¦  «         |                     |t          j        |	¦  «        ¦  «        snŒn|                     |¦  «         n# |                     |¦  «         w xY w|S )u4  TÃ¬m danh sÃ¡ch Process ID (PID) cá»§a táº¥t cáº£ tiáº¿n trÃ¬nh cÃ³ tÃªn tá»‡p thá»±c thi khá»›p vá»›i tÃªn chá»‰ Ä‘á»‹nh.

    So sÃ¡nh khÃ´ng phÃ¢n biá»‡t hoa thÆ°á»�ng. Æ¯u tiÃªn kiá»ƒm tra nhanh qua psutil náº¿u cÃ³ sáºµn,
    vÃ  tá»± Ä‘á»™ng chuyá»ƒn sang Windows Toolhelp32 API náº¿u psutil chÆ°a cÃ i Ä‘áº·t hoáº·c gáº·p sá»± cá»‘.
    Ä�áº£m báº£o giáº£i phÃ³ng handle snapshot trong khá»‘i finally.

    Args:
        name: TÃªn tá»‡p thá»±c thi cáº§n tÃ¬m (vÃ­ dá»¥: 'PathOfExile.exe').

    Returns:
        List[int]: Danh sÃ¡ch cÃ¡c PID Ä‘ang cháº¡y khá»›p vá»›i tÃªn chá»‰ Ä‘á»‹nh. Tráº£ vá»� rá»—ng náº¿u khÃ´ng tÃ¬m tháº¥y.

    Thread-safety:
        Thread-safe.

    Example:
        >>> pids = find_process_by_name("PathOfExile.exe")
        >>> print(f"TÃ¬m tháº¥y {len(pids)} tiáº¿n trÃ¬nh.")
    NÚpidr    Úntr   éÿÿÿÿ)ÚlowerÚpsutilÚprocess_iterÚinfoÚgetÚappendÚintÚNoSuchProcessÚAccessDeniedÚZombieProcessÚ	ExceptionÚosr    r   ÚwindllÚkernel32ÚCreateToolhelp32SnapshotÚTH32CS_SNAPPROCESSr   ÚHANDLEÚvaluer   Úsizeofr   ÚProcess32FirstWÚbyrefr   r
   ÚProcess32NextWÚCloseHandle)
r    Útarget_nameÚ
found_pidsÚprocÚpnamer#   r3   Ú
h_snapshotÚinvalid_handleÚpe32s
             r   Úfind_process_by_namerD   /   s8  € ð( —*’*‘,”,€KØ€Jõ Ðð	ÝÔ+¨U°F¨OÑ<Ô<ð ð �ðØ œIŸMšM¨&Ñ1Ô1�EØð 8 §¢¡¤°+Ò!=Ð!=Ø"œiŸmšm¨EÑ2Ô2˜Ø˜?Ø&×-Ò-­c°#©h¬hÑ7Ô7Ð7øøÝÔ,­fÔ.AÅ6ÔCWÐXð ð ð Ø�HðøøøàÐøÝð 	ð 	ð 	ØˆDð	øøøõ 
„w�$‚�Ý”=Ô)ˆØ×6Ò6Õ7IÈ1ÑMÔMˆ
Ýœ×/Ò/°Ñ3Ô3Ô9ˆØð 	1˜*¨Ò6Ð6ð
1Ý'Ñ)Ô)�Ý$œmÕ,<Ñ=Ô=�”Ø×+Ò+¨J½¼ÀTÑ8JÔ8JÑKÔKð "ð"Øœ>×/Ò/Ñ1Ô1°[Ò@Ð@Ø&×-Ò-­c°$Ô2DÑ.EÔ.EÑFÔFÐFØ'×6Ò6°zÅ6Ä<ÐPTÑCUÔCUÑVÔVð "Ø!ð	"ð ×$Ò$ ZÑ0Ô0Ð0Ð0ø�×$Ò$ ZÑ0Ô0Ð0Ð0øøøàÐsB   ŸC ¸A2B+Â*C Â+&CÃC ÃCÃC Ã
C&Ã%C&ÅCH, È,Ic                  ó"   — t          ¦   «         duS )uð  Kiá»ƒm tra xem tiáº¿n trÃ¬nh game Path of Exile 2 cÃ³ Ä‘ang hoáº¡t Ä‘á»™ng trÃªn há»‡ thá»‘ng hay khÃ´ng.

    QuÃ©t Ä‘á»‘i chiáº¿u toÃ n bá»™ cÃ¡c tÃªn tá»‡p thá»±c thi phá»• biáº¿n cá»§a POE2 (Standalone, Steam, x64).

    Returns:
        bool: True náº¿u phÃ¡t hiá»‡n Ã­t nháº¥t má»™t tiáº¿n trÃ¬nh POE2 Ä‘ang cháº¡y, ngÆ°á»£c láº¡i False.

    Thread-safety:
        Thread-safe.

    Example:
        >>> if is_poe2_running():
        ...     print("Client POE2 Ä‘ang hoáº¡t Ä‘á»™ng.")
    N)Úget_poe2_pidr   r   r   Úis_poe2_runningrG   k   s   € õ ‰>Œ> Ð%Ð%r   c                  óP   — t           D ]} t          | ¦  «        }|r
|d         c S ŒdS )u÷  Láº¥y Process ID (PID) cá»§a tiáº¿n trÃ¬nh Path of Exile 2 Ä‘ang cháº¡y.

    TÃ¬m kiáº¿m tuáº§n tá»± qua danh sÃ¡ch cÃ¡c tÃªn tá»‡p thá»±c thi há»£p lá»‡ vÃ  tráº£ vá»� PID Ä‘áº§u tiÃªn
    Ä‘Æ°á»£c tÃ¬m tháº¥y.

    Returns:
        Optional[int]: PID cá»§a tiáº¿n trÃ¬nh POE2 náº¿u Ä‘ang cháº¡y, hoáº·c None náº¿u khÃ´ng tÃ¬m tháº¥y.

    Thread-safety:
        Thread-safe.

    Example:
        >>> pid = get_poe2_pid()
        >>> if pid is not None:
        ...     print(f"POE2 PID: {pid}")
    r   N)ÚPOE2_PROCESS_NAMESrD   )Ú	proc_nameÚpidss     r   rF   rF   }   s?   € õ" (ð ð ˆ	Ý# IÑ.Ô.ˆØð 	Ø˜”7ˆNˆNˆNð	àˆ4r   r#   c                 ó  — | r| dk    rdS t           �P	 t          j        | ¦  «        }|                     ¦   «         }|r|                     ¦   «         S n# t          $ r Y nw xY wt
          j        dk    �rd}t          j        j        }| 	                    |d| ¦  «        }|rê	 t          j
        d¦  «        }t          j                             d¦  «        }|                     |d|t          j        |¦  «        ¦  «        rKt
          j                             |j        ¦  «                             ¦   «         |                     |¦  «         S n# t          $ r Y nw xY w|                     |¦  «         n# |                     |¦  «         w xY wdS )uì  Láº¥y tÃªn tá»‡p thá»±c thi (lowercase) cá»§a tiáº¿n trÃ¬nh tá»« Process ID (PID).

    Æ¯u tiÃªn tra cá»©u qua psutil náº¿u cÃ³ sáºµn, vÃ  tá»± Ä‘á»™ng fallback vá»� Win32
    QueryFullProcessImageNameW (PROCESS_QUERY_LIMITED_INFORMATION) khÃ´ng cáº§n quyá»�n Admin.

    Args:
        pid: Process ID cáº§n kiá»ƒm tra.

    Returns:
        str: TÃªn tá»‡p thá»±c thi dáº¡ng chá»¯ thÆ°á»�ng (vÃ­ dá»¥: 'pathofexile.exe'), hoáº·c chuá»—i rá»—ng.

    Thread-safety:
        Thread-safe.
    r   Ú Nr$   i   Fi   )r'   ÚProcessr    r&   r0   r1   r   r2   r3   ÚOpenProcessÚcreate_unicode_bufferr   r   ÚQueryFullProcessImageNameWr:   ÚpathÚbasenamer7   r<   )r#   Úpr    Ú!PROCESS_QUERY_LIMITED_INFORMATIONr3   Úh_procÚbufÚsizes           r   Úget_process_name_by_pidrY   •   s£  € ð ð �#˜’(�(Øˆrõ Ðð	Ý”˜sÑ#Ô#ˆAØ—6’6‘8”8ˆDØð $Ø—z’z‘|”|Ð#ð$øåð 	ð 	ð 	ØˆDð	øøøõ 
„w�$‚�Ø,2Ð)Ý”=Ô)ˆØ×%Ò%Ð&GÈÐPSÑTÔTˆØð 		-ð-ÝÔ2°3Ñ7Ô7�Ý”×,Ò,¨SÑ1Ô1�Ø×6Ò6°v¸qÀ#ÅvÄ|ÐTXÑGYÔGYÑZÔZð ?Ýœ7×+Ò+¨C¬IÑ6Ô6×<Ò<Ñ>Ô>ð ×$Ò$ VÑ,Ô,Ð,Ð,ð?øåð ð ð Ø�ðøøøð ×$Ò$ VÑ,Ô,Ð,Ð,ø�×$Ò$ VÑ,Ô,Ð,Ð,øøøàˆ2s<   “=A Á
AÁAÂ BE	 ÅE/ Å	
EÅE/ ÅEÅE/ Å/Fc                 óB   — t          | ¦  «        }|sdS |t          v pd|v S )ux  Kiá»ƒm tra xem Process ID (PID) cÃ³ thuá»™c vá»� tiáº¿n trÃ¬nh game Path of Exile 2 hay khÃ´ng.

    Ä�á»‘i chiáº¿u tÃªn tá»‡p thá»±c thi vá»›i POE2_PROCESS_NAMES hoáº·c chuá»—i 'pathofexile'.

    Args:
        pid: Process ID cáº§n kiá»ƒm tra.

    Returns:
        bool: True náº¿u lÃ  tiáº¿n trÃ¬nh POE2, ngÆ°á»£c láº¡i False.

    Thread-safety:
        Thread-safe.
    FÚpathofexile)rY   rI   )r#   r    s     r   Úis_poe2_pidr\   Ä   s4   € õ # 3Ñ'Ô'€DØð ØˆuØÕ%Ð%Ð>¨¸$Ð)>Ð>r   )Ú__doc__r   Úctypes.wintypesr1   Útypingr   r   r'   Ú_HAS_PSUTILÚImportErrorrI   r5   Ú	Structurer   Ústrr,   rD   ÚboolrG   rF   rY   r\   r   r   r   ú<module>re      sr  ððð ð €€€Ø Ð Ð Ð Ø 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !ðØ€M€M€MØ€K€KøØð ð ð Ø€FØ€K€K€KðøøøðÐ ð  Ð ðð ð ð ð �vÔ'ñ ô ð ð9˜sð 9 t¨C¤yð 9ð 9ð 9ð 9ðx&˜ð &ð &ð &ð &ð$�h˜s”mð ð ð ð ð0, ð ,¨ð ,ð ,ð ,ð ,ð^?�Sð ?˜Tð ?ð ?ð ?ð ?ð ?ð ?s   ˜ Ÿ	+ª+