Compare commits
616 Commits
2025.03.15
...
developmen
| Author | SHA1 | Date |
|---|---|---|
|
|
9c8ca1cae0 | |
|
|
9bb33a858e | |
|
|
eb413ad364 | |
|
|
086f733d70 | |
|
|
7492c7324e | |
|
|
d2cd4a73bc | |
|
|
2fee04077c | |
|
|
46fed4403e | |
|
|
d8cf0c75a9 | |
|
|
4ee0bd3658 | |
|
|
7deedf24d8 | |
|
|
4d9e042104 | |
|
|
9ff929a3c8 | |
|
|
6f140bf25c | |
|
|
ff2f3da5e6 | |
|
|
6616cce5f2 | |
|
|
39de4d9660 | |
|
|
6a79373bc5 | |
|
|
990cf3f9ad | |
|
|
9516f7c92f | |
|
|
e849e2e533 | |
|
|
1a95cec061 | |
|
|
21ddb12977 | |
|
|
6f2aeabb78 | |
|
|
dfcdcaea08 | |
|
|
e098eb9b89 | |
|
|
3e3e994f14 | |
|
|
9bfcc8b3a7 | |
|
|
e2b6d3e870 | |
|
|
57653c158f | |
|
|
0a1f454d7d | |
|
|
a41f18684e | |
|
|
a7afd8e176 | |
|
|
c9ce5b8f8c | |
|
|
3043594fb2 | |
|
|
0dbc0ad45e | |
|
|
4f40f6e7ca | |
|
|
03d515ddaa | |
|
|
69e2b94500 | |
|
|
36970b4ce0 | |
|
|
44673cd63c | |
|
|
692a5ceaee | |
|
|
9956a2fc39 | |
|
|
98dc763c5a | |
|
|
9c2c21af20 | |
|
|
c0f65673b4 | |
|
|
a63852c174 | |
|
|
9e4550a462 | |
|
|
e7fb94d08a | |
|
|
6088fc5e94 | |
|
|
77d17997d7 | |
|
|
a6d430b287 | |
|
|
6f605462bb | |
|
|
c685199f19 | |
|
|
d6ac633e37 | |
|
|
7fafa11b91 | |
|
|
b90140a155 | |
|
|
dbb6f2dabc | |
|
|
a8133a59e0 | |
|
|
3b0045a4bb | |
|
|
659832321b | |
|
|
a0a37d7bc4 | |
|
|
34fb2a0d31 | |
|
|
8592a6d4b6 | |
|
|
4b627a31d7 | |
|
|
130055bde1 | |
|
|
5e5ef12c29 | |
|
|
9b09e83c0c | |
|
|
7ec6c02cb5 | |
|
|
0ed945af36 | |
|
|
ce1cf27630 | |
|
|
78a84772e4 | |
|
|
717650d514 | |
|
|
44126f7709 | |
|
|
164af2ee2e | |
|
|
7495dada6b | |
|
|
06a884c1d4 | |
|
|
1740108ccd | |
|
|
01fb912331 | |
|
|
7cbe41aea4 | |
|
|
eb48012820 | |
|
|
2827f8816b | |
|
|
92e47bed1d | |
|
|
2ebda66ea0 | |
|
|
00d8ef35f9 | |
|
|
b7076f6950 | |
|
|
e1833bc9f3 | |
|
|
d016bc7a5f | |
|
|
aa5c5b5366 | |
|
|
96da258285 | |
|
|
52757b70c9 | |
|
|
bcf0907f13 | |
|
|
c1166c4c6e | |
|
|
3c23e02336 | |
|
|
37f01f86b8 | |
|
|
17103dbdb2 | |
|
|
9a1fe10a70 | |
|
|
0b240928b9 | |
|
|
eb28c690d8 | |
|
|
db9aef716f | |
|
|
71e63838fd | |
|
|
210b836600 | |
|
|
0145bed572 | |
|
|
44353ca9c8 | |
|
|
6c7cc74bc8 | |
|
|
8ff96e93f9 | |
|
|
2b3d38a835 | |
|
|
37270f3dda | |
|
|
5e11b0269f | |
|
|
4cbf05a0b0 | |
|
|
411caec5b7 | |
|
|
16274f7b7f | |
|
|
4c1fa03c49 | |
|
|
9f81784574 | |
|
|
c908e041ab | |
|
|
8968b79e72 | |
|
|
ae073d13fd | |
|
|
b9e91bc403 | |
|
|
ef01966d25 | |
|
|
de26be0682 | |
|
|
22882bff77 | |
|
|
9f7ec9f7b3 | |
|
|
cf7bb5856b | |
|
|
95309a4db6 | |
|
|
92c3720708 | |
|
|
b0731c6327 | |
|
|
0f6f25cc60 | |
|
|
0922b2e0ce | |
|
|
7cbbc5c48c | |
|
|
d681f1ba83 | |
|
|
f1f43ac192 | |
|
|
d960ab2d07 | |
|
|
99f4f0e8ce | |
|
|
c87c4fa82d | |
|
|
d242f523dd | |
|
|
f0a8f403e8 | |
|
|
1540b90e58 | |
|
|
b5d1735ea0 | |
|
|
62d1bb3f5d | |
|
|
4570584b6d | |
|
|
60da1d99e5 | |
|
|
a7b8a02336 | |
|
|
9da1f50098 | |
|
|
2a48580867 | |
|
|
d27fe4807f | |
|
|
c5d702aa90 | |
|
|
007a5efaed | |
|
|
7cb02a1d93 | |
|
|
8fe1486f16 | |
|
|
21bfec9268 | |
|
|
4f0d091543 | |
|
|
2551e5f81b | |
|
|
39e80d521d | |
|
|
39bf2e5ee3 | |
|
|
ead42e2b56 | |
|
|
7c92f53fe3 | |
|
|
cdf5219af4 | |
|
|
5278512903 | |
|
|
0dba857fd6 | |
|
|
0156fe7469 | |
|
|
35da97cda3 | |
|
|
dd4f196769 | |
|
|
c64f7784ab | |
|
|
8fa6c4f8f6 | |
|
|
c03d34e1b3 | |
|
|
a2ea0a4348 | |
|
|
1ffb6c08c6 | |
|
|
c831898485 | |
|
|
b37131ba6c | |
|
|
ff130fa599 | |
|
|
6c3a5cf811 | |
|
|
92a8917849 | |
|
|
8719e57289 | |
|
|
f8c4c63a83 | |
|
|
1fe5ffde8c | |
|
|
a8b1adc19a | |
|
|
f15078118c | |
|
|
a8429bec38 | |
|
|
b811ac0d51 | |
|
|
bc5f0cdc29 | |
|
|
cd0270b60e | |
|
|
89365c3164 | |
|
|
aac4554549 | |
|
|
9e1eb88044 | |
|
|
bf25d35956 | |
|
|
9fc3f2ad53 | |
|
|
fe4f2faa99 | |
|
|
ef068b4af2 | |
|
|
c84970b333 | |
|
|
c0ce2d7d2f | |
|
|
98da6c03d7 | |
|
|
332f810349 | |
|
|
8e9e4b9ee1 | |
|
|
444b7f9f0d | |
|
|
e14d7dcbaa | |
|
|
8fdfb68ebf | |
|
|
583658fba8 | |
|
|
5b6fb3a76b | |
|
|
c570230060 | |
|
|
db2b45b04f | |
|
|
d50f4c3ad6 | |
|
|
66860fef76 | |
|
|
e0a994a66c | |
|
|
02f5e6e0f4 | |
|
|
d2a0ca99d1 | |
|
|
e6bfcc791d | |
|
|
676e78c82b | |
|
|
7d8709e892 | |
|
|
73b6ce65a2 | |
|
|
1d83805c5d | |
|
|
f33a09767e | |
|
|
cf8b7f70a7 | |
|
|
1f5c310733 | |
|
|
fae79cf767 | |
|
|
773482db87 | |
|
|
077d26eaec | |
|
|
9fe3f5b9c4 | |
|
|
7d61a38dcc | |
|
|
02f55af8a8 | |
|
|
6ca277d3d4 | |
|
|
d572b8020e | |
|
|
e68cdecad7 | |
|
|
57db42ef03 | |
|
|
9df2a03be6 | |
|
|
9c953264c9 | |
|
|
4c38fc2d2a | |
|
|
41f1bee185 | |
|
|
0310c20463 | |
|
|
fa61862986 | |
|
|
1dc5df6153 | |
|
|
65a13352a7 | |
|
|
7f8cd6c3c1 | |
|
|
9e7937cb21 | |
|
|
25d57b00c9 | |
|
|
abb841c923 | |
|
|
df5f2ef1a6 | |
|
|
e1f68cc259 | |
|
|
8a5a0c610e | |
|
|
a0f4fe8a4d | |
|
|
bc9c79d899 | |
|
|
1e29743f82 | |
|
|
088b088a86 | |
|
|
3b8c001d6e | |
|
|
2fe189dcd6 | |
|
|
9e6cc1082c | |
|
|
5e8376380f | |
|
|
e3ffc0c440 | |
|
|
fdd75d6182 | |
|
|
8b7a6d38b9 | |
|
|
e11f5b7eaa | |
|
|
2a0e261490 | |
|
|
bddcd04210 | |
|
|
2d75fdcaa3 | |
|
|
4df07c4367 | |
|
|
3c828bcd3e | |
|
|
3840066e6c | |
|
|
ab9995c1ce | |
|
|
0fa21ab247 | |
|
|
eb34cd82f5 | |
|
|
d63dcca594 | |
|
|
f113c00e25 | |
|
|
56f0fbd3ed | |
|
|
3706462d13 | |
|
|
a598cef999 | |
|
|
70289dc646 | |
|
|
d2bd33cdeb | |
|
|
252413c1dd | |
|
|
489f2bc3c3 | |
|
|
d317a51343 | |
|
|
838b302672 | |
|
|
43857d4831 | |
|
|
91a7ae98ad | |
|
|
25b7be77b7 | |
|
|
07716bebab | |
|
|
92740e4dac | |
|
|
ca9175f180 | |
|
|
2582f42f09 | |
|
|
6cd4c50f01 | |
|
|
31373bc3a4 | |
|
|
a77c6ce347 | |
|
|
77fa9df439 | |
|
|
8efd8ce13f | |
|
|
1846a153ce | |
|
|
faddbfcfa5 | |
|
|
5a4407ec5e | |
|
|
fee38954f7 | |
|
|
5d6a28efa8 | |
|
|
96e8d54d80 | |
|
|
7008699610 | |
|
|
14e72cfa10 | |
|
|
4020a5cee1 | |
|
|
24ee7c70e3 | |
|
|
8717849a7b | |
|
|
2195b5feaf | |
|
|
0d57e8f652 | |
|
|
568f53b1b6 | |
|
|
30d64b8a8d | |
|
|
55802e132c | |
|
|
0051b67dec | |
|
|
134e7ebb26 | |
|
|
a4f753e71f | |
|
|
e1e954b862 | |
|
|
caf2c41153 | |
|
|
d237bfe69f | |
|
|
968532794f | |
|
|
61215a2356 | |
|
|
b85b2f92d9 | |
|
|
85e0ff8579 | |
|
|
d6294a8370 | |
|
|
099a17a16a | |
|
|
dc3e8299d4 | |
|
|
7e31351107 | |
|
|
4803303d28 | |
|
|
3dc0f662fb | |
|
|
49c145e603 | |
|
|
05632f429a | |
|
|
5c84c5230d | |
|
|
28178084c6 | |
|
|
b9f4f834fa | |
|
|
f99c7c294b | |
|
|
dc3a12bb50 | |
|
|
dced055689 | |
|
|
531088c8eb | |
|
|
1b9b7664ec | |
|
|
54ddde3de0 | |
|
|
0b00197a4a | |
|
|
a1352559f0 | |
|
|
06cc3703ad | |
|
|
b711f19694 | |
|
|
c11e93f283 | |
|
|
cc983665bd | |
|
|
c4e61a5030 | |
|
|
22bae7bfe3 | |
|
|
d70428c1cf | |
|
|
64bc74a434 | |
|
|
88b268de05 | |
|
|
a04b3cafa2 | |
|
|
42d6a0fe68 | |
|
|
7ed54825a8 | |
|
|
9af3f860a6 | |
|
|
2c226c9147 | |
|
|
4f996a7276 | |
|
|
2dbe6c1600 | |
|
|
b79a172f3e | |
|
|
5a7cbc4a7b | |
|
|
0d2259a311 | |
|
|
6b2c8d1d26 | |
|
|
b5f6df737d | |
|
|
a4c45cf48d | |
|
|
608a10535c | |
|
|
f8cefad5c1 | |
|
|
56a151c06d | |
|
|
d9e0a2e3df | |
|
|
b79b1fd0e9 | |
|
|
566f0d07d5 | |
|
|
735d7d7450 | |
|
|
1ab2af295c | |
|
|
f28e7a3362 | |
|
|
35ca7ec4e8 | |
|
|
1503c00bfc | |
|
|
24644ed642 | |
|
|
351890978b | |
|
|
31f1fb6877 | |
|
|
a2af08bd33 | |
|
|
c3d608759b | |
|
|
7038b31e22 | |
|
|
a3fb148644 | |
|
|
5d4486e9b0 | |
|
|
950e4a7f07 | |
|
|
52ec21f647 | |
|
|
f4f93fbfb8 | |
|
|
6cacef3336 | |
|
|
9e6fc87773 | |
|
|
c84549a8ad | |
|
|
49ef645cb1 | |
|
|
cca598427f | |
|
|
c7d5592623 | |
|
|
4f0b68c69f | |
|
|
19bca832b3 | |
|
|
ee8d5ff93c | |
|
|
01daf5c5b8 | |
|
|
7f866fde29 | |
|
|
f73d41feba | |
|
|
a1abde511e | |
|
|
ecfc40fa58 | |
|
|
dc3b0a6540 | |
|
|
79539ee416 | |
|
|
badf2becf4 | |
|
|
e225968c4f | |
|
|
bb300b6d30 | |
|
|
dc96bc102b | |
|
|
232049df62 | |
|
|
c0d887dba5 | |
|
|
926a2187e8 | |
|
|
fc97d55786 | |
|
|
754b4666b5 | |
|
|
84668ac18d | |
|
|
3a5f352fa9 | |
|
|
9ce254418c | |
|
|
3522af5d80 | |
|
|
89033cb6ec | |
|
|
4c0c3cd3dc | |
|
|
ff890cfd84 | |
|
|
a185f6d548 | |
|
|
6cf7f60fff | |
|
|
e9e3596e1d | |
|
|
4fe2c45349 | |
|
|
bbec21fde3 | |
|
|
145c6a484a | |
|
|
575d823d76 | |
|
|
8e070b7677 | |
|
|
bffce5143e | |
|
|
59b458852a | |
|
|
e91ad3971f | |
|
|
2368bfe8de | |
|
|
a1ad4c00bb | |
|
|
731ccba006 | |
|
|
ab32791e06 | |
|
|
4f406b274e | |
|
|
68e80e6b3c | |
|
|
cd850f6c2c | |
|
|
e434db152f | |
|
|
64108f0b10 | |
|
|
cb3f626933 | |
|
|
f0dfb54262 | |
|
|
078ea3fcc1 | |
|
|
6c94327505 | |
|
|
b7407e075d | |
|
|
eda7c3296b | |
|
|
074edbeb81 | |
|
|
9a93383cb9 | |
|
|
7ebb9c7c66 | |
|
|
840d9d2e93 | |
|
|
a5c3f8ab48 | |
|
|
71e669822a | |
|
|
73a15c3112 | |
|
|
d868da4c53 | |
|
|
4aa51f20e9 | |
|
|
bd315bb656 | |
|
|
fe16e2f1ac | |
|
|
1097920f8d | |
|
|
8f97124495 | |
|
|
529f36dd14 | |
|
|
cf44e3446c | |
|
|
ad8cc1f4e8 | |
|
|
56195a3a66 | |
|
|
195e6ab3f3 | |
|
|
0eed5b590e | |
|
|
51924190ff | |
|
|
6a5dfa7bbe | |
|
|
a08ffbe39f | |
|
|
6cace9a982 | |
|
|
e3f67f9888 | |
|
|
7c83a4c9b3 | |
|
|
dbadb32bea | |
|
|
73613d17fe | |
|
|
156b0ebe6a | |
|
|
3cf0821495 | |
|
|
dc5c48446e | |
|
|
98291b35b7 | |
|
|
c589e7db3b | |
|
|
ad5e2d2ee2 | |
|
|
bec9333351 | |
|
|
bcdb5c5837 | |
|
|
e5cb193849 | |
|
|
736b2be377 | |
|
|
0fb8c3d263 | |
|
|
9fb30cc7b4 | |
|
|
7646a36dc9 | |
|
|
e9492e70d0 | |
|
|
d0eecd084e | |
|
|
699342d1b7 | |
|
|
2ea1f5b2a7 | |
|
|
f711458ff9 | |
|
|
9b57a49627 | |
|
|
8e71dad881 | |
|
|
2b10f47749 | |
|
|
2cd2476fbc | |
|
|
7065d6a7a0 | |
|
|
03aebe8a50 | |
|
|
5cf93e0c3a | |
|
|
9683bb38d0 | |
|
|
fe8e5a013e | |
|
|
65a087982b | |
|
|
23f0ece561 | |
|
|
abe77409b5 | |
|
|
a5cf563777 | |
|
|
32f42753fd | |
|
|
34705e27be | |
|
|
2aa48159b8 | |
|
|
58e7bf67bd | |
|
|
d88a62893a | |
|
|
2e3af1c9c9 | |
|
|
52e3121583 | |
|
|
4df4c2ec87 | |
|
|
5db5a106a0 | |
|
|
1eae9f72ea | |
|
|
655708309a | |
|
|
b2e6e501ba | |
|
|
9b7733598b | |
|
|
15b3035ffe | |
|
|
27bba69ea6 | |
|
|
8fe261cb82 | |
|
|
b1a14260f9 | |
|
|
df110dc06f | |
|
|
118d270d81 | |
|
|
1e9bae2021 | |
|
|
d01fcbdd34 | |
|
|
2223a7f10b | |
|
|
13b63bb2d4 | |
|
|
ba881ee3e8 | |
|
|
e125c96f05 | |
|
|
78ed057754 | |
|
|
fef5f2f2cd | |
|
|
2f6637f9cc | |
|
|
8197c96ce6 | |
|
|
cf64258e9b | |
|
|
33db0de838 | |
|
|
b75fdcd4a8 | |
|
|
a719a0f4b6 | |
|
|
972d296b5c | |
|
|
82c5725862 | |
|
|
167c8becfe | |
|
|
ab38798693 | |
|
|
f3862f4641 | |
|
|
d6cd31e1d3 | |
|
|
ff1b2b21b9 | |
|
|
e5ea90143f | |
|
|
f920310a93 | |
|
|
2d54cc46ec | |
|
|
fd153e701f | |
|
|
c5abf7dfc2 | |
|
|
f751f5bc18 | |
|
|
6a874665de | |
|
|
b4da6eda3c | |
|
|
c183595c1b | |
|
|
af7b4043a7 | |
|
|
72f159fa88 | |
|
|
acd8903e0b | |
|
|
2819790e13 | |
|
|
09c802bec5 | |
|
|
9f1e78710f | |
|
|
1976cdb01a | |
|
|
d519cd0e5b | |
|
|
822a86a483 | |
|
|
a5a25cc4a4 | |
|
|
c2615db58e | |
|
|
fc751c8d80 | |
|
|
5d7a71a2ca | |
|
|
02991d0cf6 | |
|
|
dcd4c069b1 | |
|
|
762b44d60d | |
|
|
90dec0a319 | |
|
|
7dfa4a736f | |
|
|
ec267b96c6 | |
|
|
93ae8b1560 | |
|
|
58cf1f8f5a | |
|
|
d36c3b0dfa | |
|
|
51b9e0ec08 | |
|
|
0288ff97fe | |
|
|
fb97407043 | |
|
|
5d6fe5e503 | |
|
|
6963ca7589 | |
|
|
3934a9ff96 | |
|
|
792b5fbaff | |
|
|
2c79b99644 | |
|
|
024b25a912 | |
|
|
16bf06d929 | |
|
|
60f9388938 | |
|
|
69df47aab7 | |
|
|
e40652fc5a | |
|
|
2df98d8074 | |
|
|
2a08360c67 | |
|
|
1bde29d9df | |
|
|
53637c610b | |
|
|
310935b749 | |
|
|
79e5e7ffcd | |
|
|
31993c2d58 | |
|
|
d659dc9a24 | |
|
|
a7e64fc72c | |
|
|
3caa50e4f2 | |
|
|
84a23f161f | |
|
|
54d8dd4c25 | |
|
|
0a6d8c5496 | |
|
|
c71327443d | |
|
|
298cf102be | |
|
|
8e52767d46 | |
|
|
cbc4896d43 | |
|
|
30fda8b41c | |
|
|
fd172927fe | |
|
|
ae8504f372 | |
|
|
1956402b30 | |
|
|
9eaa5f4553 | |
|
|
62421ffd16 | |
|
|
2192d19bed | |
|
|
8eb501713b | |
|
|
ca93f483fc | |
|
|
c2204b8431 | |
|
|
f2ee27b732 | |
|
|
66ddb4198e | |
|
|
5b2f5c4031 | |
|
|
04703952d6 | |
|
|
d1670eef81 | |
|
|
4d2d0bd410 | |
|
|
9b301b3c8d | |
|
|
b57b134b35 | |
|
|
8adaab5db5 | |
|
|
e8ffba6dcc | |
|
|
53d1123e83 | |
|
|
2cfccf8d5e | |
|
|
c113b20c4d | |
|
|
0939434287 | |
|
|
1218421857 | |
|
|
1c9d49af8c | |
|
|
0c4d84d0b2 | |
|
|
a3a96b71e4 |
|
|
@ -0,0 +1,148 @@
|
|||
---
|
||||
Checks: '
|
||||
-*,
|
||||
bugprone-argument-comment,
|
||||
bugprone-assert-side-effect,
|
||||
bugprone-bad-signal-to-kill-thread,
|
||||
bugprone-branch-clone,
|
||||
bugprone-copy-constructor-init,
|
||||
bugprone-dangling-handle,
|
||||
bugprone-dynamic-static-initializers,
|
||||
bugprone-fold-init-type,
|
||||
bugprone-forward-declaration-namespace,
|
||||
bugprone-forwarding-reference-overload,
|
||||
bugprone-inaccurate-erase,
|
||||
bugprone-incorrect-roundings,
|
||||
bugprone-integer-division,
|
||||
bugprone-lambda-function-name,
|
||||
bugprone-macro-parentheses,
|
||||
bugprone-macro-repeated-side-effects,
|
||||
bugprone-misplaced-operator-in-strlen-in-alloc,
|
||||
bugprone-misplaced-pointer-arithmetic-in-alloc,
|
||||
bugprone-misplaced-widening-cast,
|
||||
bugprone-move-forwarding-reference,
|
||||
bugprone-multiple-statement-macro,
|
||||
bugprone-no-escape,
|
||||
bugprone-parent-virtual-call,
|
||||
bugprone-posix-return,
|
||||
bugprone-reserved-identifier,
|
||||
bugprone-sizeof-container,
|
||||
bugprone-sizeof-expression,
|
||||
bugprone-spuriously-wake-up-functions,
|
||||
bugprone-string-constructor,
|
||||
bugprone-string-integer-assignment,
|
||||
bugprone-string-literal-with-embedded-nul,
|
||||
bugprone-suspicious-enum-usage,
|
||||
bugprone-suspicious-include,
|
||||
bugprone-suspicious-memset-usage,
|
||||
bugprone-suspicious-missing-comma,
|
||||
bugprone-suspicious-semicolon,
|
||||
bugprone-suspicious-string-compare,
|
||||
bugprone-suspicious-memory-comparison,
|
||||
bugprone-suspicious-realloc-usage,
|
||||
bugprone-swapped-arguments,
|
||||
bugprone-terminating-continue,
|
||||
bugprone-throw-keyword-missing,
|
||||
bugprone-too-small-loop-variable,
|
||||
bugprone-undefined-memory-manipulation,
|
||||
bugprone-undelegated-constructor,
|
||||
bugprone-unhandled-self-assignment,
|
||||
bugprone-unused-raii,
|
||||
bugprone-unused-return-value,
|
||||
bugprone-use-after-move,
|
||||
bugprone-virtual-near-miss,
|
||||
cert-dcl21-cpp,
|
||||
cert-dcl58-cpp,
|
||||
cert-err34-c,
|
||||
cert-err52-cpp,
|
||||
cert-err60-cpp,
|
||||
cert-flp30-c,
|
||||
cert-msc50-cpp,
|
||||
cert-msc51-cpp,
|
||||
cert-str34-c,
|
||||
cppcoreguidelines-interfaces-global-init,
|
||||
cppcoreguidelines-narrowing-conversions,
|
||||
cppcoreguidelines-pro-type-member-init,
|
||||
cppcoreguidelines-pro-type-static-cast-downcast,
|
||||
cppcoreguidelines-slicing,
|
||||
google-default-arguments,
|
||||
google-explicit-constructor,
|
||||
google-runtime-operator,
|
||||
hicpp-exception-baseclass,
|
||||
hicpp-multiway-paths-covered,
|
||||
misc-misplaced-const,
|
||||
misc-new-delete-overloads,
|
||||
misc-no-recursion,
|
||||
misc-non-copyable-objects,
|
||||
misc-throw-by-value-catch-by-reference,
|
||||
misc-unconventional-assign-operator,
|
||||
misc-uniqueptr-reset-release,
|
||||
modernize-avoid-bind,
|
||||
modernize-concat-nested-namespaces,
|
||||
modernize-deprecated-headers,
|
||||
modernize-deprecated-ios-base-aliases,
|
||||
modernize-loop-convert,
|
||||
modernize-make-shared,
|
||||
modernize-make-unique,
|
||||
modernize-pass-by-value,
|
||||
modernize-raw-string-literal,
|
||||
modernize-redundant-void-arg,
|
||||
modernize-replace-auto-ptr,
|
||||
modernize-replace-disallow-copy-and-assign-macro,
|
||||
modernize-replace-random-shuffle,
|
||||
modernize-return-braced-init-list,
|
||||
modernize-shrink-to-fit,
|
||||
modernize-unary-static-assert,
|
||||
modernize-use-auto,
|
||||
modernize-use-bool-literals,
|
||||
modernize-use-emplace,
|
||||
modernize-use-equals-default,
|
||||
modernize-use-equals-delete,
|
||||
modernize-use-nodiscard,
|
||||
modernize-use-noexcept,
|
||||
modernize-use-nullptr,
|
||||
modernize-use-override,
|
||||
modernize-use-transparent-functors,
|
||||
modernize-use-uncaught-exceptions,
|
||||
mpi-buffer-deref,
|
||||
mpi-type-mismatch,
|
||||
openmp-use-default-none,
|
||||
performance-faster-string-find,
|
||||
performance-for-range-copy,
|
||||
performance-implicit-conversion-in-loop,
|
||||
performance-inefficient-algorithm,
|
||||
performance-inefficient-string-concatenation,
|
||||
performance-inefficient-vector-operation,
|
||||
performance-move-const-arg,
|
||||
performance-move-constructor-init,
|
||||
performance-no-automatic-move,
|
||||
performance-noexcept-move-constructor,
|
||||
performance-trivially-destructible,
|
||||
performance-type-promotion-in-math-fn,
|
||||
performance-unnecessary-copy-initialization,
|
||||
performance-unnecessary-value-param,
|
||||
portability-simd-intrinsics,
|
||||
readability-avoid-const-params-in-decls,
|
||||
readability-const-return-type,
|
||||
readability-container-size-empty,
|
||||
readability-convert-member-functions-to-static,
|
||||
readability-delete-null-pointer,
|
||||
readability-deleted-default,
|
||||
readability-inconsistent-declaration-parameter-name,
|
||||
readability-make-member-function-const,
|
||||
readability-misleading-indentation,
|
||||
readability-misplaced-array-index,
|
||||
readability-non-const-parameter,
|
||||
readability-redundant-control-flow,
|
||||
readability-redundant-declaration,
|
||||
readability-redundant-function-ptr-dereference,
|
||||
readability-redundant-smartptr-get,
|
||||
readability-redundant-string-cstr,
|
||||
readability-redundant-string-init,
|
||||
readability-simplify-subscript-expr,
|
||||
readability-static-accessed-through-instance,
|
||||
readability-static-definition-in-anonymous-namespace,
|
||||
readability-string-compare,
|
||||
readability-uniqueptr-delete-release,
|
||||
readability-use-anyofallof
|
||||
'
|
||||
|
|
@ -7,19 +7,18 @@ Welcome to x64dbg! This document is relevant for you if you want to contribute t
|
|||
This is a list of things you can do to help us out (in no particular order). Each item will be expanded upon later in the document.
|
||||
|
||||
- [Compile x64dbg](https://github.com/x64dbg/x64dbg/wiki/Compiling-the-whole-project) and add new features ([good first issues](https://easy.x64dbg.com) are a good place to start).
|
||||
- [Report bugs](https://report.x64dbg.com) at the issue tracker.
|
||||
- Add feature requests to the [issue tracker](https://issues.x64dbg.com).
|
||||
- Add report bugs of feature requests to the [issue tracker](https://issues.x64dbg.com).
|
||||
- [Write a blogpost](https://x64dbg.com/blog/2016/07/09/Looking-for-writers.html) for the [official blog](https://blog.x64dbg.com).
|
||||
- [Contact us](https://x64dbg.com/#contact) and talk about x64dbg.
|
||||
- [Contact us](https://x64dbg.com/#contact) and chat about x64dbg.
|
||||
- Send a [donation](https://donate.x64dbg.com) to support the project.
|
||||
- [Translate](https://translate.x64dbg.com) x64dbg (contact us if your language isn't listed).
|
||||
- Help us improve the [documentation](https://github.com/x64dbg/docs/issues).
|
||||
- [Translate](https://translate.x64dbg.com) x64dbg (reach out if your language is not listed).
|
||||
- Help us improve the [documentation](https://help.x64dbg.com).
|
||||
|
||||
### Compile x64dbg
|
||||
|
||||
There is a guide to [compiling the whole project](https://github.com/x64dbg/x64dbg/wiki/Compiling-the-whole-project) available. This might seem difficult at first, but if you install the correct versions of the *Prerequisites* it will be a breeze.
|
||||
There is a guide to [compiling the whole project](https://github.com/x64dbg/x64dbg/wiki/Compiling-the-whole-project) available. We recently spent a lot of effort on making this as seamless as possible, but if you have any difficulties, reach out on Discord (`#development` channel)!
|
||||
|
||||
Compiling x64dbg is very useful to us (even if you don't add any code). Your experience can improve this guide and help new contributors.
|
||||
[](https://discord.x64dbg.com)
|
||||
|
||||
#### Getting started with development
|
||||
|
||||
|
|
@ -30,22 +29,38 @@ As with any open source project, documentation is lacking and the code can seem
|
|||
- [User interface design principles](https://x64dbg.com/blog/2016/08/08/user-interface-design-principles.html) blog post. It explains some of the design philosophy.
|
||||
- [Control flow graph](https://x64dbg.com/blog/2016/07/27/Control-flow-graph.html) blog post. The post links to the relevant code sections.
|
||||
- Blog post about the [plugin SDK](https://x64dbg.com/blog/2016/07/30/x64dbg-plugin-sdk.html). Writing an x64dbg plugin can also help you understand the code structure.
|
||||
- Check out the [DeepWiki page](https://deepwiki.com/x64dbg/x64dbg) and ask Devin where to start.
|
||||
|
||||
This is by no means an exhaustive list and we are still working on lowering the barrier for new contributors. The feedback of new contributors is vital to reaching this goal.
|
||||
|
||||
#### Sending a pull request
|
||||
|
||||
Here is a little guide on how to do a clean pull request for people who don't yet know how to use git. We recommend using [Git Extensions](https://gitextensions.github.io), but any git interface is fine.
|
||||
Here is a little guide on how to do a clean pull request for people who don't yet know how to use git:
|
||||
|
||||
1. First we need to [fork](https://help.github.com/articles/fork-a-repo/) the actual x64dbg repo on our github account.
|
||||
2. When the fork is finished, clone the repo (`git clone https://github.com/myname/x64dbg.git`).
|
||||
3. When pushing new features/bug/whatever to a github project the best practice is to create branches. The command `git checkout -b my-branch-name` will automatically create a branch and check it out.
|
||||
4. Make all the changes you want and when finishing it, use `git add myfiles` to add it to the repo.
|
||||
5. Commit your change. `git commit -m 'a message about what you changed'`. The change are applied to your local git repo.
|
||||
6. Push it to your `origin`. The `origin` is your repo which is hosted on github. `git push --set-upstream origin your-branch-name`.
|
||||
7. Sync with the `upstream` repo, the real x64dbg repo. `git remote add upstream https://github.com/x64dbg/x64dbg.git`, using `git remote -v` will show which origin/upstream are setup in the local repo.
|
||||
8. Sync your fork with the `upstream`, `git fetch upstream`. Now checkout your local `development` branch again `git checkout development` and merge the upstream `git merge upstream/development`.
|
||||
9. Time to create the pull request! Using the github ui, go to your account/repo, select the branch you already pushed, and click `Pull request`. Review your pull request and send it.
|
||||
1. First we need to [fork](https://github.com/x64dbg/x64dbg/fork) the upstream x64dbg repo on our GitHub account.
|
||||
2. When the fork is finished, clone the repo:
|
||||
```sh
|
||||
git clone --recursive https://github.com/<yourusername>/x64dbg.git
|
||||
```
|
||||
3. Create a [feature branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches) to isolate your changes:
|
||||
```sh
|
||||
git checkout -B my-feature
|
||||
```
|
||||
4. Make all the changes you want and when finished, add the files to the [staging area](https://git-scm.com/about/staging-area):
|
||||
```sh
|
||||
git add .
|
||||
```
|
||||
5. Create a [commit](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits) in your local git repository from the changes in your staging area:
|
||||
```sh
|
||||
git commit -m "Added a cool feature"
|
||||
```
|
||||
6. Push the changes to your fork:
|
||||
```sh
|
||||
git push --set-upstream origin my-feature
|
||||
```
|
||||
7. Time to create the pull request! Navigate to your forked repository in the browser and click the green `Pull request` button.
|
||||
|
||||
For a more in-depth tutorial, you can look at GitHub's official [contributing to a project](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project) guide.
|
||||
|
||||
Happy PRs!
|
||||
|
||||
|
|
@ -67,11 +82,15 @@ We understand that it can be disappointing to not get your feature implemented,
|
|||
|
||||
### Write a blogpost
|
||||
|
||||
The x64dbg blog is open to all contributors (foreign and domestic). We encourage anyone who has an interesting encounter with the x64dbg code base, or a use case to share it with the community. For a guideline on how/what to contribute see the [blog post](https://x64dbg.com/blog/2016/07/09/Looking-for-writers.html) about contributing to the blog. Don't worry about contributing complex posts, we welcome ALL experience levels to add content to the blog!
|
||||
The x64dbg blog is open to all contributors (foreign and domestic). We encourage anyone who has an interesting encounter with the x64dbg code base, or a use case to share it with the community. For a guideline on how/what to contribute see the [blog post](https://x64dbg.com/blog/2016/07/09/Looking-for-writers.html) about contributing to the blog. Don't worry about contributing complex posts, we welcome ALL experience levels to add content to the blog!
|
||||
|
||||
### Contact us
|
||||
|
||||
There are several ways to reach out to the community of x64dbg developers, contributors and users. Chat channels consist of a [Telegram](https://telegram.me/x64dbg), [Gitter](https://gitter.x64dbg.com/) and [IRC](https://webchat.freenode.net/?channels=x64dbg) channel. Most questions regarding contributing, developing and using x64dbg can be answered here. To ensure channel cohesion a bot will sync messages across all three channels. (when it is not down ;))
|
||||
There are several ways to reach out to the community of x64dbg developers, contributors and users:
|
||||
|
||||
[](https://discord.x64dbg.com) [](https://slack.x64dbg.com) [](https://gitter.im/x64dbg/x64dbg) [](https://riot.im/app/#/room/#x64dbg:matrix.org) [](https://web.libera.chat/#x64dbg)
|
||||
|
||||
Discord is the main communication channel, but the other platforms are synchronized with the `#general` channel.
|
||||
|
||||
### Translate
|
||||
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -12,10 +12,10 @@
|
|||
<value>*.c;*.h;*.cpp;*.hpp</value>
|
||||
</setting>
|
||||
<setting name="Options" serializeAs="String">
|
||||
<value>style=allman, convert-tabs, align-pointer=type, align-reference=middle, indent=spaces, indent-namespaces, indent-col1-comments, pad-oper, unpad-paren, keep-one-line-blocks, close-templates</value>
|
||||
<value>style=allman, convert-tabs, align-pointer=type, align-reference=middle, indent=spaces, indent-namespaces, indent-col1-comments, unpad-paren, keep-one-line-blocks, close-templates</value>
|
||||
</setting>
|
||||
<setting name="Ignore" serializeAs="String">
|
||||
<value />
|
||||
<value>src/cross/vendor;src/gui/Src/ThirdPartyLibs/md4c</value>
|
||||
</setting>
|
||||
<setting name="License" serializeAs="String">
|
||||
<value />
|
||||
|
|
|
|||
|
|
@ -0,0 +1,429 @@
|
|||
#!/usr/bin/env -S uv run --script
|
||||
# /// script
|
||||
# requires-python = ">=3.10"
|
||||
# dependencies = [
|
||||
# "astyle==3.6.9",
|
||||
# ]
|
||||
# ///
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import importlib.metadata
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import sysconfig
|
||||
from pathlib import Path
|
||||
|
||||
PATTERNS = ("*.c", "*.h", "*.cpp", "*.hpp")
|
||||
OPTIONS = (
|
||||
"style=allman, convert-tabs, align-pointer=type, align-reference=middle, "
|
||||
"indent=spaces, indent-namespaces, indent-col1-comments, "
|
||||
"unpad-paren, keep-one-line-blocks, close-templates"
|
||||
)
|
||||
IGNORE_PATTERNS = (
|
||||
r"src/cross/vendor",
|
||||
r"src/gui/Src/ThirdPartyLibs/md4c",
|
||||
)
|
||||
LICENSE_TEXT = ""
|
||||
|
||||
EXIT_OK = 0
|
||||
EXIT_CHANGES = 1
|
||||
EXIT_ERROR = 2
|
||||
|
||||
|
||||
def stderr(message: str) -> None:
|
||||
print(message, file=sys.stderr)
|
||||
|
||||
|
||||
def usage() -> int:
|
||||
stderr(
|
||||
"Usage: AStyleHelper.py [Silent|Check] [filter_epoch]\n"
|
||||
"\n"
|
||||
"Formats the git repository containing the current working directory.\n"
|
||||
"If the current working directory is not inside a git repository, it formats that directory.\n"
|
||||
"\n"
|
||||
"Modes:\n"
|
||||
" <no mode> Format files and print each file as it is processed.\n"
|
||||
" Silent Format files without progress output.\n"
|
||||
" Check Check formatting without modifying files.\n"
|
||||
"\n"
|
||||
"Examples:\n"
|
||||
" uv run --script .github/format/AStyleHelper.py\n"
|
||||
" uv run --script .github/format/AStyleHelper.py Silent\n"
|
||||
" uv run --script .github/format/AStyleHelper.py Check\n"
|
||||
)
|
||||
return EXIT_ERROR
|
||||
|
||||
|
||||
def parse_filter_epoch(args: list[str]) -> tuple[int, int]:
|
||||
if not args:
|
||||
return 0, EXIT_OK
|
||||
try:
|
||||
return int(args[0]), EXIT_OK
|
||||
except ValueError:
|
||||
stderr(f"Invalid epoch time provided: {args[0]}")
|
||||
return 0, EXIT_ERROR
|
||||
|
||||
|
||||
def option_flags() -> list[str]:
|
||||
return [f"--{option.strip()}" for option in OPTIONS.split(",") if option.strip()]
|
||||
|
||||
|
||||
def find_astyle_executable() -> Path:
|
||||
candidate_names = ("astyle.exe", "AStyle.exe", "astyle", "AStyle")
|
||||
|
||||
try:
|
||||
dist = importlib.metadata.distribution("astyle")
|
||||
preferred = []
|
||||
fallback = []
|
||||
for file in dist.files or []:
|
||||
path = Path(file)
|
||||
if path.name not in candidate_names:
|
||||
continue
|
||||
located = Path(dist.locate_file(file))
|
||||
if not located.is_file():
|
||||
continue
|
||||
if "data" in path.parts:
|
||||
preferred.append(located)
|
||||
else:
|
||||
fallback.append(located)
|
||||
if preferred:
|
||||
return preferred[0]
|
||||
if fallback:
|
||||
return fallback[0]
|
||||
except importlib.metadata.PackageNotFoundError:
|
||||
pass
|
||||
|
||||
candidate_dirs = []
|
||||
scripts_dir = sysconfig.get_path("scripts")
|
||||
if scripts_dir:
|
||||
candidate_dirs.append(Path(scripts_dir))
|
||||
candidate_dirs.append(Path(sys.executable).resolve().parent)
|
||||
|
||||
for directory in candidate_dirs:
|
||||
for name in candidate_names:
|
||||
candidate = directory / name
|
||||
if candidate.is_file():
|
||||
return candidate
|
||||
|
||||
for name in candidate_names:
|
||||
resolved = shutil.which(name)
|
||||
if resolved:
|
||||
return Path(resolved)
|
||||
|
||||
raise FileNotFoundError(
|
||||
"Could not locate the 'astyle' executable from the astyle wheel."
|
||||
)
|
||||
|
||||
|
||||
def get_git_root(start_dir: Path) -> Path:
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["git", "rev-parse", "--show-toplevel"],
|
||||
cwd=start_dir,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
encoding="utf-8",
|
||||
errors="replace",
|
||||
check=False,
|
||||
)
|
||||
if result.returncode == 0:
|
||||
git_root = result.stdout.strip()
|
||||
if git_root:
|
||||
return Path(git_root).resolve()
|
||||
except OSError:
|
||||
pass
|
||||
return start_dir.resolve()
|
||||
|
||||
|
||||
def filter_git_ignored(root: Path, files: list[Path]) -> list[Path]:
|
||||
if not files:
|
||||
return files
|
||||
|
||||
try:
|
||||
relative_paths = [file.as_posix() for file in files]
|
||||
result = subprocess.run(
|
||||
["git", "check-ignore", "--no-index", "--stdin"],
|
||||
cwd=root,
|
||||
input="\n".join(relative_paths) + "\n",
|
||||
capture_output=True,
|
||||
text=True,
|
||||
encoding="utf-8",
|
||||
errors="replace",
|
||||
check=False,
|
||||
)
|
||||
if result.returncode not in (0, 1):
|
||||
return files
|
||||
ignored = {
|
||||
line.strip().replace("\\", "/")
|
||||
for line in result.stdout.splitlines()
|
||||
if line.strip()
|
||||
}
|
||||
return [file for file in files if file.as_posix() not in ignored]
|
||||
except OSError:
|
||||
return files
|
||||
|
||||
|
||||
def git_ls_files(root: Path) -> list[Path]:
|
||||
try:
|
||||
result = subprocess.run(
|
||||
[
|
||||
"git",
|
||||
"ls-files",
|
||||
"--cached",
|
||||
"--others",
|
||||
"--exclude-standard",
|
||||
"--",
|
||||
*PATTERNS,
|
||||
],
|
||||
cwd=root,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
encoding="utf-8",
|
||||
errors="replace",
|
||||
check=False,
|
||||
)
|
||||
if result.returncode == 0:
|
||||
seen: set[str] = set()
|
||||
files: list[Path] = []
|
||||
for line in result.stdout.splitlines():
|
||||
line = line.strip()
|
||||
if not line or line in seen:
|
||||
continue
|
||||
seen.add(line)
|
||||
files.append(Path(line))
|
||||
return filter_git_ignored(root, files)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
seen: set[str] = set()
|
||||
files: list[Path] = []
|
||||
for pattern in PATTERNS:
|
||||
for path in root.rglob(pattern):
|
||||
if not path.is_file():
|
||||
continue
|
||||
relative = path.relative_to(root)
|
||||
key = relative.as_posix()
|
||||
if key in seen:
|
||||
continue
|
||||
seen.add(key)
|
||||
files.append(relative)
|
||||
files.sort(key=lambda path: path.as_posix())
|
||||
return files
|
||||
|
||||
|
||||
def should_ignore(path: Path) -> bool:
|
||||
normalized = path.as_posix()
|
||||
return any(re.search(pattern, normalized) for pattern in IGNORE_PATTERNS)
|
||||
|
||||
|
||||
def should_process(root: Path, relative_path: Path, filter_epoch: int) -> bool:
|
||||
if should_ignore(relative_path):
|
||||
return False
|
||||
if filter_epoch <= 0:
|
||||
return True
|
||||
try:
|
||||
return int((root / relative_path).stat().st_mtime) >= filter_epoch
|
||||
except OSError:
|
||||
return False
|
||||
|
||||
|
||||
def read_utf8(path: Path) -> str | None:
|
||||
try:
|
||||
return path.read_bytes().decode("utf-8")
|
||||
except (OSError, UnicodeDecodeError):
|
||||
return None
|
||||
|
||||
|
||||
def normalize_output(text: str) -> str:
|
||||
text = text.replace("\r\n", "\n").replace("\r", "\n")
|
||||
text = text.replace("\n", "\r\n")
|
||||
text = text.strip("\uFEFF\u200B")
|
||||
if LICENSE_TEXT and not text.startswith(LICENSE_TEXT):
|
||||
text = LICENSE_TEXT + text
|
||||
return text
|
||||
|
||||
|
||||
def chunk_paths(paths: list[Path], max_command_chars: int = 24000) -> list[list[Path]]:
|
||||
chunks: list[list[Path]] = []
|
||||
current: list[Path] = []
|
||||
current_chars = 0
|
||||
|
||||
for path in paths:
|
||||
path_chars = len(str(path)) + 3
|
||||
if current and current_chars + path_chars > max_command_chars:
|
||||
chunks.append(current)
|
||||
current = []
|
||||
current_chars = 0
|
||||
current.append(path)
|
||||
current_chars += path_chars
|
||||
|
||||
if current:
|
||||
chunks.append(current)
|
||||
return chunks
|
||||
|
||||
|
||||
def run_astyle(astyle_exe: Path, file_paths: list[Path], dry_run: bool) -> subprocess.CompletedProcess[str]:
|
||||
command = [
|
||||
str(astyle_exe),
|
||||
*option_flags(),
|
||||
"--options=none",
|
||||
"--project=none",
|
||||
"--formatted",
|
||||
]
|
||||
if dry_run:
|
||||
command.append("--dry-run")
|
||||
else:
|
||||
command.append("--suffix=none")
|
||||
command.extend(str(file_path) for file_path in file_paths)
|
||||
return subprocess.run(
|
||||
command,
|
||||
capture_output=True,
|
||||
text=True,
|
||||
encoding="utf-8",
|
||||
errors="replace",
|
||||
check=False,
|
||||
)
|
||||
|
||||
|
||||
def parse_changed_paths(output: str, root: Path) -> list[str]:
|
||||
changed_files: list[str] = []
|
||||
root_resolved = root.resolve()
|
||||
|
||||
for line in output.splitlines():
|
||||
line = line.strip()
|
||||
if not line or not line.startswith("Formatted"):
|
||||
continue
|
||||
path_text = line[len("Formatted"):].strip()
|
||||
try:
|
||||
relative = Path(path_text).resolve().relative_to(root_resolved).as_posix()
|
||||
except (OSError, ValueError):
|
||||
relative = path_text.replace("\\", "/")
|
||||
changed_files.append(relative)
|
||||
|
||||
return changed_files
|
||||
|
||||
|
||||
def format_directory(root: Path, write_changes: bool, filter_epoch: int, show_progress: bool = False) -> tuple[list[str], list[str]]:
|
||||
changed_files: set[str] = set()
|
||||
errors: list[str] = []
|
||||
astyle_exe = find_astyle_executable()
|
||||
file_records: list[tuple[Path, str]] = []
|
||||
|
||||
for relative_path in git_ls_files(root):
|
||||
if not should_process(root, relative_path, filter_epoch):
|
||||
continue
|
||||
|
||||
original_text = read_utf8(root / relative_path)
|
||||
if original_text is None:
|
||||
continue
|
||||
file_records.append((relative_path, original_text))
|
||||
|
||||
if show_progress:
|
||||
for relative_path, _ in file_records:
|
||||
print(relative_path.as_posix(), flush=True)
|
||||
|
||||
absolute_paths = [root / relative_path for relative_path, _ in file_records]
|
||||
for batch in chunk_paths(absolute_paths):
|
||||
result = run_astyle(astyle_exe, batch, dry_run=not write_changes)
|
||||
if result.returncode != 0:
|
||||
batch_set = {path.resolve() for path in batch}
|
||||
for relative_path, _ in file_records:
|
||||
if (root / relative_path).resolve() in batch_set:
|
||||
errors.append(f"Cannot format {relative_path.as_posix()}")
|
||||
continue
|
||||
changed_files.update(parse_changed_paths(result.stdout, root))
|
||||
|
||||
for relative_path, original_text in file_records:
|
||||
display_path = relative_path.as_posix()
|
||||
if write_changes:
|
||||
formatted_text = read_utf8(root / relative_path)
|
||||
if formatted_text is None:
|
||||
errors.append(f"Cannot format {display_path}")
|
||||
continue
|
||||
normalized_text = normalize_output(formatted_text)
|
||||
if formatted_text != normalized_text:
|
||||
try:
|
||||
(root / relative_path).write_bytes(normalized_text.encode("utf-8"))
|
||||
except OSError:
|
||||
errors.append(f"Cannot format {display_path}")
|
||||
continue
|
||||
if original_text != normalized_text:
|
||||
changed_files.add(display_path)
|
||||
elif original_text != normalize_output(original_text):
|
||||
changed_files.add(display_path)
|
||||
|
||||
return sorted(changed_files), errors
|
||||
|
||||
|
||||
def run_format(root: Path, filter_epoch: int, show_progress: bool) -> int:
|
||||
changed_files, errors = format_directory(
|
||||
root,
|
||||
write_changes=True,
|
||||
filter_epoch=filter_epoch,
|
||||
show_progress=show_progress,
|
||||
)
|
||||
for error in errors:
|
||||
stderr(error)
|
||||
if errors and not changed_files:
|
||||
return EXIT_ERROR
|
||||
return EXIT_CHANGES if changed_files else EXIT_OK
|
||||
|
||||
|
||||
def run_silent(root: Path, filter_epoch: int) -> int:
|
||||
return run_format(root, filter_epoch, show_progress=False)
|
||||
|
||||
|
||||
def run_check(root: Path, filter_epoch: int) -> int:
|
||||
changed_files, errors = format_directory(root, write_changes=False, filter_epoch=filter_epoch)
|
||||
for error in errors:
|
||||
stderr(error)
|
||||
if changed_files:
|
||||
stderr("Nonconforming files:")
|
||||
for path in changed_files:
|
||||
stderr(path)
|
||||
return EXIT_CHANGES
|
||||
if errors:
|
||||
return EXIT_ERROR
|
||||
print("Formatting fully conforming!")
|
||||
return EXIT_OK
|
||||
|
||||
|
||||
def main(argv: list[str]) -> int:
|
||||
root = get_git_root(Path.cwd())
|
||||
|
||||
if not argv:
|
||||
try:
|
||||
return run_format(root, 0, show_progress=True)
|
||||
except FileNotFoundError as exc:
|
||||
stderr(str(exc))
|
||||
return EXIT_ERROR
|
||||
except OSError as exc:
|
||||
stderr(str(exc))
|
||||
return EXIT_ERROR
|
||||
|
||||
filter_epoch, status = parse_filter_epoch(argv[1:])
|
||||
if status != EXIT_OK:
|
||||
return status
|
||||
|
||||
command = argv[0].lower()
|
||||
|
||||
try:
|
||||
if command == "silent":
|
||||
return run_silent(root, filter_epoch)
|
||||
if command == "check":
|
||||
return run_check(root, filter_epoch)
|
||||
stderr(f"Invalid argument: {argv[0]}")
|
||||
return usage()
|
||||
except FileNotFoundError as exc:
|
||||
stderr(str(exc))
|
||||
return EXIT_ERROR
|
||||
except OSError as exc:
|
||||
stderr(str(exc))
|
||||
return EXIT_ERROR
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main(sys.argv[1:]))
|
||||
|
|
@ -1,5 +1,36 @@
|
|||
# Hooks
|
||||
# Formatter
|
||||
|
||||
This contains two binaries `AStyleHelper.exe` and `AStyle.dll` to format any code before you commit.
|
||||
The main formatter integration for this repository is still the bundled Windows tool:
|
||||
|
||||
If you are unsure about the integrity of the files, don't hesitate to contact me (mrexodia). The source code is available [here](https://github.com/mrexodia/AStyleHelper). The version of `AStyle.dll` is compiled from `AStyle_2.06_windows.zip` which came from [Sourceforge](https://sourceforge.net/projects/astyle/files/astyle/astyle%202.06/AStyle_2.06_windows.zip/download).
|
||||
- `AStyleHelper.exe` from https://github.com/mrexodia/AStyleHelper
|
||||
- `AStyle.dll` from (`astyle-3.6.9\build\vs2022\AStyle Dll 2022.sln`)
|
||||
|
||||
These are used by the existing Windows workflows and helper scripts.
|
||||
|
||||
For Linux users, there is also a Python port at `.github/format/AStyleHelper.py`.
|
||||
It uses [`uv` script metadata](https://docs.astral.sh/uv/guides/scripts/#declaring-script-dependencies) and the [`astyle` wheel](https://github.com/Freed-Wu/astyle-wheel).
|
||||
|
||||
## Windows usage
|
||||
|
||||
```bat
|
||||
format.bat
|
||||
```
|
||||
|
||||
Or directly:
|
||||
|
||||
```bat
|
||||
.github\format\AStyleHelper.exe Silent
|
||||
.github\format\AStyleHelper.exe Check
|
||||
```
|
||||
|
||||
## Linux usage
|
||||
|
||||
```bash
|
||||
uv run --script .github/format/AStyleHelper.py
|
||||
uv run --script .github/format/AStyleHelper.py Silent
|
||||
uv run --script .github/format/AStyleHelper.py Check
|
||||
```
|
||||
|
||||
Running the script without `Silent` or `Check` formats the tree and prints each file as it is processed, so users get progress output.
|
||||
|
||||
The Python script keeps the old `Silent` / `Check` CLI so it can act as a compatible alternative on non-Windows systems. It formats the git repository containing the current working directory (falling back to the current directory if not in git), and skips files matched by git ignore rules via `git check-ignore --no-index`.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,20 @@
|
|||
@echo off
|
||||
git config core.autocrlf false
|
||||
set PRE_COMMIT_HOOK=%~dp0..\..\.git\hooks\pre-commit
|
||||
|
||||
REM Get the git directory path (works for worktrees too)
|
||||
for /f "delims=" %%i in ('git rev-parse --git-dir') do set GIT_DIR=%%i
|
||||
|
||||
REM Replace forward slashes with backslashes
|
||||
set GIT_DIR=%GIT_DIR:/=\%
|
||||
|
||||
set PRE_COMMIT_HOOK=%GIT_DIR%\hooks\pre-commit
|
||||
|
||||
REM Create the hooks directory if it doesn't exist
|
||||
if not exist "%GIT_DIR%\hooks" (
|
||||
mkdir "%GIT_DIR%\hooks"
|
||||
)
|
||||
|
||||
if not exist "%PRE_COMMIT_HOOK%" (
|
||||
echo Installing pre-commit hook...
|
||||
copy %~dp0pre-commit %PRE_COMMIT_HOOK%
|
||||
)
|
||||
copy "%~dp0pre-commit" "%PRE_COMMIT_HOOK%"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,33 +1,48 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# Simple script to auto-format every source file before committing.
|
||||
#
|
||||
|
||||
#check if the formatter is present
|
||||
if [ ! -f ./.github/format/AStyleHelper.exe ]; then
|
||||
echo "AStyleHelper not found!"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
#format the code
|
||||
"./.github/format/AStyleHelper.exe" Silent
|
||||
|
||||
#exit when nothing needs to be done
|
||||
if [ $? == 0 ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
#stage the formatted files (when staged in this commit)
|
||||
gitFiles=$(git diff-index --name-only --cached HEAD)
|
||||
if [[ -n "${gitFiles}" ]]; then
|
||||
for fname in $gitFiles; do
|
||||
git add --all -- "${fname}"
|
||||
done
|
||||
fi
|
||||
|
||||
#cancel commit if the changes were undone by the formatting
|
||||
gitFiles=$(git diff-index --name-only --cached HEAD)
|
||||
if [ -z "$gitFiles" ]; then
|
||||
"./.github/AStyleHelper.exe" "After formatting, no files were staged..."
|
||||
exit 1
|
||||
fi
|
||||
#!/bin/sh
|
||||
#
|
||||
# Simple script to auto-format every source file before committing.
|
||||
#
|
||||
|
||||
# Check if the formatter is present
|
||||
if [ ! -f .github/format/AStyleHelper.exe ]; then
|
||||
echo "AStyleHelper not found!"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get stamp file epoch (default to 0)
|
||||
STAMP_EPOCH=$(date -u -r .git/AStyleHelper.stamp +%s 2>/dev/null)
|
||||
STAMP_EPOCH=${STAMP_EPOCH:-0}
|
||||
|
||||
# If the HEAD is newer than the stamp (we switched branches), set stamp to 0
|
||||
if [ $(date -u -r .git/HEAD +%s 2>/dev/null) -gt $STAMP_EPOCH ]; then
|
||||
echo "AStyleHelper: branch switched, performing full formatting"
|
||||
STAMP_EPOCH=0
|
||||
fi
|
||||
|
||||
# Format the code
|
||||
".github/format/AStyleHelper.exe" Silent $STAMP_EPOCH
|
||||
FORMAT_STATUS=$?
|
||||
|
||||
# Touch the stamp file to indicate when the last formatting was done
|
||||
touch .git/AStyleHelper.stamp
|
||||
|
||||
# Exit when nothing needs to be done
|
||||
if [ $FORMAT_STATUS -eq 0 ]; then
|
||||
echo "AStyleHelper: no formatting needed"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Stage the formatted files (when staged in this commit)
|
||||
GIT_FILES=$(git diff-index --name-only --cached HEAD)
|
||||
if [[ -n "$GIT_FILES" ]]; then
|
||||
for GIT_FILE in $GIT_FILES; do
|
||||
git add --all -- "$GIT_FILE"
|
||||
done
|
||||
fi
|
||||
|
||||
# Cancel commit if the changes were undone by the formatting
|
||||
GIT_FILES=$(git diff-index --name-only --cached HEAD)
|
||||
if [ -z "$GIT_FILES" ]; then
|
||||
".github/format/AStyleHelper.exe" "After formatting, no files were staged..."
|
||||
exit 1
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -0,0 +1,169 @@
|
|||
name: Build
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
# Automatically cancel previous runs of this workflow on the same branch
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
cmake:
|
||||
# Skip building pull requests from the same repository
|
||||
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }}
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [x64, x86]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Visual Studio Development Environment
|
||||
uses: TheMrMilchmann/setup-msvc-dev@79dac248aac9d0059f86eae9d8b5bfab4e95e97c # v4.0.0
|
||||
with:
|
||||
arch: ${{ matrix.arch }}
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_UNITY_BUILD=ON -DCMAKE_UNITY_BUILD_BATCH_SIZE=6 -DX64DBG_RELEASE=${{ startsWith(github.ref, 'refs/tags/') && 'ON' || 'OFF' }}
|
||||
cmake --build build
|
||||
|
||||
- name: Upload Build Artifacts
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: build-${{ matrix.arch }}
|
||||
path: bin
|
||||
if-no-files-found: error
|
||||
include-hidden-files: true
|
||||
retention-days: 1
|
||||
|
||||
docs:
|
||||
# Skip building pull requests from the same repository
|
||||
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }}
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Build Documentation
|
||||
run: |
|
||||
docs\makechm.bat
|
||||
|
||||
- name: Upload Documentation
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: docs
|
||||
path: docs/x64dbg.chm
|
||||
if-no-files-found: error
|
||||
include-hidden-files: true
|
||||
retention-days: 1
|
||||
|
||||
test:
|
||||
needs: cmake
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [x64, x86]
|
||||
engine: [TitanEngine, GleeBug]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Download Build Artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: build-${{ matrix.arch }}
|
||||
path: bin
|
||||
|
||||
- name: Run Tests
|
||||
shell: pwsh
|
||||
run: |
|
||||
py src/tests/run.py --arch ${{ matrix.arch }} --engine ${{ matrix.engine }} --artifacts-dir "test-artifacts/${{ matrix.arch }}-${{ matrix.engine }}"
|
||||
|
||||
- name: Upload Test Artifacts
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: test-artifacts-${{ matrix.arch }}-${{ matrix.engine }}
|
||||
path: test-artifacts/${{ matrix.arch }}-${{ matrix.engine }}
|
||||
if-no-files-found: warn
|
||||
include-hidden-files: true
|
||||
retention-days: 7
|
||||
|
||||
package:
|
||||
needs: [cmake, docs]
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Download x64 Artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: build-x64
|
||||
path: bin
|
||||
|
||||
- name: Download x86 Artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: build-x86
|
||||
path: bin
|
||||
|
||||
- name: Download Documentation
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: docs
|
||||
path: docs
|
||||
|
||||
- name: Prepare Release
|
||||
run: |
|
||||
curl.exe -L https://github.com/x64dbg/translations/releases/download/translations/qm.zip -o bin\qm.zip
|
||||
7z x bin\qm.zip -obin
|
||||
cmake -P .\cmake\release.cmake
|
||||
$timestamp = Get-Date (Get-Date).ToUniversalTime() -Format "yyyy-MM-dd_HH-mm"
|
||||
echo "timestamp=$timestamp" >> $env:GITHUB_ENV
|
||||
|
||||
- name: Upload Snapshot
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: snapshot_${{ env.timestamp }}
|
||||
path: |
|
||||
release/pluginsdk
|
||||
release/release
|
||||
release/commithash.txt
|
||||
if-no-files-found: error
|
||||
include-hidden-files: true
|
||||
compression-level: 9
|
||||
|
||||
- name: Upload Symbols
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: symbols-snapshot_${{ env.timestamp }}
|
||||
path: |
|
||||
release/pdb
|
||||
release/commithash.txt
|
||||
if-no-files-found: error
|
||||
include-hidden-files: true
|
||||
compression-level: 9
|
||||
|
||||
- name: Upload Plugin SDK
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: x64dbg-pluginsdk
|
||||
path: |
|
||||
release/pluginsdk
|
||||
if-no-files-found: error
|
||||
include-hidden-files: true
|
||||
compression-level: 9
|
||||
|
|
@ -0,0 +1,68 @@
|
|||
name: Cross
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
# Automatically cancel previous runs of this workflow on the same branch
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
cmake:
|
||||
# Skip building pull requests from the same repository
|
||||
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [windows-latest, ubuntu-latest]
|
||||
runs-on: ${{ matrix.platform }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Visual Studio Development Environment
|
||||
if: ${{ matrix.platform == 'windows-latest' }}
|
||||
uses: TheMrMilchmann/setup-msvc-dev@79dac248aac9d0059f86eae9d8b5bfab4e95e97c # v4.0.0
|
||||
with:
|
||||
arch: x64
|
||||
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@48d3ad6db93f3627c8ee7a0454bc6f3744f7e730 # v4.3.1
|
||||
with:
|
||||
cache: true
|
||||
modules: qtwebsockets
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
cd src/cross
|
||||
cmake -B build -G Ninja -DCMAKE_UNITY_BUILD=ON
|
||||
cmake --build build
|
||||
|
||||
appimage:
|
||||
# Skip building pull requests from the same repository
|
||||
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }}
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ghcr.io/x64dbg/x64dbg/qt5-appimage
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 1
|
||||
|
||||
- name: Build AppImage
|
||||
run: |
|
||||
src/cross/debugger/build-appimage.sh
|
||||
|
||||
- name: Upload AppImage
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: x64dbg-appimage
|
||||
path: src/cross/build-linux/x64dbg.AppImage
|
||||
if-no-files-found: error
|
||||
include-hidden-files: true
|
||||
retention-days: 1
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
name: Format
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
format:
|
||||
# Skip checking pull requests from the same repository
|
||||
if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }}
|
||||
runs-on: windows-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Run Formatter
|
||||
run: .github/format/AStyleHelper.exe Silent || true
|
||||
|
||||
- name: Check for Changes
|
||||
id: check_changes
|
||||
run: |
|
||||
git diff --exit-code
|
||||
continue-on-error: true
|
||||
|
||||
- name: Report Failure
|
||||
if: steps.check_changes.outcome == 'failure'
|
||||
run: |
|
||||
echo "::error::Code is not formatted correctly! Please run 'format.bat' locally and commit the changes."
|
||||
git diff --color
|
||||
git diff > format.patch
|
||||
exit 1
|
||||
|
||||
- name: Upload Patch
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: format-patch
|
||||
path: format.patch
|
||||
|
|
@ -4,6 +4,9 @@
|
|||
/bin/*.dll
|
||||
/bin/*.ini
|
||||
/bin/*.chm
|
||||
/bin/*.zip
|
||||
/bin/release-notes.md
|
||||
!/bin/themes/
|
||||
/src/**/x64/
|
||||
/src/**/Win32/
|
||||
/src/gui_build/
|
||||
|
|
@ -25,7 +28,16 @@ cmake-build*/
|
|||
*.pro.user*
|
||||
*.orig
|
||||
*.pdb
|
||||
*.ilk
|
||||
.DS_Store
|
||||
Makefile
|
||||
Makefile.*
|
||||
|
||||
CMakeLists.txt.user
|
||||
/.cache
|
||||
CMakeUserPresets.json
|
||||
|
||||
# Python
|
||||
__pycache__/
|
||||
*.pyc
|
||||
*.egg-info/
|
||||
|
|
|
|||
|
|
@ -1,7 +1,13 @@
|
|||
[submodule "src/dbg/btparser"]
|
||||
path = src/dbg/btparser
|
||||
url = ../btparser
|
||||
[submodule "deps"]
|
||||
path = deps
|
||||
url = ../deps
|
||||
shallow = true
|
||||
[submodule "src/dbg/btparser"]
|
||||
path = src/dbg/btparser
|
||||
url = ../../x64dbg/btparser
|
||||
[submodule "deps"]
|
||||
path = deps
|
||||
url = ../../x64dbg/deps
|
||||
shallow = true
|
||||
[submodule "src/third_party/TitanEngine"]
|
||||
path = src/third_party/TitanEngine
|
||||
url = ../../x64dbg/TitanEngine
|
||||
[submodule "src/third_party/GleeBug"]
|
||||
path = src/third_party/GleeBug
|
||||
url = ../../x64dbg/GleeBug
|
||||
|
|
|
|||
|
|
@ -7,6 +7,9 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
|||
message(FATAL_ERROR "In-tree builds are not supported. Run CMake from a separate directory: cmake -B build")
|
||||
endif()
|
||||
|
||||
# Enable support for MSVC_RUNTIME_LIBRARY
|
||||
cmake_policy(SET CMP0091 NEW)
|
||||
|
||||
set(CMKR_ROOT_PROJECT OFF)
|
||||
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
||||
set(CMKR_ROOT_PROJECT ON)
|
||||
|
|
@ -22,11 +25,25 @@ if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
|||
|
||||
# Create a configure-time dependency on cmake.toml to improve IDE support
|
||||
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS cmake.toml)
|
||||
if(NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
|
||||
endif()
|
||||
|
||||
endif()
|
||||
|
||||
# Options
|
||||
option(X64DBG_BUILD_IN_TREE "" ON)
|
||||
option(X64DBG_RELEASE "" OFF)
|
||||
|
||||
# Variables
|
||||
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
|
||||
|
||||
include("cmake/VSToolchain.cmake")
|
||||
|
||||
project(x64dbg
|
||||
LANGUAGES
|
||||
C
|
||||
CXX
|
||||
DESCRIPTION
|
||||
"An open-source x64/x32 debugger for windows."
|
||||
)
|
||||
|
|
@ -37,36 +54,48 @@ include("cmake/VSFlags.cmake")
|
|||
find_package(Qt5 REQUIRED
|
||||
COMPONENTS
|
||||
Widgets
|
||||
Network
|
||||
WinExtras
|
||||
)
|
||||
|
||||
# Target: zydis_wrapper
|
||||
set(zydis_wrapper_SOURCES
|
||||
cmake.toml
|
||||
"src/zydis_wrapper/Zydis/Zydis.h"
|
||||
"src/zydis_wrapper/zydis/Zydis.c"
|
||||
"src/zydis_wrapper/zydis_wrapper.cpp"
|
||||
"src/zydis_wrapper/zydis_wrapper.h"
|
||||
)
|
||||
# Subdirectory: src/zydis_wrapper
|
||||
set(CMKR_CMAKE_FOLDER ${CMAKE_FOLDER})
|
||||
if(CMAKE_FOLDER)
|
||||
set(CMAKE_FOLDER "${CMAKE_FOLDER}/src/zydis_wrapper")
|
||||
else()
|
||||
set(CMAKE_FOLDER "src/zydis_wrapper")
|
||||
endif()
|
||||
add_subdirectory("src/zydis_wrapper")
|
||||
set(CMAKE_FOLDER ${CMKR_CMAKE_FOLDER})
|
||||
|
||||
add_library(zydis_wrapper STATIC)
|
||||
# Subdirectory: src/gui/Src/ThirdPartyLibs/md4c
|
||||
set(CMKR_CMAKE_FOLDER ${CMAKE_FOLDER})
|
||||
if(CMAKE_FOLDER)
|
||||
set(CMAKE_FOLDER "${CMAKE_FOLDER}/src/gui/Src/ThirdPartyLibs/md4c")
|
||||
else()
|
||||
set(CMAKE_FOLDER "src/gui/Src/ThirdPartyLibs/md4c")
|
||||
endif()
|
||||
add_subdirectory("src/gui/Src/ThirdPartyLibs/md4c")
|
||||
set(CMAKE_FOLDER ${CMKR_CMAKE_FOLDER})
|
||||
|
||||
target_sources(zydis_wrapper PRIVATE ${zydis_wrapper_SOURCES})
|
||||
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${zydis_wrapper_SOURCES})
|
||||
# Subdirectory: src/third_party
|
||||
set(CMKR_CMAKE_FOLDER ${CMAKE_FOLDER})
|
||||
if(CMAKE_FOLDER)
|
||||
set(CMAKE_FOLDER "${CMAKE_FOLDER}/src/third_party")
|
||||
else()
|
||||
set(CMAKE_FOLDER "src/third_party")
|
||||
endif()
|
||||
add_subdirectory("src/third_party")
|
||||
set(CMAKE_FOLDER ${CMKR_CMAKE_FOLDER})
|
||||
|
||||
target_compile_definitions(zydis_wrapper PUBLIC
|
||||
ZYCORE_STATIC_BUILD
|
||||
ZYDIS_STATIC_BUILD
|
||||
)
|
||||
|
||||
target_include_directories(zydis_wrapper PUBLIC
|
||||
"src/zydis_wrapper"
|
||||
)
|
||||
|
||||
target_include_directories(zydis_wrapper PRIVATE
|
||||
"src/zydis_wrapper/Zydis"
|
||||
)
|
||||
# Subdirectory: src/tests
|
||||
set(CMKR_CMAKE_FOLDER ${CMAKE_FOLDER})
|
||||
if(CMAKE_FOLDER)
|
||||
set(CMAKE_FOLDER "${CMAKE_FOLDER}/src/tests")
|
||||
else()
|
||||
set(CMAKE_FOLDER "src/tests")
|
||||
endif()
|
||||
add_subdirectory("src/tests")
|
||||
set(CMAKE_FOLDER ${CMKR_CMAKE_FOLDER})
|
||||
|
||||
# Target: bridge
|
||||
set(bridge_SOURCES
|
||||
|
|
@ -79,6 +108,7 @@ set(bridge_SOURCES
|
|||
"src/bridge/bridgemain.cpp"
|
||||
"src/bridge/bridgemain.h"
|
||||
"src/bridge/bridgemain_checker.c"
|
||||
"src/bridge/startupargs.h"
|
||||
)
|
||||
|
||||
add_library(bridge SHARED)
|
||||
|
|
@ -107,13 +137,11 @@ endif()
|
|||
# Target: btparser
|
||||
set(btparser_SOURCES
|
||||
cmake.toml
|
||||
"src/dbg/btparser/btparser/ast.h"
|
||||
"src/dbg/btparser/btparser/helpers.h"
|
||||
"src/dbg/btparser/btparser/keywords.h"
|
||||
"src/dbg/btparser/btparser/lexer.cpp"
|
||||
"src/dbg/btparser/btparser/lexer.h"
|
||||
"src/dbg/btparser/btparser/operators.h"
|
||||
"src/dbg/btparser/btparser/parser.cpp"
|
||||
"src/dbg/btparser/btparser/parser.h"
|
||||
"src/dbg/btparser/btparser/testfiles.h"
|
||||
)
|
||||
|
|
@ -123,6 +151,12 @@ add_library(btparser STATIC)
|
|||
target_sources(btparser PRIVATE ${btparser_SOURCES})
|
||||
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${btparser_SOURCES})
|
||||
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "Clang") # clang-any
|
||||
target_compile_options(btparser PUBLIC
|
||||
-Wno-self-assign-field
|
||||
)
|
||||
endif()
|
||||
|
||||
target_include_directories(btparser PUBLIC
|
||||
"src/dbg/btparser"
|
||||
)
|
||||
|
|
@ -209,6 +243,7 @@ set(dbg_SOURCES
|
|||
"src/dbg/analysis/xrefsanalysis.h"
|
||||
"src/dbg/animate.cpp"
|
||||
"src/dbg/animate.h"
|
||||
"src/dbg/args.h"
|
||||
"src/dbg/argument.cpp"
|
||||
"src/dbg/argument.h"
|
||||
"src/dbg/assemble.cpp"
|
||||
|
|
@ -311,6 +346,7 @@ set(dbg_SOURCES
|
|||
"src/dbg/jansson/jansson_x64dbg.h"
|
||||
"src/dbg/jit.cpp"
|
||||
"src/dbg/jit.h"
|
||||
"src/dbg/jobqueue.h"
|
||||
"src/dbg/label.cpp"
|
||||
"src/dbg/label.h"
|
||||
"src/dbg/loop.cpp"
|
||||
|
|
@ -365,6 +401,8 @@ set(dbg_SOURCES
|
|||
"src/dbg/taskthread.h"
|
||||
"src/dbg/tcpconnections.cpp"
|
||||
"src/dbg/tcpconnections.h"
|
||||
"src/dbg/testing.cpp"
|
||||
"src/dbg/testing.h"
|
||||
"src/dbg/thread.cpp"
|
||||
"src/dbg/thread.h"
|
||||
"src/dbg/threading.cpp"
|
||||
|
|
@ -372,6 +410,8 @@ set(dbg_SOURCES
|
|||
"src/dbg/types.cpp"
|
||||
"src/dbg/types.h"
|
||||
"src/dbg/typesparser.cpp"
|
||||
"src/dbg/typevisitor.cpp"
|
||||
"src/dbg/typevisitor.h"
|
||||
"src/dbg/value.cpp"
|
||||
"src/dbg/value.h"
|
||||
"src/dbg/variable.cpp"
|
||||
|
|
@ -391,6 +431,7 @@ source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${dbg_SOURCES})
|
|||
|
||||
target_compile_definitions(dbg PRIVATE
|
||||
BUILD_DBG
|
||||
NOMINMAX
|
||||
)
|
||||
|
||||
target_include_directories(dbg PRIVATE
|
||||
|
|
@ -399,6 +440,24 @@ target_include_directories(dbg PRIVATE
|
|||
"src/dbg/commands"
|
||||
)
|
||||
|
||||
if(MSVC) # msvc
|
||||
target_link_libraries(dbg PUBLIC
|
||||
Delayimp
|
||||
)
|
||||
endif()
|
||||
|
||||
if(NOT TARGET zydis_wrapper)
|
||||
message(FATAL_ERROR "Target \"zydis_wrapper\" referenced by \"dbg\" does not exist!")
|
||||
endif()
|
||||
|
||||
if(NOT TARGET bridge)
|
||||
message(FATAL_ERROR "Target \"bridge\" referenced by \"dbg\" does not exist!")
|
||||
endif()
|
||||
|
||||
if(NOT TARGET btparser)
|
||||
message(FATAL_ERROR "Target \"btparser\" referenced by \"dbg\" does not exist!")
|
||||
endif()
|
||||
|
||||
target_link_libraries(dbg PRIVATE
|
||||
zydis_wrapper
|
||||
bridge
|
||||
|
|
@ -407,6 +466,7 @@ target_link_libraries(dbg PRIVATE
|
|||
Shlwapi
|
||||
Ws2_32
|
||||
Wininet
|
||||
Iphlpapi
|
||||
)
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
|
|
@ -435,6 +495,12 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8) # x64
|
|||
)
|
||||
endif()
|
||||
|
||||
if(MSVC) # msvc
|
||||
target_link_options(dbg PUBLIC
|
||||
"/DELAYLOAD:TitanEngine.dll"
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
set_target_properties(dbg PROPERTIES
|
||||
OUTPUT_NAME
|
||||
|
|
@ -452,6 +518,24 @@ endif()
|
|||
# Target: gui
|
||||
set(gui_SOURCES
|
||||
cmake.toml
|
||||
"src/gui/Src/Accessible/Accessible.cpp"
|
||||
"src/gui/Src/Accessible/Accessible.h"
|
||||
"src/gui/Src/Accessible/AccessibleAbstractTableView.cpp"
|
||||
"src/gui/Src/Accessible/AccessibleAbstractTableView.h"
|
||||
"src/gui/Src/Accessible/AccessibleAbstractTableViewCell.cpp"
|
||||
"src/gui/Src/Accessible/AccessibleAbstractTableViewCell.h"
|
||||
"src/gui/Src/Accessible/AccessibleAbstractTableViewCellTitle.cpp"
|
||||
"src/gui/Src/Accessible/AccessibleAbstractTableViewCellTitle.h"
|
||||
"src/gui/Src/Accessible/AccessibleDisassembly.cpp"
|
||||
"src/gui/Src/Accessible/AccessibleDisassembly.h"
|
||||
"src/gui/Src/Accessible/AccessibleHexDump.cpp"
|
||||
"src/gui/Src/Accessible/AccessibleHexDump.h"
|
||||
"src/gui/Src/Accessible/AccessibleRegistersView.cpp"
|
||||
"src/gui/Src/Accessible/AccessibleRegistersView.h"
|
||||
"src/gui/Src/Accessible/AccessibleStdTable.cpp"
|
||||
"src/gui/Src/Accessible/AccessibleStdTable.h"
|
||||
"src/gui/Src/Accessible/AccessibleTraceBrowser.cpp"
|
||||
"src/gui/Src/Accessible/AccessibleTraceBrowser.h"
|
||||
"src/gui/Src/BasicView/AbstractSearchList.h"
|
||||
"src/gui/Src/BasicView/AbstractStdTable.cpp"
|
||||
"src/gui/Src/BasicView/AbstractStdTable.h"
|
||||
|
|
@ -560,6 +644,9 @@ set(gui_SOURCES
|
|||
"src/gui/Src/Gui/DisassemblerGraphView.h"
|
||||
"src/gui/Src/Gui/DisassemblyPopup.cpp"
|
||||
"src/gui/Src/Gui/DisassemblyPopup.h"
|
||||
"src/gui/Src/Gui/DisplayTypeDialog.cpp"
|
||||
"src/gui/Src/Gui/DisplayTypeDialog.h"
|
||||
"src/gui/Src/Gui/DisplayTypeDialog.ui"
|
||||
"src/gui/Src/Gui/EditBreakpointDialog.cpp"
|
||||
"src/gui/Src/Gui/EditBreakpointDialog.h"
|
||||
"src/gui/Src/Gui/EditBreakpointDialog.ui"
|
||||
|
|
@ -584,6 +671,8 @@ set(gui_SOURCES
|
|||
"src/gui/Src/Gui/HexLineEdit.cpp"
|
||||
"src/gui/Src/Gui/HexLineEdit.h"
|
||||
"src/gui/Src/Gui/HexLineEdit.ui"
|
||||
"src/gui/Src/Gui/ImageTextBrowser.cpp"
|
||||
"src/gui/Src/Gui/ImageTextBrowser.h"
|
||||
"src/gui/Src/Gui/LineEditDialog.cpp"
|
||||
"src/gui/Src/Gui/LineEditDialog.h"
|
||||
"src/gui/Src/Gui/LineEditDialog.ui"
|
||||
|
|
@ -620,6 +709,9 @@ set(gui_SOURCES
|
|||
"src/gui/Src/Gui/ReferenceManager.h"
|
||||
"src/gui/Src/Gui/RegistersView.cpp"
|
||||
"src/gui/Src/Gui/RegistersView.h"
|
||||
"src/gui/Src/Gui/ReleaseNotesDialog.cpp"
|
||||
"src/gui/Src/Gui/ReleaseNotesDialog.h"
|
||||
"src/gui/Src/Gui/ReleaseNotesDialog.ui"
|
||||
"src/gui/Src/Gui/RichTextItemDelegate.cpp"
|
||||
"src/gui/Src/Gui/RichTextItemDelegate.h"
|
||||
"src/gui/Src/Gui/SEHChainView.cpp"
|
||||
|
|
@ -644,7 +736,6 @@ set(gui_SOURCES
|
|||
"src/gui/Src/Gui/SourceViewerManager.h"
|
||||
"src/gui/Src/Gui/StructWidget.cpp"
|
||||
"src/gui/Src/Gui/StructWidget.h"
|
||||
"src/gui/Src/Gui/StructWidget.ui"
|
||||
"src/gui/Src/Gui/SymbolView.cpp"
|
||||
"src/gui/Src/Gui/SymbolView.h"
|
||||
"src/gui/Src/Gui/SymbolView.ui"
|
||||
|
|
@ -659,6 +750,8 @@ set(gui_SOURCES
|
|||
"src/gui/Src/Gui/ThreadView.h"
|
||||
"src/gui/Src/Gui/TimeWastedCounter.cpp"
|
||||
"src/gui/Src/Gui/TimeWastedCounter.h"
|
||||
"src/gui/Src/Gui/TypeWidget.cpp"
|
||||
"src/gui/Src/Gui/TypeWidget.h"
|
||||
"src/gui/Src/Gui/VirtualModDialog.cpp"
|
||||
"src/gui/Src/Gui/VirtualModDialog.h"
|
||||
"src/gui/Src/Gui/VirtualModDialog.ui"
|
||||
|
|
@ -685,6 +778,9 @@ set(gui_SOURCES
|
|||
"src/gui/Src/QHexEdit/XByteArray.cpp"
|
||||
"src/gui/Src/QHexEdit/XByteArray.h"
|
||||
"src/gui/Src/ThirdPartyLibs/ldconvert/ldconvert.h"
|
||||
"src/gui/Src/ThirdPartyLibs/md4c/md4c-entity.h"
|
||||
"src/gui/Src/ThirdPartyLibs/md4c/md4c-html.h"
|
||||
"src/gui/Src/ThirdPartyLibs/md4c/md4c.h"
|
||||
"src/gui/Src/Tracer/TraceBrowser.cpp"
|
||||
"src/gui/Src/Tracer/TraceBrowser.h"
|
||||
"src/gui/Src/Tracer/TraceDump.cpp"
|
||||
|
|
@ -760,9 +856,16 @@ add_library(gui SHARED)
|
|||
target_sources(gui PRIVATE ${gui_SOURCES})
|
||||
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${gui_SOURCES})
|
||||
|
||||
if(X64DBG_RELEASE) # X64DBG_RELEASE
|
||||
target_compile_definitions(gui PUBLIC
|
||||
X64DBG_RELEASE
|
||||
)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(gui PRIVATE
|
||||
BUILD_LIB
|
||||
NOMINMAX
|
||||
X64DBG
|
||||
)
|
||||
|
||||
target_include_directories(gui PRIVATE
|
||||
|
|
@ -778,13 +881,27 @@ target_include_directories(gui PRIVATE
|
|||
"src/gui/Src/ThirdPartyLibs/ldconvert"
|
||||
)
|
||||
|
||||
if(NOT TARGET zydis_wrapper)
|
||||
message(FATAL_ERROR "Target \"zydis_wrapper\" referenced by \"gui\" does not exist!")
|
||||
endif()
|
||||
|
||||
if(NOT TARGET bridge)
|
||||
message(FATAL_ERROR "Target \"bridge\" referenced by \"gui\" does not exist!")
|
||||
endif()
|
||||
|
||||
if(NOT TARGET md4c-html)
|
||||
message(FATAL_ERROR "Target \"md4c-html\" referenced by \"gui\" does not exist!")
|
||||
endif()
|
||||
|
||||
target_link_libraries(gui PRIVATE
|
||||
Qt5::Widgets
|
||||
Qt5::Network
|
||||
Qt5::WinExtras
|
||||
zydis_wrapper
|
||||
bridge
|
||||
md4c-html
|
||||
winmm
|
||||
wininet
|
||||
dwmapi
|
||||
)
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
|
|
@ -825,6 +942,113 @@ set_target_properties(gui PROPERTIES
|
|||
set(CMKR_TARGET gui)
|
||||
include("cmake/deps.cmake")
|
||||
|
||||
# Target: exe
|
||||
set(exe_SOURCES
|
||||
cmake.toml
|
||||
"src/exe/LoadResourceString.h"
|
||||
"src/exe/crashdump.cpp"
|
||||
"src/exe/crashdump.h"
|
||||
"src/exe/icon.h"
|
||||
"src/exe/manifest.xml"
|
||||
"src/exe/resource.h"
|
||||
"src/exe/resource.rc"
|
||||
"src/exe/signaturecheck.cpp"
|
||||
"src/exe/signaturecheck.h"
|
||||
"src/exe/strings.h"
|
||||
"src/exe/strings_utf8.rc"
|
||||
"src/exe/x64dbg_exe.cpp"
|
||||
)
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
list(APPEND exe_SOURCES
|
||||
"src/exe/icon32.rc"
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # x64
|
||||
list(APPEND exe_SOURCES
|
||||
"src/exe/icon64.rc"
|
||||
)
|
||||
endif()
|
||||
|
||||
add_executable(exe)
|
||||
|
||||
target_sources(exe PRIVATE ${exe_SOURCES})
|
||||
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${exe_SOURCES})
|
||||
|
||||
if(NOT TARGET bridge)
|
||||
message(FATAL_ERROR "Target \"bridge\" referenced by \"exe\" does not exist!")
|
||||
endif()
|
||||
|
||||
target_link_libraries(exe PRIVATE
|
||||
bridge
|
||||
Wintrust
|
||||
)
|
||||
|
||||
if(MSVC) # msvc
|
||||
target_link_libraries(exe PRIVATE
|
||||
Delayimp
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSVC) # msvc
|
||||
target_link_options(exe PRIVATE
|
||||
"/DELAYLOAD:user32.dll"
|
||||
"/DELAYLOAD:wintrust.dll"
|
||||
"/DELAYLOAD:$<TARGET_FILE_NAME:bridge>"
|
||||
"/NOIMPLIB"
|
||||
"/NOEXP"
|
||||
"/LARGEADDRESSAWARE"
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
add_dependencies(exe
|
||||
launcher
|
||||
)
|
||||
endif()
|
||||
|
||||
add_dependencies(exe
|
||||
dbg
|
||||
gui
|
||||
loaddll
|
||||
deps
|
||||
)
|
||||
|
||||
set_target_properties(exe PROPERTIES
|
||||
MSVC_RUNTIME_LIBRARY
|
||||
"MultiThreaded$<$<CONFIG:Debug>:Debug>"
|
||||
WIN32_EXECUTABLE
|
||||
ON
|
||||
)
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
set_target_properties(exe PROPERTIES
|
||||
OUTPUT_NAME
|
||||
x32dbg
|
||||
ARCHIVE_OUTPUT_NAME
|
||||
x32dbg_exe
|
||||
PDB_NAME
|
||||
x32dbg_exe
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # x64
|
||||
set_target_properties(exe PROPERTIES
|
||||
OUTPUT_NAME
|
||||
x64dbg
|
||||
ARCHIVE_OUTPUT_NAME
|
||||
x64dbg_exe
|
||||
PDB_NAME
|
||||
x64dbg_exe
|
||||
)
|
||||
endif()
|
||||
|
||||
get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT)
|
||||
if(NOT CMKR_VS_STARTUP_PROJECT)
|
||||
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT exe)
|
||||
endif()
|
||||
|
||||
# Target: loaddll
|
||||
set(loaddll_SOURCES
|
||||
cmake.toml
|
||||
|
|
@ -848,7 +1072,21 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 8) # x64
|
|||
)
|
||||
endif()
|
||||
|
||||
if(MSVC) # msvc
|
||||
target_link_libraries(loaddll PRIVATE
|
||||
Delayimp
|
||||
)
|
||||
endif()
|
||||
|
||||
if(MSVC) # msvc
|
||||
target_link_options(loaddll PRIVATE
|
||||
"/DELAYLOAD:user32.dll"
|
||||
)
|
||||
endif()
|
||||
|
||||
set_target_properties(loaddll PROPERTIES
|
||||
MSVC_RUNTIME_LIBRARY
|
||||
"MultiThreaded$<$<CONFIG:Debug>:Debug>"
|
||||
WIN32_EXECUTABLE
|
||||
ON
|
||||
)
|
||||
|
|
@ -858,91 +1096,51 @@ if(NOT CMKR_VS_STARTUP_PROJECT)
|
|||
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT loaddll)
|
||||
endif()
|
||||
|
||||
# Target: exe
|
||||
set(exe_SOURCES
|
||||
# Target: headless
|
||||
set(headless_SOURCES
|
||||
cmake.toml
|
||||
"src/exe/LoadResourceString.h"
|
||||
"src/exe/crashdump.cpp"
|
||||
"src/exe/crashdump.h"
|
||||
"src/exe/icon.h"
|
||||
"src/exe/manifest.xml"
|
||||
"src/exe/resource.h"
|
||||
"src/exe/resource.rc"
|
||||
"src/exe/signaturecheck.cpp"
|
||||
"src/exe/signaturecheck.h"
|
||||
"src/exe/strings.h"
|
||||
"src/exe/strings.rc"
|
||||
"src/exe/x64dbg_exe.cpp"
|
||||
"src/headless/headless.cpp"
|
||||
"src/headless/signaturecheck.cpp"
|
||||
"src/headless/stringutils.cpp"
|
||||
"src/headless/stringutils.h"
|
||||
"src/headless/tostring.h"
|
||||
)
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
list(APPEND exe_SOURCES
|
||||
"src/exe/icon32.rc"
|
||||
)
|
||||
add_executable(headless)
|
||||
|
||||
target_sources(headless PRIVATE ${headless_SOURCES})
|
||||
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${headless_SOURCES})
|
||||
|
||||
if(NOT TARGET bridge)
|
||||
message(FATAL_ERROR "Target \"bridge\" referenced by \"headless\" does not exist!")
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # x64
|
||||
list(APPEND exe_SOURCES
|
||||
"src/exe/icon64.rc"
|
||||
)
|
||||
endif()
|
||||
|
||||
add_executable(exe)
|
||||
|
||||
target_sources(exe PRIVATE ${exe_SOURCES})
|
||||
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${exe_SOURCES})
|
||||
|
||||
target_link_libraries(exe PRIVATE
|
||||
target_link_libraries(headless PRIVATE
|
||||
bridge
|
||||
Wintrust
|
||||
)
|
||||
|
||||
if(MSVC) # msvc
|
||||
target_link_options(exe PRIVATE
|
||||
"/DEF:${CMAKE_SOURCE_DIR}/src/exe/signaturecheck.def"
|
||||
"/INCREMENTAL:NO"
|
||||
target_link_options(headless PRIVATE
|
||||
"/LARGEADDRESSAWARE"
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
set_target_properties(exe PROPERTIES
|
||||
OUTPUT_NAME
|
||||
x32dbg
|
||||
PDB_NAME
|
||||
x32dbg_exe
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8) # x64
|
||||
set_target_properties(exe PROPERTIES
|
||||
OUTPUT_NAME
|
||||
x64dbg
|
||||
PDB_NAME
|
||||
x64dbg_exe
|
||||
)
|
||||
endif()
|
||||
|
||||
set_target_properties(exe PROPERTIES
|
||||
WIN32_EXECUTABLE
|
||||
ON
|
||||
add_dependencies(headless
|
||||
exe
|
||||
)
|
||||
|
||||
get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT)
|
||||
if(NOT CMKR_VS_STARTUP_PROJECT)
|
||||
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT exe)
|
||||
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT headless)
|
||||
endif()
|
||||
|
||||
set(CMKR_TARGET exe)
|
||||
# Make the executable the main target
|
||||
add_dependencies(exe dbg gui deps)
|
||||
|
||||
# Target: launcher
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
||||
set(launcher_SOURCES
|
||||
cmake.toml
|
||||
"src/exe/icon.rc"
|
||||
"src/exe/resource.rc"
|
||||
"src/exe/strings.rc"
|
||||
"src/exe/strings_utf8.rc"
|
||||
"src/launcher/x64dbg_launcher.cpp"
|
||||
)
|
||||
|
||||
|
|
@ -957,12 +1155,21 @@ if(CMAKE_SIZEOF_VOID_P EQUAL 4) # x86
|
|||
)
|
||||
|
||||
set_target_properties(launcher PROPERTIES
|
||||
MSVC_RUNTIME_LIBRARY
|
||||
"MultiThreaded$<$<CONFIG:Debug>:Debug>"
|
||||
OUTPUT_NAME
|
||||
x96dbg
|
||||
WIN32_EXECUTABLE
|
||||
ON
|
||||
)
|
||||
|
||||
if(X64DBG_BUILD_IN_TREE) # X64DBG_BUILD_IN_TREE
|
||||
set_target_properties(launcher PROPERTIES
|
||||
RUNTIME_OUTPUT_DIRECTORY
|
||||
"${PROJECT_SOURCE_DIR}/bin"
|
||||
)
|
||||
endif()
|
||||
|
||||
get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT)
|
||||
if(NOT CMKR_VS_STARTUP_PROJECT)
|
||||
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT launcher)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,50 @@
|
|||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "x64-Release",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "RelWithDebInfo",
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"inheritEnvironments": [ "msvc_x64_x64" ]
|
||||
},
|
||||
{
|
||||
"name": "x86-Release",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "RelWithDebInfo",
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"inheritEnvironments": [ "msvc_x86" ],
|
||||
"variables": []
|
||||
},
|
||||
{
|
||||
"name": "x64-Debug",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "Debug",
|
||||
"inheritEnvironments": [ "msvc_x64_x64" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": ""
|
||||
},
|
||||
{
|
||||
"name": "x86-Debug",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "Debug",
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"inheritEnvironments": [ "msvc_x86" ],
|
||||
"variables": []
|
||||
}
|
||||
]
|
||||
}
|
||||
79
README.md
79
README.md
|
|
@ -2,9 +2,9 @@
|
|||
|
||||
<img width="100" src="https://github.com/x64dbg/x64dbg/raw/development/src/bug_black.png"/>
|
||||
|
||||
[](https://ci.appveyor.com/project/mrexodia/x64dbg) [](https://translate.x64dbg.com) [](https://sourceforge.net/projects/x64dbg/files/latest/download)
|
||||
[](https://translate.x64dbg.com) [](https://sourceforge.net/projects/x64dbg/files/latest/download) [](https://deepwiki.com/x64dbg/x64dbg)
|
||||
|
||||
[](https://invite.gg/x64dbg) [](https://telegram.me/x64dbg) [](https://gitter.im/x64dbg/x64dbg) [](https://riot.im/app/#/room/#x64dbg:matrix.org)
|
||||
[](https://discord.x64dbg.com) [](https://slack.x64dbg.com) [](https://gitter.im/x64dbg/x64dbg) [](https://riot.im/app/#/room/#x64dbg:matrix.org) [](https://web.libera.chat/#x64dbg)
|
||||
|
||||
An open-source binary debugger for Windows, aimed at malware analysis and reverse engineering of executables you do not have the source code for. There are many features available and a comprehensive [plugin system](https://plugins.x64dbg.com) to add your own. You can find more information on the [blog](https://x64dbg.com/blog)!
|
||||
|
||||
|
|
@ -19,7 +19,7 @@ An open-source binary debugger for Windows, aimed at malware analysis and revers
|
|||
|
||||
## Installation & Usage
|
||||
|
||||
1. Download a snapshot from [GitHub](https://github.com/x64dbg/x64dbg/releases), [SourceForge](https://sourceforge.net/projects/x64dbg/files/snapshots) or [OSDN](https://osdn.net/projects/x64dbg) and extract it in a location your user has write access to.
|
||||
1. Download a snapshot from [GitHub](https://github.com/x64dbg/x64dbg/releases) or [SourceForge](https://sourceforge.net/projects/x64dbg/files/snapshots) and extract it in a location your user has write access to.
|
||||
2. _Optionally_ use `x96dbg.exe` to register a shell extension and add shortcuts to your desktop.
|
||||
3. You can now run `x32\x32dbg.exe` if you want to debug a 32-bit executable or `x64\x64dbg.exe` to debug a 64-bit executable! If you are unsure you can always run `x96dbg.exe` and choose your architecture there.
|
||||
|
||||
|
|
@ -27,12 +27,20 @@ You can also [compile](https://github.com/x64dbg/x64dbg/wiki/Compiling-the-whole
|
|||
|
||||
## Sponsors
|
||||
|
||||
[](https://sponsors.x64dbg.com/malcore)
|
||||
<div align="center" markdown="1">
|
||||
|
||||
<a href="https://sponsors.x64dbg.com/warp" target="_blank">
|
||||
<img alt="Warp sponsorship" width="400" src="https://raw.githubusercontent.com/warpdotdev/brand-assets/main/Github/Sponsor/Warp-Github-LG-02.png">
|
||||
</a>
|
||||
|
||||
[**Warp, built for coding with multiple AI agents**](https://sponsors.x64dbg.com/warp)
|
||||
|
||||
<br>
|
||||
|
||||
[](https://sponsors.x64dbg.com/telekom)
|
||||
|
||||
</div>
|
||||
|
||||
## Contributing
|
||||
|
||||
This is a community effort and we accept pull requests! See the [CONTRIBUTING](.github/CONTRIBUTING.md) document for more information. If you have any questions you can always [contact us](https://x64dbg.com/#contact) or open an [issue](https://github.com/x64dbg/x64dbg/issues). You can take a look at the [good first issues](https://easy.x64dbg.com/) to get started.
|
||||
|
|
@ -93,3 +101,66 @@ You can find an exhaustive list of GitHub contributors [here](https://github.com
|
|||
- [JustMagic](https://github.com/JustasMasiulis)
|
||||
|
||||
Without the help of many people and other open-source projects, it would not have been possible to make x64dbg what it is today, thank you!
|
||||
|
||||
## Historical Donors
|
||||
|
||||
Before fully transitioning to [GitHub Sponsors](https://github.com/sponsors/mrexodia), this project received donations through BountySource. The original donation terms included an optional website link for donors who requested one at the time of donation. Links marked below reflect those requests. BountySource has since been shut down, so these records are reconstructed by hand. If you donated during this period and your username/amount is missing or incorrect, please reach out.
|
||||
|
||||
|Username|Amount|Date||Username|Amount|Date|
|
||||
|-|-|-|-|-|-|-|
|
||||
|sghctoma|$50|2015-04-19||dfrunza|$20|2017-01-30|
|
||||
|overflow|$50|2015-04-25||ham3di|$100|2017-02-01|
|
||||
|jl2id|$15|2015-04-29||johnny5|$5|2017-02-19|
|
||||
|cypherpunk|$50|2015-05-02||David-Reguera-Garcia-Dreg|$90|2017-02-26|
|
||||
|Aciid|$50|2015-05-05||[Alexandro Sanchez Bach](https://phi.nz)|-|2017-03-02|
|
||||
|PI32|$15|2015-05-09||(unknown)|$6|2017-03-11|
|
||||
|darkvapeur|$8|2015-05-21||fred26|$50|2017-04-08|
|
||||
|fearless|$5|2015-05-24||gatesbillou|$20|2017-04-15|
|
||||
|0x90|$10|2015-05-31||David-Reguera-Garcia-Dreg|$10|2017-04-24|
|
||||
|acidflash|$50|2015-06-03||Adir|$20|2017-05-03|
|
||||
|VackerSimon|$10|2015-06-14||ferbeb|$10|2017-05-17|
|
||||
|Artic|$10|2015-06-29||(unknown)|$16|2017-06-04|
|
||||
|[crystalidea](https://www.crystalidea.com/uninstall-tool)|$24|2015-07-10||androsa|$20|2017-06-11|
|
||||
|jl2id|$10|2015-08-13||robersor|$25|2017-07-05|
|
||||
|[PELock](https://pelock.com)|$115|2015-08-26||DDSTrainers|$10|2017-07-15|
|
||||
|[tslater2006](https://github.com/tslater2006)|$20|2015-09-04||blaquee|$20|2017-08-27|
|
||||
|Exidous|$20|2015-09-04||SmilingWolf|$15|2017-09-26|
|
||||
|lupier|$40|2015-09-08||Alexander H.|$150|2017-10-11|
|
||||
|Stef|$10|2015-09-15||gatesbillou|$25|2017-10-14|
|
||||
|[d3v1l401](https://d3vsite.org)|$5|2015-10-06||t4rmo|$5|2017-10-18|
|
||||
|Artur|$20|2015-10-24||joelcornu|$5|2017-10-27|
|
||||
|RoBa|$100|2015-11-18||Adir|$35|2017-11-02|
|
||||
|mr.tuna7331|-|2015-12-15||(unknown)|$10|2017-11-11|
|
||||
|lupier|$90|2016-01-12||xdeng|$10|2018-01-04|
|
||||
|fvrmatteo|$10|2016-01-21||v-p-b|$50|2018-03-21|
|
||||
|willi.neu9|$10|2016-01-30||EmptyBrain|$50|2018-03-30|
|
||||
|rithien|$100|2016-02-19||[mentebinaria](https://www.mentebinaria.com.br/)|$19|2018-04-12|
|
||||
|ey|$20|2016-02-26||Mauro Bollini|$50|2018-06-07|
|
||||
|clockwork|$10|2016-03-06||gatesbillou|$15|2018-06-17|
|
||||
|codespy|$5|2016-03-23||Kirbiflint|$3|2018-06-22|
|
||||
|test|$100|2016-03-28||Chisato Rokumiya|$20|2018-09-20|
|
||||
|RomanGol|$10|2016-03-28||pengchang|$100|2018-10-24|
|
||||
|fearless|$10|2016-04-24||younsunmin|$5|2018-11-18|
|
||||
|Jack|$5|2016-05-17||EmptyBrain|$50|2018-12-27|
|
||||
|willi.neu9|$30|2016-05-26||Yim|$10|2019-01-13|
|
||||
|gatesbillou|$20|2016-06-02||[OALabs](https://www.youtube.com/c/OALabs)|-|2019-01-27|
|
||||
|AGI|$155|2016-06-16||Lixinist|$10|2019-04-15|
|
||||
|lupier|$100|2016-06-24||bloodmc|$50|2019-04-29|
|
||||
|0x90|$50|2016-07-19||(unknown)|$20|2019-05-24|
|
||||
|tr4nc3|$15|2016-07-31||masacate|$10|2019-07-10|
|
||||
|MikeGuidry|$2500|2016-07-31||User Manuals|$5|2020-01-20|
|
||||
|Alexander H.|$150|2016-09-09||Jim Conyngham|$50|2020-03-23|
|
||||
|darkvapeur|$10|2016-10-04||Danya|$5|2020-06-08|
|
||||
|h907308901|$5|2016-10-06||RooT|$160|2020-07-22|
|
||||
|Adir|$20|2016-10-24||jadakiss9018|$2|2020-09-11|
|
||||
|NicoG|$100|2016-10-27||samsonpianofingers|$15|2020-09-14|
|
||||
|Angie|$150|2016-11-03||tpericin|$1337|2020-10-09|
|
||||
|hulucc|$20|2016-12-02||nikkej|$100|2020-10-22|
|
||||
|napcode|$10|2016-12-05||kha1ifaa|$10|2021-01-04|
|
||||
|TechLord|-|2016-12-26||rikaardhosein|$20|2021-09-08|
|
||||
|ayylmao5|$5|2017-01-01||Lukas21|$50|2021-09-15|
|
||||
|affelwafro|$10|2017-01-03||Flavio Nardiello|$30|2021-12-01|
|
||||
|FS|$40|2017-01-15||stevemk14ebr|$1000|2021-12-03|
|
||||
|EmptyBrain|$50|2017-01-27||[ethical.blue](https://ethical.blue)|$19|2022-05-14|
|
||||
|
||||
_To all our early supporters: thank you for believing in this project before it became what it is today!_
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -6,10 +6,6 @@ ShortcutEdit[error="true"] {
|
|||
color: #EF5350;
|
||||
}
|
||||
|
||||
QTabWidget::pane {
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
QTabBar::tear {
|
||||
width: 0px;
|
||||
border: none;
|
||||
|
|
@ -323,7 +319,7 @@ QAbstractItemView QLineEdit {
|
|||
}
|
||||
|
||||
QGroupBox {
|
||||
border: 1px solid #212121;
|
||||
border: 1px solid #515151;
|
||||
border-radius: 2px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
|
@ -469,19 +465,11 @@ QTextEdit {
|
|||
|
||||
QPlainTextEdit {
|
||||
background-color: #313131;
|
||||
;
|
||||
color: #e0e0e0;
|
||||
border-radius: 2px;
|
||||
border: 1px solid #212121;
|
||||
}
|
||||
|
||||
QHeaderView::section {
|
||||
background-color: #2a2b2f;
|
||||
color: #e0e0e0;
|
||||
padding: 5px;
|
||||
border: 1px solid #212121;
|
||||
}
|
||||
|
||||
QSizeGrip {
|
||||
image: url(./rc/sizegrip.png);
|
||||
width: 12px;
|
||||
|
|
@ -958,10 +946,6 @@ QToolButton:pressed {
|
|||
border: 1px solid #414141;
|
||||
}
|
||||
|
||||
QHeaderView {
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
QListView::item:pressed,
|
||||
QTreeView::item:pressed {
|
||||
background: #414141;
|
||||
|
|
@ -978,6 +962,7 @@ QHeaderView {
|
|||
background-color: #212121;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border-radius: 0px;
|
||||
}
|
||||
|
||||
QHeaderView::section {
|
||||
|
|
@ -1019,10 +1004,6 @@ QHeaderView::up-arrow {
|
|||
image: url(./rc/up_arrow.png);
|
||||
}
|
||||
|
||||
QStatusBar::item {
|
||||
border: none;
|
||||
}
|
||||
|
||||
QSplitter::handle {
|
||||
background-color: #515151;
|
||||
}
|
||||
|
|
@ -1070,7 +1051,7 @@ DebugStatusLabel[state="paused"] {
|
|||
}
|
||||
|
||||
DebugStatusLabel[state="running"] {
|
||||
color: #000000;
|
||||
color: #f0f0f0;
|
||||
/*background-color: #c0c0c0;*/
|
||||
}
|
||||
|
||||
|
|
@ -1099,15 +1080,6 @@ ShortcutEdit[error="true"] {
|
|||
color: #dd0000;
|
||||
}
|
||||
|
||||
QTabWidget::pane {
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
QTabBar::tear {
|
||||
width: 0px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* e.g. "Exception filters" list, "Patch file" modules list, "Set page memory rights" table, "Select font" list, etc */
|
||||
QTableView, QListView {
|
||||
selection-color: #c8c8c8;
|
||||
|
|
|
|||
|
|
@ -237,6 +237,8 @@ SymbolLoadingTextColor=#E1EA76
|
|||
SymbolUnloadedTextColor=#A0A0A0
|
||||
ThreadCurrentBackgroundColor=#C24000
|
||||
ThreadCurrentColor=#FFFFFF
|
||||
CallStackHighlightBackgroundColor=#5C4A00
|
||||
CallStackHighlightColor=#FFFFFF
|
||||
WatchTriggeredBackgroundColor=#XXXXXX
|
||||
WatchTriggeredColor=#EF5350
|
||||
LinkColor=#89A2F6
|
||||
|
|
|
|||
|
|
@ -153,7 +153,6 @@
|
|||
0x00FE WM_INPUT_DEVICE_CHANGE
|
||||
0x00FF WM_INPUT
|
||||
0x0100 WM_KEYDOWN
|
||||
0x0100 WM_KEYFIRST
|
||||
0x0101 WM_KEYUP
|
||||
0x0102 WM_CHAR
|
||||
0x0103 WM_DEADCHAR
|
||||
|
|
@ -284,7 +283,6 @@
|
|||
0x01B1 LB_MULTIPLEADDSTRING
|
||||
0x01B2 LB_GETLISTBOXINFO
|
||||
0x01E1 MN_GETHMENU
|
||||
0x0200 WM_MOUSEFIRST
|
||||
0x0200 WM_MOUSEMOVE
|
||||
0x0201 WM_LBUTTONDOWN
|
||||
0x0202 WM_LBUTTONUP
|
||||
|
|
@ -295,7 +293,6 @@
|
|||
0x0207 WM_MBUTTONDOWN
|
||||
0x0208 WM_MBUTTONUP
|
||||
0x0209 WM_MBUTTONDBLCLK
|
||||
0x0209 WM_MOUSELAST
|
||||
0x020A WM_MOUSEWHEEL
|
||||
0x020B WM_XBUTTONDOWN
|
||||
0x020C WM_XBUTTONUP
|
||||
|
|
|
|||
83
build.bat
83
build.bat
|
|
@ -1,83 +0,0 @@
|
|||
@echo off
|
||||
|
||||
echo Saving PATH
|
||||
if "%OLDPATH%"=="" set OLDPATH=%PATH%
|
||||
|
||||
cd %~dp0
|
||||
|
||||
if /i "%1"=="x32" call setenv.bat x32&set type=Configuration=Release;Platform=Win32&goto build
|
||||
if /i "%1"=="x64" call setenv.bat x64&set type=Configuration=Release;Platform=x64&goto build
|
||||
if /i "%1"=="coverity" goto coverity
|
||||
if /i "%1"=="sonarqube" goto sonarqube
|
||||
|
||||
goto usage
|
||||
|
||||
|
||||
:build
|
||||
echo Building DBG...
|
||||
if "%MAXCORES%"=="" (
|
||||
msbuild.exe x64dbg.sln /m /verbosity:minimal /t:Rebuild /p:%type%
|
||||
) else (
|
||||
set CL=/MP%MAXCORES%
|
||||
msbuild.exe x64dbg.sln /m:1 /verbosity:minimal /t:Rebuild /p:%type%
|
||||
)
|
||||
if not %ERRORLEVEL%==0 exit
|
||||
|
||||
echo Building GUI...
|
||||
rmdir /S /Q src\gui_build
|
||||
cd src\gui
|
||||
qmake x64dbg.pro CONFIG+=release
|
||||
if not %ERRORLEVEL%==0 exit
|
||||
if "%MAXCORES%"=="" (
|
||||
jom
|
||||
) else (
|
||||
jom /J %MAXCORES%
|
||||
)
|
||||
if not %ERRORLEVEL%==0 exit
|
||||
cd ..\..
|
||||
goto :restorepath
|
||||
|
||||
|
||||
:coverity
|
||||
if "%2"=="" (
|
||||
echo "Usage: build.bat coverity x32/x64"
|
||||
goto usage
|
||||
)
|
||||
|
||||
call setenv.bat coverity
|
||||
echo Building with Coverity
|
||||
cov-configure --msvc
|
||||
cov-build --dir cov-int --instrument build.bat %2
|
||||
goto :restorepath
|
||||
|
||||
|
||||
:sonarqube
|
||||
if "%2"=="" (
|
||||
echo "Usage: build.bat sonarqube x32/x64"
|
||||
goto usage
|
||||
)
|
||||
|
||||
echo Building with SonarQube
|
||||
build-wrapper --out-dir bw-output build.bat %2
|
||||
if not defined APPVEYOR_PULL_REQUEST_NUMBER (
|
||||
sonar-scanner -Dsonar.projectKey=x64dbg -Dsonar.sources=. -Dsonar.cfamily.build-wrapper-output=bw-output -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=mrexodia-github -Dsonar.login=%SONARQUBE_TOKEN% -Dsonar.exclusions=src/dbg/btparser/**,src/gui_build/**,src/zydis_wrapper/zydis/**
|
||||
) else (
|
||||
sonar-scanner -Dsonar.projectKey=x64dbg -Dsonar.sources=. -Dsonar.cfamily.build-wrapper-output=bw-output -Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=mrexodia-github -Dsonar.login=%SONARQUBE_TOKEN% -Dsonar.exclusions=src/dbg/btparser/**,src/gui_build/**,src/zydis_wrapper/zydis/** -Dsonar.analysis.mode=preview -Dsonar.github.pullRequest=%APPVEYOR_PULL_REQUEST_NUMBER% -Dsonar.github.repository=x64dbg/x64dbg -Dsonar.github.oauth=%GITHUB_TOKEN%
|
||||
)
|
||||
goto :restorepath
|
||||
|
||||
|
||||
:usage
|
||||
echo "Usage: build.bat x32/x64/coverity"
|
||||
echo.
|
||||
echo Examples:
|
||||
echo build.bat x32 : builds 32-bit release build
|
||||
echo build.bat x64 : builds 64-bit release build
|
||||
echo build.bat coverity x32 : builds 32-bit coverity build
|
||||
echo build.bat coverity x64 : builds 64-bit coverity build
|
||||
goto :restorepath
|
||||
|
||||
:restorepath
|
||||
echo Resetting PATH
|
||||
set PATH=%OLDPATH%
|
||||
set OLDPATH=
|
||||
86
clean.bat
86
clean.bat
|
|
@ -1,86 +0,0 @@
|
|||
@echo off
|
||||
|
||||
echo Cleaning base directory...
|
||||
del /Q *.sdf
|
||||
del /Q *.layout
|
||||
del /Q /A H *.suo
|
||||
rmdir /S /Q ipch
|
||||
rmdir /S /Q release
|
||||
rmdir /S /Q build
|
||||
rmdir /S /Q cov-int
|
||||
|
||||
echo Cleaning BRIDGE...
|
||||
cd src\bridge
|
||||
call :delfiles
|
||||
|
||||
echo Cleaning DBG...
|
||||
cd src\dbg
|
||||
call :delfiles
|
||||
|
||||
echo Cleaning EXE...
|
||||
cd src\exe
|
||||
call :delfiles
|
||||
|
||||
echo Cleaning LAUNCHER...
|
||||
cd src\launcher
|
||||
call :delfiles
|
||||
|
||||
echo Cleaning GUI SRC...
|
||||
rmdir /S /Q src\gui_build
|
||||
|
||||
echo Cleaning GUI...
|
||||
cd src/gui
|
||||
rmdir /S /Q build
|
||||
del /Q Makefile*
|
||||
del /Q *.pdb
|
||||
cd ..\..
|
||||
|
||||
echo Cleaning bin\
|
||||
del /Q bin\*.pdb
|
||||
del /Q bin\*.exp
|
||||
del /Q bin\*.a
|
||||
del /Q bin\*.lib
|
||||
del /Q bin\*.def
|
||||
del /Q bin\x96dbg.exe
|
||||
|
||||
echo Cleaning bin\x32...
|
||||
rmdir /S /Q bin\x32\db
|
||||
del /Q bin\x32\*.pdb
|
||||
del /Q bin\x32\*.exp
|
||||
del /Q bin\x32\*.a
|
||||
del /Q bin\x32\*.lib
|
||||
del /Q bin\x32\*.def
|
||||
del /Q bin\x32\x32dbg.exe
|
||||
del /Q bin\x32\x32dbg.dll
|
||||
del /Q bin\x32\x32gui.dll
|
||||
del /Q bin\x32\x32bridge.dll
|
||||
|
||||
echo Cleaning bin\x64...
|
||||
rmdir /S /Q bin\x64\db
|
||||
del /Q bin\x64\*.pdb
|
||||
del /Q bin\x64\*.exp
|
||||
del /Q bin\x64\*.a
|
||||
del /Q bin\x64\*.lib
|
||||
del /Q bin\x64\*.def
|
||||
del /Q bin\x64\x64dbg.exe
|
||||
del /Q bin\x64\x64dbg.dll
|
||||
del /Q bin\x64\x64gui.dll
|
||||
del /Q bin\x64\x64bridge.dll
|
||||
|
||||
echo Cleaning help...
|
||||
cd help
|
||||
del /Q *.chm
|
||||
rmdir /S /Q output
|
||||
|
||||
echo Done!
|
||||
exit 0
|
||||
|
||||
:delfiles
|
||||
rmdir /S /Q obj
|
||||
rmdir /S /Q Win32
|
||||
rmdir /S /Q x64
|
||||
del /Q *.bmarks
|
||||
del /Q *.layout
|
||||
del /Q *.depend
|
||||
del /Q *.pdb
|
||||
cd ..\..
|
||||
141
cmake.toml
141
cmake.toml
|
|
@ -2,9 +2,17 @@
|
|||
version = "3.15"
|
||||
cmkr-include = "cmake/cmkr.cmake"
|
||||
|
||||
[options]
|
||||
X64DBG_BUILD_IN_TREE = true
|
||||
X64DBG_RELEASE = false
|
||||
|
||||
[variables]
|
||||
CMAKE_MODULE_PATH = "${CMAKE_SOURCE_DIR}/cmake"
|
||||
|
||||
[project]
|
||||
name = "x64dbg"
|
||||
description = "An open-source x64/x32 debugger for windows."
|
||||
msvc-runtime = "dynamic"
|
||||
include-before = [
|
||||
"cmake/VSToolchain.cmake"
|
||||
]
|
||||
|
|
@ -17,26 +25,12 @@ x86 = "CMAKE_SIZEOF_VOID_P EQUAL 4"
|
|||
x64 = "CMAKE_SIZEOF_VOID_P EQUAL 8"
|
||||
|
||||
[find-package]
|
||||
Qt5 = { components = ["Widgets", "Network", "WinExtras"] }
|
||||
Qt5 = { components = ["Widgets", "WinExtras"] }
|
||||
|
||||
[target.zydis_wrapper]
|
||||
type = "static"
|
||||
sources = [
|
||||
"src/zydis_wrapper/*.cpp",
|
||||
"src/zydis_wrapper/*.h",
|
||||
"src/zydis_wrapper/Zydis/Zydis.h",
|
||||
"src/zydis_wrapper/zydis/Zydis.c",
|
||||
]
|
||||
include-directories = [
|
||||
"src/zydis_wrapper",
|
||||
]
|
||||
private-include-directories = [
|
||||
"src/zydis_wrapper/Zydis",
|
||||
]
|
||||
compile-definitions = [
|
||||
"ZYCORE_STATIC_BUILD",
|
||||
"ZYDIS_STATIC_BUILD",
|
||||
]
|
||||
[subdir."src/zydis_wrapper"]
|
||||
[subdir."src/gui/Src/ThirdPartyLibs/md4c"]
|
||||
[subdir."src/third_party"]
|
||||
[subdir."src/tests"]
|
||||
|
||||
[target.bridge]
|
||||
type = "shared"
|
||||
|
|
@ -57,8 +51,6 @@ x64.OUTPUT_NAME = "x64bridge"
|
|||
type = "static"
|
||||
sources = [
|
||||
"src/dbg/btparser/btparser/lexer.cpp",
|
||||
"src/dbg/btparser/btparser/parser.cpp",
|
||||
"src/dbg/btparser/btparser/ast.h",
|
||||
"src/dbg/btparser/btparser/helpers.h",
|
||||
"src/dbg/btparser/btparser/keywords.h",
|
||||
"src/dbg/btparser/btparser/lexer.h",
|
||||
|
|
@ -69,6 +61,7 @@ sources = [
|
|||
include-directories = [
|
||||
"src/dbg/btparser",
|
||||
]
|
||||
clang-any.compile-options = ["-Wno-self-assign-field"]
|
||||
|
||||
[target.dbg]
|
||||
type = "shared"
|
||||
|
|
@ -91,13 +84,14 @@ sources = [
|
|||
"src/dbg/XEDParse/*.h",
|
||||
]
|
||||
private-link-libraries = [
|
||||
"zydis_wrapper",
|
||||
"bridge",
|
||||
"btparser",
|
||||
"::zydis_wrapper",
|
||||
"::bridge",
|
||||
"::btparser",
|
||||
"Psapi",
|
||||
"Shlwapi",
|
||||
"Ws2_32",
|
||||
"Wininet",
|
||||
"Iphlpapi",
|
||||
]
|
||||
x86.private-link-libraries = [
|
||||
"src/dbg/dbghelp/dbghelp_x86.lib",
|
||||
|
|
@ -121,12 +115,19 @@ x64.private-link-libraries = [
|
|||
]
|
||||
private-compile-definitions = [
|
||||
"BUILD_DBG",
|
||||
"NOMINMAX",
|
||||
]
|
||||
private-include-directories = [
|
||||
"src/dbg",
|
||||
"src/dbg/analysis",
|
||||
"src/dbg/commands",
|
||||
]
|
||||
msvc.link-options = [
|
||||
"/DELAYLOAD:TitanEngine.dll",
|
||||
]
|
||||
msvc.link-libraries = [
|
||||
"Delayimp",
|
||||
]
|
||||
|
||||
[target.dbg.properties]
|
||||
x86.OUTPUT_NAME = "x32dbg"
|
||||
|
|
@ -142,11 +143,13 @@ sources = [
|
|||
]
|
||||
private-link-libraries = [
|
||||
"Qt5::Widgets",
|
||||
"Qt5::Network",
|
||||
"Qt5::WinExtras",
|
||||
"zydis_wrapper",
|
||||
"bridge",
|
||||
"::zydis_wrapper",
|
||||
"::bridge",
|
||||
"::md4c-html",
|
||||
"winmm",
|
||||
"wininet",
|
||||
"dwmapi"
|
||||
]
|
||||
x86.private-link-libraries = [
|
||||
"src/gui/Src/ThirdPartyLibs/ldconvert/ldconvert_x86.lib",
|
||||
|
|
@ -169,7 +172,9 @@ private-include-directories = [
|
|||
private-compile-definitions = [
|
||||
"BUILD_LIB",
|
||||
"NOMINMAX",
|
||||
"X64DBG",
|
||||
]
|
||||
X64DBG_RELEASE.compile-definitions = ["X64DBG_RELEASE"]
|
||||
include-after = ["cmake/deps.cmake"]
|
||||
|
||||
[target.gui.properties]
|
||||
|
|
@ -179,8 +184,49 @@ AUTOMOC = true
|
|||
AUTORCC = true
|
||||
AUTOUIC = true
|
||||
|
||||
[target.exe]
|
||||
type = "executable"
|
||||
msvc-runtime = "static"
|
||||
sources = [
|
||||
"src/exe/*.cpp",
|
||||
"src/exe/*.h",
|
||||
"src/exe/manifest.xml",
|
||||
"src/exe/resource.rc",
|
||||
"src/exe/strings_utf8.rc",
|
||||
]
|
||||
x86.sources = ["src/exe/icon32.rc"]
|
||||
x64.sources = ["src/exe/icon64.rc"]
|
||||
link-libraries = [
|
||||
"::bridge",
|
||||
"Wintrust",
|
||||
]
|
||||
msvc.link-options = [
|
||||
"/DELAYLOAD:user32.dll",
|
||||
"/DELAYLOAD:wintrust.dll",
|
||||
"/DELAYLOAD:$<TARGET_FILE_NAME:bridge>",
|
||||
"/NOIMPLIB",
|
||||
"/NOEXP",
|
||||
"/LARGEADDRESSAWARE",
|
||||
]
|
||||
msvc.link-libraries = [
|
||||
"Delayimp",
|
||||
]
|
||||
# Make the executable build everything
|
||||
dependencies = ["dbg", "gui", "loaddll", "deps"]
|
||||
x86.dependencies = ["launcher"]
|
||||
|
||||
[target.exe.properties]
|
||||
x86.OUTPUT_NAME = "x32dbg"
|
||||
x64.OUTPUT_NAME = "x64dbg"
|
||||
x86.ARCHIVE_OUTPUT_NAME = "x32dbg_exe"
|
||||
x64.ARCHIVE_OUTPUT_NAME = "x64dbg_exe"
|
||||
x86.PDB_NAME = "x32dbg_exe"
|
||||
x64.PDB_NAME = "x64dbg_exe"
|
||||
WIN32_EXECUTABLE = "ON"
|
||||
|
||||
[target.loaddll]
|
||||
type = "executable"
|
||||
msvc-runtime = "static"
|
||||
sources = [
|
||||
"src/loaddll/loaddll.cpp",
|
||||
]
|
||||
|
|
@ -190,49 +236,39 @@ x86.link-libraries = [
|
|||
x64.link-libraries = [
|
||||
"src/dbg/ntdll/ntdll_x64.lib",
|
||||
]
|
||||
msvc.link-options = [
|
||||
"/DELAYLOAD:user32.dll",
|
||||
]
|
||||
msvc.link-libraries = [
|
||||
"Delayimp",
|
||||
]
|
||||
|
||||
[target.loaddll.properties]
|
||||
WIN32_EXECUTABLE = "ON"
|
||||
|
||||
[target.exe]
|
||||
[target.headless]
|
||||
type = "executable"
|
||||
sources = [
|
||||
"src/exe/*.cpp",
|
||||
"src/exe/*.h",
|
||||
"src/exe/manifest.xml",
|
||||
"src/exe/resource.rc",
|
||||
"src/exe/strings.rc",
|
||||
"src/headless/*.cpp",
|
||||
"src/headless/*.h",
|
||||
]
|
||||
x86.sources = ["src/exe/icon32.rc"]
|
||||
x64.sources = ["src/exe/icon64.rc"]
|
||||
link-libraries = [
|
||||
"bridge",
|
||||
"Wintrust",
|
||||
"::bridge",
|
||||
]
|
||||
msvc.link-options = [
|
||||
"/DEF:${CMAKE_SOURCE_DIR}/src/exe/signaturecheck.def",
|
||||
"/INCREMENTAL:NO",
|
||||
"/LARGEADDRESSAWARE",
|
||||
]
|
||||
cmake-after = """
|
||||
# Make the executable the main target
|
||||
add_dependencies(exe dbg gui deps)
|
||||
"""
|
||||
|
||||
[target.exe.properties]
|
||||
x86.OUTPUT_NAME = "x32dbg"
|
||||
x64.OUTPUT_NAME = "x64dbg"
|
||||
x86.PDB_NAME = "x32dbg_exe"
|
||||
x64.PDB_NAME = "x64dbg_exe"
|
||||
WIN32_EXECUTABLE = "ON"
|
||||
dependencies = ["exe"]
|
||||
|
||||
[target.launcher]
|
||||
type = "executable"
|
||||
condition = "x86"
|
||||
msvc-runtime = "static"
|
||||
sources = [
|
||||
"src/launcher/*.cpp",
|
||||
"src/exe/icon.rc",
|
||||
"src/exe/resource.rc",
|
||||
"src/exe/strings.rc",
|
||||
"src/exe/strings_utf8.rc",
|
||||
]
|
||||
link-libraries = [
|
||||
"Shlwapi",
|
||||
|
|
@ -241,4 +277,5 @@ link-libraries = [
|
|||
|
||||
[target.launcher.properties]
|
||||
OUTPUT_NAME = "x96dbg"
|
||||
WIN32_EXECUTABLE = "ON"
|
||||
WIN32_EXECUTABLE = "ON"
|
||||
X64DBG_BUILD_IN_TREE.RUNTIME_OUTPUT_DIRECTORY = "${PROJECT_SOURCE_DIR}/bin"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,56 @@
|
|||
# Documentation: https://cmake.org/cmake/help/latest/manual/cmake-developer.7.html#find-modules
|
||||
|
||||
if(Qt5_FOUND)
|
||||
return()
|
||||
endif()
|
||||
|
||||
find_package(Qt5 COMPONENTS ${Qt5_FIND_COMPONENTS} QUIET CONFIG)
|
||||
|
||||
if(Qt5_FOUND)
|
||||
if(NOT Qt5_FIND_QUIETLY)
|
||||
message(STATUS "Qt5 found: ${Qt5_DIR}")
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(Qt5_FIND_REQUIRED AND WIN32 AND (MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC"))
|
||||
message(STATUS "Downloading Qt5...")
|
||||
# Fix warnings about DOWNLOAD_EXTRACT_TIMESTAMP
|
||||
if(POLICY CMP0135)
|
||||
cmake_policy(SET CMP0135 NEW)
|
||||
endif()
|
||||
include(FetchContent)
|
||||
set(FETCHCONTENT_QUIET OFF)
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
FetchContent_Declare(Qt5
|
||||
URL "https://github.com/x64dbg/deps/releases/download/2025.07.02/qt5.12.12-msvc2017_64.7z"
|
||||
URL_HASH SHA256=770490bf09514982c8192ebde9a1fac8821108ba42b021f167bac54e85ada48a
|
||||
)
|
||||
else()
|
||||
FetchContent_Declare(Qt5
|
||||
URL "https://github.com/x64dbg/deps/releases/download/2025.07.02/qt5.12.12-msvc2017.7z"
|
||||
URL_HASH SHA256=3ff2a58e5ed772be475643cd7bb2df3e5499d7169d794ddf1ed5df5c5e862cb6
|
||||
)
|
||||
endif()
|
||||
FetchContent_MakeAvailable(Qt5)
|
||||
unset(FETCHCONTENT_QUIET)
|
||||
set(Qt5_ROOT ${qt5_SOURCE_DIR})
|
||||
find_package(Qt5 COMPONENTS ${Qt5_FIND_COMPONENTS} QUIET CONFIG)
|
||||
endif()
|
||||
|
||||
if(Qt5_FOUND)
|
||||
if(NOT Qt5_FIND_QUIETLY)
|
||||
message(STATUS "Qt5 found: ${Qt5_DIR}")
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(Qt5_FOUND FALSE)
|
||||
|
||||
if(Qt5_FIND_REQUIRED)
|
||||
string(JOIN ", " _qt5_required_components ${Qt5_FIND_COMPONENTS})
|
||||
message(FATAL_ERROR
|
||||
"Qt5 not found. Required components: ${_qt5_required_components}. "
|
||||
"For MSVC builds, Qt can be auto-downloaded. For other toolchains, install a compatible Qt SDK and set Qt5_DIR or CMAKE_PREFIX_PATH so CMake can find it."
|
||||
)
|
||||
endif()
|
||||
|
|
@ -1,3 +1,48 @@
|
|||
option(ENABLE_SANITIZERS "Enable sanitizers" OFF)
|
||||
if(ENABLE_SANITIZERS)
|
||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
if(CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC$")
|
||||
# NOTE: There is bug in Clang-CL that makes address sanitizers not work for all projects.
|
||||
# The main issue is the 'world' project, which has WINDOWS_EXPORT_ALL_SYMBOLS.
|
||||
# This issue will likely be fixed in a later version of Clang-CL, but for now you should
|
||||
# configure with -DCMAKE_C_COMPILER=clang.exe -DCMAKE_CXX_COMPILER=clang++.exe to enable
|
||||
# UB sanitizers.
|
||||
message(WARNING "Enabling Clang-CL sanitizers (Clang works better)...")
|
||||
add_compile_options(-fsanitize=address,undefined)
|
||||
|
||||
# Reference: https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-windows-with-msvc/
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(ASAN_LIB_SUFFIX "x86_64")
|
||||
else()
|
||||
set(ASAN_LIB_SUFFIX "i386")
|
||||
endif()
|
||||
set(ASAN_LINKER_FLAGS "/wholearchive:clang_rt.asan-${ASAN_LIB_SUFFIX}.lib /wholearchive:clang_rt.asan_cxx-${ASAN_LIB_SUFFIX}.lib")
|
||||
else()
|
||||
message(STATUS "Enabling Clang sanitizers...")
|
||||
add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer)
|
||||
set(ASAN_LINKER_FLAGS "-fsanitize=address,undefined")
|
||||
endif()
|
||||
|
||||
# NOTE: Only set linker flags for executables and shared libraries
|
||||
# the add_link_options command would add flags to static libraries as well
|
||||
# which causes issues with symbols being defined in multiple places.
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${ASAN_LINKER_FLAGS}")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${ASAN_LINKER_FLAGS}")
|
||||
|
||||
if(WIN32)
|
||||
# NOTE: The sanitizer library only supports the static release runtime
|
||||
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
|
||||
endif()
|
||||
elseif(MSVC)
|
||||
# Reference: https://learn.microsoft.com/en-us/cpp/build/reference/fsanitize
|
||||
message(WARNING "Enabling MSVC sanitizers (Clang has better support)...")
|
||||
add_compile_options(/fsanitize=address)
|
||||
add_link_options(/INCREMENTAL:NO)
|
||||
else()
|
||||
message (FATAL_ERROR "Unsupported compiler for sanitizers: ${CMAKE_CXX_COMPILER_ID}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Visual Studio generator specific flags
|
||||
if (CMAKE_GENERATOR MATCHES "Visual Studio")
|
||||
# HACK: DO NOT this to add compiler flags/definitions, use target_compile_options on a
|
||||
|
|
@ -7,10 +52,17 @@ if (CMAKE_GENERATOR MATCHES "Visual Studio")
|
|||
add_compile_options(/MP)
|
||||
endif()
|
||||
|
||||
# TODO: support other toolchains
|
||||
if(MSVC)
|
||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/DEBUG:FULL /INCREMENTAL:NO /OPT:REF /OPT:ICF" CACHE STRING "")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/DEBUG:FULL /INCREMENTAL:NO /OPT:REF /OPT:ICF" CACHE STRING "")
|
||||
# Generate PDB files for release builds
|
||||
add_link_options($<$<CONFIG:Release,MinSizeRel>:/DEBUG:FULL>)
|
||||
# Disable incremental linking
|
||||
add_link_options(
|
||||
$<$<CONFIG:Release,MinSizeRel,RelWithDebInfo>:/INCREMENTAL:NO>
|
||||
$<$<CONFIG:Release,MinSizeRel,RelWithDebInfo>:/OPT:REF>
|
||||
$<$<CONFIG:Release,MinSizeRel,RelWithDebInfo>:/OPT:ICF>
|
||||
)
|
||||
# Enable big objects (unity build)
|
||||
add_compile_options(/bigobj)
|
||||
endif()
|
||||
|
||||
# Make the project look nicer in IDEs
|
||||
|
|
@ -20,3 +72,24 @@ set_property(GLOBAL PROPERTY AUTOMOC_SOURCE_GROUP "Generated Files")
|
|||
set_property(GLOBAL PROPERTY AUTOMOC_TARGETS_FOLDER "CMakePredefinedTargets")
|
||||
set_property(GLOBAL PROPERTY AUTORCC_SOURCE_GROUP "Generated Files")
|
||||
set_property(GLOBAL PROPERTY AUTORCC_TARGETS_FOLDER "CMakePredefinedTargets")
|
||||
|
||||
# Build to the right output directory
|
||||
if(X64DBG_BUILD_IN_TREE)
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin/x64$<$<CONFIG:Debug>:d>")
|
||||
else()
|
||||
set(OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin/x32$<$<CONFIG:Debug>:d>")
|
||||
endif()
|
||||
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
|
||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
|
||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY})
|
||||
endif()
|
||||
|
||||
# Workaround for RC files to be treated as UTF-8 with llvm-rc
|
||||
if(CMAKE_RC_COMPILER MATCHES "[\\\\/]llvm-rc(.exe)?$")
|
||||
message(STATUS "Detected llvm-rc, applying UTF-8 workaround")
|
||||
# https://github.com/llvm/llvm-project/issues/63426#issuecomment-2769972658
|
||||
# https://stackoverflow.com/a/38346103/1806760
|
||||
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> /C 65001 /fo<OBJECT> <SOURCE>")
|
||||
endif()
|
||||
|
|
|
|||
|
|
@ -1,8 +1,11 @@
|
|||
include_guard()
|
||||
|
||||
# Initialize submodule if necessary
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/init-submodules.cmake)
|
||||
|
||||
# Change these defaults to point to your infrastructure if desired
|
||||
set(CMKR_REPO "https://github.com/build-cpp/cmkr" CACHE STRING "cmkr git repository" FORCE)
|
||||
set(CMKR_TAG "v0.2.44" CACHE STRING "cmkr git tag (this needs to be available forever)" FORCE)
|
||||
set(CMKR_TAG "v0.2.46" CACHE STRING "cmkr git tag (this needs to be available forever)" FORCE)
|
||||
set(CMKR_COMMIT_HASH "" CACHE STRING "cmkr git commit hash (optional)" FORCE)
|
||||
|
||||
# To bootstrap/generate a cmkr project: cmake -P cmkr.cmake
|
||||
|
|
@ -12,7 +15,7 @@ if(CMAKE_SCRIPT_MODE_FILE)
|
|||
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
endif()
|
||||
|
||||
# Signed executable from this release: https://github.com/build-cpp/cmkr/releases/tag/v0.2.44
|
||||
# Signed executable from this release: https://github.com/build-cpp/cmkr/releases/tag/v0.2.46
|
||||
# To build cmkr from source: cmake -B build -DCMKR_EXECUTABLE=
|
||||
if(WIN32)
|
||||
set(CMKR_EXECUTABLE_DEFAULT "${CMAKE_CURRENT_LIST_DIR}/cmkr.exe")
|
||||
|
|
|
|||
BIN
cmake/cmkr.exe
BIN
cmake/cmkr.exe
Binary file not shown.
231
cmake/deps.cmake
231
cmake/deps.cmake
|
|
@ -1,77 +1,154 @@
|
|||
if(CMAKE_SCRIPT_MODE_FILE)
|
||||
set(GUI_DLL ${CMAKE_ARGV3})
|
||||
set(DEPS_DIR ${CMAKE_ARGV4})
|
||||
set(WINDEPLOYQT ${CMAKE_ARGV5})
|
||||
get_filename_component(GUI_DIR ${GUI_DLL} DIRECTORY)
|
||||
|
||||
# Check if we already copied the dependencies
|
||||
if(EXISTS "${GUI_DIR}/.deps_copied")
|
||||
return()
|
||||
endif()
|
||||
|
||||
message(STATUS "Copying dependencies from ${DEPS_DIR} to ${GUI_DIR}")
|
||||
|
||||
execute_process(COMMAND ${WINDEPLOYQT} --no-compiler-runtime --force ${GUI_DLL})
|
||||
|
||||
function(copy_dep relfile)
|
||||
if(EXISTS ${relfile})
|
||||
message(STATUS "Skipping ${relfile}")
|
||||
return()
|
||||
endif()
|
||||
message(STATUS "Copying ${relfile}")
|
||||
get_filename_component(reldir ${relfile} DIRECTORY)
|
||||
get_filename_component(relfile ${relfile} NAME)
|
||||
file(COPY ${DEPS_DIR}/${relfile} DESTINATION ${GUI_DIR}/${reldir})
|
||||
endfunction()
|
||||
|
||||
file(GLOB DEPS RELATIVE ${DEPS_DIR} "${DEPS_DIR}/*.dll")
|
||||
foreach(DEP ${DEPS})
|
||||
if(NOT DEP MATCHES "^(Qt5|msvc)")
|
||||
copy_dep(${DEP})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
copy_dep(GleeBug/TitanEngine.dll)
|
||||
copy_dep(StaticEngine/TitanEngine.dll)
|
||||
|
||||
file(TOUCH "${GUI_DIR}/.deps_copied")
|
||||
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
message(STATUS "copy_dependencies is only supported on Windows")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(NOT TARGET Qt5::windeployqt AND Qt5_FOUND AND TARGET Qt5::qmake)
|
||||
get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION)
|
||||
|
||||
execute_process(
|
||||
COMMAND "${_qt5_qmake_location}" -query QT_INSTALL_PREFIX
|
||||
RESULT_VARIABLE return_code
|
||||
OUTPUT_VARIABLE qt5_install_prefix
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
set(imported_location "${qt5_install_prefix}/bin/windeployqt.exe")
|
||||
if(NOT EXISTS ${imported_location})
|
||||
message(FATAL_ERROR "Qt5 tool not found: ${imported_location}")
|
||||
endif()
|
||||
|
||||
add_executable(Qt5::windeployqt IMPORTED)
|
||||
|
||||
set_target_properties(Qt5::windeployqt PROPERTIES
|
||||
IMPORTED_LOCATION ${imported_location}
|
||||
)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(DEPS_DIR ${CMAKE_SOURCE_DIR}/deps/x64)
|
||||
else()
|
||||
set(DEPS_DIR ${CMAKE_SOURCE_DIR}/deps/x32)
|
||||
endif()
|
||||
|
||||
add_custom_target(deps
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/deps.cmake $<TARGET_FILE:gui> ${DEPS_DIR} $<TARGET_FILE:Qt5::windeployqt>
|
||||
)
|
||||
if(CMAKE_SCRIPT_MODE_FILE)
|
||||
set(GUI_DLL "${CMAKE_ARGV3}")
|
||||
set(DEPS_DIR "${CMAKE_ARGV4}")
|
||||
set(WINDEPLOYQT "${CMAKE_ARGV5}")
|
||||
set(EXPECTED_DEPS_HASH "${CMAKE_ARGV6}")
|
||||
get_filename_component(GUI_DIR "${GUI_DLL}" DIRECTORY)
|
||||
get_filename_component(WINDEPLOYQT_DIR "${WINDEPLOYQT}" DIRECTORY)
|
||||
set(DEPS_COPIED_FILE "${GUI_DIR}/.deps_copied")
|
||||
set(DEPS_HASH_FILE "${GUI_DIR}/.deps_hash")
|
||||
|
||||
# Check if we already copied the dependencies for the current Qt/deps state.
|
||||
if(EXISTS "${DEPS_COPIED_FILE}" AND EXISTS "${DEPS_HASH_FILE}")
|
||||
file(READ "${DEPS_HASH_FILE}" CURRENT_DEPS_HASH)
|
||||
string(STRIP "${CURRENT_DEPS_HASH}" CURRENT_DEPS_HASH)
|
||||
if("${CURRENT_DEPS_HASH}" STREQUAL "${EXPECTED_DEPS_HASH}")
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Make windeployqt resilient against globally configured Qt environments.
|
||||
string(CONCAT SANITIZED_PATH "${WINDEPLOYQT_DIR}" ";" "$ENV{PATH}")
|
||||
set(ENV{PATH} "${SANITIZED_PATH}")
|
||||
unset(ENV{QTDIR})
|
||||
unset(ENV{QT_PLUGIN_PATH})
|
||||
unset(ENV{QT_QPA_PLATFORM_PLUGIN_PATH})
|
||||
unset(ENV{QML_IMPORT_PATH})
|
||||
unset(ENV{QML2_IMPORT_PATH})
|
||||
|
||||
message(STATUS "Copying dependencies from ${DEPS_DIR} to ${GUI_DIR}")
|
||||
|
||||
execute_process(
|
||||
COMMAND "${WINDEPLOYQT}" --pdb --no-compiler-runtime --no-translations --no-opengl-sw --force "${GUI_DLL}" --list relative
|
||||
WORKING_DIRECTORY "${GUI_DIR}"
|
||||
RESULT_VARIABLE WINDEPLOYQT_RESULT
|
||||
OUTPUT_VARIABLE DEPS_COPIED
|
||||
ERROR_VARIABLE WINDEPLOYQT_STDERR
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
ERROR_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
if(NOT "${WINDEPLOYQT_STDERR}" STREQUAL "")
|
||||
message(STATUS "${WINDEPLOYQT_STDERR}")
|
||||
endif()
|
||||
|
||||
if(NOT WINDEPLOYQT_RESULT EQUAL 0)
|
||||
message(FATAL_ERROR "windeployqt failed with exit code ${WINDEPLOYQT_RESULT}")
|
||||
endif()
|
||||
|
||||
# Split the output into lines
|
||||
string(REGEX REPLACE "\n" ";" DEPS_COPIED "${DEPS_COPIED}")
|
||||
list(FILTER DEPS_COPIED EXCLUDE REGEX "^$")
|
||||
foreach(line ${DEPS_COPIED})
|
||||
message(STATUS "Copying ${line}")
|
||||
endforeach()
|
||||
|
||||
function(copy_dep relfile)
|
||||
set(DEPS_COPIED ${DEPS_COPIED} ${relfile} PARENT_SCOPE)
|
||||
set(target_path "${GUI_DIR}/${relfile}")
|
||||
if(IS_SYMLINK "${target_path}")
|
||||
message(STATUS "Skipping symlink ${relfile}")
|
||||
return()
|
||||
endif()
|
||||
message(STATUS "Copying ${relfile}")
|
||||
get_filename_component(reldir "${relfile}" DIRECTORY)
|
||||
get_filename_component(filename "${relfile}" NAME)
|
||||
if(reldir)
|
||||
file(COPY "${DEPS_DIR}/${reldir}/${filename}" DESTINATION "${GUI_DIR}/${reldir}")
|
||||
else()
|
||||
file(COPY "${DEPS_DIR}/${filename}" DESTINATION "${GUI_DIR}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
file(GLOB_RECURSE DEPS RELATIVE "${DEPS_DIR}" "${DEPS_DIR}/*.dll")
|
||||
list(SORT DEPS)
|
||||
foreach(DEP ${DEPS})
|
||||
copy_dep("${DEP}")
|
||||
endforeach()
|
||||
|
||||
list(JOIN DEPS_COPIED "\n" DEPS_COPIED)
|
||||
file(WRITE "${DEPS_COPIED_FILE}" "${DEPS_COPIED}")
|
||||
file(WRITE "${DEPS_HASH_FILE}" "${EXPECTED_DEPS_HASH}\n")
|
||||
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(NOT WIN32)
|
||||
message(STATUS "copy_dependencies is only supported on Windows")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(NOT TARGET Qt5::windeployqt)
|
||||
if(Qt5_FOUND AND TARGET Qt5::qmake)
|
||||
get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION)
|
||||
|
||||
execute_process(
|
||||
COMMAND "${_qt5_qmake_location}" -query QT_INSTALL_PREFIX
|
||||
RESULT_VARIABLE return_code
|
||||
OUTPUT_VARIABLE qt5_install_prefix
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
|
||||
set(imported_location "${qt5_install_prefix}/bin/windeployqt.exe")
|
||||
if(EXISTS ${imported_location})
|
||||
add_executable(Qt5::windeployqt IMPORTED)
|
||||
|
||||
set_target_properties(Qt5::windeployqt PROPERTIES
|
||||
IMPORTED_LOCATION ${imported_location}
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT TARGET Qt5::windeployqt)
|
||||
# Fallback: search for windeployqt on PATH
|
||||
find_program(_qt5_windeployqt_from_path NAMES windeployqt.exe windeployqt)
|
||||
if(_qt5_windeployqt_from_path)
|
||||
add_executable(Qt5::windeployqt IMPORTED)
|
||||
set_target_properties(Qt5::windeployqt PROPERTIES
|
||||
IMPORTED_LOCATION ${_qt5_windeployqt_from_path}
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
set(DEPS_DIR ${CMAKE_SOURCE_DIR}/deps/x64)
|
||||
else()
|
||||
set(DEPS_DIR ${CMAKE_SOURCE_DIR}/deps/x32)
|
||||
endif()
|
||||
|
||||
get_target_property(_qt5_windeployqt_location Qt5::windeployqt IMPORTED_LOCATION)
|
||||
if(NOT _qt5_windeployqt_location)
|
||||
message(FATAL_ERROR "Could not locate Qt5::windeployqt. Install Qt with windeployqt and ensure it is discoverable (in PATH or via Qt5::qmake).")
|
||||
endif()
|
||||
|
||||
file(GLOB_RECURSE DEPS_INPUT_DLLS "${DEPS_DIR}/*.dll")
|
||||
list(SORT DEPS_INPUT_DLLS)
|
||||
|
||||
file(SHA256 "${_qt5_windeployqt_location}" WINDEPLOYQT_HASH)
|
||||
set(DEPS_HASH_INPUT "WINDEPLOYQT=${WINDEPLOYQT_HASH}\n")
|
||||
foreach(DEP_FILE ${DEPS_INPUT_DLLS})
|
||||
file(RELATIVE_PATH DEP_RELATIVE "${DEPS_DIR}" "${DEP_FILE}")
|
||||
file(SHA256 "${DEP_FILE}" DEP_HASH)
|
||||
string(APPEND DEPS_HASH_INPUT "${DEP_RELATIVE}=${DEP_HASH}\n")
|
||||
endforeach()
|
||||
string(SHA256 EXPECTED_DEPS_HASH "${DEPS_HASH_INPUT}")
|
||||
|
||||
add_custom_target(deps
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/deps.cmake $<TARGET_FILE:gui> ${DEPS_DIR} $<TARGET_FILE:Qt5::windeployqt> ${EXPECTED_DEPS_HASH}
|
||||
)
|
||||
|
||||
# Make a rebuild copy the dependencies again
|
||||
set_target_properties(deps PROPERTIES
|
||||
ADDITIONAL_CLEAN_FILES "$<TARGET_FILE_DIR:gui>/.deps_copied;$<TARGET_FILE_DIR:gui>/.deps_hash"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
function(init_submodule folder)
|
||||
set(full_path "${CMAKE_CURRENT_LIST_DIR}/../${folder}")
|
||||
if(NOT EXISTS ${full_path})
|
||||
message(FATAL_ERROR "Submodule folder does not exist: ${full_path}")
|
||||
endif()
|
||||
file(GLOB files "${full_path}/*")
|
||||
if(NOT files)
|
||||
find_package(Git REQUIRED)
|
||||
message(STATUS "Submodule '${folder}' not initialized, running git...")
|
||||
execute_process(
|
||||
COMMAND "${GIT_EXECUTABLE}" rev-parse --show-toplevel
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/.."
|
||||
OUTPUT_VARIABLE git_root
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
COMMAND_ERROR_IS_FATAL ANY
|
||||
)
|
||||
execute_process(
|
||||
COMMAND "${GIT_EXECUTABLE}" submodule update --init -- "${full_path}"
|
||||
WORKING_DIRECTORY "${git_root}"
|
||||
COMMAND_ERROR_IS_FATAL ANY
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
init_submodule(src/dbg/btparser)
|
||||
init_submodule(deps)
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
set(LLVM_MINGW /Users/admin/llvm-mingw-ucrt)
|
||||
set(CMAKE_PREFIX_PATH /Users/admin/Qt5.6.3-msvc2015/msvc2015_64)
|
||||
|
||||
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
set(CMAKE_C_COMPILER_TARGET ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32)
|
||||
set(CMAKE_C_COMPILER ${LLVM_MINGW}/bin/x86_64-w64-mingw32-clang)
|
||||
set(CMAKE_CXX_COMPILER ${LLVM_MINGW}/bin/x86_64-w64-mingw32-clang++)
|
||||
set(CMAKE_SYSTEM_NAME Windows)
|
||||
set(CMAKE_SYSTEM_VERSION 1)
|
||||
|
||||
# This is working (thanks to Simon for finding this trick)
|
||||
set(CMAKE_AR ${LLVM_MINGW}/bin/llvm-ar)
|
||||
set(CMAKE_RANLIB ${LLVM_MINGW}/bin/x86_64-w64-mingw32-ranlib)
|
||||
set(CMAKE_RC_COMPILER ${LLVM_MINGW}/bin/llvm-rc)
|
||||
set(CMAKE_RC_COMPILER /Users/admin/Projects/zig-cross/cmake/zig-rc)
|
||||
|
||||
set(CMAKE_PROJECT_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/qt-cross.cmake)
|
||||
set(CMAKE_CXX_FLAGS_INIT "-stdlib=libc++ -mlzcnt")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_INIT "--start-no-unused-arguments -rtlib=compiler-rt -unwindlib=libunwind --end-no-unused-arguments")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}")
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
set(CMAKE_SYSTEM_NAME Windows)
|
||||
|
||||
set(MSVC_BIN_DIR $ENV{MSVC_BIN_DIR})
|
||||
set(CMAKE_C_COMPILER ${MSVC_BIN_DIR}/cl)
|
||||
set(CMAKE_CXX_COMPILER ${MSVC_BIN_DIR}/cl)
|
||||
set(CMAKE_RC_COMPILER ${MSVC_BIN_DIR}/rc)
|
||||
|
||||
set(CMAKE_PROJECT_INCLUDE ${CMAKE_CURRENT_LIST_DIR}/qt-wine.cmake)
|
||||
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
include_guard()
|
||||
|
||||
message(STATUS "Configuring Qt for cross-compilation...")
|
||||
|
||||
# Qt
|
||||
#set(AUTOMOC_EXECUTABLE /Users/admin/Projects/qtbase-wasm32-wasi/bin/moc)
|
||||
#set(AUTORCC_EXECUTABLE /Users/admin/Projects/qtbase-wasm32-wasi/bin/rcc)
|
||||
#set(AUTOUIC_EXECUTABLE /Users/admin/Projects/qtbase-wasm32-wasi/bin/uic)
|
||||
set(QT_HOST_BIN_DIR /Users/admin/Projects/qtbase-wasm32-wasi/bin/)
|
||||
|
||||
function(qt5_host_tool name)
|
||||
if (NOT TARGET Qt5::${name})
|
||||
add_executable(Qt5::${name} IMPORTED)
|
||||
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows")
|
||||
set(imported_location ${QT_HOST_BIN_DIR}/${name}.exe)
|
||||
else()
|
||||
set(imported_location ${QT_HOST_BIN_DIR}/${name})
|
||||
endif()
|
||||
if(NOT EXISTS ${imported_location})
|
||||
message(FATAL_ERROR "Qt5 tool not found: ${imported_location}")
|
||||
endif()
|
||||
set_target_properties(Qt5::${name} PROPERTIES
|
||||
IMPORTED_LOCATION ${imported_location}
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
qt5_host_tool(qmake)
|
||||
qt5_host_tool(moc)
|
||||
qt5_host_tool(rcc)
|
||||
qt5_host_tool(uic)
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
include_guard()
|
||||
|
||||
message(STATUS "Configuring Qt for Wine cross-compilation...")
|
||||
|
||||
set(QT_HOST_BIN_DIR ${CMAKE_CURRENT_LIST_DIR}/wine)
|
||||
|
||||
function(qt5_host_tool name)
|
||||
if (NOT TARGET Qt5::${name})
|
||||
add_executable(Qt5::${name} IMPORTED)
|
||||
|
||||
set(imported_location ${QT_HOST_BIN_DIR}/${name})
|
||||
|
||||
# FIXME run after deps.cmake to enable next
|
||||
#if(NOT EXISTS ${imported_location})
|
||||
# message(FATAL_ERROR "Qt5 tool not found: ${imported_location}")
|
||||
#endif()
|
||||
|
||||
set_target_properties(Qt5::${name} PROPERTIES
|
||||
IMPORTED_LOCATION ${imported_location}
|
||||
)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
qt5_host_tool(windeployqt)
|
||||
qt5_host_tool(qmake)
|
||||
qt5_host_tool(moc)
|
||||
qt5_host_tool(rcc)
|
||||
qt5_host_tool(uic)
|
||||
|
||||
|
|
@ -0,0 +1,135 @@
|
|||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
# Get the root directory
|
||||
get_filename_component(ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}/.." ABSOLUTE)
|
||||
set(RELEASE_DIR "${ROOT_DIR}/release")
|
||||
|
||||
# Clean up existing release directory
|
||||
file(REMOVE_RECURSE "${RELEASE_DIR}")
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}")
|
||||
|
||||
# Setup pluginsdk directories
|
||||
set(PLUGINSDK_DIR "${RELEASE_DIR}/pluginsdk")
|
||||
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}")
|
||||
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/jansson")
|
||||
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/lz4")
|
||||
file(MAKE_DIRECTORY "${PLUGINSDK_DIR}/XEDParse")
|
||||
|
||||
# Setup release directories
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}/release")
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}/release/translations")
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}/release/x32")
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}/release/x64")
|
||||
|
||||
# Copy pluginsdk files
|
||||
set(PLUGINSDK_DIR "${RELEASE_DIR}/pluginsdk")
|
||||
|
||||
# Copy directories
|
||||
file(COPY "${ROOT_DIR}/src/dbg/jansson/" DESTINATION "${PLUGINSDK_DIR}/jansson")
|
||||
file(COPY "${ROOT_DIR}/src/dbg/lz4/" DESTINATION "${PLUGINSDK_DIR}/lz4")
|
||||
file(COPY "${ROOT_DIR}/src/dbg/XEDParse/" DESTINATION "${PLUGINSDK_DIR}/XEDParse")
|
||||
|
||||
# Copy headers
|
||||
file(GLOB PLUGIN_HEADERS
|
||||
"${ROOT_DIR}/src/dbg/_plugin_types.h"
|
||||
"${ROOT_DIR}/src/dbg/_plugins.h"
|
||||
"${ROOT_DIR}/src/dbg/_scriptapi*.h"
|
||||
"${ROOT_DIR}/src/dbg/_dbgfunctions.h"
|
||||
"${ROOT_DIR}/src/bridge/bridge*.h"
|
||||
)
|
||||
file(COPY ${PLUGIN_HEADERS} DESTINATION "${PLUGINSDK_DIR}")
|
||||
|
||||
file(COPY "${ROOT_DIR}/bin/x32/x32bridge.lib" DESTINATION "${PLUGINSDK_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/x32/x32dbg.lib" DESTINATION "${PLUGINSDK_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/x64/x64bridge.lib" DESTINATION "${PLUGINSDK_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/x64/x64dbg.lib" DESTINATION "${PLUGINSDK_DIR}")
|
||||
|
||||
# Copy release files
|
||||
set(RELEASE_MAIN_DIR "${RELEASE_DIR}/release")
|
||||
|
||||
# Handle deps_copied
|
||||
set(DEPS_BLACKLIST libGLESV2.dll libEGL.dll d3dcompiler_47.dll)
|
||||
function(handle_deps_copied arch)
|
||||
file(READ "${ROOT_DIR}/bin/${arch}/.deps_copied" DEPS_COPIED)
|
||||
string(REGEX REPLACE "\n" ";" DEPS_COPIED "${DEPS_COPIED}")
|
||||
foreach(DEP ${DEPS_COPIED})
|
||||
if(NOT ${DEP} IN_LIST DEPS_BLACKLIST)
|
||||
get_filename_component(reldir ${DEP} DIRECTORY)
|
||||
file(COPY "${ROOT_DIR}/bin/${arch}/${DEP}" DESTINATION "${RELEASE_MAIN_DIR}/${arch}/${reldir}")
|
||||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
function(copy_debug_engines arch)
|
||||
file(COPY "${ROOT_DIR}/bin/${arch}/TitanEngine.dll" DESTINATION "${RELEASE_MAIN_DIR}/${arch}")
|
||||
foreach(ENGINE_DIR GleeBug StaticEngine)
|
||||
file(MAKE_DIRECTORY "${RELEASE_MAIN_DIR}/${arch}/${ENGINE_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/${arch}/${ENGINE_DIR}/TitanEngine.dll" DESTINATION "${RELEASE_MAIN_DIR}/${arch}/${ENGINE_DIR}")
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
function(copy_debug_engine_symbols arch)
|
||||
foreach(ENGINE_DIR GleeBug StaticEngine)
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}/pdb/${arch}/${ENGINE_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/${arch}/${ENGINE_DIR}/TitanEngine.pdb" DESTINATION "${RELEASE_DIR}/pdb/${arch}/${ENGINE_DIR}")
|
||||
endforeach()
|
||||
endfunction()
|
||||
|
||||
handle_deps_copied("x64")
|
||||
handle_deps_copied("x32")
|
||||
|
||||
# Copy themes
|
||||
file(COPY "${ROOT_DIR}/bin/themes/" DESTINATION "${RELEASE_MAIN_DIR}/themes")
|
||||
|
||||
# Copy main files
|
||||
file(COPY "${ROOT_DIR}/bin/x96dbg.exe" DESTINATION "${RELEASE_MAIN_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/mnemdb.json" DESTINATION "${RELEASE_MAIN_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/errordb.txt" DESTINATION "${RELEASE_MAIN_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/exceptiondb.txt" DESTINATION "${RELEASE_MAIN_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/ntstatusdb.txt" DESTINATION "${RELEASE_MAIN_DIR}")
|
||||
file(COPY "${ROOT_DIR}/bin/winconstants.txt" DESTINATION "${RELEASE_MAIN_DIR}")
|
||||
|
||||
# Copy translations
|
||||
file(GLOB TRANSLATION_FILES "${ROOT_DIR}/bin/translations/*.qm")
|
||||
file(COPY ${TRANSLATION_FILES} DESTINATION "${RELEASE_MAIN_DIR}/translations")
|
||||
|
||||
# Copy x32 files
|
||||
file(COPY "${ROOT_DIR}/bin/x32/x32bridge.dll" DESTINATION "${RELEASE_MAIN_DIR}/x32")
|
||||
file(COPY "${ROOT_DIR}/bin/x32/x32dbg.dll" DESTINATION "${RELEASE_MAIN_DIR}/x32")
|
||||
file(COPY "${ROOT_DIR}/bin/x32/x32dbg.exe" DESTINATION "${RELEASE_MAIN_DIR}/x32")
|
||||
file(COPY "${ROOT_DIR}/bin/x32/x32gui.dll" DESTINATION "${RELEASE_MAIN_DIR}/x32")
|
||||
file(COPY "${ROOT_DIR}/bin/x32/loaddll.exe" DESTINATION "${RELEASE_MAIN_DIR}/x32")
|
||||
file(COPY "${ROOT_DIR}/bin/x32/headless.exe" DESTINATION "${RELEASE_MAIN_DIR}/x32")
|
||||
copy_debug_engines("x32")
|
||||
|
||||
# Copy x64 files
|
||||
file(COPY "${ROOT_DIR}/bin/x64/x64bridge.dll" DESTINATION "${RELEASE_MAIN_DIR}/x64")
|
||||
file(COPY "${ROOT_DIR}/bin/x64/x64dbg.dll" DESTINATION "${RELEASE_MAIN_DIR}/x64")
|
||||
file(COPY "${ROOT_DIR}/bin/x64/x64dbg.exe" DESTINATION "${RELEASE_MAIN_DIR}/x64")
|
||||
file(COPY "${ROOT_DIR}/bin/x64/x64gui.dll" DESTINATION "${RELEASE_MAIN_DIR}/x64")
|
||||
file(COPY "${ROOT_DIR}/bin/x64/loaddll.exe" DESTINATION "${RELEASE_MAIN_DIR}/x64")
|
||||
file(COPY "${ROOT_DIR}/bin/x64/headless.exe" DESTINATION "${RELEASE_MAIN_DIR}/x64")
|
||||
copy_debug_engines("x64")
|
||||
|
||||
# Create commithash.txt
|
||||
execute_process(
|
||||
COMMAND git rev-parse HEAD
|
||||
OUTPUT_FILE "${RELEASE_DIR}/commithash.txt"
|
||||
WORKING_DIRECTORY "${ROOT_DIR}"
|
||||
)
|
||||
|
||||
# Copy PDB files
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}/pdb")
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}/pdb/x32")
|
||||
file(MAKE_DIRECTORY "${RELEASE_DIR}/pdb/x64")
|
||||
|
||||
file(GLOB PDB_FILES "${ROOT_DIR}/bin/*.pdb")
|
||||
file(COPY ${PDB_FILES} DESTINATION "${RELEASE_DIR}/pdb")
|
||||
|
||||
file(GLOB PDB_X32_FILES "${ROOT_DIR}/bin/x32/*.pdb")
|
||||
file(COPY ${PDB_X32_FILES} DESTINATION "${RELEASE_DIR}/pdb/x32")
|
||||
copy_debug_engine_symbols("x32")
|
||||
|
||||
file(GLOB PDB_X64_FILES "${ROOT_DIR}/bin/x64/*.pdb")
|
||||
file(COPY ${PDB_X64_FILES} DESTINATION "${RELEASE_DIR}/pdb/x64")
|
||||
copy_debug_engine_symbols("x64")
|
||||
|
|
@ -0,0 +1 @@
|
|||
run
|
||||
|
|
@ -0,0 +1 @@
|
|||
run
|
||||
|
|
@ -0,0 +1 @@
|
|||
run
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Copyright (c) 2018 Martin Storsjo
|
||||
#
|
||||
# Permission to use, copy, modify, and/or distribute this software for any
|
||||
# purpose with or without fee is hereby granted, provided that the above
|
||||
# copyright notice and this permission notice appear in all copies.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
#. msvcenv.sh
|
||||
|
||||
# /showIncludes
|
||||
unixify_path='/^Note: including file: /{ s/z:([\\/])/\1/i; s,\\,/,g; }'
|
||||
# /E
|
||||
unixify_line='/^[[:blank:]]*#[[:blank:]]*line[[:blank:]]/{ s/z:([\\/])/\1/i; s,\\\\,/,g; }'
|
||||
# Warnings and Errors
|
||||
unixify_note='/^[zZ]:.*\([[:digit:]]+\): (note|error C[[:digit:]]{4}|warning C[[:digit:]]{4}): /{ s/z:([\\/])/\1/ig; s,\\,/,g; }'
|
||||
|
||||
export WINE_MSVC_STDOUT_SED="$unixify_path;$unixify_line;$unixify_note"
|
||||
export WINE_MSVC_STDERR_SED="$unixify_path"
|
||||
|
||||
"$MSVC_BIN_DIR"/wine-msvc.sh "$QT_BIN_DIR"/$(basename $0).exe "$@"
|
||||
|
||||
ec=$?
|
||||
[ $ec -ne 0 ] && exit $ec
|
||||
|
||||
# Postprocess
|
||||
for a in "$@"; do
|
||||
case $a in
|
||||
[-/]P) arg_P=$a ;;
|
||||
[-/]Fi*) arg_Fi=${a:3} ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Unixify paths for /P
|
||||
if [ -n "$arg_P" ] && [ -f "$arg_Fi" ]; then
|
||||
if sed --help 2>&1 | grep '\-i extension' >/dev/null; then
|
||||
inplace=(-i '') # BSD sed
|
||||
else
|
||||
inplace=(-i) # GNU sed
|
||||
fi
|
||||
sed "${inplace[@]}" -E 's/\r//;'"$unixify_line" "$arg_Fi"
|
||||
fi
|
||||
|
||||
exit $ec
|
||||
|
|
@ -0,0 +1 @@
|
|||
run
|
||||
|
|
@ -0,0 +1 @@
|
|||
run
|
||||
2
deps
2
deps
|
|
@ -1 +1 @@
|
|||
Subproject commit fdef4703ba4045204d36f6f5c1734749a8b7204a
|
||||
Subproject commit 4a830e113bdb56efe828eed132b1511fb8259c72
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
; Top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
; Windows-style newlines
|
||||
[*]
|
||||
end_of_line = CRLF
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
_build*/
|
||||
*.chm
|
||||
python-2.7.18.amd64.portable/
|
||||
hha.dll
|
||||
hhc.exe
|
||||
itcc.dll
|
||||
*.7z
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
# Read the Docs configuration file
|
||||
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
# Set the version of Python and other tools you might need
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "2.7"
|
||||
|
||||
# Build documentation in the docs/ directory with Sphinx
|
||||
sphinx:
|
||||
builder: html
|
||||
configuration: docs/conf.py
|
||||
fail_on_warning: false
|
||||
|
||||
# We recommend specifying your dependencies to enable reproducible builds:
|
||||
# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
|
||||
python:
|
||||
install:
|
||||
- requirements: docs/requirements.txt
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
## Prerequisites
|
||||
```sh
|
||||
sudo apt update
|
||||
sudo apt install cmake ninja-build wine
|
||||
```
|
||||
|
||||
## Install MSVC
|
||||
Download https://github.com/mstorsjo/msvc-wine
|
||||
```sh
|
||||
cd msvc-wine
|
||||
./vsdownload.py --accept-license --dest ~/opt/msvc Microsoft.VisualStudio.Workload.VCTools Microsoft.VisualStudio.Component.VC.ATL
|
||||
./install.sh ~/opt/msvc
|
||||
```
|
||||
|
||||
## Build
|
||||
x86
|
||||
```sh
|
||||
cd x64dbg
|
||||
export MSVC_BIN_DIR=~/opt/msvc/bin/x86
|
||||
export QT_BIN_DIR=~/src/x64dbg/build32/_deps/qt5-src/bin
|
||||
cmake -B build32 -DCMAKE_TOOLCHAIN_FILE=cmake/msvc-wine.cmake -G Ninja
|
||||
cmake --build build32 -j4
|
||||
```
|
||||
|
||||
x64
|
||||
```sh
|
||||
cd x64dbg
|
||||
export MSVC_BIN_DIR=~/opt/msvc/bin/x64
|
||||
export QT_BIN_DIR=~/src/x64dbg/build64/_deps/qt5-src/bin
|
||||
cmake -B build64 -DCMAKE_TOOLCHAIN_FILE=cmake/msvc-wine.cmake -G Ninja
|
||||
cmake --build build64 -j4
|
||||
```
|
||||
|
||||
## Issues
|
||||
- ```LINK : fatal error LNK1158: cannot run 'rc.exe'```
|
||||
> Fix: winecfg -> Drives -> Remove drives with alternative path to x64dbg src (like: E: -> ~/src)
|
||||
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# docs
|
||||
|
||||
Documentation repository for [x64dbg](http://x64dbg.com) at [Read the Docs](https://readthedocs.org/projects/x64dbg).
|
||||
|
||||
## Building
|
||||
|
||||
Run `makechm.bat`. It will build the .CHM help file.
|
||||
|
||||
When first building the .CHM help file, it automatically downloads
|
||||
[python 2.7.18 portable](https://github.com/x64dbg/docs/releases/download/python27-portable/python-2.7.18.amd64.portable.7z) and
|
||||
[Microsoft HTML Help Compiler 4.74.8702](https://github.com/x64dbg/deps/releases/download/dependencies/hhc-4.74.8702.7z) from GitHub.
|
||||
Then, `7z` is used to extract the downloaded archive, so make sure [7-zip](https://7-zip.org/) is installed, and `7z` command can be accessed from
|
||||
the current directory.
|
||||
|
||||
Note: The following patch was applied:
|
||||
|
||||
|
||||
Add `relpath = relpath.replace(os.path.sep, '/')` after `C:\Python27\Lib\site-packages\recommonmark\transform.py` line `63`
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# GetRelocSize/grs
|
||||
|
||||
Get the correct size of a relocation table. This is useful while unpacking and restoring the original relocation table.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The address of the relocation table to analyze.
|
||||
|
||||
## results
|
||||
|
||||
The found size of the relocation table is stored in `$result`.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# analadv
|
||||
|
||||
Do function analysis, embedded data analysis and xref analysis.
|
||||
|
||||
## arguments
|
||||
|
||||
This command has no arguments.
|
||||
|
||||
## results
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# analrecur/analr
|
||||
|
||||
Do single function analysis.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The base address of the function to analyze.
|
||||
|
||||
## results
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# analxrefs/analx
|
||||
|
||||
Do xrefs analysis in the module selected in the disassembly view.
|
||||
|
||||
## arguments
|
||||
|
||||
This command has no arguments.
|
||||
|
||||
## results
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# analyse/analyze/anal
|
||||
|
||||
Do function analysis.
|
||||
|
||||
## arguments
|
||||
|
||||
This command has no arguments.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# analyse_nukem/analyze_nukem/anal_nukem
|
||||
|
||||
Do function analysis using nukem's algorithm.
|
||||
|
||||
## arguments
|
||||
|
||||
This command has no arguments.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# cfanalyze/cfanalyse/cfanal
|
||||
|
||||
Do control flow analysis in the module selected in the disassembly view.
|
||||
|
||||
## arguments
|
||||
|
||||
This command has no arguments.
|
||||
|
||||
## results
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# exanalyse/exanalyze/exanal
|
||||
|
||||
Do exception directory analysis. This kind of analysis doesn't work on 32-bit executables.
|
||||
|
||||
## arguments
|
||||
|
||||
This command has no arguments.
|
||||
|
||||
## results
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
exhandlers
|
||||
==========
|
||||
Print all exception handlers, including SEH(StructuredExceptionHandler), VEH(VectoredExceptionHandler),
|
||||
VCH(VectoredContinueHandler) and UnhandledExceptionFilter, into the log.
|
||||
|
||||
arguments
|
||||
---------
|
||||
This command has no arguments
|
||||
|
||||
results
|
||||
-------
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
# exinfo
|
||||
|
||||
Print the `EXCEPTION_DEBUG_INFO` structure from the last exception.
|
||||
|
||||
Sample output:
|
||||
|
||||
```
|
||||
EXCEPTION_DEBUG_INFO:
|
||||
dwFirstChance: 1
|
||||
ExceptionCode: 80000001 (EXCEPTION_GUARD_PAGE)
|
||||
ExceptionFlags: 00000000
|
||||
ExceptionAddress: 00007FFE16FB1B91 ntdll.00007FFE16FB1B91
|
||||
NumberParameters: 2
|
||||
ExceptionInformation[00]: 0000000000000008
|
||||
ExceptionInformation[01]: 00007FFE16FB1B91 ntdll.00007FFE16FB1B91
|
||||
```
|
||||
|
||||
arguments
|
||||
---------
|
||||
This command has no arguments
|
||||
|
||||
results
|
||||
-------
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# imageinfo
|
||||
|
||||
Output the image information for a module. The information describes the Characteristics and DLL Characteristics fields in the PE header structure.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` The base of the module. If not specified the module at CIP will be used.
|
||||
|
||||
## results
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
Analysis
|
||||
========
|
||||
This section contains commands that are used for analysis.
|
||||
|
||||
**Contents:**
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
|
||||
analyse
|
||||
exanalyse
|
||||
cfanalyze
|
||||
analyse_nukem
|
||||
analxrefs
|
||||
analrecur
|
||||
analadv
|
||||
virtualmod
|
||||
symdownload
|
||||
symload
|
||||
symunload
|
||||
imageinfo
|
||||
GetRelocSize
|
||||
exhandlers
|
||||
exinfo
|
||||
traceexecute
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# symdownload/downloadsym
|
||||
|
||||
Attempt to download a symbol from a Symbol Store.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Module name (with or without extension) to attempt to download symbols for. When not specified, an attempt will be done to download symbols for all loaded modules.
|
||||
|
||||
`[arg2]` Symbol Store URL. When not specified, the default store will be used.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# symload/loadsym
|
||||
|
||||
Attempt to load a symbol from disk.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` Module name (with or without extension) to attempt to load symbols for.
|
||||
|
||||
`arg2` Path to the symbol file.
|
||||
|
||||
`[arg3]` Force load. Set to `1` to skip symbol validation.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# symunload/unloadsym
|
||||
|
||||
Unload a symbol.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` Module name (with or without extension) to unload symbols from.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# traceexecute
|
||||
|
||||
Tell the debugger that an address has been traced.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The address.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# virtualmod
|
||||
|
||||
Tell the debugger to treat a memory range as a virtual module.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` the user-supplied module name.
|
||||
|
||||
`arg2` the base of the memory range.
|
||||
|
||||
`[arg3]` the size of the memory range.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# DeleteBPX/bpc/bc
|
||||
|
||||
Delete a breakpoint set using the SetBPX command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Name or address of the breakpoint to delete. If this argument is not specified, all breakpoints will be deleted.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# DeleteExceptionBPX
|
||||
|
||||
Delete an exception breakpoint set using the SetExceptionBPX command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Name, exception name or code of the exception breakpoint to delete. If this argument is not specified, all exception breakpoints will be deleted.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# DeleteHardwareBreakpoint/bphc/bphwc
|
||||
|
||||
Delete a hardware breakpoint set using the SetHardwareBreakpoint command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Name or address of the hardware breakpoint to delete. If this argument is not specified, all hardware breakpoints will be deleted.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# DeleteMemoryBPX/membpc/bpmc
|
||||
|
||||
Delete a memory breakpoint set using the SetMemoryBPX command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Name or (base) address of the memory breakpoint to delete. If this argument is not specified, all memory breakpoints will be deleted.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# DisableBPX/bpd/bd
|
||||
|
||||
Disable a breakpoint set using the SetBPX command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Name or address of the breakpoint to disable. If this argument is not specified, all breakpoints will be disabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# DisableExceptionBPX
|
||||
|
||||
Disable an exception breakpoint set using the SetExceptionBPX command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Name, exception name or code of the exception breakpoint to enable. If this argument is not specified, all exception breakpoints will be disabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# DisableHardwareBreakpoint/bphd/bphwd
|
||||
|
||||
Disable a hardware breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Address of the hardware breakpoint to disable. If this argument is not specified, all hardware breakpoints will be disabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# DisableMemoryBreakpoint/membpd/bpmd
|
||||
|
||||
Disable a memory breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Address of the memory breakpoint to disable. If this argument is not specified, all memory breakpoints will be disabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# EnableBPX/bpe/be
|
||||
|
||||
Enable a breakpoint set using the SetBPX command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Name or address of the breakpoint to enable. If this argument is not specified, all breakpoints will be enabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# EnableExceptionBPX
|
||||
|
||||
Enable an exception breakpoint set using the SetExceptionBPX command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Name, exception name or code of the exception breakpoint to enable. If this argument is not specified, all exception breakpoints will be enabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# EnableHardwareBreakpoint/bphe/bphwe
|
||||
|
||||
Enable a previously disabled hardware breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Address of the hardware breakpoint to enable. If this argument is not specified, as many as possible hardware breakpoints will be enabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# EnableMemoryBreakpoint/membpe/bpme
|
||||
|
||||
Enable a previously disabled memory breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` Address of the memory breakpoint to enable. If this argument is not specified, all memory breakpoints will be enabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# LibrarianDisableBreakpoint/bpddll
|
||||
|
||||
Enable a DLL breakpoint set using the LibrarianSetBreakpoint command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` DLL Name of the DLL breakpoint to disable. If this argument is not specified, all DLL breakpoints will be disabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# LibrarianEnableBreakpoint/bpedll
|
||||
|
||||
Enable a DLL breakpoint set using the LibrarianSetBreakpoint command.
|
||||
|
||||
## arguments
|
||||
|
||||
`[arg1]` DLL Name of the DLL breakpoint to enable. If this argument is not specified, all DLL breakpoints will be enabled.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# LibrarianRemoveBreakpoint/bcdll
|
||||
|
||||
Remove a DLL breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` DLL Name to remove the breakpoint from.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# LibrarianSetBreakpoint/bpdll
|
||||
|
||||
Set a singleshoot breakpoint on DLL load/unload.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` DLL Name to break on.
|
||||
|
||||
`[arg2]` `a` means on load and unload, `l` means on load, `u` means on unload. When not specified, x64dbg will break on both load and unload.
|
||||
|
||||
`[arg3]` When specified, the breakpoint will be singleshoot. When not specified the breakpoint will not be removed after it has been hit.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# SetBPX/bp/bpx
|
||||
|
||||
Set an INT3 (SHORT/LONG) or UD2 breakpoint and optionally assign a name to it.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` Address to put a breakpoint on. This can be an API name.
|
||||
|
||||
`[arg2]` Name of the breakpoint, use quotation marks to include spaces. This name can be used by the EnableBPX, DisableBPX and DeleteBPX functions as alias, but is mainly intended to provide a single line of information about the currently-hit breakpoint. When arg2 equals to a valid type (arg3) the type is used and arg2 is ignored.
|
||||
|
||||
`[arg3]` Breakpoint type. Can be one of the following options in random order: "ss" (single shot breakpoint), "long" (CD03), "ud2" (0F0B) and "short" (CC). You can combine the "ss" option with one of the type options in one string. Example: "SetBPX 00401000,"entrypoint",ssud2" will set a single shot UD2 breakpoint at 00401000 with the name "entrypoint". When specifying no type or just the type "ss" the default type will be used. Per default this equals to the "short" type. You can change the default type using the "SetBPXOptions" command.
|
||||
|
||||
## result
|
||||
|
||||
This command does not any result variables.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# SetBPXOptions/bptype
|
||||
|
||||
Set the default type for the "SetBPX" command.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` Default type. This can be "short" (CC), "long" (CD03) or "ud2" (0F0B). Type default type affects both NORMAL and SINGLESHOT breakpoints.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# SetExceptionBPX
|
||||
|
||||
Set an exception breakpoint. If an exception breakpoint is active, all the exceptions with the same chance and code will be captured as a breakpoint event and will not be handled by the default exception handling policy.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` Exception name or code of the new exception breakpoint
|
||||
|
||||
`[arg2]` Chance. Set to `first`/`1` to capture first-chance exceptions, `second`/`2` to capture second-chance exceptions, `all`/`3` to capture all exceptions. Default value is `first`.
|
||||
|
||||
## result
|
||||
|
||||
This command does not any result variables.
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# SetHardwareBreakpoint/bph/bphws
|
||||
|
||||
Set a hardware breakpoint (using debug registers).
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` Address of the hardware breakpoint.
|
||||
|
||||
`[arg2]` Hardware breakpoint type. Can be either 'r' (readwrite), 'w' (write) or 'x' (execute). When not specified, 'x' is assumed.
|
||||
|
||||
`[arg3]` Hardware breakpoint size. Can be either '1', '2', '4' or '8' (x64 only). Per default, '1' is assumed. The address you're putting the hardware breakpoint on must be aligned to the specified size.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# SetMemoryBPX/membp/bpm
|
||||
|
||||
Set a memory breakpoint (GUARD_PAGE) on the whole memory region the provided address is in.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` Address of or inside a memory region that will be watched.
|
||||
|
||||
`[arg2]` 1/0 restore the memory breakpoint once it's hit? When this value is not equal to '1' or '0', it's assumed to be arg3. This means "bpm eax,r" would be the same command as: "bpm eax,0,r".
|
||||
|
||||
`[arg3]` Breakpoint type, it can be 'a' (read+write+execute) 'r' (read), 'w' (write) or 'x' (execute). Per default, it's 'a' (read+write+execute)
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
# SetMemoryRangeBPX/memrangebp/bpmrange
|
||||
|
||||
Set a memory breakpoint (GUARD_PAGE) on a specific memory range.
|
||||
|
||||
## arguments
|
||||
|
||||
`start` Start of the memory range.
|
||||
|
||||
`size` Size of the memory range.
|
||||
|
||||
`[type]` Breakpoint type, it can be 'a' (read+write+execute) 'r' (read), 'w' (write) or 'x' (execute). Per default, it's 'a' (read+write+execute). Append `ss` for a singleshot breakpoint (you can also use [SetMemoryBreakpointSingleshoot](../conditional-breakpoint-control/SetMemoryBreakpointSingleshoot.md) to do this).
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
# bpgoto
|
||||
|
||||
Configure the breakpoint so that when the program reaches it, the program will be directed to a new location. It is equivallent to the following commands:
|
||||
|
||||
```
|
||||
SetBreakpointCondition arg1, 0
|
||||
SetBreakpointCommand arg1, "CIP=arg2"
|
||||
SetBreakpointCommandCondition arg1, 1
|
||||
SetBreakpointFastResume arg1, 0
|
||||
```
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The address of the breakpoint.
|
||||
|
||||
`arg2` The new address to execute if the breakpoint is reached.
|
||||
|
||||
## results
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
# bplist
|
||||
|
||||
Get a list of breakpoints. This list includes their state (enabled/disabled), their type, their address and (optionally) their names.
|
||||
|
||||
## arguments
|
||||
|
||||
This command has no arguments.
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables. A list entry has the following format:
|
||||
|
||||
STATE:TYPE:ADDRESS\[:NAME\]
|
||||
|
||||
STATEcan be 0 or 1. 0 means disabled, 1 means enabled. Only singleshoot and 'normal' breakpoints can be disabled.
|
||||
|
||||
TYPEcan be one of the following values: BP, SS, HW and GP. BP stands for a normal breakpoint (set using the SetBPX command), SS stands for SINGLESHOT, HW stands for HARDWARE and GP stand for Guard Page, the way of setting memory breakpoints.
|
||||
|
||||
ADDRESSis the breakpoint address, given in 32 and 64 bits for the x32 and x64 debugger respectively.
|
||||
|
||||
NAMEis the name assigned to the breakpoint.
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
Breakpoint Control
|
||||
==================
|
||||
|
||||
This section contains breakpoint control (set/delete/enable/disable) commands.
|
||||
|
||||
**Context:**
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 0
|
||||
|
||||
SetBPX
|
||||
DeleteBPX
|
||||
EnableBPX
|
||||
DisableBPX
|
||||
SetHardwareBreakpoint
|
||||
DeleteHardwareBreakpoint
|
||||
EnableHardwareBreakpoint
|
||||
DisableHardwareBreakpoint
|
||||
SetMemoryBPX
|
||||
SetMemoryRangeBPX
|
||||
DeleteMemoryBPX
|
||||
EnableMemoryBreakpoint
|
||||
DisableMemoryBreakpoint
|
||||
LibrarianSetBreakpoint
|
||||
LibrarianRemoveBreakpoint
|
||||
LibrarianEnableBreakpoint
|
||||
LibrarianDisableBreakpoint
|
||||
SetExceptionBPX
|
||||
DeleteExceptionBPX
|
||||
EnableExceptionBPX
|
||||
DisableExceptionBPX
|
||||
bpgoto
|
||||
bplist
|
||||
SetBPXOptions
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# GetBreakpointHitCount
|
||||
|
||||
Gets the hit counter of a software breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The address of the breakpoint.
|
||||
|
||||
## result
|
||||
|
||||
`$result` will be set to the current value of the hit counter.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# GetExceptionBreakpointHitCount
|
||||
|
||||
Gets the hit counter of an exception breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The name, exception name or code of the exception breakpoint.
|
||||
|
||||
## result
|
||||
|
||||
`$result` will be set to the current value of the hit counter.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# GetHardwareBreakpointHitCount
|
||||
|
||||
Gets the hit counter of a hardware breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The address of the breakpoint.
|
||||
|
||||
## result
|
||||
|
||||
`$result` will be set to the current value of the hit counter.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# GetLibrarianBreakpointHitCount
|
||||
|
||||
Gets the hit counter of a librarian breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The DLL name.
|
||||
|
||||
## result
|
||||
|
||||
`$result` will be set to the current value of the hit counter.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
# GetMemoryBreakpointHitCount
|
||||
|
||||
Gets the hit counter of a memory breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The address of the breakpoint.
|
||||
|
||||
## result
|
||||
|
||||
`$result` will be set to the current value of the hit counter.
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# ResetBreakpointHitCount
|
||||
|
||||
Resets the hit counter of a software breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The address of the breakpoint.
|
||||
|
||||
`[arg2]` The new hit count (zero when not specified).
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# ResetExceptionBreakpointHitCount
|
||||
|
||||
Resets the hit counter of an exception breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The name, exception code or name of the exception breakpoint.
|
||||
|
||||
`[arg2]` The new hit count (zero when not specified).
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# ResetHardwareBreakpointHitCount
|
||||
|
||||
Resets the hit counter of a hardware breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The address of the breakpoint.
|
||||
|
||||
`[arg2]` The new hit count (zero when not specified).
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
# ResetLibrarianBreakpointHitCount
|
||||
|
||||
Resets the hit counter of a librarian breakpoint.
|
||||
|
||||
## arguments
|
||||
|
||||
`arg1` The DLL name.
|
||||
|
||||
`[arg2]` The new hit count (zero when not specified).
|
||||
|
||||
## result
|
||||
|
||||
This command does not set any result variables.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue