1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
U
X±dvPã@sÐddlZddlZddlmZdd„ZdZdd„Zdd    „Zd
d „ZGd d „d ƒZ    d$dd„Z
dd„Z Gdd„dƒZ Gdd„dƒZ Gdd„dƒZGdd„dƒZdd„ZGdd„dƒZGdd„dƒZd d!„Zd"d#„ZdS)%éN)Úwin32apicCs<z tj|dd}t|jjd@ƒWStk
r6YdSXdS)ab
    Checks if the specified PE file has CFG (Control Flow Guard) enabled.
 
    Parameters
    ----------
    filename : str
        Path to the PE file to inspect.
 
    Returns
    ----------
    bool
        True if file is a PE file with CFG enabled. False if CFG is not enabled or if file could not be processed using
        the pefile library.
    T©Z    fast_loadi@FN)ÚpefileÚPEÚboolZOPTIONAL_HEADERZDllCharacteristicsÚ    Exception)ÚfilenameÚpe©r
úZd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\PyInstaller/utils/win32/versioninfo.pyÚpefile_check_control_flow_guards
r écCs
| d¡S)zL
    Encodes text as UTF-16LE (Microsoft 'Unicode') for use in structs.
    úUTF-16LE)Úencode)Útextr
r
r ÚgetRaw0srcCsbt |dt¡}t |tjd¡}t|ƒs,dSt |tjd|d¡}tƒ}|     |¡t 
|¡|S)z–
    Read the version information structure from the given executable's resources, and return it as an instance of
    `VSVersionInfo` structure.
    rÚ
RT_VERSIONN) rZ LoadLibraryExÚLOAD_LIBRARY_AS_DATAFILEZEnumResourceNamesrÚ RESOURCE_TYPEÚlenZ LoadResourceÚ VSVersionInfoÚfromRawÚ FreeLibrary)Ú exe_filenameÚhÚresÚdataÚinfor
r
r Ú!read_version_info_from_executable7s
 
rcCs|dd?d>S)z5
    Align `offset` to the next 4-byte boundary.
    ér r
)Úoffsetr
r
r Ú    nextDWordGsr!c@sDeZdZdZddd„Zdd„Zdd„Zd    d
„Zdd d „Zdd„Z    dS)ra
    WORD  wLength;        // length of the VS_VERSION_INFO structure
    WORD  wValueLength;   // length of the Value member
    WORD  wType;          // 1 means text, 0 means binary
    WCHAR szKey[];        // Contains the Unicode string "VS_VERSION_INFO".
    WORD  Padding1[];
    VS_FIXEDFILEINFO Value;
    WORD  Padding2[];
    WORD  Children[];     // zero or more StringFileInfo or VarFileInfo
                          // structures (or both) that are children of the
                          // current version structure.
    NcCs||_|p g|_dS©N©ÚffiÚkids)Úselfr$r%r
r
r Ú__init__[szVSVersionInfo.__init__c    CsØt|ƒ\}\}}}}t|ƒ}tƒ|_|j ||¡}|}||krÔ|}t||ƒ\}\}}    }
}| ¡dkr”tƒ} |  ||    |||||¡} |j | ¡| }n.t    ƒ} |  ||    |||||¡} |j | ¡| }||}t|ƒ}q6|S©NÚStringFileInfo)
Ú parseCommonr!Ú FixedFileInfor$rÚstripr)r%ÚappendÚ VarFileInfo)r&rÚiÚsublenÚvallenÚwTypeÚnmÚjZcsublenZcvallenZctypZsfiÚkZvfir
r
r r_s(   
zVSVersionInfo.fromRawc    Cs°tdƒ}|j ¡}t|ƒ}d}dt|ƒd}d}|dr>d}|t|ƒ|}d}|dr^d}d dd    „|jDƒ¡}|t|ƒt|ƒ}t d
|||¡|d||||S) NZVS_VERSION_INFOrér óéócSsg|] }| ¡‘qSr
©ÚtoRaw©Ú.0Úkidr
r
r Ú
<listcomp>…sz'VSVersionInfo.toRaw.<locals>.<listcomp>Úhhh)rr$r;rÚjoinr%ÚstructÚpack)    r&Úraw_nameZrawffir1Útypr0ÚpadZpad2Útmpr
r
r r;xs
zVSVersionInfo.toRawcCs | ¡|kSr"r:©r&Úotherr
r
r Ú__eq__‰szVSVersionInfo.__eq__Úc s`ˆd‰‡fdd„|jDƒ}d |¡}d dddd    d
ˆd |j ˆ¡›d ˆd |ˆddg
¡S)Nú  csg|]}| ˆd¡‘qS)rL©Ú__str__r<©Úindentr
r r?Žsz)VSVersionInfo.__str__.<locals>.<listcomp>ú, 
Ú
z# UTF-8ú#z3# For more details about fixed file info 'ffi' see:z7# http://msdn.microsoft.com/en-us/library/ms646997.aspxzVSVersionInfo(zffi=ú,zkids=[ú]ú))r%rAr$rN©r&rPrGr
rOr rNŒs
özVSVersionInfo.__str__cCsd|j|jfS)Nz*versioninfo.VSVersionInfo(ffi=%r, kids=%r)r#©r&r
r
r Ú__repr__szVSVersionInfo.__repr__)NN)rK©
Ú__name__Ú
__module__Ú __qualname__Ú__doc__r'rr;rJrNrYr
r
r
r rNs
 
rcCsF|d}t d|||…¡\}}}t||||ƒ\}}|||||ffS)Nr6Z3h)rBÚunpackÚ parseUString)rÚstartr/ZwLengthÚ wValueLengthr2rr
r
r r*¡sr*cCsN|}||kr,|||d…dkr"q,|d7}q|||… d¡}|d7}||fS)Nr r9r)Údecode)rraÚlimitr/rr
r
r r`¨s
r`c@sDeZdZdZddd    „Zd
d „Zd d „Zdd„Zddd„Zdd„Z    dS)r+aü
    DWORD dwSignature;        //Contains the value 0xFEEFO4BD
    DWORD dwStrucVersion;     // binary version number of this structure.
                              // The high-order word of this member contains
                              // the major version number, and the low-order
                              // word contains the minor version number.
    DWORD dwFileVersionMS;    // most significant 32 bits of the file's binary
                              // version number
    DWORD dwFileVersionLS;    //
    DWORD dwProductVersionMS; // most significant 32 bits of the binary version
                              // number of the product with which this file was
                              // distributed
    DWORD dwProductVersionLS; //
    DWORD dwFileFlagsMask;    // bitmask that specifies the valid bits in
                              // dwFileFlags. A bit is valid only if it was
                              // defined when the file was created.
    DWORD dwFileFlags;        // VS_FF_DEBUG, VS_FF_PATCHED etc.
    DWORD dwFileOS;           // VOS_NT, VOS_WINDOWS32 etc.
    DWORD dwFileType;         // VFT_APP etc.
    DWORD dwFileSubtype;      // 0 unless VFT_DRV or VFT_FONT or VFT_VXD
    DWORD dwFileDateMS;
    DWORD dwFileDateLS;
    ©rrrré?réé©rrc        Csªd|_d|_|dd>|dd@B|_|dd>|dd@B|_|dd>|dd@B|_|dd>|dd@B|_||_||_||_||_    ||_
|d|_ |d|_ dS)    Nl½Þ}irérhéÿÿr r) ÚsigÚ strucVersionÚ fileVersionMSÚ fileVersionLSÚproductVersionMSÚproductVersionLSÚ fileFlagsMaskÚ    fileFlagsÚfileOSÚfileTypeÚ fileSubtypeÚ
fileDateMSÚ
fileDateLS)    r&ZfileversZprodversÚmaskÚflagsZOSruÚsubtypeÚdater
r
r r'Ës 
zFixedFileInfo.__init__cCsTt d|||d…¡\ |_|_|_|_|_|_|_|_    |_
|_ |_ |_ |_|dS)NÚ13Lé4)rBr_rlrmrnrorprqrrrsrtrurvrwrx)r&rr/r
r
r räs òzFixedFileInfo.fromRawcCs>t d|j|j|j|j|j|j|j|j    |j
|j |j |j |j¡S)Nr})rBrCrlrmrnrorprqrrrsrtrurvrwrxrXr
r
r r;ös òzFixedFileInfo.toRawcCs | ¡|kSr"r:rHr
r
r rJszFixedFileInfo.__eq__rKcCsØ|jd?|jd@|jd?|jd@f}|jd?|jd@|jd?|jd@f}|j|jf}dddd|fd|fdd    t|jƒd
d t|jƒd d dt|j    ƒdddt|j
ƒdddt|j ƒdd|fdg}d|›d  |¡S)NrjrkzFixedFileInfo(zN# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)z!# Set not needed items to zero 0.z filevers=%s,z prodvers=%s,z;# Contains a bitmask that specifies the valid bits 'flags'rzmask=%s,zG# Contains a bitmask that specifies the Boolean attributes of the file.z    flags=%s,z8# The operating system for which this file was designed.z-# 0x4 - NT and there is no need to change it.zOS=%s,z# The general type of file.z## 0x1 - the file is an application.z fileType=%s,z# The function of the file.z5# 0x0 - the function is not defined for this fileTypez subtype=%s,z# Creation date and time stamp.zdate=%srVrRrL) rnrorprqrwrxÚhexrrrsrtrurvrA)r&rPÚfvÚpvÚfdrGr
r
r rN sDþþ      ëzFixedFileInfo.__str__c    Csv|jd?|jd@|jd?|jd@f}|jd?|jd@|jd?|jd@f}|j|jf}d|||j|j|j|j    |j
|fS)Nrjrkzwversioninfo.FixedFileInfo(filevers=%r, prodvers=%r, mask=0x%x, flags=0x%x, OS=0x%x, fileType=%r, subtype=0x%x, date=%r)) rnrorprqrwrxrrrsrtrurv)r&r€rr‚r
r
r rY.sþþ ýÿzFixedFileInfo.__repr__N)rererfrrgrhrri)rKrZr
r
r
r r+³s÷
 
#r+c@sDeZdZdZddd„Zdd„Zdd„Zd    d
„Zdd d „Zdd„Z    dS)r)a»
    WORD        wLength;      // length of the version resource
    WORD        wValueLength; // length of the Value member in the current
                              // VS_VERSION_INFO structure
    WORD        wType;        // 1 means text, 0 means binary
    WCHAR       szKey[];      // Contains the Unicode string 'StringFileInfo'.
    WORD        Padding[];
    StringTable Children[];   // list of zero or more String structures
    NcCsd|_|p g|_dSr(©Únamer%©r&r%r
r
r r'JszStringFileInfo.__init__c    Cs8||_||kr4tƒ}| |||¡}|j |¡|}q|Sr")r„Ú StringTablerr%r-)    r&r0r1r„rr/rdÚstr4r
r
r rNs zStringFileInfo.fromRawcCs|t|jƒ}d}d}dt|ƒd}d}|dr2d}d dd    „|jDƒ¡}|t|ƒt|ƒ}t d
|||¡|d||S) Nrrhr6r r7r8r9cSsg|] }| ¡‘qSr
r:r<r
r
r r?_sz(StringFileInfo.toRaw.<locals>.<listcomp>r@)rr„rrAr%rBrC)r&rDr1rEr0rFrGr
r
r r;Ws
zStringFileInfo.toRawcCs | ¡|kSr"r:rHr
r
r rJcszStringFileInfo.__eq__rKcs>|d‰d ‡fdd„|jDƒ¡}|›dˆ›d|›dˆ›dS)    NrLrQc3s|]}| ˆ¡VqdSr"rMr<©Ú
new_indentr
r Ú    <genexpr>hsz)StringFileInfo.__str__.<locals>.<genexpr>zStringFileInfo(
z[
rRú])©rAr%rWr
rˆr rNfszStringFileInfo.__str__cCs
d|jS)Nzversioninfo.StringFileInfo(%r)©r%rXr
r
r rYkszStringFileInfo.__repr__)N)rKrZr
r
r
r r)@s    
     
r)c@sDeZdZdZddd„Zdd„Zdd„Zd    d
„Zdd d „Zdd„Z    dS)r†z
    WORD   wLength;
    WORD   wValueLength;
    WORD   wType;
    WCHAR  szKey[];
    String Children[];    // list of zero or more String structures.
    NcCs|pd|_|pg|_dS©NrKrƒ©r&r„r%r
r
r r'ws
zStringTable.__init__c    Cs\t|||ƒ\}\}}}|_t|ƒ}||krXtƒ}| |||¡}|}|j |¡t|ƒ}q"|Sr")Ú parseCodePager„r!Ú StringStructrr%r-)    r&rr/rdZcpsublenZcpwValueLengthZcpwTypeÚssr4r
r
r r{s 
zStringTable.fromRawcCsŠt|jƒ}d}d}dt|ƒd}g}|jD]*}| ¡}t|ƒdrL|d}| |¡q,d |¡}|t|ƒ7}t d|||¡|d|S)    Nrrhr6r r8r9r7r@)    rr„rr%r;r-rArBrC)r&rDr1rEr0rGr>Úrawr
r
r r;†s
 
 
 zStringTable.toRawcCs | ¡|kSr"r:rHr
r
r rJ•szStringTable.__eq__rKc
CsF|d}d| dd„|jDƒ¡}|›d|›d|j›d|›d|›d    
S)
NrLz,
css|]}t|ƒVqdSr"©Ústrr<r
r
r rŠšsz&StringTable.__str__.<locals>.<genexpr>z StringTable(
ú'z',
ú[r‹)rAr%r„)r&rPr‰rGr
r
r rN˜szStringTable.__str__cCsd|j|jfS)Nzversioninfo.StringTable(%r, %r)rƒrXr
r
r rYszStringTable.__repr__)NN)rKrZr
r
r
r r†os
 
r†c@sDeZdZdZddd„Zdd„Zdd„Zd    d
„Zdd d „Zdd„Z    dS)r‘z‚
    WORD   wLength;
    WORD   wValueLength;
    WORD   wType;
    WCHAR  szKey[];
    WORD   Padding[];
    String Value[];
    NcCs|pd|_|pd|_dSrŽ©r„Úval)r&r„r™r
r
r r'ªs
zStringStruct.__init__cCs>t||ƒ\}\}}}|_||}t|ƒ}t|||ƒ\}|_|Sr")r*r„r!r`r™)r&rr/rdr0r1rEr
r
r r®s
zStringStruct.fromRawcCs~t|jƒ}t|jƒ}t|jƒd}d}dt|ƒd}d}|drFd}|t|ƒ|d}t d|||¡|d||dS)Nrhr6r r7r8r9r@)rr„r™rrBrC)r&rDZraw_valr1rEr0rFr
r
r r;µs
 
zStringStruct.toRawcCs | ¡|kSr"r:rHr
r
r rJÂszStringStruct.__eq__rKcCsd|j|jfS)NzStringStruct('%s', '%s')r˜©r&rPr
r
r rNÅszStringStruct.__str__cCsd|j|jfS)Nz versioninfo.StringStruct(%r, %r)r˜rXr
r
r rYÈszStringStruct.__repr__)NN)rKrZr
r
r
r r‘¡s
 
r‘cCs&t||ƒ\}\}}}}|||||ffSr")r*)rr/rdr0rbr2r3r
r
r rÌsrc@sDeZdZdZddd„Zdd„Zdd„Zd    d
„Zdd d „Zdd„Z    dS)r.a—
    WORD  wLength;        // length of the version resource
    WORD  wValueLength;   // length of the Value member in the current
                          // VS_VERSION_INFO structure
    WORD  wType;          // 1 means text, 0 means binary
    WCHAR szKey[];        // Contains the Unicode string 'VarFileInfo'.
    WORD  Padding[];
    Var   Children[];     // list of zero or more Var structures
    NcCs|pg|_dSr"rr…r
r
r r'ÛszVarFileInfo.__init__c    CsL||_||_||_t|ƒ}||krHtƒ}| |||¡}|j |¡|}q|Sr")r0r1r„r!Ú    VarStructrr%r-)    r&r0r1r„rr/rdÚvsr4r
r
r rÞs zVarFileInfo.fromRawcCsŽd|_d|_d|_t|jƒ}dt|ƒd}d}|dr<d}d d    d
„|jDƒ¡}|t|ƒt|ƒ|_t     d |j|j|j¡|d||S) Nrrhr.r6r r7r8r9cSsg|] }| ¡‘qSr
r:r<r
r
r r?ósz%VarFileInfo.toRaw.<locals>.<listcomp>r@)
r1r2r„rrrAr%r0rBrC©r&rDr0rFrGr
r
r r;ês
zVarFileInfo.toRawcCs | ¡|kSr"r:rHr
r
r rJ÷szVarFileInfo.__eq__rKcCs|dd dd„|jDƒ¡S)NzVarFileInfo([%s])z, css|]}t|ƒVqdSr"r”r<r
r
r rŠûsz&VarFileInfo.__str__.<locals>.<genexpr>rŒršr
r
r rNúszVarFileInfo.__str__cCs
d|jS)Nzversioninfo.VarFileInfo(%r)rrXr
r
r rYýszVarFileInfo.__repr__)N)rKrZr
r
r
r r.Ñs    
 
r.c@sDeZdZdZddd„Zdd„Zdd„Zd    d
„Zdd d „Zdd„Z    dS)r›a
    WORD  wLength;        // length of the version resource
    WORD  wValueLength;   // length of the Value member in the current
                          // VS_VERSION_INFO structure
    WORD  wType;          // 1 means text, 0 means binary
    WCHAR szKey[];        // Contains the Unicode string 'Translation'
                          // or a user-defined key string value
    WORD  Padding[];      //
    WORD  Value[];        // list of one or more values that are language
                          // and code-page identifiers
    NcCs|pd|_|pg|_dSrŽrƒrr
r
r r' s
zVarStruct.__init__cCsnt||ƒ\}\|_|_|_|_t|ƒ}td|jdƒD]4}t d|||d…¡d}|j     
|¡|d7}q4|S)Nrr r) r*r0rbr2r„r!ÚrangerBr_r%r-)r&rr/rdr4r>r
r
r rs 
zVarStruct.fromRawcCst|jƒd|_d|_t|jƒ}dt|ƒd}d}|dr@d}|t|ƒ|j|_d dd„|jDƒ¡}t     d    |j|j|j¡|d||S)
Nr rr6r7r8r9cSsg|]}t d|¡‘qS)r)rBrCr<r
r
r r?#sz#VarStruct.toRaw.<locals>.<listcomp>r@)
rr%rbr2rr„r0rArBrCrr
r
r r;s
zVarStruct.toRawcCs | ¡|kSr"r:rHr
r
r rJ&szVarStruct.__eq__rKcCsd|j|jfS)NzVarStruct('%s', %r)rƒršr
r
r rN)szVarStruct.__str__cCsd|j|jfS)Nzversioninfo.VarStruct(%r, %r)rƒrXr
r
r rY,szVarStruct.__repr__)NN)rKrZr
r
r
r r›s
     
r›c
Csddlmm}t|dƒ}| | ¡¡}W5QRXz t|ƒ}Wn,tk
rn}ztdƒ|‚W5d}~XYnXt    |t
ƒsŒt dt |ƒ›ƒ‚|S)z±
    Load the `VSVersionInfo` structure from its string-based (`VSVersionInfo.__str__`) serialization by reading the
    text from the file and running it through `eval()`.
    rNÚrbzCFailed to deserialize VSVersionInfo from text-based representation!zALoaded incompatible structure type! Expected VSVersionInfo, got: ) ZPyInstaller.utils.miscÚutilsÚmiscÚopenrcÚreadÚevalrÚ
ValueErrorÚ
isinstancerÚAssertionErrorÚtype)rZ    miscutilsÚfprrÚer
r
r Ú load_version_info_from_text_file0s    ÿr«c    Cs¨t|tƒst‚tj|dd}| ¡}| ¡t |d¡}t     |tj
dd|  ¡¡t  |d¡|r¤tj|dd}| ¡}| ¡|s¤t |dƒ}| |¡W5QRXdS)NTrrrrhÚab)r¦rr§rrZ get_overlayÚcloserZBeginUpdateResourceZUpdateResourcerr;ZEndUpdateResourcer¢Úwrite)rrr    Zoverlay_beforeZhdstZ overlay_afterZexefr
r
r Ú write_version_info_to_executableHs   r¯)r)rBrZPyInstaller.compatrr rrrr!rr*r`r+r)r†r‘rr.r›r«r¯r
r
r
r Ú<module> s( S
 /2+0/