Compare commits
1910 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 875166b683 | |||
| 179748c469 | |||
| ffcee1156a | |||
| edd944a325 | |||
| 75119c15ad | |||
| e6db63c8b0 | |||
| e388b77639 | |||
| bbdef56df2 | |||
| 6a5a944ea0 | |||
| 3621914312 | |||
| 0ef9412995 | |||
| 0335797a5d | |||
| 2a07aebff3 | |||
| 244d917c73 | |||
| 13b8dc8696 | |||
| 58576cbdb4 | |||
| a3a7b25512 | |||
| 50033f42f6 | |||
| d00d625142 | |||
| 97842e82f2 | |||
| 4a54b6e00c | |||
| ee7c7c2448 | |||
| 3aff533c4d | |||
| a256e6e764 | |||
| cc3e36c60d | |||
| f91eac3ec3 | |||
| 667de2d672 | |||
| 272fd3e43f | |||
| 58069f9db2 | |||
| 33d266f83e | |||
| e84feb3160 | |||
| 243fb78837 | |||
| 565ec32294 | |||
| 694eec911b | |||
| 44b7f786e7 | |||
| f7d212d115 | |||
| 3230984a4f | |||
| 9f4b0ffa82 | |||
| 75bad41e93 | |||
| 8602723adb | |||
| b01cb6ed26 | |||
| aaae24b790 | |||
| 94c8c2ba01 | |||
| 80a0d9874a | |||
| e85d9c220e | |||
| 864a546fe3 | |||
| 3ce134901a | |||
| 6d62bfeaea | |||
| c18e82af75 | |||
| 9f5c097f81 | |||
| 42c72f20f4 | |||
| 4e887c318b | |||
| e39a2acf26 | |||
| 8ab56ae9d8 | |||
| 1c6f0f5f28 | |||
| 4aedea65c7 | |||
| d7067af522 | |||
| 484f13dc29 | |||
| 868932c5e4 | |||
| 17a62d6f36 | |||
| b20b612315 | |||
| 73bd58a973 | |||
| 33e9cde0f4 | |||
| ee9d316217 | |||
| f7345a8a54 | |||
| 075a0d8541 | |||
| 5147a4105f | |||
| d933ec6415 | |||
| f5681a93d8 | |||
| dbe4a342cc | |||
| 460fd9c952 | |||
| 7603b93338 | |||
| 42720d322b | |||
| 6bef46bb4d | |||
| 670619b65e | |||
| b9c4c9c32f | |||
| e7642bdc63 | |||
| a12995b37d | |||
| ee34e692dd | |||
| 2134536960 | |||
| 47ccd7dd91 | |||
| 24e4f7ddcc | |||
| bddf47816f | |||
| 0c1c65182c | |||
| cda5aee714 | |||
| 7c16d13f65 | |||
| 840008d8cd | |||
| 090a9f2b96 | |||
| 4467369811 | |||
| a20fdf7bd3 | |||
| df1d2b713f | |||
| 4a34f5477d | |||
| 0ace951380 | |||
| 6a1cf98d0b | |||
| 8f14fd2442 | |||
| a78a077bdf | |||
| d101ec627f | |||
| 408a0c6114 | |||
| ebd1bbda18 | |||
| 7499639c5c | |||
| d6f3455236 | |||
| 55d752dd8b | |||
| f8fc38a78b | |||
| 895d8d2f0a | |||
| 815cfde84a | |||
| 9a7fdba3f9 | |||
| f9a6850c1a | |||
| 172f00e4e9 | |||
| 86203a4b86 | |||
| 8e234ce0cd | |||
| 9689dcfeab | |||
| cafa2c24fb | |||
| 3ff61e9948 | |||
| 9980dab27b | |||
| 55ce4d8ded | |||
| 662f8c1254 | |||
| d34df7ae07 | |||
| dfcc717048 | |||
| 21cbe5d445 | |||
| d94e9097b7 | |||
| 228a5f640e | |||
| acd484f891 | |||
| d958945fe8 | |||
| 3e10f2cb8c | |||
| 9810c630f6 | |||
| c3bf5f6730 | |||
| c63b388f81 | |||
| 20a0881421 | |||
| 203ad715e0 | |||
| 986c870090 | |||
| 4feb15182e | |||
| 88d3ade64d | |||
| 4202d3c1dc | |||
| bcb9228234 | |||
| f2ab06374b | |||
| a2c41fbaf2 | |||
| 7e6cfa1896 | |||
| 13e14e6734 | |||
| 45a7f84e19 | |||
| 86f748c599 | |||
| becc564269 | |||
| 7ab6ccbd36 | |||
| 8e7d202c32 | |||
| 05de5c7294 | |||
| fc2b90a2c0 | |||
| de7993c39c | |||
| dbb606601d | |||
| 1dc22d5991 | |||
| f50ea711e6 | |||
| 2cce572acf | |||
| a253fdc80f | |||
| 386a8b7000 | |||
| a5eb64a055 | |||
| c009ab2d41 | |||
| 1bfdb14be4 | |||
| bf9d994675 | |||
| f654052f1d | |||
| 12326a5e2c | |||
| 171cd0019e | |||
| 62edaac25a | |||
| 60d08a189d | |||
| 69832eda5d | |||
| 534f258846 | |||
| 0126452bf1 | |||
| 3334638a2c | |||
| cb012423bb | |||
| 4c76e59238 | |||
| ba69773fba | |||
| f19c4b2422 | |||
| 59d89575ed | |||
| 9678f143c7 | |||
| 7aafcd7c01 | |||
| b834be9f00 | |||
| ba3bf480f7 | |||
| f9bcd534d4 | |||
| d302be2d7c | |||
| 13fc64e6ab | |||
| 44ddb3c258 | |||
| 95d7159414 | |||
| 03a143488c | |||
| 6efc970374 | |||
| e3ebc2d1b8 | |||
| 96136e8e46 | |||
| ddb9c4041b | |||
| 9228137187 | |||
| 89fd647792 | |||
| 9f66b151af | |||
| 08294caffc | |||
| 7c66eb5e99 | |||
| d5bc74d21b | |||
| 4f6a07c449 | |||
| 606e657591 | |||
| 2717ad1a88 | |||
| 10400ec2c3 | |||
| bbdc10e0f2 | |||
| 16ee95b1d9 | |||
| e00920f24a | |||
| dad1d3e7f9 | |||
| a124b0002b | |||
| c888adc1e0 | |||
| 4cc6a5ecd1 | |||
| ee1f41a1bb | |||
| ba1191e425 | |||
| fd9d506ce5 | |||
| 9d76502421 | |||
| f371a4cb83 | |||
| 4f89656edc | |||
| 4a3bb2cc3f | |||
| 302ad58814 | |||
| 6e4bc11a7e | |||
| c5b3df3e03 | |||
| 5e95cee2f3 | |||
| c235926930 | |||
| 4a7762f751 | |||
| 3e7d074ca3 | |||
| 0e2d51926c | |||
| 0ce8169e6b | |||
| f21b95b090 | |||
| b136462c75 | |||
| 137c3ec5e5 | |||
| 1dfc7a0243 | |||
| 786660a625 | |||
| a96eacab06 | |||
| 89de2a7679 | |||
| 2d353cf4e6 | |||
| 76e7994aaa | |||
| 902ccc7989 | |||
| e8f86196c8 | |||
| 93e4a2e50c | |||
| e583929498 | |||
| 3922ed08a8 | |||
| 71bbf6ed57 | |||
| f85a03a712 | |||
| d306a4c4e6 | |||
| b36847fa5c | |||
| 94c1f282f5 | |||
| d1ff7a391b | |||
| b9202c0ba2 | |||
| 166ad3198c | |||
| 2706d1a9a5 | |||
| 5c6c123daa | |||
| 1f984f5b77 | |||
| 25b64d6852 | |||
| a324e71ba9 | |||
| 31de1a20d9 | |||
| 3d90adf4b2 | |||
| eab7a03f70 | |||
| df6d3d4a24 | |||
| 8c03530ec5 | |||
| abaed514fb | |||
| 3d799c2b62 | |||
| 49ed3c2919 | |||
| 7dd35e3572 | |||
| 7714b3436f | |||
| 4465caa9fd | |||
| a6a774beae | |||
| bb43c7447d | |||
| 2c9e56e830 | |||
| fc8f81b66d | |||
| 6880a353cc | |||
| c08ad2b1fb | |||
| 591fb8e138 | |||
| a9581c9152 | |||
| dc2c9955e6 | |||
| 5a61ea9abf | |||
| 926b32b574 | |||
| 5aa49fe5e5 | |||
| d51bf9fe63 | |||
| 3602665438 | |||
| e55cc41e2b | |||
| 2df0bb504f | |||
| 82e0de422b | |||
| cafdf42a6d | |||
| 3b89f1eabc | |||
| 9f52daeec3 | |||
| dd59f94f85 | |||
| 2b42bf9a8c | |||
| a86649cb29 | |||
| f008546565 | |||
| 21da84e5e2 | |||
| a2e1c1fad3 | |||
| a97a71a24a | |||
| 5f69e23887 | |||
| d36589751e | |||
| 5e1cc683fe | |||
| 72640686da | |||
| df85d3049e | |||
| 38e867d3e3 | |||
| 9e874f8034 | |||
| 989fe9f047 | |||
| 301c64be4c | |||
| c4009517e4 | |||
| 7b13b7de26 | |||
| b4547c3555 | |||
| 7abd4c21c3 | |||
| 193d207d5b | |||
| e03956f2fe | |||
| 1616379398 | |||
| 29d4e80f7e | |||
| 544ffb1aff | |||
| cf7ed909b3 | |||
| fddd77e6fd | |||
| 0370ba213b | |||
| 068f1773aa | |||
| 4d34e868b2 | |||
| 5fc5cda86d | |||
| 0ecc4d4146 | |||
| 47308c1508 | |||
| 19e86e0ba0 | |||
| eb0e13e794 | |||
| 859bc990e0 | |||
| af13a88c81 | |||
| 6642aad2c8 | |||
| 2585ed584c | |||
| 95cd3b645d | |||
| d667695e9e | |||
| af8b2b7dd3 | |||
| 41b4ffd9fb | |||
| 312df1ee9d | |||
| 20f91f01d1 | |||
| 3d7881328f | |||
| f79e578aaf | |||
| 46eb737dc8 | |||
| 99dd7661d4 | |||
| fc2bb07d11 | |||
| 5ffa6d8261 | |||
| 4647efb971 | |||
| 8582046948 | |||
| 56e145942a | |||
| 172cb398ba | |||
| a3abf03a23 | |||
| 8dd8701e8d | |||
| 4817fe6d1f | |||
| 817cfc3de7 | |||
| 2a70997a6c | |||
| 4e61025e99 | |||
| b66f25dfea | |||
| b82493b12b | |||
| 9d2eb8b175 | |||
| ea9e3b3696 | |||
| c3ec690318 | |||
| b750432381 | |||
| f58f6d9da1 | |||
| 027052ee70 | |||
| fe81ccbaff | |||
| 4a0c0d35bc | |||
| a35ffdda23 | |||
| 0ecb7e2933 | |||
| 82a2e7f85c | |||
| 6b3524cde8 | |||
| ef5c61caa9 | |||
| 32d7cd44ff | |||
| a19714d735 | |||
| 8075dfe45c | |||
| dc52eba172 | |||
| 3f678e1920 | |||
| 0fb62f4bcd | |||
| 125431a767 | |||
| 3ebfdbbedb | |||
| a7d359e2b0 | |||
| c0e29e5a57 | |||
| 0e56ccccfd | |||
| 93b2422044 | |||
| 8ecac36a64 | |||
| 7006a6453d | |||
| 5fb6dc4205 | |||
| 6f0ae5a6ad | |||
| 88373c5e10 | |||
| 7dac69de14 | |||
| 4c0afb498b | |||
| 545cc20e48 | |||
| 49e8d5c894 | |||
| 627994973d | |||
| 9fb5a221fb | |||
| a18a8f8156 | |||
| d3f5cccdb2 | |||
| 194f694309 | |||
| a5a96dd598 | |||
| b331022520 | |||
| 98f3ebb49e | |||
| 6a9299dea1 | |||
| 6d0d929c44 | |||
| 7940e3a219 | |||
| fd27af040b | |||
| 2f655787e5 | |||
| cc95bbe68b | |||
| 7388d94c50 | |||
| 5d54b6de4b | |||
| ca45fe800f | |||
| c66c39669c | |||
| 22bde273f2 | |||
| 2efd84b1df | |||
| 135e7e5d78 | |||
| 1ff17f4bb8 | |||
| 1f41a67350 | |||
| e9d2fb6f40 | |||
| c5fca8f04f | |||
| d664100c50 | |||
| a417cc0c64 | |||
| e750a9c66d | |||
| fa6183379e | |||
| b5021674ee | |||
| ccd6933f51 | |||
| b7d54e1469 | |||
| aa0e35cbaa | |||
| 0725674a3b | |||
| d1b32a786c | |||
| d4392b7285 | |||
| bc0a358ac0 | |||
| 2b2f371482 | |||
| a7779a9c1f | |||
| 24269f801c | |||
| e57b859bd3 | |||
| 7db0ece687 | |||
| f7e6f88b9c | |||
| 659d71c0eb | |||
| ba4edcf6f3 | |||
| e62a008800 | |||
| 6a0fd46523 | |||
| 4a21ade0b4 | |||
| d214e3f363 | |||
| 625539c786 | |||
| 7391c863f9 | |||
| 0fc5c4b146 | |||
| 02055c5b30 | |||
| bd0a03e283 | |||
| eacab48c1e | |||
| f1645f80e6 | |||
| 30e43b9814 | |||
| 526f6e26eb | |||
| 337b6d95e1 | |||
| 423cd343fb | |||
| d725837f9b | |||
| f0451a9803 | |||
| 90fb97ad91 | |||
| 2e485505d4 | |||
| 8289df1d62 | |||
| 528602d98e | |||
| bc320b4d87 | |||
| f9d4b1e3a3 | |||
| 7009a074c7 | |||
| cb3ec42b92 | |||
| b61f243cc8 | |||
| a03d772788 | |||
| 49d7e6d78a | |||
| 68d8e292cc | |||
| b05835d80f | |||
| 14ff5a9437 | |||
| 578925cb70 | |||
| 38fd38f1ec | |||
| 90f2a37531 | |||
| bec4ed520c | |||
| 3d984f5f29 | |||
| 673a92b323 | |||
| e485cc9674 | |||
| ae4a72036d | |||
| e90b59853c | |||
| 56a8ffea03 | |||
| 7dfd399e6e | |||
| 0e124dc1f2 | |||
| e7f6dc6b86 | |||
| 24b3c7a8a9 | |||
| c2353ad859 | |||
| 3189fc464a | |||
| 547038c560 | |||
| 8cdfb244e8 | |||
| 7ce67c7844 | |||
| 5620ac882a | |||
| 0a6f0f200b | |||
| f61f4397d2 | |||
| 6031b73fb5 | |||
| 628592f958 | |||
| dd50852a68 | |||
| 07bddaae54 | |||
| bf6482a594 | |||
| 8a685d4e60 | |||
| f9f947fab6 | |||
| 9c5767f71f | |||
| e4fbc7fe69 | |||
| d76dca8fd7 | |||
| 3cf371177c | |||
| 8e0fdf641b | |||
| bfea4b9910 | |||
| 93de0645cd | |||
| 527a5b2e97 | |||
| 32b25f912d | |||
| f3e3483b46 | |||
| a5b0758d30 | |||
| e83bcb864c | |||
| 6d3c74e71e | |||
| de6ee523b0 | |||
| 1f618a4152 | |||
| b7b8f20e24 | |||
| 59fd85429c | |||
| d2fb8250bc | |||
| bde9863b98 | |||
| 4928989913 | |||
| 6a00444bd4 | |||
| 4872a18e91 | |||
| acc3a4dccc | |||
| 461bc8ac9c | |||
| e9db4238ff | |||
| b1acb6a076 | |||
| 2d4ae65188 | |||
| 6b35d4165d | |||
| 9b6bfa2760 | |||
| ff43bc79b8 | |||
| 080e440d23 | |||
| 04b2c1c9d9 | |||
| 03000662fe | |||
| cf8b600dd5 | |||
| f706a48f60 | |||
| bdbed4622e | |||
| 77920db5b5 | |||
| 06b0ff81e1 | |||
| e488b2c89c | |||
| 447e93ca3a | |||
| 7f40a52444 | |||
| e17c96d465 | |||
| 973dad3240 | |||
| 078859838a | |||
| a7db972ba5 | |||
| 1dbad4bafe | |||
| b2c94113d9 | |||
| 005d4d1ea6 | |||
| 9a77a5cb9b | |||
| 10b443f0f5 | |||
| c2d3752bc5 | |||
| d200878e0d | |||
| 125907ed3a | |||
| 3c748520e1 | |||
| ee3203c485 | |||
| b44fda2ccd | |||
| cb825e37ba | |||
| b8335188ce | |||
| 65cb8481bc | |||
| fd7a8c4066 | |||
| 9351b597c2 | |||
| d722e587b1 | |||
| 7064472e0b | |||
| ffa2df416b | |||
| e088f705ba | |||
| 47b49077da | |||
| 943c1e11b9 | |||
| ed6f188eb2 | |||
| 759cd12379 | |||
| f1592b92a6 | |||
| 20fe08dbb4 | |||
| a4ee7b890c | |||
| d781038e88 | |||
| 535455813c | |||
| b047b28f30 | |||
| 719e6c457d | |||
| 0ed814786a | |||
| 66bf189e55 | |||
| b3a667641d | |||
| ce8dddd9b7 | |||
| 812fd15011 | |||
| 2761018a37 | |||
| 9d3508909a | |||
| 830e088ccf | |||
| 5a2d35d3cc | |||
| 43fd30322e | |||
| 18bc139d25 | |||
| c452256fe7 | |||
| 1a3b57da66 | |||
| 9eb782e2b7 | |||
| 9478000cdf | |||
| 61f2b00a2a | |||
| 8e5d350ac2 | |||
| cce8651e00 | |||
| 50e4164bf8 | |||
| ecbbf5511c | |||
| 695bf03bcb | |||
| b3e7b55635 | |||
| aa6f7088ab | |||
| cd2b5b997f | |||
| c8d473ba7d | |||
| 76f74b770b | |||
| d2f9e9fd2f | |||
| 0ebfbb51b1 | |||
| cdbc300ea2 | |||
| 7215c3242b | |||
| 0aefdf3f1a | |||
| a36dd24ae9 | |||
| 21627180c3 | |||
| c49391d05a | |||
| 5b4139e3c8 | |||
| ae42634a8e | |||
| 1a38a6d6a3 | |||
| 1a70ad0c63 | |||
| ba5efedb11 | |||
| 9818d5196f | |||
| 3f48b10942 | |||
| 7fdab1b1e6 | |||
| 1f4a3c6e55 | |||
| 876ac668c1 | |||
| 4892f4c419 | |||
| 6b9e5cad9f | |||
| 635b54ff07 | |||
| 2e5621bf6e | |||
| 1353de44f7 | |||
| 118012d7e2 | |||
| b081d79fab | |||
| 2497fec389 | |||
| 31cd8d1e56 | |||
| ce912e9525 | |||
| 7d77aa81b0 | |||
| 830395f672 | |||
| 9a53d4adad | |||
| 6c775bbba7 | |||
| d0d74b8763 | |||
| 8753344665 | |||
| 818e321682 | |||
| 24dbdf29fd | |||
| a4df2f41d3 | |||
| 45a6b31910 | |||
| 94a428f6da | |||
| 0a00e17536 | |||
| 1f1fdfc738 | |||
| a354e67642 | |||
| 3b640ac85b | |||
| e773a05265 | |||
| 5ca0127e46 | |||
| e301617ca0 | |||
| 6cee9930c1 | |||
| a66c27be84 | |||
| ebbdedef6c | |||
| ad1adba837 | |||
| 6eb75c38a3 | |||
| 64db679a4d | |||
| 154acc5280 | |||
| 06d1f0551b | |||
| da4b50afb4 | |||
| 385b2158fd | |||
| dc6dcfb845 | |||
| c8f95d866a | |||
| 86f0f1e5fd | |||
| 417241acb5 | |||
| 4a3981e10c | |||
| c7d57ff266 | |||
| e1943b9fb4 | |||
| 41130a38ed | |||
| 98032a0fed | |||
| 1a26aead44 | |||
| 2b5e2244c1 | |||
| f14f5e0d72 | |||
| 5cc0456f40 | |||
| 0c8701e3e4 | |||
| cc8c0992f6 | |||
| fe50ce8994 | |||
| 7fd3e3bada | |||
| 25d9f3d20d | |||
| cb531fa14a | |||
| 568483d49c | |||
| 145b7b76f9 | |||
| 9c95dcbd5c | |||
| 25c532881e | |||
| dc97fb079d | |||
| 1b643f3918 | |||
| 019cbb6c1a | |||
| 8bcf9b032e | |||
| ea3240772e | |||
| b71d3479be | |||
| 78e28bb6d2 | |||
| 0219f886ce | |||
| 458f637d2c | |||
| 631c5e907f | |||
| aa1338e1b5 | |||
| e4cf588891 | |||
| 989ed25cf8 | |||
| 5cbb86abd8 | |||
| d3adc08c15 | |||
| bfc17942cd | |||
| e92ceb070c | |||
| 79abbcfaf8 | |||
| 710fcc29dc | |||
| e59073cf20 | |||
| 661681b806 | |||
| 3f9ebedfb3 | |||
| 1b473b1ab0 | |||
| 202022c5a0 | |||
| 6373996c68 | |||
| 5e2361ba94 | |||
| 4dce02308b | |||
| af80f53666 | |||
| a01f3d04b6 | |||
| 45608e8346 | |||
| 7f9cb9917d | |||
| 92cfe54f98 | |||
| f16a01c6fb | |||
| ac134b0a3f | |||
| 627c86ce7f | |||
| 1451035560 | |||
| 6686a4d495 | |||
| d0e69683b5 | |||
| d873013968 | |||
| 23fb36cd8a | |||
| c161ebac2a | |||
| e9b1fe7819 | |||
| f91df9f4e7 | |||
| bff3bbdc86 | |||
| df2e4927d2 | |||
| 0e602bb504 | |||
| 6408b1abff | |||
| cb0d411605 | |||
| 0a7fedd9c5 | |||
| 7b77946afe | |||
| 28d9085231 | |||
| 6c374e9ae4 | |||
| 16dbffd91c | |||
| e355fb1316 | |||
| 24a2e60f02 | |||
| 6c66473209 | |||
| d8617df871 | |||
| ea9a9f9a46 | |||
| c3da2557a6 | |||
| ab2e9862e2 | |||
| ec3bbb83e9 | |||
| 76a9d90ecb | |||
| 6e3f02961c | |||
| 43cf4e2727 | |||
| 9171ed6685 | |||
| 0a2976d9ce | |||
| 51224a6929 | |||
| b101809e42 | |||
| a7bb7e1e23 | |||
| da6f818d90 | |||
| 7702cdcf0a | |||
| 8b9672313a | |||
| 142ad75744 | |||
| b0b0b612a1 | |||
| c135d686df | |||
| 8f31e5bd67 | |||
| 703783406a | |||
| 7bf03749ec | |||
| b75326aeee | |||
| 945ae941fa | |||
| fdad48f613 | |||
| 72787d5c24 | |||
| b79deefdd6 | |||
| 168c0a50df | |||
| 383b7c331a | |||
| 64645cdf1f | |||
| 5926c3170d | |||
| 470524dfff | |||
| 4acdab8c0f | |||
| c71e30e4fb | |||
| a68e52322c | |||
| e6e51498dd | |||
| 30a5df8a00 | |||
| 4a2b18e4f7 | |||
| 848ccc3ef1 | |||
| 097360ca0a | |||
| 6eaf5c2bc2 | |||
| eb702577ae | |||
| 276e2e0dda | |||
| a4b5e81ef1 | |||
| 4f2b31c705 | |||
| 2b18da7244 | |||
| c22c3da493 | |||
| 2983eb9bd3 | |||
| 299b075eef | |||
| 48eb4c13d7 | |||
| 9ae8810282 | |||
| ac04a3ddc5 | |||
| 5d0ed475a6 | |||
| 9702d7665f | |||
| 6dc887b04e | |||
| 764d35836b | |||
| 1dacdd4637 | |||
| f45a10395f | |||
| df6f3ba8e1 | |||
| e88e4ab3eb | |||
| bcd46d4017 | |||
| d9561a0159 | |||
| e7fbc21721 | |||
| 0ddafe8a42 | |||
| 631449e40a | |||
| 89de1d52bb | |||
| 6ad68c37d4 | |||
| fa39801523 | |||
| 7d7dc70630 | |||
| fc0a37999b | |||
| bd3601e0c8 | |||
| 20787da275 | |||
| c083a124ad | |||
| 20ffa0c6db | |||
| ef6abce6ab | |||
| f542b62f3c | |||
| 4c50a1fb8a | |||
| 67bb9223aa | |||
| e7e3261b0a | |||
| 44b6c4eedb | |||
| f71cc8ad68 | |||
| 1ed6309971 | |||
| 6d6380dc6a | |||
| 0f2007f5dc | |||
| 428d255538 | |||
| 0f0c47bbe4 | |||
| 59ef06f402 | |||
| 2fb2c3fa6e | |||
| b20e6cc4ad | |||
| c3245c92da | |||
| 3fc9a843fc | |||
| c72372d55c | |||
| bc2c3a2c80 | |||
| cb7d0da816 | |||
| 6bfee95043 | |||
| da5f521f92 | |||
| b746cda6e7 | |||
| 3733da17fc | |||
| 48a6b3200b | |||
| 3a8c052d5a | |||
| 045d2b2571 | |||
| 5445df8e62 | |||
| 7a880e2ee7 | |||
| 15f1a5bada | |||
| d0eee81129 | |||
| 07cb287eb0 | |||
| 3262888024 | |||
| 77190137f6 | |||
| 82827b7a0d | |||
| 0472166c09 | |||
| 9c7914fc3d | |||
| 2770f85e01 | |||
| b25b15f195 | |||
| 442ed991bb | |||
| ca001ed831 | |||
| e623185d96 | |||
| 8e5bfa12f4 | |||
| 23c99084b5 | |||
| cc85e3e8ed | |||
| 081658550b | |||
| 6bc4ce3c0b | |||
| 82341dbbb3 | |||
| 6071470b6a | |||
| 376a9e92ba | |||
| 9dc8329dec | |||
| c09cd0c9c2 | |||
| 7d66b723ca | |||
| 126aaae8ba | |||
| 8f909182d3 | |||
| 1f74b0b989 | |||
| a0b07cbfde | |||
| c7585d17f0 | |||
| 2c732885c6 | |||
| 2a4b68c222 | |||
| a76d7775fd | |||
| b45dc74e5a | |||
| 564745f03b | |||
| 56a99a8a4e | |||
| e1ef9db6b6 | |||
| d173d317e3 | |||
| 76772be422 | |||
| 6167d0d78d | |||
| da7c12bb61 | |||
| fb4b44fefb | |||
| 65c08ad972 | |||
| b71bca4577 | |||
| 445523e5f1 | |||
| 6da34c1f2b | |||
| c0b6606758 | |||
| d1005ad0a9 | |||
| e041125c20 | |||
| 4dc41aec27 | |||
| 4990537082 | |||
| c520b5a865 | |||
| 7796189d14 | |||
| aa3b69f6fa | |||
| 4cadb913e8 | |||
| 79371a3fa5 | |||
| 402c4359a1 | |||
| fec2473b93 | |||
| 45086c90bb | |||
| 1a91f72d8c | |||
| 46a6dda0ff | |||
| 0eadb784bb | |||
| e18b625281 | |||
| aa5b5cd9b7 | |||
| d4ca575426 | |||
| 1054794af3 | |||
| 4e6b2cd4da | |||
| 9b5d9e1186 | |||
| 4bd4536cfd | |||
| e3d0902c45 | |||
| 4ecdc80e4c | |||
| b15c01ac37 | |||
| dc030ab076 | |||
| 49c0ce9a62 | |||
| 72905f9ccc | |||
| ee7d656f2a | |||
| 21dfeac20b | |||
| 906826d752 | |||
| 196e2adc82 | |||
| 0cbc858cf4 | |||
| 6963d2ae71 | |||
| 0b6cd1cb6c | |||
| 964885d63c | |||
| 76a501af85 | |||
| 2520126905 | |||
| fe228a5edc | |||
| 100757ba69 | |||
| ce3a98028a | |||
| 2b06375f71 | |||
| 8f663072f6 | |||
| 05d6fb762c | |||
| 177401ecc8 | |||
| 920f481049 | |||
| 27b75ab8e9 | |||
| 205c5ed0fc | |||
| 3a2924bd51 | |||
| b7c790438a | |||
| a053931c17 | |||
| b162c99d6e | |||
| 12de0e5b84 | |||
| 0e9b1af56b | |||
| d933ff9742 | |||
| e634d1691f | |||
| 93102b5144 | |||
| 07fdbcdd7c | |||
| d25b341eb3 | |||
| 5d6b7578d3 | |||
| 2a019d09a0 | |||
| 117df6158a | |||
| ae5e9b8f34 | |||
| c7090e77c2 | |||
| fbb480dae6 | |||
| 6a1be5cf06 | |||
| c0242ad55c | |||
| 70248ef0b5 | |||
| 07120b7dc4 | |||
| 52d61226a0 | |||
| 6e557da370 | |||
| c9b3794f0e | |||
| 2b5254dd0c | |||
| 3ecf107c39 | |||
| 193511d83b | |||
| 89f62562f0 | |||
| 187a29ff6f | |||
| cc483abd29 | |||
| 386299ce57 | |||
| e80a63ee51 | |||
| a2017fa415 | |||
| ad06fab8a2 | |||
| 1ffabd8642 | |||
| 4c35d7cb4e | |||
| ff1044a401 | |||
| 60969f26eb | |||
| 2ea0b4818a | |||
| 972cb6fb66 | |||
| 9ee664bc2b | |||
| 1cfd8fb7b4 | |||
| f27f3024e8 | |||
| 115a462f6e | |||
| 0636a032be | |||
| 27d348bf9c | |||
| f1775766e7 | |||
| 318f59c473 | |||
| 5925aca3c2 | |||
| f55f0ba016 | |||
| 304d811698 | |||
| 2678ce77da | |||
| b41027562a | |||
| 78e3765730 | |||
| 010ac87de6 | |||
| 7a99713043 | |||
| 6af5f78fbb | |||
| 8ca59a029a | |||
| 40413151c8 | |||
| 6f60006c9a | |||
| b71f1d8d80 | |||
| 8c8eea0f9a | |||
| 7cb5ecd09f | |||
| 8d9e264efc | |||
| 3d95d9c1a1 | |||
| 4d6fad82db | |||
| 94dac676fe | |||
| a59f20ac8b | |||
| 428bb5a05c | |||
| 21b44d01ff | |||
| 9da19f3702 | |||
| f1a1a158ba | |||
| 68000272ea | |||
| e52e90454d | |||
| d7fc209e53 | |||
| 849c53a62d | |||
| 2b08654d7c | |||
| 1542ba39cd | |||
| 34d5106804 | |||
| 1f96ae5c53 | |||
| bd3440daa9 | |||
| 8cedac738e | |||
| 7a9c569251 | |||
| 0707d650f6 | |||
| 516dc88d44 | |||
| c43539a92d | |||
| b314a9f1e2 | |||
| 4100c38280 | |||
| d722754f12 | |||
| 147b9d2035 | |||
| 4e5bef23da | |||
| ff4e371b32 | |||
| 36e2ad8522 | |||
| 11d9a5203e | |||
| cf5b546183 | |||
| 2270236e42 | |||
| f75feca345 | |||
| bde8d33f20 | |||
| 5d40d74c46 | |||
| 2f720210e9 | |||
| a0027122c9 | |||
| a60e298f02 | |||
| d9a1cb755b | |||
| a7dac6072c | |||
| 0757b9fe55 | |||
| f1d53e698b | |||
| 1829c3b2f3 | |||
| 1997cdcefd | |||
| 4cb52a28a6 | |||
| 5c817717e7 | |||
| 77238ad41a | |||
| c9d35a0e2f | |||
| 6e963fe5da | |||
| 04ca9b9fff | |||
| 2cbe99952f | |||
| f985c03490 | |||
| 7a0a618b3f | |||
| 1ffbd29ed5 | |||
| b60f357527 | |||
| 6e43340acb | |||
| b0aa7b0218 | |||
| 86d9979a7f | |||
| ac7fcb2e0b | |||
| 9da283f7fc | |||
| 6928485965 | |||
| bdf53b435a | |||
| 36e70c48ba | |||
| f30a6dd3db | |||
| 8b4daa507b | |||
| b98397d491 | |||
| ca67ed392f | |||
| 23eda17bd3 | |||
| acd92b3e50 | |||
| 4cc54011b7 | |||
| beabbd9c7b | |||
| dfde06a2fd | |||
| f7a114ee44 | |||
| 0427d2586f | |||
| 96837ff774 | |||
| bca9c19053 | |||
| b368b27faa | |||
| 91d8185ede | |||
| 18daa41e2a | |||
| 747277b121 | |||
| b8e09e83ce | |||
| e798503f6f | |||
| 5b5c99e6f8 | |||
| c50627867e | |||
| e30e52e880 | |||
| 90f5285067 | |||
| 441a6ad66f | |||
| 87668c6ad0 | |||
| d1af82e114 | |||
| dba39dd9c4 | |||
| eb3624e9ad | |||
| b95586a590 | |||
| 3007c22c41 | |||
| f30d195cc4 | |||
| c537a01fbf | |||
| 86f17757db | |||
| 70823d2cd8 | |||
| ec5591453e | |||
| 606efac3fe | |||
| 28bedc0873 | |||
| 52e4415b43 | |||
| 248e321438 | |||
| c4ad9055d4 | |||
| 7a67e68308 | |||
| 434bb97765 | |||
| 6a821de0b5 | |||
| 576cb29281 | |||
| b83f2b0c5f | |||
| 2d3ccac369 | |||
| 7816602685 | |||
| 214df52723 | |||
| 35890d6bb3 | |||
| 7ccd4c6055 | |||
| 5ccd628259 | |||
| b9276aa0d7 | |||
| 798876eb10 | |||
| 617bb1484a | |||
| d51538aac3 | |||
| b554cfebe0 | |||
| f8773e1736 | |||
| d8024be2c3 | |||
| dac20b12f1 | |||
| 5ae8ea3be1 | |||
| 1d2d79eceb | |||
| 896f9e4a05 | |||
| b737696f7f | |||
| 2fb9b36959 | |||
| 5756d14292 | |||
| 2ce8c66fc8 | |||
| 9502ea0bbc | |||
| 8b4b0c40ce | |||
| a83dcdd06a | |||
| 731a281805 | |||
| e2d788e265 | |||
| 0080539575 | |||
| 19799bb1f4 | |||
| 72c0e75156 | |||
| 27eb7975ef | |||
| b05057d743 | |||
| 8edf164522 | |||
| f062f3ce71 | |||
| 153cda7cf8 | |||
| 050bef7f85 | |||
| e07c019fb2 | |||
| 21a587ee0f | |||
| 427243c933 | |||
| cd4ea75862 | |||
| 949efa4de6 | |||
| a9461311bc | |||
| 4215a2fd78 | |||
| 9652aa4623 | |||
| 091c31d33a | |||
| 89ac824d82 | |||
| 4115f3cfe1 | |||
| c66b2facbf | |||
| c16e97e49a | |||
| 95f4877862 | |||
| fc9de61269 | |||
| 26aca0df9f | |||
| 7ee04060d8 | |||
| d769b1ad4e | |||
| 996b01bb34 | |||
| 807c94e2ce | |||
| af757c5582 | |||
| c8944e5a14 | |||
| 2230ea1eea | |||
| e098d40c2f | |||
| 72cc33cb7e | |||
| 3310e3d253 | |||
| 164fd4c646 | |||
| 0e6be3ad08 | |||
| 1b312658e9 | |||
| cf1d11eb78 | |||
| cc1a318e3d | |||
| 6734460d42 | |||
| fde9be6b3f | |||
| d62a647fa9 | |||
| 5a1f7b1829 | |||
| b2528b90f8 | |||
| 0883b099fd | |||
| 23add7e276 | |||
| 56ca605257 | |||
| c3ebdee5d0 | |||
| d113d710a7 | |||
| c4755124a0 | |||
| ceb6a9e294 | |||
| a8afd793e0 | |||
| d33f78960d | |||
| 1a8b6705e0 | |||
| 415f56863d | |||
| 4d9ab2215b | |||
| 14ebc23b81 | |||
| b43309be75 | |||
| 8cdb834499 | |||
| 5fe37b62b2 | |||
| 4c33c110b7 | |||
| b166172d10 | |||
| e420074c83 | |||
| 50cb765108 | |||
| b6c6fc9aa9 | |||
| cd0a9456cb | |||
| c4d00a2073 | |||
| 575126eaa2 | |||
| 3ff0bcd3c9 | |||
| 639a338cca | |||
| a22e6f552f | |||
| e089dd99a3 | |||
| 52e3e24a3a | |||
| c5364a65a2 | |||
| 0b31fa271d | |||
| c022d3f9c6 | |||
| 28cea9697e | |||
| fa05c93bf8 | |||
| c96ffc5f59 | |||
| 95338f1df7 | |||
| 877db91cb6 | |||
| 723f1ad4ad | |||
| 089cdba4f9 | |||
| f98c106080 | |||
| 48c0cf0b1b | |||
| 4cb14c6429 | |||
| b84d4eb6b8 | |||
| 1235269da0 | |||
| 2e679dbf5e | |||
| 84deb49beb | |||
| ec74b06282 | |||
| f9b35b9a3d | |||
| c5b4446133 | |||
| 86f81f2720 | |||
| 70b8d2536a | |||
| 34ef0bfae6 | |||
| 648787913e | |||
| 75df9777b3 | |||
| 122bbfb157 | |||
| 7381547b27 | |||
| 480222c1f2 | |||
| 3fa6521c51 | |||
| 459f95394a | |||
| 22b1452168 | |||
| 1d10503b91 | |||
| e7d31c21c3 | |||
| 7f6509d235 | |||
| 7701418e55 | |||
| 7078efe9e7 | |||
| a3d2de92bc | |||
| 607d4b1e57 | |||
| 6edfcc9766 | |||
| 40f269aabd | |||
| a5852d1caa | |||
| 95aa063a69 | |||
| e60bfaca48 | |||
| 858c2e1bd5 | |||
| b0e2b01e00 | |||
| d5dc453ffa | |||
| 68a3b6d0c7 | |||
| 197a5a9160 | |||
| 62f2ec8a4d | |||
| 4197fc9e0b | |||
| 8d8399c9aa | |||
| af5281626b | |||
| 8add6f634c | |||
| 058a52961d | |||
| d03772666d | |||
| 974e20df05 | |||
| 34f4bca97d | |||
| e2c83aad6e | |||
| cd4bb7c867 | |||
| 0398ea7e51 | |||
| fa2aa04b53 | |||
| 27eb984e73 | |||
| 017c0e3385 | |||
| 82377bc1ab | |||
| 7132d971f6 | |||
| dc6de9cab0 | |||
| a28a754be1 | |||
| 3c35a75c92 | |||
| f8404f3c16 | |||
| 5efdf05274 | |||
| 7c7d8e41e2 | |||
| 814ada0ac0 | |||
| fcd8d67f51 | |||
| 5b9e91f8af | |||
| bece9837b2 | |||
| 6c47650c2d | |||
| fd8358a899 | |||
| cb072366e0 | |||
| 4a96736592 | |||
| ad1d7d71f2 | |||
| 6246393894 | |||
| c1324548ce | |||
| 969011f3f5 | |||
| 6488101cdc | |||
| e088ba134e | |||
| f2bd2a6e75 | |||
| 6ea4791dc9 | |||
| 63f9c1c193 | |||
| ed70d1ab18 | |||
| f8adbe074d | |||
| 4bd0cd1598 | |||
| beb36dfc97 | |||
| ebcd38ef50 | |||
| ae92eea76e | |||
| 50da682d76 | |||
| 7a9474a6a8 | |||
| 68bbee66d5 | |||
| e40b0b98e4 | |||
| 4a04e92caf | |||
| aa4c6a1434 | |||
| 3d69fe773d | |||
| 141fe422db | |||
| 3122a75f64 | |||
| 6340bceb11 | |||
| a9c5c1c274 | |||
| 8f9bae9a6f | |||
| 575fa17425 | |||
| 91649f5ee7 | |||
| 1095e15643 | |||
| 453ce9cf44 | |||
| b6e9e447c5 | |||
| 6df88ec021 | |||
| f321dee54f | |||
| 3e733e65e9 | |||
| 7b8b1ab111 | |||
| 922d632afb | |||
| 5af0996259 | |||
| c96e2f252c | |||
| d0c49240d8 | |||
| 3b4668e61b | |||
| c7706a115f | |||
| b1786e088c | |||
| c501c8b23f | |||
| 387062074a | |||
| 4ddce7cfbe | |||
| a9ebeee748 | |||
| 25bacb9892 | |||
| 5664765f6e | |||
| c3ca58879c | |||
| ec0341027e | |||
| fa424a4576 | |||
| a47707447c | |||
| cfd4eebcd4 | |||
| deb9d9add1 | |||
| 82a2d6b74d | |||
| 72eac47524 | |||
| 07e43307c5 | |||
| 018aba2fe6 | |||
| 097fae866a | |||
| 166a293864 | |||
| ffd07e07fd | |||
| 0a899539c9 | |||
| 10e978d4c5 | |||
| 4049272cbb | |||
| c74e2c7667 | |||
| 327c5b8a33 | |||
| 6a3e225192 | |||
| a269859b17 | |||
| 36e419bca0 | |||
| 765673db66 | |||
| 28e2ce90df | |||
| a124236def | |||
| 4b956d5eea | |||
| a39c62eabc | |||
| dcc2e5cd6a | |||
| 98c0c34bf8 | |||
| 96d34ceb50 | |||
| 6e37736146 | |||
| c15eb85a5e | |||
| 6d9f50629c | |||
| d37923a31c | |||
| d930bdddbd | |||
| d60aab9584 | |||
| eed8a1e40c | |||
| c6eb7cdfd6 | |||
| f022d0ca76 | |||
| 42407f0eca | |||
| 44fe888230 | |||
| 62b8e51705 | |||
| ad15cdad56 | |||
| 04cfdff2bf | |||
| e1834d5179 | |||
| ad9662c120 | |||
| fad65b8df6 | |||
| e5f0ccb5d5 | |||
| 91a77bb14e | |||
| 7ac035c578 | |||
| 932669844b | |||
| 10ae59be19 | |||
| 0c0f8e8950 | |||
| 41c9a4d23f | |||
| 8c5820d5aa | |||
| ec8c78197b | |||
| 385bdd7dbf | |||
| a25a10e616 | |||
| c820d2ac6d | |||
| baaf1994e3 | |||
| e0a2993c36 | |||
| d8123a71ec | |||
| 4c0bb1c9b7 | |||
| 503e6f2b42 | |||
| a4896a55f6 | |||
| 8993b483a6 | |||
| ef42b596d9 | |||
| 8b936f5413 | |||
| e96ac5c156 | |||
| dc8416b5f7 | |||
| a5d92537f5 | |||
| f2a519b7ec | |||
| 37b8676b9c | |||
| 99984603ed | |||
| cee8252455 | |||
| 81f05fa79f | |||
| 5b74879805 | |||
| b5c93317dc | |||
| 47084efe17 | |||
| 62a60ff3fd | |||
| a967a5c425 | |||
| a3f7e5ad89 | |||
| 6c06a67fdf | |||
| d9554314d5 | |||
| a2ef06e6db | |||
| 2b43cdf9e2 | |||
| 30d4acd986 | |||
| 8a8a63eb66 | |||
| a00105f718 | |||
| bb93386fa0 | |||
| 465a3b42fb | |||
| d88a9f39f2 | |||
| 668c7c4c6a | |||
| 941a553766 | |||
| 49471663f5 | |||
| 0390290f10 | |||
| 6a3ef60881 | |||
| 12ff99eb32 | |||
| a910f2cb03 | |||
| ca4234b1c3 | |||
| dc606a8780 | |||
| 30ba651674 | |||
| 74bb31e795 | |||
| 5550cce8db | |||
| c777d49091 | |||
| 5405b97eb1 | |||
| 46080b4363 | |||
| 0e5fab0104 | |||
| 95b0d1e3f4 | |||
| 328d6eb294 | |||
| 2eccc236a9 | |||
| 7140f38ba4 | |||
| cb67f7e3c3 | |||
| 5dd8fa8416 | |||
| 163f64dda7 | |||
| 372f80bf38 | |||
| 7c163a8110 | |||
| d025b8dc9e | |||
| 2d69d93154 | |||
| 43b9645c69 | |||
| 4bb1402ac5 | |||
| 8fb1620c94 | |||
| 597a236089 | |||
| 1489ad4237 | |||
| 62c9d82fd2 | |||
| 5701b53026 | |||
| 6014a8fb70 | |||
| 70a742e69c | |||
| 2df4d48bb3 | |||
| 560929e2fa | |||
| 18fc97293e | |||
| 3fdd8c629c | |||
| 10f2fca2bf | |||
| 83dda97ff6 | |||
| c42c764789 | |||
| f802ea860d | |||
| bb23d49833 | |||
| b3b821a868 | |||
| 8a86edb5bb | |||
| 972d91a4b8 | |||
| e3076152ba | |||
| 566e1474a5 | |||
| 2d9de7b69e | |||
| 5da9d4e36b | |||
| 7e960df2d6 | |||
| 832ef993e6 | |||
| 1cac083916 | |||
| 7f37bc8802 | |||
| 1839edf84d | |||
| 7f7c220073 | |||
| 18b13cf506 | |||
| 923ddd7cd3 | |||
| 8064fc4a17 | |||
| 63fcaed8cd | |||
| 5e1daf36df | |||
| 5380d133e4 | |||
| 509620707c | |||
| bf354edeae | |||
| 1cb7de08f3 | |||
| 95c8de0a21 | |||
| 6a67052d83 | |||
|
|
087500c9b7 | ||
|
|
85e7813539 | ||
|
|
7e17a93d42 | ||
| 6f5a25d65d | |||
| ecb9364bd2 | |||
| c7da54d86a | |||
| e6d7d8699a | |||
| 10f1982c23 | |||
| 1e6f486865 | |||
| 79b64e4f23 | |||
| c43ba34cbf | |||
| 26eadebf21 | |||
| 7da01be7ab | |||
| 3b27d05fd6 | |||
| a3c82023e8 | |||
| 5e73583e00 | |||
| 4b16ec6095 | |||
| d4f24eafb6 | |||
| 6c4381c3a5 | |||
| 4979fbe927 | |||
| 9689f5aa15 | |||
| a4d559f406 | |||
| 883305ca6b | |||
| 48f789c5b4 | |||
| b34187b86a | |||
| 79fc40e57a | |||
| e3aaa887c5 | |||
| 50a503240d | |||
| ae8993821f | |||
| 9c02626937 | |||
| 902a6398ca | |||
| 1e6eb26c77 | |||
| d502f769ea | |||
| bc57230418 | |||
| f3885f25d6 | |||
| e4bcf88fe5 | |||
| 4e9cd1f114 | |||
| b79cd5d65a | |||
| a71f7648c2 | |||
| 7cc31e892b | |||
| 6cdf2a4211 | |||
| a213ba5d32 | |||
| 91f7628081 | |||
| 35fd50771c | |||
| 1e21c04a3e | |||
| da92cee338 | |||
| 9a093ace9c | |||
| 1ee4a611b9 | |||
| d31991a67f | |||
| 3a801ba72d | |||
| cdef33d774 | |||
| 879927c37c | |||
| 821cb5cd46 | |||
| cb5ff20378 | |||
| d9a9ce0a86 | |||
| deec1746e4 | |||
| 34925a72c0 | |||
| 56e354f124 | |||
| 83064d7c90 | |||
| 9f12f2c856 | |||
| 8fec6fc5b9 | |||
| 793581ac22 | |||
| 5ef7c9b16e | |||
| a35be68780 | |||
| 0d0defb8de | |||
| 240c55f407 | |||
| 78c6024b95 | |||
| d35dba7539 | |||
| bd47f08996 | |||
| 9dbfce94d4 | |||
| 86fc23aed8 | |||
| dbf4559e14 | |||
| 7cfdddcfbd | |||
| b2e287520c | |||
| 84d7207d90 | |||
| bb631b39e9 | |||
| 1d0378dd7b | |||
| ee4cea3b01 | |||
| 0c8de47893 | |||
| 2272d133f9 | |||
| afaee53077 | |||
| 7d30a735fc | |||
| 8461e581ea | |||
| 5948d1a62f | |||
| 5ac05c943e | |||
| ca78da4dd4 | |||
| bb270715c1 | |||
| 53a899f967 | |||
| e0a695a673 | |||
| 1a983344c2 | |||
| d474c8b5d4 | |||
| c568668fd0 | |||
| 177bf10e2d | |||
| 459b78dcc3 | |||
| ccf7f0686e | |||
| 03bdb4b4b7 | |||
| 7ac91fd312 | |||
| 1e195f70fc | |||
| 53f0b93a5f | |||
| 30b703e025 | |||
| 6cdc4015e7 | |||
| 4047b956f5 | |||
| a19ac4772b | |||
| 127c3b810d | |||
| d1eefd05ab | |||
| 6aeba34bdb | |||
| 66c7563335 | |||
| 180eb0f9ef | |||
| 98b05c93bf | |||
| fa3b3b11b0 | |||
| f5ff65bfe0 | |||
| 2430ba5e00 | |||
| f5994d851b | |||
| cd955fe1fc | |||
| 1f63f91144 | |||
| 9e48c1d1a6 | |||
| 6b28444c36 | |||
| d7dfb34b02 | |||
| 37734e65bf | |||
| 281607f3e4 | |||
| 93c9b206d9 | |||
| 6582293370 | |||
| 5f4598814a | |||
| 016f87b76c | |||
| 7597394d61 | |||
| d09664bb7d | |||
| f84413f1a9 | |||
| e640caee74 | |||
| 646e1a3764 | |||
| 19dcc87950 | |||
| e5ce254e8b | |||
| f2c557f77c | |||
| 88c28a3f25 | |||
| 9d91a28d7a | |||
| c705ba6afc | |||
| a12a591279 | |||
| 358191539c | |||
| d1d3e1592e | |||
| 7d851d2222 | |||
| 310a2eb63a | |||
| fd8ac7cf1a | |||
| de8f3bbd2b | |||
| 29266f1611 | |||
| 1e4a3b6c0e | |||
| 007d2ef692 | |||
| c37dab58af | |||
| 6eb486c770 | |||
| ae7ba9cba4 | |||
| 9a27afebf7 | |||
| 6643cf5d25 | |||
| 552868c26e | |||
| 69909fa34c | |||
| 855884ec93 | |||
| ae4f2ac680 | |||
| adc1283330 | |||
| b1541c0faf | |||
| b5d8a55031 | |||
| e56296d8b0 | |||
| b2fc7ea860 | |||
| 0c3b90eb63 | |||
| cfbd0ec8f2 | |||
| 667223b3c2 | |||
| 8b1e19fa4b | |||
| d57b08ec6f | |||
| afef5e9052 | |||
|
|
bbfcc2e3fe | ||
|
|
38934027a4 | ||
|
|
7559a673ef | ||
|
|
9ed4c6209b | ||
|
|
2dabfd4020 | ||
|
|
341f424eae | ||
|
|
69cbbbc203 | ||
|
|
c7ae1b1dc7 | ||
|
|
da61ea3856 | ||
|
|
0b1d7bb4f3 | ||
|
|
5b0e7b9dfe | ||
|
|
0063de6846 | ||
|
|
629d29ec99 | ||
|
|
24df753a40 | ||
|
|
e6b7cc602b | ||
|
|
25d34e5ace | ||
|
|
70e4797b7a | ||
|
|
3285a640c7 | ||
|
|
fb16b0e748 | ||
|
|
352bf042b0 | ||
|
|
7e8f9df877 | ||
|
|
1d3be750b4 | ||
|
|
0a8db0a3d9 | ||
|
|
50a200535e | ||
|
|
e305b3e60f | ||
|
|
27953bde5a | ||
|
|
b997a52385 | ||
|
|
5902a51f9e | ||
|
|
02054a8047 | ||
|
|
db09236b26 | ||
|
|
bec947262b | ||
|
|
3114b72178 | ||
|
|
5ea499d6ff | ||
|
|
223155b842 | ||
|
|
598dea32c7 | ||
|
|
1c3520806c | ||
|
|
f1700e5ba9 | ||
|
|
f7d55306be | ||
|
|
96e008bec7 | ||
|
|
2305c047de | ||
|
|
0902a7997f | ||
|
|
6868988cec | ||
|
|
8ea17268c7 | ||
|
|
e751696307 | ||
|
|
ebffd2a2dd | ||
|
|
17dc572c4a | ||
|
|
79d2af6e0a | ||
|
|
18c535dcfd | ||
|
|
ee2bcd5aea | ||
|
|
97fa91725e | ||
|
|
8f0393d173 | ||
|
|
f6d3938ecb | ||
|
|
f0bbb1c57e | ||
|
|
94f74fa1a0 | ||
|
|
04f7ae2f21 | ||
|
|
b5202d3646 | ||
|
|
945c771b6e | ||
|
|
501191b388 | ||
|
|
c7eb3921fd | ||
|
|
d1f4944a09 | ||
|
|
c18d86d8c5 | ||
|
|
9ddfaab8bc | ||
|
|
ae18668a72 | ||
|
|
d893a80f03 | ||
|
|
d7111b0e41 | ||
|
|
71885212e8 | ||
|
|
e55dbeeb23 | ||
|
|
a7079d4eae | ||
|
|
c7c23bc7a1 | ||
|
|
4b0dde6efe | ||
|
|
8e22aa22b0 | ||
|
|
b080200118 | ||
|
|
77f3458d71 | ||
|
|
acd33243eb | ||
|
|
ac1ee5f695 | ||
|
|
f37b1cdf44 | ||
|
|
6d503fb6c7 | ||
|
|
2899e34f5e | ||
|
|
5c035cf3b8 | ||
|
|
aadba319b1 | ||
|
|
6f80f0e708 | ||
|
|
d9155b9b7e | ||
|
|
e4edb809f5 | ||
|
|
06a72e29fb | ||
|
|
1cd52813b1 | ||
|
|
f86f2b9ad4 | ||
|
|
4dbb7ae7f1 | ||
|
|
da1d958c11 | ||
|
|
51f9f91195 | ||
|
|
d82ad55113 | ||
|
|
49c7880e6a | ||
|
|
1d2940b92e | ||
|
|
a5630c2837 | ||
|
|
6d5abd3b92 | ||
|
|
64f22fbe30 | ||
|
|
751f9422d3 | ||
|
|
1851e05598 | ||
|
|
57cae8c813 | ||
|
|
f950d6d91b | ||
|
|
b17a8de350 | ||
|
|
483344af70 | ||
|
|
0d3f1e87cf | ||
|
|
2fbd401416 | ||
|
|
e5ac9e0d1c | ||
|
|
bb6ea3694b | ||
|
|
a0c6569eaf | ||
|
|
7d1826f094 | ||
|
|
e958eedfb6 | ||
|
|
f844977d62 | ||
|
|
15be408a20 | ||
|
|
987ea3ab84 | ||
|
|
bd8151a8cb | ||
|
|
9feff50913 | ||
|
|
44acb9b755 | ||
|
|
7bebe745a1 | ||
|
|
96c6997a44 | ||
|
|
89c343943f | ||
|
|
e0db7560e6 | ||
|
|
fbf956c651 | ||
|
|
16ea653ca4 | ||
|
|
314bc24d09 | ||
|
|
3ac2d8d1d4 | ||
|
|
012da00821 | ||
|
|
c24554720f | ||
|
|
8e05cb0e40 | ||
|
|
1cd3571253 | ||
|
|
3d8af3cb0a | ||
|
|
d96256fd87 | ||
|
|
30dcd8758e | ||
|
|
a7451f86ba | ||
|
|
f0ae207890 | ||
|
|
f7f3f0d53c | ||
|
|
8f4ec41359 | ||
|
|
fbd7f47749 | ||
|
|
5a1f9f0961 | ||
|
|
3bc45e9832 | ||
|
|
480ac48aae | ||
|
|
0e87bf55a0 | ||
|
|
10cf7a1575 | ||
|
|
5c21f8569c | ||
|
|
f3d8daf8e2 | ||
|
|
07f6179dab | ||
|
|
2cce7c34d6 | ||
|
|
41b818ad99 | ||
|
|
3a8aa66f18 | ||
|
|
fb4f7c99eb | ||
|
|
ac2bc78ab8 | ||
|
|
c57c24d245 | ||
|
|
95bb27c165 | ||
|
|
3ab3e4cd2a | ||
|
|
c7901d1328 | ||
|
|
b70f1bda9a | ||
|
|
b441738950 | ||
|
|
43e8746c46 | ||
|
|
6eef031ebf | ||
|
|
19f087cb8b | ||
|
|
a2737e3102 | ||
|
|
886d9ae8c2 | ||
|
|
0b8670f6ef | ||
|
|
3c07c5b265 | ||
|
|
4ab8ea8664 | ||
|
|
02793b1e73 | ||
|
|
28cda82704 | ||
|
|
698546f823 | ||
|
|
7092391c47 | ||
|
|
c0cbdc6923 | ||
|
|
c4adbd3ac0 | ||
|
|
cde9953b2a | ||
|
|
aac9badc4f | ||
|
|
524096165c | ||
|
|
5d70124c39 | ||
|
|
18ce079aa3 | ||
|
|
346b9f492c | ||
|
|
29f663fd0e | ||
|
|
70e1655efe | ||
|
|
938ee7afd5 | ||
|
|
094251b93f | ||
|
|
6ddf3fca67 | ||
|
|
62c77fb696 | ||
|
|
16c20ac6ea | ||
|
|
7fbbde56c6 | ||
|
|
d4146c9c35 | ||
|
|
0ea523a2cf | ||
|
|
0bab107e24 | ||
|
|
24e72f2f35 | ||
|
|
579a747878 | ||
|
|
a6917fc129 | ||
|
|
8ff33547c4 | ||
|
|
c1fe3d8538 | ||
|
|
03d7646685 | ||
|
|
74ba8fb758 | ||
|
|
57b1d246c2 | ||
|
|
6f456f5c47 | ||
|
|
59a449e7e5 | ||
|
|
87c09c4da0 | ||
|
|
8acb493006 | ||
|
|
a733af679c | ||
|
|
8e26e09fe6 | ||
|
|
19d32dda0b | ||
|
|
5d6e138d29 | ||
|
|
a7606a4b5c | ||
|
|
a1b72c0aeb | ||
|
|
1760c030ef | ||
|
|
e19bcf1000 | ||
|
|
374d4a1c98 | ||
|
|
e96d491285 | ||
|
|
1cfa008b8e | ||
|
|
96ef259b4c | ||
|
|
a84b2dfef6 | ||
|
|
a230810dbc | ||
|
|
04656c50b1 | ||
|
|
9c04a5dc83 | ||
|
|
6bbc15d4f1 | ||
|
|
183ef78ea9 | ||
|
|
8260746d7f | ||
|
|
3b0b103590 | ||
|
|
5ea03da0a4 | ||
|
|
c1e391132b | ||
|
|
a33a54c5e6 | ||
|
|
1613d767bf | ||
|
|
d71ca1a38b | ||
|
|
ef6dbc197a | ||
|
|
ce48c717eb | ||
|
|
d3dab9a2ea | ||
|
|
451b5868a1 | ||
|
|
42f7fa3e7a | ||
|
|
11eb66c81d | ||
|
|
144e94b31a | ||
|
|
0b21331747 | ||
|
|
e8e3d09731 | ||
|
|
81df06fd8b | ||
|
|
94d26902dc | ||
|
|
daa19626a6 | ||
|
|
4abea24310 | ||
|
|
cc2e42d348 | ||
|
|
c159602a70 | ||
|
|
e37b1529b0 | ||
|
|
f97028bbdd | ||
|
|
c780a03361 | ||
|
|
58e968467b | ||
|
|
957e1a2d77 | ||
|
|
faffd66d09 | ||
|
|
708ffe1157 | ||
|
|
a8033f0a02 | ||
|
|
b9e5f1921f | ||
|
|
87e651cb07 | ||
|
|
2af3e552d4 | ||
|
|
2c5d0faae0 | ||
|
|
3b0b6f32c2 | ||
|
|
4d42fac799 | ||
|
|
94ce0e50f0 | ||
|
|
5fbc888343 | ||
|
|
8b56ca30a2 | ||
|
|
40a432786d | ||
|
|
2c40aedbba | ||
|
|
542d584b4a | ||
|
|
077401ef85 | ||
|
|
18e9e0b332 | ||
|
|
1297501714 | ||
|
|
d8952ed26f | ||
|
|
a83c28ca3b | ||
|
|
3e57a6fb9e | ||
|
|
3bf0f54b1a | ||
|
|
f67cd37a38 | ||
|
|
8e36a24f37 | ||
|
|
546a654c0f | ||
|
|
10a70e5192 | ||
|
|
d37e453643 | ||
|
|
b077602a42 | ||
|
|
6ff8d76b59 | ||
|
|
5d7cad37e4 | ||
|
|
ac1e839876 | ||
|
|
2fd5dd28d9 | ||
|
|
a6b74ce3d0 |
|
|
@ -1,152 +0,0 @@
|
|||
:: Wizard Kit: Copy Kit ::
|
||||
@echo off
|
||||
|
||||
:Init
|
||||
setlocal EnableDelayedExpansion
|
||||
title Wizard Kit: Tools Copier
|
||||
color 1b
|
||||
echo Initializing...
|
||||
call :CheckFlags %*
|
||||
call :FindBin
|
||||
call :SetTitle Tools Copier
|
||||
|
||||
:SetVariables
|
||||
rem Set variables using settings\main.py file
|
||||
set "SETTINGS=%bin%\Scripts\settings\main.py"
|
||||
for %%v in (ARCHIVE_PASSWORD KIT_NAME_FULL) do (
|
||||
set "var=%%v"
|
||||
for /f "tokens=* usebackq" %%f in (`findstr "!var!=" %SETTINGS%`) do (
|
||||
set "_v=%%f"
|
||||
set "_v=!_v:*'=!"
|
||||
set "%%v=!_v:~0,-1!"
|
||||
)
|
||||
)
|
||||
rem Set ARCH to 32 as a gross assumption and check for x86_64 status
|
||||
set ARCH=32
|
||||
if /i "%PROCESSOR_ARCHITECTURE%" == "AMD64" set "ARCH=64"
|
||||
set "SEVEN_ZIP=%bin%\7-Zip\7za.exe"
|
||||
set "CON=%bin%\ConEmu\ConEmu.exe"
|
||||
set "FASTCOPY=%bin%\FastCopy\FastCopy.exe"
|
||||
if %ARCH% equ 64 (
|
||||
set "SEVEN_ZIP=%bin%\7-Zip\7za64.exe"
|
||||
set "CON=%bin%\ConEmu\ConEmu64.exe"
|
||||
set "FASTCOPY=%bin%\FastCopy\FastCopy64.exe"
|
||||
)
|
||||
set "fastcopy_args=/cmd=diff /no_ui /auto_close"
|
||||
rem Set %client_dir%
|
||||
call "%bin%\Scripts\init_client_dir.cmd"
|
||||
pushd "%bin%\.."
|
||||
set "source=%cd%"
|
||||
popd
|
||||
set "dest=%client_dir%\Tools"
|
||||
|
||||
:RelaunchInConEmu
|
||||
if not defined IN_CONEMU (
|
||||
if not defined L_NCMD (
|
||||
set "con_args=-new_console:n"
|
||||
rem If in DEBUG state then force ConEmu to stay open
|
||||
if defined DEBUG (set "con_args=!con_args! -new_console:c")
|
||||
set IN_CONEMU=True
|
||||
start "" "%CON%" -run ""%~0" %*" !con_args! || goto ErrorUnknown
|
||||
exit /b 0
|
||||
)
|
||||
)
|
||||
:CopyBin
|
||||
echo Copying .bin...
|
||||
mkdir "%dest%\.bin" >nul 2>&1
|
||||
attrib +h "%dest%\.bin"
|
||||
set _sources="%bin%\7-Zip"
|
||||
set _sources=%_sources% "%bin%\ConEmu"
|
||||
set _sources=%_sources% "%bin%\FastCopy"
|
||||
set _sources=%_sources% "%bin%\HWiNFO"
|
||||
set _sources=%_sources% "%bin%\Python"
|
||||
set _sources=%_sources% "%bin%\Scripts"
|
||||
start "" /wait "%fastcopy%" %fastcopy_args% %_sources% /to="%dest%\.bin\"
|
||||
|
||||
:CopyCBin
|
||||
echo Copying .cbin...
|
||||
mkdir "%dest%\.cbin" >nul 2>&1
|
||||
attrib +h "%dest%\.cbin"
|
||||
start "" /wait "%fastcopy%" %fastcopy_args% %cbin%\* /to="%dest%\.cbin\"
|
||||
|
||||
:CopyMainData
|
||||
echo Copying Main Kit...
|
||||
set _sources="%source%\Data Transfers"
|
||||
set _sources=%_sources% "%source%\Diagnostics"
|
||||
set _sources=%_sources% "%source%\Drivers"
|
||||
set _sources=%_sources% "%source%\Installers"
|
||||
set _sources=%_sources% "%source%\Misc"
|
||||
set _sources=%_sources% "%source%\Repairs"
|
||||
set _sources=%_sources% "%source%\Uninstallers"
|
||||
set _sources=%_sources% "%source%\Activate Windows.cmd"
|
||||
set _sources=%_sources% "%source%\Enter SafeMode.cmd"
|
||||
set _sources=%_sources% "%source%\Exit SafeMode.cmd"
|
||||
set _sources=%_sources% "%source%\LICENSE.txt"
|
||||
set _sources=%_sources% "%source%\README.md"
|
||||
set _sources=%_sources% "%source%\System Checklist.cmd"
|
||||
set _sources=%_sources% "%source%\System Diagnostics.cmd"
|
||||
set _sources=%_sources% "%source%\User Checklist.cmd"
|
||||
start "" /wait "%fastcopy%" %fastcopy_args% /exclude="Snappy Driver Installer*;Update Kit*;*.exe" %_sources% /to="%dest%\"
|
||||
start "" /wait "%fastcopy%" %fastcopy_args% "%source%\Installers\Extras\Office\Adobe Reader DC.exe" /to="%dest%\Installers\Extras\Office\"
|
||||
|
||||
:Ninite
|
||||
echo Extracting Ninite installers...
|
||||
"%SEVEN_ZIP%" x "%cbin%\_Ninite.7z" -aos -bso0 -bse0 -bsp0 -p%ARCHIVE_PASSWORD% -o"%dest%\Installers\Extras" || goto Abort
|
||||
|
||||
:OpenFolder
|
||||
start "" explorer "%dest%"
|
||||
goto Exit
|
||||
|
||||
:: Functions ::
|
||||
:CheckFlags
|
||||
rem Loops through all arguments to check for accepted flags
|
||||
set DEBUG=
|
||||
for %%f in (%*) do (
|
||||
if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG")
|
||||
)
|
||||
@exit /b 0
|
||||
|
||||
:FindBin
|
||||
rem Checks the current directory and all parents for the ".bin" folder
|
||||
rem NOTE: Has not been tested for UNC paths
|
||||
set bin=
|
||||
pushd "%~dp0"
|
||||
:FindBinInner
|
||||
if exist ".bin" (goto FindBinDone)
|
||||
if "%~d0\" == "%cd%" (popd & @exit /b 1)
|
||||
cd ..
|
||||
goto FindBinInner
|
||||
:FindBinDone
|
||||
set "bin=%cd%\.bin"
|
||||
set "cbin=%cd%\.cbin"
|
||||
popd
|
||||
@exit /b 0
|
||||
|
||||
:SetTitle
|
||||
rem Sets title using KIT_NAME_FULL from settings\main.py
|
||||
set "window_title=%*"
|
||||
if not defined window_title set "window_title=Launcher"
|
||||
set "window_title=%KIT_NAME_FULL%: %window_title%"
|
||||
title %window_title%
|
||||
@exit /b 0
|
||||
|
||||
:: Errors ::
|
||||
:ErrorNoBin
|
||||
echo.
|
||||
echo ERROR: ".bin" folder not found.
|
||||
goto Abort
|
||||
|
||||
:Abort
|
||||
color 4e
|
||||
echo Aborted.
|
||||
echo Press any key to exit...
|
||||
pause>nul
|
||||
color
|
||||
rem Set errorlevel to 1 by calling color incorrectly
|
||||
color 00
|
||||
goto Exit
|
||||
|
||||
:: Cleanup and exit ::
|
||||
:Exit
|
||||
endlocal
|
||||
exit /b %errorlevel%
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
# Wizard Kit: Activate Windows using various methods
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.activation import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Windows Activation Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: Windows Activation Tool\n'.format(KIT_NAME_FULL))
|
||||
# Bail early if already activated
|
||||
if windows_is_activated():
|
||||
print_info('This system is already activated')
|
||||
sleep(5)
|
||||
exit_script()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'BIOSKeyNotFoundError': 'BIOS key not found.',
|
||||
}}
|
||||
|
||||
# Determine activation method
|
||||
activation_methods = [
|
||||
{'Name': 'Activate with BIOS key', 'Function': activate_with_bios},
|
||||
]
|
||||
if global_vars['OS']['Version'] not in ['8', '10']:
|
||||
activation_methods[0]['Disabled'] = True
|
||||
actions = [
|
||||
{'Name': 'Quit', 'Letter': 'Q'},
|
||||
]
|
||||
|
||||
while True:
|
||||
selection = menu_select(
|
||||
'{}: Windows Activation Menu'.format(KIT_NAME_FULL),
|
||||
main_entries=activation_methods, action_entries=actions)
|
||||
|
||||
if (selection.isnumeric()):
|
||||
result = try_and_print(
|
||||
message = activation_methods[int(selection)-1]['Name'],
|
||||
function = activation_methods[int(selection)-1]['Function'],
|
||||
other_results=other_results)
|
||||
if result['CS']:
|
||||
break
|
||||
else:
|
||||
sleep(2)
|
||||
elif selection == 'Q':
|
||||
exit_script()
|
||||
|
||||
# Done
|
||||
print_success('\nDone.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Michael Kropat
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
|
@ -1,164 +0,0 @@
|
|||
import ctypes, sys
|
||||
from ctypes import windll, wintypes
|
||||
from uuid import UUID
|
||||
|
||||
class GUID(ctypes.Structure): # [1]
|
||||
_fields_ = [
|
||||
("Data1", wintypes.DWORD),
|
||||
("Data2", wintypes.WORD),
|
||||
("Data3", wintypes.WORD),
|
||||
("Data4", wintypes.BYTE * 8)
|
||||
]
|
||||
|
||||
def __init__(self, uuid_):
|
||||
ctypes.Structure.__init__(self)
|
||||
self.Data1, self.Data2, self.Data3, self.Data4[0], self.Data4[1], rest = uuid_.fields
|
||||
for i in range(2, 8):
|
||||
self.Data4[i] = rest>>(8 - i - 1)*8 & 0xff
|
||||
|
||||
class FOLDERID: # [2]
|
||||
AccountPictures = UUID('{008ca0b1-55b4-4c56-b8a8-4de4b299d3be}')
|
||||
AdminTools = UUID('{724EF170-A42D-4FEF-9F26-B60E846FBA4F}')
|
||||
ApplicationShortcuts = UUID('{A3918781-E5F2-4890-B3D9-A7E54332328C}')
|
||||
CameraRoll = UUID('{AB5FB87B-7CE2-4F83-915D-550846C9537B}')
|
||||
CDBurning = UUID('{9E52AB10-F80D-49DF-ACB8-4330F5687855}')
|
||||
CommonAdminTools = UUID('{D0384E7D-BAC3-4797-8F14-CBA229B392B5}')
|
||||
CommonOEMLinks = UUID('{C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D}')
|
||||
CommonPrograms = UUID('{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}')
|
||||
CommonStartMenu = UUID('{A4115719-D62E-491D-AA7C-E74B8BE3B067}')
|
||||
CommonStartup = UUID('{82A5EA35-D9CD-47C5-9629-E15D2F714E6E}')
|
||||
CommonTemplates = UUID('{B94237E7-57AC-4347-9151-B08C6C32D1F7}')
|
||||
Contacts = UUID('{56784854-C6CB-462b-8169-88E350ACB882}')
|
||||
Cookies = UUID('{2B0F765D-C0E9-4171-908E-08A611B84FF6}')
|
||||
Desktop = UUID('{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}')
|
||||
DeviceMetadataStore = UUID('{5CE4A5E9-E4EB-479D-B89F-130C02886155}')
|
||||
Documents = UUID('{FDD39AD0-238F-46AF-ADB4-6C85480369C7}')
|
||||
DocumentsLibrary = UUID('{7B0DB17D-9CD2-4A93-9733-46CC89022E7C}')
|
||||
Downloads = UUID('{374DE290-123F-4565-9164-39C4925E467B}')
|
||||
Favorites = UUID('{1777F761-68AD-4D8A-87BD-30B759FA33DD}')
|
||||
Fonts = UUID('{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}')
|
||||
GameTasks = UUID('{054FAE61-4DD8-4787-80B6-090220C4B700}')
|
||||
History = UUID('{D9DC8A3B-B784-432E-A781-5A1130A75963}')
|
||||
ImplicitAppShortcuts = UUID('{BCB5256F-79F6-4CEE-B725-DC34E402FD46}')
|
||||
InternetCache = UUID('{352481E8-33BE-4251-BA85-6007CAEDCF9D}')
|
||||
Libraries = UUID('{1B3EA5DC-B587-4786-B4EF-BD1DC332AEAE}')
|
||||
Links = UUID('{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}')
|
||||
LocalAppData = UUID('{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}')
|
||||
LocalAppDataLow = UUID('{A520A1A4-1780-4FF6-BD18-167343C5AF16}')
|
||||
LocalizedResourcesDir = UUID('{2A00375E-224C-49DE-B8D1-440DF7EF3DDC}')
|
||||
Music = UUID('{4BD8D571-6D19-48D3-BE97-422220080E43}')
|
||||
MusicLibrary = UUID('{2112AB0A-C86A-4FFE-A368-0DE96E47012E}')
|
||||
NetHood = UUID('{C5ABBF53-E17F-4121-8900-86626FC2C973}')
|
||||
OriginalImages = UUID('{2C36C0AA-5812-4b87-BFD0-4CD0DFB19B39}')
|
||||
PhotoAlbums = UUID('{69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C}')
|
||||
PicturesLibrary = UUID('{A990AE9F-A03B-4E80-94BC-9912D7504104}')
|
||||
Pictures = UUID('{33E28130-4E1E-4676-835A-98395C3BC3BB}')
|
||||
Playlists = UUID('{DE92C1C7-837F-4F69-A3BB-86E631204A23}')
|
||||
PrintHood = UUID('{9274BD8D-CFD1-41C3-B35E-B13F55A758F4}')
|
||||
Profile = UUID('{5E6C858F-0E22-4760-9AFE-EA3317B67173}')
|
||||
ProgramData = UUID('{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}')
|
||||
ProgramFiles = UUID('{905e63b6-c1bf-494e-b29c-65b732d3d21a}')
|
||||
ProgramFilesX64 = UUID('{6D809377-6AF0-444b-8957-A3773F02200E}')
|
||||
ProgramFilesX86 = UUID('{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}')
|
||||
ProgramFilesCommon = UUID('{F7F1ED05-9F6D-47A2-AAAE-29D317C6F066}')
|
||||
ProgramFilesCommonX64 = UUID('{6365D5A7-0F0D-45E5-87F6-0DA56B6A4F7D}')
|
||||
ProgramFilesCommonX86 = UUID('{DE974D24-D9C6-4D3E-BF91-F4455120B917}')
|
||||
Programs = UUID('{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}')
|
||||
Public = UUID('{DFDF76A2-C82A-4D63-906A-5644AC457385}')
|
||||
PublicDesktop = UUID('{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}')
|
||||
PublicDocuments = UUID('{ED4824AF-DCE4-45A8-81E2-FC7965083634}')
|
||||
PublicDownloads = UUID('{3D644C9B-1FB8-4f30-9B45-F670235F79C0}')
|
||||
PublicGameTasks = UUID('{DEBF2536-E1A8-4c59-B6A2-414586476AEA}')
|
||||
PublicLibraries = UUID('{48DAF80B-E6CF-4F4E-B800-0E69D84EE384}')
|
||||
PublicMusic = UUID('{3214FAB5-9757-4298-BB61-92A9DEAA44FF}')
|
||||
PublicPictures = UUID('{B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5}')
|
||||
PublicRingtones = UUID('{E555AB60-153B-4D17-9F04-A5FE99FC15EC}')
|
||||
PublicUserTiles = UUID('{0482af6c-08f1-4c34-8c90-e17ec98b1e17}')
|
||||
PublicVideos = UUID('{2400183A-6185-49FB-A2D8-4A392A602BA3}')
|
||||
QuickLaunch = UUID('{52a4f021-7b75-48a9-9f6b-4b87a210bc8f}')
|
||||
Recent = UUID('{AE50C081-EBD2-438A-8655-8A092E34987A}')
|
||||
RecordedTVLibrary = UUID('{1A6FDBA2-F42D-4358-A798-B74D745926C5}')
|
||||
ResourceDir = UUID('{8AD10C31-2ADB-4296-A8F7-E4701232C972}')
|
||||
Ringtones = UUID('{C870044B-F49E-4126-A9C3-B52A1FF411E8}')
|
||||
RoamingAppData = UUID('{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}')
|
||||
RoamedTileImages = UUID('{AAA8D5A5-F1D6-4259-BAA8-78E7EF60835E}')
|
||||
RoamingTiles = UUID('{00BCFC5A-ED94-4e48-96A1-3F6217F21990}')
|
||||
SampleMusic = UUID('{B250C668-F57D-4EE1-A63C-290EE7D1AA1F}')
|
||||
SamplePictures = UUID('{C4900540-2379-4C75-844B-64E6FAF8716B}')
|
||||
SamplePlaylists = UUID('{15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5}')
|
||||
SampleVideos = UUID('{859EAD94-2E85-48AD-A71A-0969CB56A6CD}')
|
||||
SavedGames = UUID('{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}')
|
||||
SavedSearches = UUID('{7d1d3a04-debb-4115-95cf-2f29da2920da}')
|
||||
Screenshots = UUID('{b7bede81-df94-4682-a7d8-57a52620b86f}')
|
||||
SearchHistory = UUID('{0D4C3DB6-03A3-462F-A0E6-08924C41B5D4}')
|
||||
SearchTemplates = UUID('{7E636BFE-DFA9-4D5E-B456-D7B39851D8A9}')
|
||||
SendTo = UUID('{8983036C-27C0-404B-8F08-102D10DCFD74}')
|
||||
SidebarDefaultParts = UUID('{7B396E54-9EC5-4300-BE0A-2482EBAE1A26}')
|
||||
SidebarParts = UUID('{A75D362E-50FC-4fb7-AC2C-A8BEAA314493}')
|
||||
SkyDrive = UUID('{A52BBA46-E9E1-435f-B3D9-28DAA648C0F6}')
|
||||
SkyDriveCameraRoll = UUID('{767E6811-49CB-4273-87C2-20F355E1085B}')
|
||||
SkyDriveDocuments = UUID('{24D89E24-2F19-4534-9DDE-6A6671FBB8FE}')
|
||||
SkyDrivePictures = UUID('{339719B5-8C47-4894-94C2-D8F77ADD44A6}')
|
||||
StartMenu = UUID('{625B53C3-AB48-4EC1-BA1F-A1EF4146FC19}')
|
||||
Startup = UUID('{B97D20BB-F46A-4C97-BA10-5E3608430854}')
|
||||
System = UUID('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}')
|
||||
SystemX86 = UUID('{D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27}')
|
||||
Templates = UUID('{A63293E8-664E-48DB-A079-DF759E0509F7}')
|
||||
UserPinned = UUID('{9E3995AB-1F9C-4F13-B827-48B24B6C7174}')
|
||||
UserProfiles = UUID('{0762D272-C50A-4BB0-A382-697DCD729B80}')
|
||||
UserProgramFiles = UUID('{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}')
|
||||
UserProgramFilesCommon = UUID('{BCBD3057-CA5C-4622-B42D-BC56DB0AE516}')
|
||||
Videos = UUID('{18989B1D-99B5-455B-841C-AB7C74E4DDFC}')
|
||||
VideosLibrary = UUID('{491E922F-5643-4AF4-A7EB-4E7A138D8174}')
|
||||
Windows = UUID('{F38BF404-1D43-42F2-9305-67DE0B28FC23}')
|
||||
|
||||
class UserHandle: # [3]
|
||||
current = wintypes.HANDLE(0)
|
||||
common = wintypes.HANDLE(-1)
|
||||
|
||||
_CoTaskMemFree = windll.ole32.CoTaskMemFree # [4]
|
||||
_CoTaskMemFree.restype= None
|
||||
_CoTaskMemFree.argtypes = [ctypes.c_void_p]
|
||||
|
||||
_SHGetKnownFolderPath = windll.shell32.SHGetKnownFolderPath # [5] [3]
|
||||
_SHGetKnownFolderPath.argtypes = [
|
||||
ctypes.POINTER(GUID), wintypes.DWORD, wintypes.HANDLE, ctypes.POINTER(ctypes.c_wchar_p)
|
||||
]
|
||||
|
||||
class PathNotFoundException(Exception): pass
|
||||
|
||||
def get_path(folderid, user_handle=UserHandle.common):
|
||||
fid = GUID(folderid)
|
||||
pPath = ctypes.c_wchar_p()
|
||||
S_OK = 0
|
||||
if _SHGetKnownFolderPath(ctypes.byref(fid), 0, user_handle, ctypes.byref(pPath)) != S_OK:
|
||||
raise PathNotFoundException()
|
||||
path = pPath.value
|
||||
_CoTaskMemFree(pPath)
|
||||
return path
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 2 or sys.argv[1] in ['-?', '/?']:
|
||||
print('python knownpaths.py FOLDERID {current|common}')
|
||||
sys.exit(0)
|
||||
|
||||
try:
|
||||
folderid = getattr(FOLDERID, sys.argv[1])
|
||||
except AttributeError:
|
||||
print('Unknown folder id "%s"' % sys.argv[1], file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
if len(sys.argv) == 2:
|
||||
print(get_path(folderid))
|
||||
else:
|
||||
print(get_path(folderid, getattr(UserHandle, sys.argv[2])))
|
||||
except PathNotFoundException:
|
||||
print('Folder not found "%s"' % ' '.join(sys.argv[1:]), file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# [1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
|
||||
# [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx
|
||||
# [3] http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188.aspx
|
||||
# [4] http://msdn.microsoft.com/en-us/library/windows/desktop/ms680722.aspx
|
||||
# [5] http://www.themacaque.com/?p=954
|
||||
|
|
@ -1,207 +0,0 @@
|
|||
# Wizard Kit: Download kit components
|
||||
|
||||
## Init ##
|
||||
#Requires -Version 3.0
|
||||
if (Test-Path Env:\DEBUG) {
|
||||
Set-PSDebug -Trace 1
|
||||
}
|
||||
$Host.UI.RawUI.WindowTitle = "Wizard Kit: Build Tool"
|
||||
$WD = $(Split-Path $MyInvocation.MyCommand.Path)
|
||||
$Bin = (Get-Item $WD).Parent.FullName
|
||||
$Root = (Get-Item $Bin -Force).Parent.FullName
|
||||
$Temp = "$Bin\tmp"
|
||||
$System32 = "{0}\System32" -f $Env:SystemRoot
|
||||
Push-Location "$WD"
|
||||
$Host.UI.RawUI.BackgroundColor = "black"
|
||||
$Host.UI.RawUI.ForegroundColor = "white"
|
||||
|
||||
|
||||
## Functions ##
|
||||
function Abort {
|
||||
Write-Host -ForegroundColor "Red" "`nAborted."
|
||||
WKPause "Press Enter to exit..."
|
||||
exit
|
||||
}
|
||||
function DownloadFile ($Path, $Name, $Url) {
|
||||
$OutFile = "{0}\{1}" -f $Path, $Name
|
||||
|
||||
Write-Host ("Downloading: $Name")
|
||||
New-Item -Type Directory $Path 2>&1 | Out-Null
|
||||
try {
|
||||
Invoke-WebRequest -Uri $Url -OutFile $OutFile
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to download file." ) -ForegroundColor "Red"
|
||||
$DownloadErrors += 1
|
||||
}
|
||||
}
|
||||
function FindDynamicUrl ($SourcePage, $RegEx) {
|
||||
# Get source page
|
||||
Invoke-Webrequest -Uri $SourcePage -OutFile "tmp_page"
|
||||
|
||||
# Search for real url
|
||||
$Url = Get-Content "tmp_page" | Where-Object {$_ -imatch $RegEx}
|
||||
$Url = $Url -ireplace '.*(a |)href="([^"]+)".*', '$2'
|
||||
$Url = $Url -ireplace ".*(a |)href='([^']+)'.*", '$2'
|
||||
|
||||
# Remove tmp_page
|
||||
Remove-Item "tmp_page"
|
||||
|
||||
$Url | Select-Object -First 1
|
||||
}
|
||||
function WKPause ($Message = "Press Enter to continue... ") {
|
||||
Write-Host $Message -NoNewLine
|
||||
Read-Host
|
||||
}
|
||||
|
||||
## Safety Check ##
|
||||
if ($PSVersionTable.PSVersion.Major -eq 6 -and $PSVersionTable.OS -imatch "Windows 6.1") {
|
||||
Write-Host "`nThis script doesn't support PowerShell 6.0 on Windows 7."
|
||||
Write-Host "Press Enter to exit... " -NoNewLine
|
||||
Abort
|
||||
}
|
||||
|
||||
## PowerShell equivalent of Python's "if __name__ == '__main__'"
|
||||
# Code based on StackOverflow comments
|
||||
# Question: https://stackoverflow.com/q/4693947
|
||||
# Using answer: https://stackoverflow.com/a/5582692
|
||||
# Asked by: https://stackoverflow.com/users/65164/mark-mascolino
|
||||
# Answer by: https://stackoverflow.com/users/696808/bacon-bits
|
||||
if ($MyInvocation.InvocationName -ne ".") {
|
||||
Clear-Host
|
||||
Write-Host "Wizard Kit: Build Tool`n`n`n`n`n"
|
||||
|
||||
## Download ##
|
||||
$DownloadErrors = 0
|
||||
$Path = $Temp
|
||||
|
||||
# 7-Zip
|
||||
DownloadFile -Path $Path -Name "7z-installer.msi" -Url "http://www.7-zip.org/a/7z1701.msi"
|
||||
DownloadFile -Path $Path -Name "7z-extra.7z" -Url "http://www.7-zip.org/a/7z1701-extra.7z"
|
||||
|
||||
# ConEmu
|
||||
$Url = "https://github.com/Maximus5/ConEmu/releases/download/v17.11.09/ConEmuPack.171109.7z"
|
||||
DownloadFile -Path $Path -Name "ConEmuPack.7z" -Url $Url
|
||||
|
||||
# Notepad++
|
||||
$Url = "https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.7z"
|
||||
DownloadFile -Path $Path -Name "npp.7z" -Url $Url
|
||||
|
||||
# Python
|
||||
$Url = "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-win32.zip"
|
||||
DownloadFile -Path $Path -Name "python32.zip" -Url $Url
|
||||
$Url = "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-amd64.zip"
|
||||
DownloadFile -Path $Path -Name "python64.zip" -Url $Url
|
||||
|
||||
# Python: psutil
|
||||
$DownloadPage = "https://pypi.python.org/pypi/psutil"
|
||||
$RegEx = "href=.*-cp36-cp36m-win32.whl"
|
||||
$Url = FindDynamicUrl $DownloadPage $RegEx
|
||||
DownloadFile -Path $Path -Name "psutil32.whl" -Url $Url
|
||||
$RegEx = "href=.*-cp36-cp36m-win_amd64.whl"
|
||||
$Url = FindDynamicUrl $DownloadPage $RegEx
|
||||
DownloadFile -Path $Path -Name "psutil64.whl" -Url $Url
|
||||
|
||||
# Python: requests & dependancies
|
||||
$RegEx = "href=.*.py3-none-any.whl"
|
||||
foreach ($Module in @("chardet", "certifi", "idna", "urllib3", "requests")) {
|
||||
$DownloadPage = "https://pypi.python.org/pypi/$Module"
|
||||
$Name = "$Module.whl"
|
||||
$Url = FindDynamicUrl -SourcePage $DownloadPage -RegEx $RegEx
|
||||
DownloadFile -Path $Path -Name $Name -Url $Url
|
||||
}
|
||||
|
||||
## Bail ##
|
||||
# If errors were encountered during downloads
|
||||
if ($DownloadErrors -gt 0) {
|
||||
Abort
|
||||
}
|
||||
|
||||
## Extract ##
|
||||
# 7-Zip
|
||||
Write-Host "Extracting: 7-Zip"
|
||||
try {
|
||||
$ArgumentList = @("/a", "$Temp\7z-installer.msi", "TARGETDIR=$Temp\7zi", "/qn")
|
||||
Start-Process -FilePath "$System32\msiexec.exe" -ArgumentList $ArgumentList -Wait
|
||||
$SevenZip = "$Temp\7zi\Files\7-Zip\7z.exe"
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\7z-extra.7z", "-o$Bin\7-Zip",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"-x!x64\*.dll", "-x!Far", "-x!*.dll")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Start-Sleep 1
|
||||
Move-Item "$Bin\7-Zip\x64\7za.exe" "$Bin\7-Zip\7za64.exe"
|
||||
Remove-Item "$Bin\7-Zip\x64" -Recurse
|
||||
Remove-Item "$Temp\7z*" -Recurse
|
||||
$SevenZip = "$Bin\7-Zip\7za.exe"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Notepad++
|
||||
Write-Host "Extracting: Notepad++"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\npp.7z", "-o$Bin\NotepadPlusPlus",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\npp.7z"
|
||||
Move-Item "$Bin\NotepadPlusPlus\notepad++.exe" "$Bin\NotepadPlusPlus\notepadplusplus.exe"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# ConEmu
|
||||
Write-Host "Extracting: ConEmu"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\ConEmuPack.7z", "-o$Bin\ConEmu",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\ConEmuPack.7z"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Python
|
||||
foreach ($Arch in @("32", "64")) {
|
||||
Write-Host "Extracting: Python (x$Arch)"
|
||||
$Files = @(
|
||||
"python$Arch.zip",
|
||||
"certifi.whl",
|
||||
"chardet.whl",
|
||||
"idna.whl",
|
||||
"psutil$Arch.whl",
|
||||
"requests.whl",
|
||||
"urllib3.whl"
|
||||
)
|
||||
try {
|
||||
foreach ($File in $Files) {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\$File", "-o$Bin\Python\x$Arch",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
}
|
||||
Remove-Item "$Temp\python*.zip"
|
||||
Remove-Item "$Temp\*.whl"
|
||||
|
||||
## Configure ##
|
||||
Write-Host "Configuring kit"
|
||||
WKPause "Press Enter to open settings..."
|
||||
$Cmd = "$Bin\NotepadPlusPlus\notepadplusplus.exe"
|
||||
Start-Process -FilePath $Cmd -ArgumentList @("$Bin\Scripts\settings\main.py") -Wait
|
||||
Start-Sleep 1
|
||||
|
||||
## Done ##
|
||||
Pop-Location
|
||||
$ArgumentList = @("-run", "$Bin\Python\x32\python.exe", "$Bin\Scripts\update_kit.py", "-new_console:n")
|
||||
Start-Process -FilePath "$Bin\ConEmu\ConEmu.exe" -ArgumentList $ArgumentList -verb RunAs
|
||||
}
|
||||
|
|
@ -1,614 +0,0 @@
|
|||
# Wizard Kit: Windows PE Build Tool
|
||||
|
||||
## Init ##
|
||||
#Requires -Version 3.0
|
||||
#Requires -RunAsAdministrator
|
||||
if (Test-Path Env:\DEBUG) {
|
||||
Set-PSDebug -Trace 1
|
||||
}
|
||||
$Host.UI.RawUI.WindowTitle = "Wizard Kit: Windows PE Build Tool"
|
||||
$WD = $(Split-Path $MyInvocation.MyCommand.Path)
|
||||
$Bin = (Get-Item $WD -Force).Parent.FullName
|
||||
$Root = (Get-Item $Bin -Force).Parent.FullName
|
||||
$Build = "$Root\BUILD"
|
||||
$LogDir = "$Build\Logs"
|
||||
$Temp = "$Build\Temp"
|
||||
$Date = Get-Date -UFormat "%Y-%m-%d"
|
||||
$Host.UI.RawUI.BackgroundColor = "Black"
|
||||
$Host.UI.RawUI.ForegroundColor = "White"
|
||||
$HostSystem32 = "{0}\System32" -f $Env:SystemRoot
|
||||
$DISM = "{0}\DISM.exe" -f $Env:DISMRoot
|
||||
|
||||
## Functions ##
|
||||
function Ask-User ($text = "Kotaero") {
|
||||
$text += " [Y/N]"
|
||||
while ($true) {
|
||||
$answer = read-host $text
|
||||
if ($answer -imatch "^(y|yes)$") {
|
||||
$answer = $true
|
||||
break
|
||||
} elseif ($answer -imatch "^(n|no|nope)$") {
|
||||
$answer = $false
|
||||
break
|
||||
}
|
||||
}
|
||||
$answer
|
||||
}
|
||||
function Abort {
|
||||
Write-Host -ForegroundColor "Red" "`nAborted."
|
||||
WKPause "Press Enter to exit... "
|
||||
exit
|
||||
}
|
||||
function MakeClean {
|
||||
$Folders = @(
|
||||
"$Build\Mount",
|
||||
"$Build\PEFiles")
|
||||
$Clean = $false
|
||||
foreach ($f in $Folders) {
|
||||
if (Test-Path $f) {
|
||||
Write-Host -ForegroundColor "Yellow" ("Found: {0}" -f $f)
|
||||
$Clean = $true
|
||||
}
|
||||
}
|
||||
if (($Clean) -and (Ask-User "Delete the above folder(s)?")) {
|
||||
foreach ($f in $Folders) {
|
||||
if (Test-Path $f) {
|
||||
Remove-Item -Path $f -Recurse -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function DownloadFile ($Path, $Name, $Url) {
|
||||
$OutFile = "{0}\{1}" -f $Path, $Name
|
||||
|
||||
Write-Host ("Downloading: $Name")
|
||||
New-Item -Type Directory $Path 2>&1 | Out-Null
|
||||
try {
|
||||
Invoke-WebRequest -Uri $Url -OutFile $OutFile
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to download file." ) -ForegroundColor "Red"
|
||||
$DownloadErrors += 1
|
||||
}
|
||||
}
|
||||
function FindDynamicUrl ($SourcePage, $RegEx) {
|
||||
# Get source page
|
||||
Invoke-Webrequest -Uri $SourcePage -OutFile "tmp_page"
|
||||
|
||||
# Search for real url
|
||||
$Url = Get-Content "tmp_page" | Where-Object {$_ -imatch $RegEx}
|
||||
$Url = $Url -ireplace '.*(a |)href="([^"]+)".*', '$2'
|
||||
$Url = $Url -ireplace ".*(a |)href='([^']+)'.*", '$2'
|
||||
|
||||
# Remove tmp_page
|
||||
Remove-Item "tmp_page"
|
||||
|
||||
$Url | Select-Object -First 1
|
||||
}
|
||||
function WKPause ($Message = "Press Enter to continue... ") {
|
||||
Write-Host $Message -NoNewLine
|
||||
Read-Host
|
||||
}
|
||||
|
||||
## PowerShell equivalent of Python's "if __name__ == '__main__'"
|
||||
# Code based on StackOverflow comments
|
||||
# Question: https://stackoverflow.com/q/4693947
|
||||
# Using answer: https://stackoverflow.com/a/5582692
|
||||
# Asked by: https://stackoverflow.com/users/65164/mark-mascolino
|
||||
# Answer by: https://stackoverflow.com/users/696808/bacon-bits
|
||||
if ($MyInvocation.InvocationName -ne ".") {
|
||||
Clear-Host
|
||||
Write-Host "Wizard Kit: Windows PE Build Tool`n`n`n`n`n"
|
||||
|
||||
## Prep ##
|
||||
try {
|
||||
Import-Module -Name $Env:DISMRoot -ErrorAction "stop"
|
||||
}
|
||||
catch {
|
||||
Write-Host -ForegroundColor "Red" "ERROR: Failed to load DISM CmdLet"
|
||||
Abort
|
||||
}
|
||||
Push-Location "$WD"
|
||||
MakeClean
|
||||
New-Item -Type Directory $Build 2>&1 | Out-Null
|
||||
New-Item -Type Directory $LogDir 2>&1 | Out-Null
|
||||
|
||||
## main.py ##
|
||||
if (!(Test-Path "$Build\main.py") -or (Ask-User "Replace existing main.py?")) {
|
||||
Copy-Item -Path "$Bin\Scripts\settings\main.py" -Destination "$Build\main.py" -Force
|
||||
}
|
||||
WKPause "Press Enter to open settings..."
|
||||
Start-Process "$HostSystem32\notepad.exe" -ArgumentList @("$Build\main.py") -Wait
|
||||
$KitNameFull = (Get-Content "$Build\main.py" | Where-Object {$_ -match 'FULL'}) -replace ".*'(.*)'$", '$1'
|
||||
$KitNameShort = (Get-Content "$Build\main.py" | Where-Object {$_ -match 'SHORT'}) -replace ".*'(.*)'$", '$1'
|
||||
|
||||
if (Ask-User "Update Tools?") {
|
||||
$DownloadErrors = 0
|
||||
|
||||
## Download Tools ##
|
||||
$ToolSources = @(
|
||||
# 7-Zip
|
||||
@("7z-installer.msi", "http://www.7-zip.org/a/7z1701.msi"),
|
||||
@("7z-extra.7z", "http://www.7-zip.org/a/7z1701-extra.7z"),
|
||||
# Blue Screen View
|
||||
@("bluescreenview64.zip", "http://www.nirsoft.net/utils/bluescreenview-x64.zip"),
|
||||
@("bluescreenview32.zip", "http://www.nirsoft.net/utils/bluescreenview.zip"),
|
||||
# ConEmu
|
||||
@("ConEmuPack.7z", "https://github.com/Maximus5/ConEmu/releases/download/v17.11.09/ConEmuPack.171109.7z"),
|
||||
# Fast Copy
|
||||
@("fastcopy64.zip", "http://ftp.vector.co.jp/69/28/2323/FastCopy332_x64.zip"),
|
||||
@("fastcopy32.zip", "http://ftp.vector.co.jp/69/28/2323/FastCopy332.zip"),
|
||||
# HWiNFO
|
||||
@("hwinfo64.zip", "http://app.oldfoss.com:81/download/HWiNFO/hw64_560.zip"),
|
||||
@("hwinfo32.zip", "http://app.oldfoss.com:81/download/HWiNFO/hw32_560.zip"),
|
||||
# Killer Network Drivers
|
||||
@(
|
||||
"killerinf.zip",
|
||||
("http://www.killernetworking.com"+(FindDynamicUrl "http://www.killernetworking.com/driver-downloads/item/killer-drivers-inf" "Download Killer-Ethernet").replace('&', '&'))
|
||||
),
|
||||
# Notepad++
|
||||
@("npp_amd64.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.x64.7z"),
|
||||
@("npp_x86.7z", "https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.7z"),
|
||||
# NT Password Editor
|
||||
@("ntpwed.zip", "http://cdslow.org.ru/files/ntpwedit/ntpwed07.zip"),
|
||||
# Prime95
|
||||
@("prime95_64.zip", "http://www.mersenne.org/ftp_root/gimps/p95v294b5.win64.zip"),
|
||||
@("prime95_32.zip", "http://www.mersenne.org/ftp_root/gimps/p95v294b5.win32.zip"),
|
||||
# ProduKey
|
||||
@("produkey64.zip", "http://www.nirsoft.net/utils/produkey-x64.zip"),
|
||||
@("produkey32.zip", "http://www.nirsoft.net/utils/produkey.zip"),
|
||||
# Python
|
||||
@("python64.zip", "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-amd64.zip"),
|
||||
@("python32.zip", "https://www.python.org/ftp/python/3.6.3/python-3.6.3-embed-win32.zip"),
|
||||
# Python: psutil
|
||||
@(
|
||||
"psutil64.whl",
|
||||
(FindDynamicUrl "https://pypi.python.org/pypi/psutil" "href=.*-cp36-cp36m-win_amd64.whl")
|
||||
),
|
||||
@(
|
||||
"psutil32.whl",
|
||||
(FindDynamicUrl "https://pypi.python.org/pypi/psutil" "href=.*-cp36-cp36m-win32.whl")
|
||||
),
|
||||
# Q-Dir
|
||||
@("qdir64.zip", "https://www.softwareok.com/Download/Q-Dir_Portable_x64.zip"),
|
||||
@("qdir32.zip", "https://www.softwareok.com/Download/Q-Dir_Portable.zip"),
|
||||
# TestDisk / PhotoRec
|
||||
@("testdisk64.zip", "https://www.cgsecurity.org/testdisk-7.1-WIP.win64.zip"),
|
||||
@("testdisk32.zip", "https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip"),
|
||||
# wimlib-imagex
|
||||
@("wimlib64.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip"),
|
||||
@("wimlib32.zip", "https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip")
|
||||
)
|
||||
foreach ($Tool in $ToolSources) {
|
||||
DownloadFile -Path $Temp -Name $Tool[0] -Url $Tool[1]
|
||||
}
|
||||
|
||||
## Bail ##
|
||||
# If errors were encountered during downloads
|
||||
if ($DownloadErrors -gt 0) {
|
||||
Abort
|
||||
}
|
||||
|
||||
## Extract ##
|
||||
# 7-Zip
|
||||
Write-Host "Extracting: 7-Zip"
|
||||
try {
|
||||
$ArgumentList = @("/a", "$Temp\7z-installer.msi", "TARGETDIR=$Temp\7zi", "/qn")
|
||||
Start-Process -FilePath "$HostSystem32\msiexec.exe" -ArgumentList $ArgumentList -Wait
|
||||
$SevenZip = "$Temp\7zi\Files\7-Zip\7z.exe"
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\7z-extra.7z", "-o$Build\bin\amd64\7-Zip",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"x64\7za.exe", "*.txt")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\7z-extra.7z", "-o$Build\bin\x86\7-Zip",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"7za.exe", "*.txt")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\7z*" -Recurse
|
||||
$SevenZip = "$Build\bin\x86\7-Zip\7za.exe"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Blue Screen View
|
||||
Write-Host "Extracting: BlueScreenView"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\bluescreenview64.zip", "-o$Build\bin\amd64\BlueScreenView",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\bluescreenview32.zip", "-o$Build\bin\x86\BlueScreenView",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\bluescreenview*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# ConEmu
|
||||
Write-Host "Extracting: ConEmu"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\ConEmuPack.7z", "-o$Build\bin\amd64\ConEmu",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Build\bin\amd64\ConEmu\ConEmu.exe"
|
||||
Remove-Item "$Build\bin\amd64\ConEmu\ConEmu.map"
|
||||
Move-Item "$Build\bin\amd64\ConEmu\ConEmu64.exe" "$Build\bin\amd64\ConEmu\ConEmu.exe" -Force
|
||||
Move-Item "$Build\bin\amd64\ConEmu\ConEmu64.map" "$Build\bin\amd64\ConEmu\ConEmu.map" -Force
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\ConEmuPack.7z", "-o$Build\bin\x86\ConEmu",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Build\bin\x86\ConEmu\ConEmu64.exe"
|
||||
Remove-Item "$Build\bin\x86\ConEmu\ConEmu64.map"
|
||||
Remove-Item "$Temp\ConEmuPack*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Fast Copy
|
||||
Write-Host "Extracting: FastCopy"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\fastcopy64.zip", "-o$Build\bin\amd64\FastCopy",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"-x!setup.exe", "-x!*.dll")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\fastcopy32.zip", "-o$Build\bin\x86\FastCopy",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"-x!setup.exe", "-x!*.dll")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\fastcopy*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Killer Network Driver
|
||||
Write-Host "Extracting: Killer Network Driver"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\killerinf.zip", "-o$Build\Drivers\amd64\Killer",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"Production\Windows10-x64\Eth\*")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\killerinf.zip", "-o$Build\Drivers\x86\Killer",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"Production\Windows10-x86\Eth\*")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\killerinf*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# HWiNFO
|
||||
Write-Host "Extracting: HWiNFO"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\hwinfo64.zip", "-o$Build\bin\amd64\HWiNFO",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0", "HWiNFO64.exe")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\hwinfo32.zip", "-o$Build\bin\x86\HWiNFO",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0", "HWiNFO32.exe")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\hwinfo*"
|
||||
Move-Item "$Build\bin\amd64\HWiNFO\HWiNFO64.exe" "$Build\bin\amd64\HWiNFO\HWiNFO.exe" -Force
|
||||
Move-Item "$Build\bin\x86\HWiNFO\HWiNFO32.exe" "$Build\bin\x86\HWiNFO\HWiNFO.exe" -Force
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Notepad++
|
||||
Write-Host "Extracting: Notepad++"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\npp_amd64.7z", "-o$Build\bin\amd64\NotepadPlusPlus",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\npp_x86.7z", "-o$Build\bin\x86\NotepadPlusPlus",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\npp*"
|
||||
Move-Item "$Build\bin\amd64\NotepadPlusPlus\notepad++.exe" "$Build\bin\amd64\NotepadPlusPlus\notepadplusplus.exe" -Force
|
||||
Move-Item "$Build\bin\x86\NotepadPlusPlus\notepad++.exe" "$Build\bin\x86\NotepadPlusPlus\notepadplusplus.exe" -Force
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# NT Password Editor
|
||||
Write-Host "Extracting: NT Password Editor"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\ntpwed.zip", ('-o"{0}\bin\amd64\NT Password Editor"' -f $Build),
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"ntpwedit64.exe", "*.txt")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Move-Item "$Build\bin\amd64\NT Password Editor\ntpwedit64.exe" "$Build\bin\amd64\NT Password Editor\ntpwedit.exe" -Force
|
||||
$ArgumentList = @(
|
||||
"e", "$Temp\ntpwed.zip", ('-o"{0}\bin\x86\NT Password Editor"' -f $Build),
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0",
|
||||
"ntpwedit.exe", "*.txt")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\ntpwed*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# PhotoRec / TestDisk
|
||||
Write-Host "Extracting: PhotoRec / TestDisk"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\testdisk64.zip", "-o$Build\bin\amd64\TestDisk",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
# Remove destination since Move-Item -Force can't handle this recursive merge
|
||||
Remove-Item "$Build\bin\amd64\TestDisk" -Recurse -Force 2>&1 | Out-Null
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Move-Item "$Build\bin\amd64\TestDisk\testdisk-7.1-WIP\*" "$Build\bin\amd64\TestDisk" -Force
|
||||
Remove-Item "$Build\bin\amd64\TestDisk\testdisk-7.1-WIP" -Recurse -Force
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\testdisk32.zip", "-o$Build\bin\x86\TestDisk",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
# Remove destination since Move-Item -Force can't handle this recursive merge
|
||||
Remove-Item "$Build\bin\x86\TestDisk" -Recurse -Force 2>&1 | Out-Null
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Move-Item "$Build\bin\x86\TestDisk\testdisk-7.1-WIP\*" "$Build\bin\x86\TestDisk" -Force
|
||||
Remove-Item "$Build\bin\x86\TestDisk\testdisk-7.1-WIP" -Recurse -Force
|
||||
Remove-Item "$Temp\testdisk*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Prime95
|
||||
Write-Host "Extracting: Prime95"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\prime95_64.zip", "-o$Build\bin\amd64\Prime95",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\prime95_32.zip", "-o$Build\bin\x86\Prime95",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\prime95*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# ProduKey
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\produkey64.zip", "-o$Build\bin\amd64\ProduKey",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\produkey32.zip", "-o$Build\bin\x86\ProduKey",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\produkey*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Python (x64)
|
||||
Write-Host "Extracting: Python (x64)"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\python64.zip", "-o$Build\bin\amd64\python",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\psutil64.whl", "-o$Build\bin\amd64\python",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# Python (x32)
|
||||
Write-Host "Extracting: Python (x32)"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\python32.zip", "-o$Build\bin\x86\python",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\psutil32.whl", "-o$Build\bin\x86\python",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
Remove-Item "$Temp\python*"
|
||||
Remove-Item "$Temp\*.whl"
|
||||
|
||||
# Q-Dir
|
||||
Write-Host "Extracting: Q-Dir"
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\qdir64.zip", "-o$Build\bin\amd64",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\qdir32.zip", "-o$Build\bin\x86",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\qdir*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
|
||||
# wimlib-imagex
|
||||
try {
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\wimlib64.zip", "-o$Build\bin\amd64\wimlib",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @(
|
||||
"x", "$Temp\wimlib32.zip", "-o$Build\bin\x86\wimlib",
|
||||
"-aoa", "-bso0", "-bse0", "-bsp0")
|
||||
Start-Process -FilePath $SevenZip -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Remove-Item "$Temp\wimlib*"
|
||||
}
|
||||
catch {
|
||||
Write-Host (" ERROR: Failed to extract files." ) -ForegroundColor "Red"
|
||||
}
|
||||
}
|
||||
|
||||
## Build ##
|
||||
foreach ($Arch in @("amd64", "x86")) {
|
||||
$Drivers = "$Build\Drivers\$Arch"
|
||||
$Mount = "$Build\Mount"
|
||||
$PEFiles = "$Build\PEFiles\$Arch"
|
||||
|
||||
# Copy WinPE files
|
||||
Write-Host "Copying files..."
|
||||
$Cmd = ("{0}\copype.cmd" -f $Env:WinPERoot)
|
||||
Start-Process -FilePath $Cmd -ArgumentList @($Arch, $PEFiles) -NoNewWindow -Wait
|
||||
|
||||
# Remove unwanted items
|
||||
foreach ($SubDir in @("media", "media\Boot", "media\EFI\Microsoft\Boot")) {
|
||||
foreach ($Item in Get-ChildItem "$PEFiles\$SubDir") {
|
||||
if ($Item.Name -inotmatch "^(boot|efi|en-us|sources|fonts|resources|bcd|memtest)") {
|
||||
Remove-Item -Path $Item.FullName -Recurse -Force
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Mount image
|
||||
Write-Host "Mounting image..."
|
||||
New-Item -Path $Mount -ItemType "directory" -Force | Out-Null
|
||||
Mount-WindowsImage -Path $Mount -ImagePath "$PEFiles\media\sources\boot.wim" -Index 1 -LogPath "$LogDir\DISM.log"
|
||||
|
||||
# Add drivers
|
||||
Add-WindowsDriver -Path $Mount -Driver $Drivers -Recurse -LogPath "$LogDir\DISM.log"
|
||||
|
||||
# Add packages
|
||||
Write-Host "Adding packages:"
|
||||
$WinPEPackages = @(
|
||||
"WinPE-EnhancedStorage",
|
||||
"WinPE-FMAPI",
|
||||
"WinPE-WMI",
|
||||
"WinPE-SecureStartup"
|
||||
)
|
||||
foreach ($Package in $WinPEPackages) {
|
||||
$PackagePath = ("{0}\{1}\WinPE_OCs\{2}.cab" -f $Env:WinPERoot, $Arch, $Package)
|
||||
Write-Host " $Package..."
|
||||
Add-WindowsPackage –PackagePath $PackagePath –Path $Mount -LogPath "$LogDir\DISM.log"
|
||||
$LangPackagePath = ("{0}\{1}\WinPE_OCs\en-us\{2}_en-us.cab" -f $Env:WinPERoot, $Arch, $Package)
|
||||
if (Test-Path $LangPackagePath) {
|
||||
Add-WindowsPackage –PackagePath $LangPackagePath –Path $Mount -LogPath "$LogDir\DISM.log"
|
||||
}
|
||||
}
|
||||
|
||||
# Set RamDisk size
|
||||
$ArgumentList = @(
|
||||
('/Image:"{0}"' -f $Mount),
|
||||
"/Set-ScratchSpace:512",
|
||||
('/LogPath:"{0}\DISM.log"' -f $LogDir)
|
||||
)
|
||||
Start-Process -FilePath $DISM -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
|
||||
# Add tools
|
||||
Write-Host "Copying tools..."
|
||||
Copy-Item -Path "$Build\bin\$Arch" -Destination "$Mount\.bin" -Recurse -Force
|
||||
Copy-Item -Path "$Root\.pe_items\_include\*" -Destination "$Mount\.bin" -Recurse -Force
|
||||
if ($Arch -eq "amd64") {
|
||||
$DestIni = "$Mount\.bin\HWiNFO\HWiNFO64.INI"
|
||||
} else {
|
||||
$DestIni = "$Mount\.bin\HWiNFO\HWiNFO32.INI"
|
||||
}
|
||||
Move-Item -Path "$Mount\.bin\HWiNFO\HWiNFO.INI" -Destination $DestIni -Force
|
||||
Copy-Item -Path "$Root\Images\WinPE.jpg" -Destination "$Mount\.bin\ConEmu\ConEmu.jpg" -Recurse -Force
|
||||
Copy-Item -Path "$Bin\Scripts" -Destination "$Mount\.bin\Scripts" -Recurse -Force
|
||||
Copy-Item -Path "$Build\main.py" -Destination "$Mount\.bin\Scripts\settings\main.py" -Force
|
||||
|
||||
# Add System32 items
|
||||
$HostSystem32 = "{0}\System32" -f $Env:SystemRoot
|
||||
Copy-Item -Path "$Root\.pe_items\System32\*" -Destination "$Mount\Windows\System32" -Recurse -Force
|
||||
$ArgumentList = @("/f", "$Mount\Windows\System32\winpe.jpg", "/a")
|
||||
Start-Process -FilePath "$HostSystem32\takeown.exe" -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @("$Mount\Windows\System32\winpe.jpg", "/grant", "Administrators:F")
|
||||
Start-Process -FilePath "$HostSystem32\icacls.exe" -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
Copy-Item -Path "$Root\Images\WinPE.jpg" -Destination "$Mount\Windows\System32\winpe.jpg" -Recurse -Force
|
||||
|
||||
# Load registry hives
|
||||
Write-Host "Updating Registry..."
|
||||
$Reg = "$HostSystem32\reg.exe"
|
||||
$ArgumentList = @("load", "HKLM\WinPE-SW", "$Mount\Windows\System32\config\SOFTWARE")
|
||||
Start-Process -FilePath $Reg -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
$ArgumentList = @("load", "HKLM\WinPE-SYS", "$Mount\Windows\System32\config\SYSTEM")
|
||||
Start-Process -FilePath $Reg -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
|
||||
# Add tools to path
|
||||
## .NET code to properly handle REG_EXPAND_SZ values
|
||||
## Credit: https://www.sepago.com/blog/2013/08/22/reading-and-writing-regexpandsz-data-with-powershell
|
||||
## By: Marius Gawenda
|
||||
$Hive = [Microsoft.Win32.Registry]::LocalMachine
|
||||
$RegPath = "WinPE-SYS\ControlSet001\Control\Session Manager\Environment"
|
||||
$RegKey = $Hive.OpenSubKey($RegPath)
|
||||
$CurValue = $RegKey.GetValue(
|
||||
"Path", $false, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
|
||||
$NewValue = "$CurValue;%SystemDrive%\.bin\7-Zip;%SystemDrive%\.bin\python;%SystemDrive%\.bin\wimlib"
|
||||
Set-ItemProperty -Path "HKLM:\$RegPath" -Name "Path" -Value $NewValue -Force | Out-Null
|
||||
$Hive.close()
|
||||
$RegKey.close()
|
||||
|
||||
# Replace Notepad
|
||||
$RegPath = "HKLM:\WinPE-SW\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe"
|
||||
$NewValue = 'cmd /c "%SystemDrive%\.bin\NotepadPlusPlus\npp.cmd"'
|
||||
New-Item -Path $RegPath -Force | Out-Null
|
||||
New-ItemProperty -Path $RegPath -Name "Debugger" -Value $NewValue -Force | Out-Null
|
||||
|
||||
# Run garbage collection to release potential stale handles
|
||||
## Credit: https://jrich523.wordpress.com/2012/03/06/powershell-loading-and-unloading-registry-hives/
|
||||
Start-Sleep -Seconds 2
|
||||
[gc]::collect()
|
||||
|
||||
# Unload registry hives
|
||||
Start-Sleep -Seconds 2
|
||||
Start-Process -FilePath $Reg -ArgumentList @("unload", "HKLM\WinPE-SW") -NoNewWindow -Wait
|
||||
Start-Process -FilePath $Reg -ArgumentList @("unload", "HKLM\WinPE-SYS") -NoNewWindow -Wait
|
||||
|
||||
# Unmount image
|
||||
Write-Host "Dismounting image..."
|
||||
Dismount-WindowsImage -Path $Mount -Save -LogPath "$LogDir\DISM.log"
|
||||
|
||||
# Create ISO
|
||||
New-Item -Type Directory "$Root\OUT_PE" 2>&1 | Out-Null
|
||||
$ArgumentList = @("/iso", $PEFiles, "$Root\OUT_PE\$KitNameShort-WinPE-$Date-$Arch.iso")
|
||||
$Cmd = "{0}\MakeWinPEMedia.cmd" -f $Env:WinPERoot
|
||||
Start-Process -FilePath $Cmd -ArgumentList $ArgumentList -NoNewWindow -Wait
|
||||
}
|
||||
|
||||
## Cleanup ##
|
||||
Remove-Item -Path "$Build\Mount" -Recurse -Force
|
||||
Remove-Item -Path "$Build\PEFiles" -Recurse -Force
|
||||
|
||||
## Done ##
|
||||
Pop-Location
|
||||
Write-Host "`nDone."
|
||||
WKPause "Press Enter to exit... "
|
||||
}
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
# Wizard Kit: Backup CBS Logs and prep CBS temp data for deletion
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.cleanup import *
|
||||
from functions.data import *
|
||||
init_global_vars()
|
||||
os.system('title {}: CBS Cleanup'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\CBS Cleanup.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
# Prep
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
folder_path = r'{}\Backups'.format(KIT_NAME_SHORT)
|
||||
dest = select_destination(folder_path=folder_path,
|
||||
prompt='Which disk are we using for temp data and backup?')
|
||||
|
||||
# Show details
|
||||
print_info('{}: CBS Cleanup Tool\n'.format(KIT_NAME_FULL))
|
||||
show_info('Backup / Temp path:', dest)
|
||||
print_standard('\n')
|
||||
if (not ask('Proceed with CBS cleanup?')):
|
||||
abort()
|
||||
|
||||
# Run Cleanup
|
||||
try_and_print(message='Running cleanup...', function=cleanup_cbs,
|
||||
cs='Done', dest_folder=dest)
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
# Wizard Kit: Check or repair the %SYSTEMDRIVE% filesystem via CHKDSK
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Check Disk Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\Check Disk.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
options = [
|
||||
{'Name': 'Run CHKDSK scan (read-only)', 'Repair': False},
|
||||
{'Name': 'Schedule CHKDSK scan (offline repair)', 'Repair': True}]
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
selection = menu_select(
|
||||
'{}: Check Disk Menu\n'.format(KIT_NAME_FULL),
|
||||
main_entries=options,
|
||||
action_entries=actions)
|
||||
print_info('{}: Check Disk Menu\n'.format(KIT_NAME_FULL))
|
||||
if selection == 'Q':
|
||||
abort()
|
||||
elif selection.isnumeric():
|
||||
repair = options[int(selection)-1]['Repair']
|
||||
if repair:
|
||||
cs = 'Scheduled'
|
||||
else:
|
||||
cs = 'CS'
|
||||
message = 'CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env'])
|
||||
try_and_print(message=message, function=run_chkdsk,
|
||||
cs=cs, other_results=other_results, repair=repair)
|
||||
else:
|
||||
abort()
|
||||
|
||||
# Done
|
||||
print_success('Done.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
@echo off
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
pushd "%~dp0"
|
||||
|
||||
rem Prep
|
||||
mkdir _out\_Drivers
|
||||
set "out=%cd%\_out"
|
||||
|
||||
rem _Drivers
|
||||
pushd _Drivers
|
||||
for %%f in (*) do (
|
||||
set "file=%%f"
|
||||
"%programfiles%\7-Zip\7z.exe" a -t7z -mx=9 -myx=9 -ms=on -mhe -pAbracadabra "%out%\_Drivers\!file:~0,-4!.7z" "%%f"
|
||||
)
|
||||
popd
|
||||
|
||||
rem Rest
|
||||
for /d %%d in (*) do (
|
||||
if not "%%d" == "_out" (
|
||||
pushd "%%d"
|
||||
"%programfiles%\7-Zip\7z.exe" a -t7z -mx=9 -myx=9 -ms=on -mhe -pAbracadabra "%out%\%%d.7z" *
|
||||
popd
|
||||
)
|
||||
)
|
||||
|
||||
popd
|
||||
endlocal
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
# Wizard Kit: Check or repair component store health via DISM
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: DISM helper Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\DISM helper tool.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
disabled = bool(global_vars['OS']['Version'] not in ['8', '10'])
|
||||
options = [
|
||||
{'Name': 'Check Health', 'Repair': False, 'Disabled': disabled},
|
||||
{'Name': 'Restore Health', 'Repair': True, 'Disabled': disabled}]
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
selection = menu_select(
|
||||
'{}: DISM Menu\n'.format(KIT_NAME_FULL),
|
||||
main_entries=options,
|
||||
action_entries=actions)
|
||||
print_info('{}: DISM Menu\n'.format(KIT_NAME_FULL))
|
||||
if selection == 'Q':
|
||||
abort()
|
||||
elif selection.isnumeric():
|
||||
repair = options[int(selection)-1]['Repair']
|
||||
if repair:
|
||||
message='DISM RestoreHealth...'
|
||||
else:
|
||||
message='DISM ScanHealth...'
|
||||
try_and_print(message=message, function=run_dism,
|
||||
cs='No corruption', ns='Corruption detected',
|
||||
other_results=other_results, repair=repair)
|
||||
else:
|
||||
abort()
|
||||
|
||||
# Done
|
||||
print_success('Done.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,66 +0,0 @@
|
|||
# Wizard Kit: Functions - Activation
|
||||
|
||||
import subprocess
|
||||
|
||||
from borrowed import acpi
|
||||
from functions.common import *
|
||||
from os import environ
|
||||
|
||||
# Variables
|
||||
SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT'))
|
||||
|
||||
def activate_with_bios():
|
||||
"""Attempt to activate Windows with a key stored in the BIOS."""
|
||||
# Code borrowed from https://github.com/aeruder/get_win8key
|
||||
#####################################################
|
||||
#script to query windows 8.x OEM key from PC firmware
|
||||
#ACPI -> table MSDM -> raw content -> byte offset 56 to end
|
||||
#ck, 03-Jan-2014 (christian@korneck.de)
|
||||
#####################################################
|
||||
bios_key = None
|
||||
table = b"MSDM"
|
||||
if acpi.FindAcpiTable(table) is True:
|
||||
rawtable = acpi.GetAcpiTable(table)
|
||||
#http://msdn.microsoft.com/library/windows/hardware/hh673514
|
||||
#byte offset 36 from beginning \
|
||||
# = Microsoft 'software licensing data structure' \
|
||||
# / 36 + 20 bytes offset from beginning = Win Key
|
||||
bios_key = rawtable[56:len(rawtable)].decode("utf-8")
|
||||
if bios_key is None:
|
||||
raise BIOSKeyNotFoundError
|
||||
|
||||
# Install Key
|
||||
cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key]
|
||||
subprocess.run(cmd, check=False)
|
||||
sleep(5)
|
||||
|
||||
# Attempt activation
|
||||
cmd = ['cscript', '//nologo', SLMGR, '/ato']
|
||||
subprocess.run(cmd, check=False)
|
||||
sleep(5)
|
||||
|
||||
# Check status
|
||||
if not windows_is_activated():
|
||||
raise Exception('Activation Failed')
|
||||
|
||||
def get_activation_string():
|
||||
"""Get activation status, returns str."""
|
||||
act_str = subprocess.run(
|
||||
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
act_str = act_str.stdout.decode()
|
||||
act_str = act_str.splitlines()
|
||||
act_str = act_str[1].strip()
|
||||
return act_str
|
||||
|
||||
def windows_is_activated():
|
||||
"""Check if Windows is activated via slmgr.vbs and return bool."""
|
||||
activation_string = subprocess.run(
|
||||
['cscript', '//nologo', SLMGR, '/xpr'], check=False,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
activation_string = activation_string.stdout.decode()
|
||||
|
||||
return bool(activation_string and 'permanent' in activation_string)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,150 +0,0 @@
|
|||
# Wizard Kit: Functions - Backup
|
||||
|
||||
from functions.disk import *
|
||||
|
||||
# Regex
|
||||
REGEX_BAD_PATH_NAMES = re.compile(
|
||||
r'([<>:"/\|\?\*]'
|
||||
r'|^(CON|PRN|AUX|NUL|COM\d*|LPT\d*)$)'
|
||||
r'|^\s+'
|
||||
r'|[\s\.]+$',
|
||||
re.IGNORECASE)
|
||||
|
||||
def backup_partition(disk, par):
|
||||
if par.get('Image Exists', False) or par['Number'] in disk['Bad Partitions']:
|
||||
raise GenericAbort
|
||||
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'capture',
|
||||
'{}:\\'.format(par['Letter']),
|
||||
par['Image Path'],
|
||||
par['Image Name'], # Image name
|
||||
par['Image Name'], # Image description
|
||||
'--compress=none',
|
||||
]
|
||||
dest_dir = re.sub(r'(.*)\\.*$', r'\1', par['Image Path'], re.IGNORECASE)
|
||||
os.makedirs(dest_dir, exist_ok=True)
|
||||
run_program(cmd)
|
||||
|
||||
def fix_path(path):
|
||||
return REGEX_BAD_PATH_NAMES.sub('_', path)
|
||||
|
||||
def prep_disk_for_backup(destination, disk, ticket_number):
|
||||
disk['Clobber Risk'] = []
|
||||
width = len(str(len(disk['Partitions'])))
|
||||
|
||||
# Get partition totals
|
||||
disk['Bad Partitions'] = [par['Number'] for par in disk['Partitions']
|
||||
if is_bad_partition(par)]
|
||||
num_valid_partitions = len(disk['Partitions']) - len(disk['Bad Partitions'])
|
||||
disk['Valid Partitions'] = num_valid_partitions
|
||||
if disk['Valid Partitions'] <= 0:
|
||||
print_error('ERROR: No partitions can be backed up for this disk')
|
||||
raise GenericAbort
|
||||
|
||||
# Prep partitions
|
||||
for par in disk['Partitions']:
|
||||
display = '{size} {fs}'.format(
|
||||
num = par['Number'],
|
||||
width = width,
|
||||
size = par['Size'],
|
||||
fs = par['FileSystem'])
|
||||
|
||||
if par['Number'] in disk['Bad Partitions']:
|
||||
# Set display string using partition description & OS type
|
||||
display = '* {display}\t\t{q}{name}{q}\t{desc} ({os})'.format(
|
||||
display = display,
|
||||
q = '"' if par['Name'] != '' else '',
|
||||
name = par['Name'],
|
||||
desc = par['Description'],
|
||||
os = par['OS'])
|
||||
else:
|
||||
# Update info for WIM capturing
|
||||
par['Image Name'] = par['Name'] if par['Name'] else 'Unknown'
|
||||
if 'IP' in destination:
|
||||
par['Image Path'] = r'\\{}\{}\{}'.format(
|
||||
destination['IP'], destination['Share'], ticket_number)
|
||||
else:
|
||||
par['Image Path'] = r'{}:\{}'.format(
|
||||
ticket_number, destination['Letter'])
|
||||
par['Image Path'] += r'\{}_{}.wim'.format(
|
||||
par['Number'], par['Image Name'])
|
||||
par['Image Path'] = fix_path(par['Image Path'])
|
||||
|
||||
# Check for existing backups
|
||||
par['Image Exists'] = os.path.exists(par['Image Path'])
|
||||
if par['Image Exists']:
|
||||
disk['Clobber Risk'].append(par['Number'])
|
||||
display = '+ {}'.format(display)
|
||||
else:
|
||||
display = ' {}'.format(display)
|
||||
|
||||
# Append rest of Display String for valid/clobber partitions
|
||||
display += ' (Used: {used})\t{q}{name}{q}'.format(
|
||||
used = par['Used Space'],
|
||||
q = '"' if par['Name'] != '' else '',
|
||||
name = par['Name'])
|
||||
# For all partitions
|
||||
par['Display String'] = display
|
||||
|
||||
# Set description for bad partitions
|
||||
warnings = '\n'
|
||||
if disk['Bad Partitions']:
|
||||
warnings += '{} * Unsupported filesystem{}\n'.format(
|
||||
COLORS['YELLOW'], COLORS['CLEAR'])
|
||||
if disk['Clobber Risk']:
|
||||
warnings += '{} + Backup exists on {}{}\n'.format(
|
||||
COLORS['BLUE'], destination['Name'], COLORS['CLEAR'])
|
||||
if disk['Bad Partitions'] or disk['Clobber Risk']:
|
||||
warnings += '\n{}Marked partition(s) will NOT be backed up.{}\n'.format(
|
||||
COLORS['YELLOW'], COLORS['CLEAR'])
|
||||
disk['Backup Warnings'] = warnings
|
||||
|
||||
def select_backup_destination(auto_select=True):
|
||||
# Build menu
|
||||
destinations = [s for s in BACKUP_SERVERS if s['Mounted']]
|
||||
actions = [
|
||||
{'Name': 'Main Menu', 'Letter': 'M'},
|
||||
]
|
||||
|
||||
# Size check
|
||||
for dest in destinations:
|
||||
if 'IP' in dest:
|
||||
dest['Usage'] = shutil.disk_usage(r'\\{IP}\{Share}'.format(**dest))
|
||||
else:
|
||||
dest['Usage'] = shutil.disk_usage('{}:\\'.format(dest['Letter']))
|
||||
dest['Free Space'] = human_readable_size(dest['Usage'].free)
|
||||
dest['Display Name'] = '{Name} ({Free Space} available)'.format(**dest)
|
||||
|
||||
# Bail
|
||||
if not destinations:
|
||||
print_warning('No backup destinations found.')
|
||||
raise GenericAbort
|
||||
|
||||
# Skip menu?
|
||||
if len(destinations) == 1 and auto_select:
|
||||
return destinations[0]
|
||||
|
||||
selection = menu_select(
|
||||
title = 'Where are we backing up to?',
|
||||
main_entries = destinations,
|
||||
action_entries = actions)
|
||||
if selection == 'M':
|
||||
raise GenericAbort
|
||||
else:
|
||||
return destinations[int(selection)-1]
|
||||
|
||||
def verify_wim_backup(partition):
|
||||
if not os.path.exists(partition['Image Path']):
|
||||
raise PathNotFoundError
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'verify',
|
||||
partition['Image Path'],
|
||||
'--nocheck',
|
||||
]
|
||||
run_program(cmd)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,446 +0,0 @@
|
|||
# Wizard Kit: Functions - Browsers
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# Define other_results for later try_and_print
|
||||
browser_data = {}
|
||||
other_results = {
|
||||
'Error': {
|
||||
'MultipleInstallationsError': 'Multiple installations detected',
|
||||
},
|
||||
'Warning': {
|
||||
'NotInstalledError': 'Not installed',
|
||||
'NoProfilesError': 'No profiles found',
|
||||
}
|
||||
}
|
||||
|
||||
# Regex
|
||||
REGEX_BACKUP = re.compile(
|
||||
r'\.\w*bak.*',
|
||||
re.IGNORECASE)
|
||||
REGEX_CHROMIUM_PROFILE = re.compile(
|
||||
r'^(Default|Profile)',
|
||||
re.IGNORECASE)
|
||||
REGEX_CHROMIUM_ITEMS = re.compile(
|
||||
r'^(Bookmarks|Cookies|Favicons|Google Profile'
|
||||
r'|History|Login Data|Top Sites|TransportSecurity'
|
||||
r'|Visited Links|Web Data)',
|
||||
re.IGNORECASE)
|
||||
REGEX_MOZILLA = re.compile(
|
||||
r'^(bookmarkbackups|(cookies|formhistory|places).sqlite'
|
||||
r'|key3.db|logins.json|persdict.dat)$',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
DEFAULT_HOMEPAGE = 'https://www.google.com/'
|
||||
IE_GALLERY = 'https://www.microsoft.com/en-us/iegallery'
|
||||
MOZILLA_PREFS = {
|
||||
'browser.search.defaultenginename': '"Google"',
|
||||
'browser.search.defaultenginename.US': '"Google"',
|
||||
'browser.search.geoSpecificDefaults': 'false',
|
||||
'browser.startup.homepage': '"{}"'.format(DEFAULT_HOMEPAGE),
|
||||
'extensions.ui.lastCategory': '"addons://list/extension"',
|
||||
}
|
||||
UBO_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en'
|
||||
UBO_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm'
|
||||
UBO_EXTRA_CHROME = 'https://chrome.google.com/webstore/detail/ublock-origin-extra/pgdnlhfefecpicbbihgmbmffkjpaplco?hl=en'
|
||||
UBO_EXTRA_CHROME_REG = r'Software\Wow6432Node\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco'
|
||||
UBO_MOZILLA = 'https://addons.mozilla.org/en-us/firefox/addon/ublock-origin/'
|
||||
UBO_OPERA = 'https://addons.opera.com/en/extensions/details/ublock/?display=en'
|
||||
SUPPORTED_BROWSERS = {
|
||||
'Internet Explorer': {
|
||||
'base': 'ie',
|
||||
'exe_name': 'iexplore.exe',
|
||||
'rel_install_path': 'Internet Explorer',
|
||||
'user_data_path': r'{USERPROFILE}\Favorites',
|
||||
},
|
||||
'Google Chrome': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'chrome.exe',
|
||||
'rel_install_path': r'Google\Chrome\Application',
|
||||
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome\User Data',
|
||||
},
|
||||
'Google Chrome Canary': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'chrome.exe',
|
||||
'rel_install_path': r'Google\Chrome SxS\Application',
|
||||
'user_data_path': r'{LOCALAPPDATA}\Google\Chrome SxS\User Data',
|
||||
},
|
||||
'Mozilla Firefox': {
|
||||
'base': 'mozilla',
|
||||
'exe_name': 'firefox.exe',
|
||||
'rel_install_path': 'Mozilla Firefox',
|
||||
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
||||
},
|
||||
'Mozilla Firefox Dev': {
|
||||
'base': 'mozilla',
|
||||
'exe_name': 'firefox.exe',
|
||||
'rel_install_path': 'Firefox Developer Edition',
|
||||
'user_data_path': r'{APPDATA}\Mozilla\Firefox\Profiles',
|
||||
},
|
||||
'Opera': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'launcher.exe',
|
||||
'rel_install_path': 'Opera',
|
||||
'user_data_path': r'{APPDATA}\Opera Software\Opera Stable',
|
||||
},
|
||||
'Opera Beta': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'launcher.exe',
|
||||
'rel_install_path': 'Opera beta',
|
||||
'user_data_path': r'{APPDATA}\Opera Software\Opera Next',
|
||||
},
|
||||
'Opera Dev': {
|
||||
'base': 'chromium',
|
||||
'exe_name': 'launcher.exe',
|
||||
'rel_install_path': 'Opera developer',
|
||||
'user_data_path': r'{APPDATA}\Opera Software\Opera Developer',
|
||||
},
|
||||
}
|
||||
|
||||
def archive_browser(name):
|
||||
"""Create backup of Browser saved in the BackupDir."""
|
||||
source = '{}*'.format(browser_data[name]['user_data_path'])
|
||||
dest = r'{BackupDir}\Browsers ({USERNAME})'.format(
|
||||
**global_vars, **global_vars['Env'])
|
||||
archive = r'{}\{}.7z'.format(dest, name)
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', '-aoa', '-bso0', '-bse0', '-mx=1',
|
||||
archive, source]
|
||||
run_program(cmd)
|
||||
|
||||
def backup_browsers():
|
||||
"""Create backup of all detected browser profiles."""
|
||||
for name in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
||||
try_and_print(message='{}...'.format(name),
|
||||
function=archive_browser, name=name)
|
||||
|
||||
def clean_chromium_profile(profile):
|
||||
"""Renames profile, creates a new folder, and copies the user data to it."""
|
||||
if profile is None:
|
||||
raise Exception
|
||||
backup_path = '{path}_{Date}.bak'.format(
|
||||
path=profile['path'], **global_vars)
|
||||
backup_path = non_clobber_rename(backup_path)
|
||||
shutil.move(profile['path'], backup_path)
|
||||
os.makedirs(profile['path'], exist_ok=True)
|
||||
|
||||
# Restore essential files from backup_path
|
||||
for entry in os.scandir(backup_path):
|
||||
if REGEX_CHROMIUM_ITEMS.search(entry.name):
|
||||
shutil.copy(entry.path, r'{}\{}'.format(
|
||||
profile['path'], entry.name))
|
||||
|
||||
def clean_internet_explorer(**kwargs):
|
||||
"""Uses the built-in function to reset IE and sets the homepage.
|
||||
|
||||
NOTE: kwargs set but unused as a workaround."""
|
||||
kill_process('iexplore.exe')
|
||||
run_program(['rundll32.exe', 'inetcpl.cpl,ResetIEtoDefaults'], check=False)
|
||||
key = r'Software\Microsoft\Internet Explorer\Main'
|
||||
|
||||
# Set homepage
|
||||
with winreg.OpenKey(HKCU, key, access=winreg.KEY_WRITE) as _key:
|
||||
winreg.SetValueEx(_key, 'Start Page', 0,
|
||||
winreg.REG_SZ, DEFAULT_HOMEPAGE)
|
||||
try:
|
||||
winreg.DeleteValue(_key, 'Secondary Start Pages')
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
def clean_mozilla_profile(profile):
|
||||
"""Renames profile, creates a new folder, and copies the user data to it."""
|
||||
if profile is None:
|
||||
raise Exception
|
||||
backup_path = '{path}_{Date}.bak'.format(
|
||||
path=profile['path'], **global_vars)
|
||||
backup_path = non_clobber_rename(backup_path)
|
||||
shutil.move(profile['path'], backup_path)
|
||||
homepages = []
|
||||
os.makedirs(profile['path'], exist_ok=True)
|
||||
|
||||
# Restore essential files from backup_path
|
||||
for entry in os.scandir(backup_path):
|
||||
if REGEX_MOZILLA.search(entry.name):
|
||||
if entry.is_dir():
|
||||
shutil.copytree(entry.path, r'{}\{}'.format(
|
||||
profile['path'], entry.name))
|
||||
else:
|
||||
shutil.copy(entry.path, r'{}\{}'.format(
|
||||
profile['path'], entry.name))
|
||||
|
||||
# Set profile defaults
|
||||
with open(r'{path}\prefs.js'.format(**profile), 'a', encoding='ascii') as f:
|
||||
for k, v in MOZILLA_PREFS.items():
|
||||
f.write('user_pref("{}", {});\n'.format(k, v))
|
||||
|
||||
def get_browser_details(name):
|
||||
"""Get installation status and profile details for all supported browsers."""
|
||||
browser = SUPPORTED_BROWSERS[name].copy()
|
||||
|
||||
# Update user_data_path
|
||||
browser['user_data_path'] = browser['user_data_path'].format(
|
||||
**global_vars['Env'])
|
||||
|
||||
# Find executable (if multiple files are found, the last one is used)
|
||||
exe_path = None
|
||||
num_installs = 0
|
||||
for install_path in ['LOCALAPPDATA', 'PROGRAMFILES(X86)', 'PROGRAMFILES']:
|
||||
test_path = r'{install_path}\{rel_install_path}\{exe_name}'.format(
|
||||
install_path = global_vars['Env'].get(install_path, ''),
|
||||
**browser)
|
||||
if os.path.exists(test_path):
|
||||
num_installs += 1
|
||||
exe_path = test_path
|
||||
|
||||
# Find profile(s)
|
||||
profiles = []
|
||||
if browser['base'] == 'ie':
|
||||
profiles.append({'name': 'Default', 'path': None})
|
||||
elif 'Google Chrome' in name:
|
||||
profiles.extend(
|
||||
get_chromium_profiles(
|
||||
search_path=browser['user_data_path']))
|
||||
elif browser['base'] == 'mozilla':
|
||||
dev = 'Dev' in name
|
||||
profiles.extend(
|
||||
get_mozilla_profiles(
|
||||
search_path=browser['user_data_path'], dev=dev))
|
||||
if exe_path and not dev and len(profiles) == 0:
|
||||
# e.g. If Firefox is installed but no profiles were found.
|
||||
## Rename profiles.ini and create a new default profile
|
||||
profiles_ini_path = browser['user_data_path'].replace(
|
||||
'Profiles', 'profiles.ini')
|
||||
if os.path.exists(profiles_ini_path):
|
||||
backup_path = '{path}_{Date}.bak'.format(
|
||||
path=profiles_ini_path, **global_vars)
|
||||
backup_path = non_clobber_rename(backup_path)
|
||||
shutil.move(profiles_ini_path, backup_path)
|
||||
run_program([exe_path, '-createprofile', 'default'], check=False)
|
||||
profiles.extend(
|
||||
get_mozilla_profiles(
|
||||
search_path=browser['user_data_path'], dev=dev))
|
||||
|
||||
elif 'Opera' in name:
|
||||
if os.path.exists(browser['user_data_path']):
|
||||
profiles.append(
|
||||
{'name': 'Default', 'path': browser['user_data_path']})
|
||||
|
||||
# Get homepages
|
||||
if browser['base'] == 'ie':
|
||||
# IE is set to only have one profile above
|
||||
profiles[0]['homepages'] = get_ie_homepages()
|
||||
elif browser['base'] == 'mozilla':
|
||||
for profile in profiles:
|
||||
prefs_path = r'{path}\prefs.js'.format(**profile)
|
||||
profile['homepages'] = get_mozilla_homepages(prefs_path=prefs_path)
|
||||
|
||||
# Add to browser_data
|
||||
browser_data[name] = browser
|
||||
browser_data[name].update({
|
||||
'exe_path': exe_path,
|
||||
'profiles': profiles,
|
||||
})
|
||||
|
||||
# Raise installation warnings (if any)
|
||||
if num_installs == 0:
|
||||
raise NotInstalledError
|
||||
elif num_installs > 1 and browser['base'] != 'ie':
|
||||
raise MultipleInstallationsError
|
||||
|
||||
def get_chromium_profiles(search_path):
|
||||
"""Find any chromium-style profiles and return as a list of dicts."""
|
||||
profiles = []
|
||||
try:
|
||||
for entry in os.scandir(search_path):
|
||||
if entry.is_dir() and REGEX_CHROMIUM_PROFILE.search(entry.name):
|
||||
profiles.append(entry)
|
||||
REGEX_PROFILE_BACKUP = r'\.\w+bak.*'
|
||||
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
|
||||
# Convert os.DirEntries to dicts
|
||||
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return profiles
|
||||
|
||||
def get_ie_homepages():
|
||||
"""Read homepages from the registry and return as a list."""
|
||||
homepages = []
|
||||
main_page = ''
|
||||
extra_pages = []
|
||||
key = r'Software\Microsoft\Internet Explorer\Main'
|
||||
with winreg.OpenKey(HKCU, key) as _key:
|
||||
try:
|
||||
main_page = winreg.QueryValueEx(_key, 'Start Page')[0]
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
try:
|
||||
extra_pages = winreg.QueryValueEx(_key, 'Secondary Start Pages')[0]
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
if main_page != '':
|
||||
homepages.append(main_page)
|
||||
if len(extra_pages) > 0:
|
||||
homepages.extend(extra_pages)
|
||||
return homepages
|
||||
|
||||
def get_mozilla_homepages(prefs_path):
|
||||
"""Read homepages from prefs.js and return as a list."""
|
||||
homepages = []
|
||||
try:
|
||||
with open(prefs_path, 'r') as f:
|
||||
search = re.search(
|
||||
r'browser\.startup\.homepage", "([^"]*)"',
|
||||
f.read(), re.IGNORECASE)
|
||||
if search:
|
||||
homepages = search.group(1).split('|')
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return homepages
|
||||
|
||||
def get_mozilla_profiles(search_path, dev=False):
|
||||
"""Find any mozilla-style profiles and return as a list of dicts."""
|
||||
profiles = []
|
||||
try:
|
||||
for entry in os.scandir(search_path):
|
||||
if entry.is_dir():
|
||||
if 'dev-edition' in entry.name:
|
||||
# NOTE: Not always present which can lead
|
||||
# to Dev profiles being marked as non-Dev
|
||||
## NOTE 2: It is possible that a non-Dev profile
|
||||
## to be created with 'dev-edition' in the name.
|
||||
## (It wouldn't make sense, but possible)
|
||||
if dev:
|
||||
profiles.append(entry)
|
||||
elif not dev:
|
||||
profiles.append(entry)
|
||||
profiles = [p for p in profiles if not REGEX_BACKUP.search(p.name)]
|
||||
# Convert os.DirEntries to dicts
|
||||
profiles = [{'name': p.name, 'path': p.path} for p in profiles]
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
return profiles
|
||||
|
||||
def install_adblock(indent=8, width=32):
|
||||
"""Install adblock for all supported browsers."""
|
||||
for browser in sorted(browser_data):
|
||||
exe_path = browser_data[browser].get('exe_path', None)
|
||||
function=run_program
|
||||
if not exe_path:
|
||||
if browser_data[browser]['profiles']:
|
||||
print_standard(
|
||||
'{indent}{browser:<{width}}'.format(
|
||||
indent=' '*indent, width=width, browser=browser+'...'),
|
||||
end='', flush=True)
|
||||
print_warning('Profile(s) detected but browser not installed',
|
||||
timestamp=False)
|
||||
else:
|
||||
# Only warn if profile(s) are detected.
|
||||
pass
|
||||
else:
|
||||
# Set urls to open
|
||||
urls = []
|
||||
if browser_data[browser]['base'] == 'chromium':
|
||||
if browser == 'Google Chrome':
|
||||
# Check for system exensions
|
||||
try:
|
||||
winreg.QueryValue(HKLM, UBO_CHROME_REG)
|
||||
except FileNotFoundError:
|
||||
urls.append(UBO_CHROME)
|
||||
try:
|
||||
winreg.QueryValue(HKLM, UBO_EXTRA_CHROME_REG)
|
||||
except FileNotFoundError:
|
||||
urls.append(UBO_EXTRA_CHROME)
|
||||
|
||||
if len(urls) == 0:
|
||||
urls = ['chrome://extensions']
|
||||
elif 'Opera' in browser:
|
||||
urls.append(UBO_OPERA)
|
||||
else:
|
||||
urls.append(UBO_CHROME)
|
||||
urls.append(UBO_EXTRA_CHROME)
|
||||
|
||||
elif browser_data[browser]['base'] == 'mozilla':
|
||||
# Assume UBO is not installed first and change if it is
|
||||
urls.append(UBO_MOZILLA)
|
||||
if browser == 'Mozilla Firefox':
|
||||
ubo = browser_data[browser]['exe_path'].replace(
|
||||
'firefox.exe',
|
||||
r'distribution\extensions\uBlock0@raymondhill.net')
|
||||
if os.path.exists(ubo):
|
||||
urls = ['about:addons']
|
||||
|
||||
elif browser_data[browser]['base'] == 'ie':
|
||||
urls.append(IE_GALLERY)
|
||||
function=popen_program
|
||||
|
||||
# By using check=False we're skipping any return codes so
|
||||
# it should only fail if the program can't be run
|
||||
# (or can't be found).
|
||||
# In other words, this isn't tracking the addon/extension's
|
||||
# installation status.
|
||||
try_and_print(message='{}...'.format(browser),
|
||||
indent=indent, width=width,
|
||||
cs='Done', function=function,
|
||||
cmd=[exe_path, *urls], check=False)
|
||||
|
||||
def list_homepages(indent=8, width=32):
|
||||
"""List current homepages for reference."""
|
||||
|
||||
for browser in [k for k, v in sorted(browser_data.items()) if v['exe_path']]:
|
||||
# Skip Chromium-based browsers
|
||||
if browser_data[browser]['base'] == 'chromium':
|
||||
print_info(
|
||||
'{indent}{browser:<{width}}'.format(
|
||||
indent=' '*indent, width=width, browser=browser+'...'),
|
||||
end='', flush=True)
|
||||
print_warning('Not implemented', timestamp=False)
|
||||
continue
|
||||
|
||||
# All other browsers
|
||||
print_info('{indent}{browser:<{width}}'.format(
|
||||
indent=' '*indent, width=width, browser=browser+'...'))
|
||||
for profile in browser_data[browser].get('profiles', []):
|
||||
name = profile.get('name', '?')
|
||||
homepages = profile.get('homepages', [])
|
||||
if len(homepages) == 0:
|
||||
print_standard(
|
||||
'{indent}{name:<{width}}'.format(
|
||||
indent=' '*indent, width=width, name=name),
|
||||
end='', flush=True)
|
||||
print_warning('None found', timestamp=False)
|
||||
else:
|
||||
for page in homepages:
|
||||
print_standard('{indent}{name:<{width}}{page}'.format(
|
||||
indent=' '*indent, width=width, name=name, page=page))
|
||||
|
||||
def reset_browsers(indent=8, width=32):
|
||||
"""Reset all detected browsers to safe defaults."""
|
||||
for browser in [k for k, v in sorted(browser_data.items()) if v['profiles']]:
|
||||
print_info('{indent}{name}'.format(indent=' '*indent, name=browser))
|
||||
for profile in browser_data[browser]['profiles']:
|
||||
if browser_data[browser]['base'] == 'chromium':
|
||||
function = clean_chromium_profile
|
||||
elif browser_data[browser]['base'] == 'ie':
|
||||
function = clean_internet_explorer
|
||||
elif browser_data[browser]['base'] == 'mozilla':
|
||||
function = clean_mozilla_profile
|
||||
try_and_print(
|
||||
message='{}...'.format(profile['name']),
|
||||
indent=indent, width=width, function=function,
|
||||
other_results=other_results, profile=profile)
|
||||
|
||||
def scan_for_browsers():
|
||||
"""Scan system for any supported browsers."""
|
||||
for name in sorted(SUPPORTED_BROWSERS):
|
||||
try_and_print(message='{}...'.format(name),
|
||||
function=get_browser_details, cs='Detected',
|
||||
other_results=other_results, name=name)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
# Wizard Kit: Functions - Cleanup
|
||||
|
||||
from functions.common import *
|
||||
|
||||
def cleanup_adwcleaner():
|
||||
"""Move AdwCleaner folders into the ClientDir."""
|
||||
source_path = r'{SYSTEMDRIVE}\AdwCleaner'.format(**global_vars['Env'])
|
||||
source_quarantine = r'{}\Quarantine'.format(source_path)
|
||||
|
||||
# Quarantine
|
||||
if os.path.exists(source_quarantine):
|
||||
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
|
||||
dest_name = r'{QuarantineDir}\AdwCleaner_{Date-Time}'.format(
|
||||
**global_vars)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(source_quarantine, dest_name)
|
||||
|
||||
# Delete source folder if empty
|
||||
try:
|
||||
os.rmdir(source_path)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
# Main folder
|
||||
if os.path.exists(source_path):
|
||||
os.makedirs(global_vars['ProgBackupDir'], exist_ok=True)
|
||||
dest_name = r'{ProgBackupDir}\AdwCleaner_{Date-Time}'.format(
|
||||
**global_vars)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(source_path, dest_name)
|
||||
|
||||
def cleanup_cbs(dest_folder):
|
||||
"""Safely cleanup a known CBS archive bug under Windows 7.
|
||||
|
||||
If a CbsPersist file is larger than 2 Gb then the auto archive feature
|
||||
continually fails and will fill up the system drive with temp files.
|
||||
|
||||
This function moves the temp files and CbsPersist file to a temp folder,
|
||||
compresses the CbsPersist files with 7-Zip, and then opens the temp folder
|
||||
for the user to manually save the backup files and delete the temp files.
|
||||
"""
|
||||
backup_folder = r'{dest_folder}\CbsFix'.format(dest_folder=dest_folder)
|
||||
temp_folder = r'{backup_folder}\Temp'.format(backup_folder=backup_folder)
|
||||
os.makedirs(backup_folder, exist_ok=True)
|
||||
os.makedirs(temp_folder, exist_ok=True)
|
||||
|
||||
# Move files into temp folder
|
||||
cbs_path = r'{SYSTEMROOT}\Logs\CBS'.format(**global_vars['Env'])
|
||||
for entry in os.scandir(cbs_path):
|
||||
# CbsPersist files
|
||||
if entry.name.lower().startswith('cbspersist'):
|
||||
dest_name = r'{}\{}'.format(temp_folder, entry.name)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(entry.path, dest_name)
|
||||
temp_path = r'{SYSTEMROOT}\Temp'.format(**global_vars['Env'])
|
||||
for entry in os.scandir(temp_path):
|
||||
# cab_ files
|
||||
if entry.name.lower().startswith('cab_'):
|
||||
dest_name = r'{}\{}'.format(temp_folder, entry.name)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(entry.path, dest_name)
|
||||
|
||||
# Compress CbsPersist files with 7-Zip
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', '-t7z', '-mx=3', '-bso0', '-bse0',
|
||||
r'{}\CbsPersists.7z'.format(backup_folder),
|
||||
r'{}\CbsPersist*'.format(temp_folder)]
|
||||
run_program(cmd)
|
||||
|
||||
def cleanup_desktop():
|
||||
"""Move known backup files and reports into the ClientDir."""
|
||||
dest_folder = r'{ProgBackupDir}\Desktop_{Date-Time}'.format(**global_vars)
|
||||
os.makedirs(dest_folder, exist_ok=True)
|
||||
|
||||
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
||||
for entry in os.scandir(desktop_path):
|
||||
# JRT, RKill, Shortcut cleaner
|
||||
if re.search(r'^(JRT|RKill|sc-cleaner)', entry.name, re.IGNORECASE):
|
||||
dest_name = r'{}\{}'.format(dest_folder, entry.name)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
shutil.move(entry.path, dest_name)
|
||||
|
||||
# Remove dir if empty
|
||||
try:
|
||||
os.rmdir(dest_folder)
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,716 +0,0 @@
|
|||
# Wizard Kit: Functions - Common
|
||||
|
||||
import os
|
||||
import psutil
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import time
|
||||
import traceback
|
||||
import winreg
|
||||
|
||||
from subprocess import CalledProcessError
|
||||
|
||||
from settings.main import *
|
||||
from settings.tools import *
|
||||
|
||||
# Global variables
|
||||
global_vars = {}
|
||||
|
||||
# STATIC VARIABLES
|
||||
COLORS = {
|
||||
'CLEAR': '\033[0m',
|
||||
'RED': '\033[31m',
|
||||
'GREEN': '\033[32m',
|
||||
'YELLOW': '\033[33m',
|
||||
'BLUE': '\033[34m'
|
||||
}
|
||||
HKU = winreg.HKEY_USERS
|
||||
HKCU = winreg.HKEY_CURRENT_USER
|
||||
HKLM = winreg.HKEY_LOCAL_MACHINE
|
||||
|
||||
# Error Classes
|
||||
class BIOSKeyNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
class BinNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
class GenericAbort(Exception):
|
||||
pass
|
||||
|
||||
class GenericError(Exception):
|
||||
pass
|
||||
|
||||
class GenericRepair(Exception):
|
||||
pass
|
||||
|
||||
class MultipleInstallationsError(Exception):
|
||||
pass
|
||||
|
||||
class NotInstalledError(Exception):
|
||||
pass
|
||||
|
||||
class NoProfilesError(Exception):
|
||||
pass
|
||||
|
||||
class PathNotFoundError(Exception):
|
||||
pass
|
||||
|
||||
class UnsupportedOSError(Exception):
|
||||
pass
|
||||
|
||||
# General functions
|
||||
def abort():
|
||||
"""Abort script."""
|
||||
print_warning('Aborted.')
|
||||
sleep(1)
|
||||
pause(prompt='Press Enter to exit... ')
|
||||
exit_script()
|
||||
|
||||
def ask(prompt='Kotaero!'):
|
||||
"""Prompt the user with a Y/N question, log answer, and return a bool."""
|
||||
answer = None
|
||||
prompt = '{} [Y/N]: '.format(prompt)
|
||||
while answer is None:
|
||||
tmp = input(prompt)
|
||||
if re.search(r'^y(es|)$', tmp, re.IGNORECASE):
|
||||
answer = True
|
||||
elif re.search(r'^n(o|ope|)$', tmp, re.IGNORECASE):
|
||||
answer = False
|
||||
message = '{prompt}{answer_text}'.format(
|
||||
prompt = prompt,
|
||||
answer_text = 'Yes' if answer else 'No')
|
||||
print_log(message=message)
|
||||
return answer
|
||||
|
||||
def clear_screen():
|
||||
"""Simple wrapper for cls."""
|
||||
os.system('cls')
|
||||
|
||||
def convert_to_bytes(size):
|
||||
"""Convert human-readable size str to bytes and return an int."""
|
||||
size = str(size)
|
||||
tmp = re.search(r'(\d+)\s+([KMGT]B)', size.upper())
|
||||
if tmp:
|
||||
size = int(tmp.group(1))
|
||||
units = tmp.group(2)
|
||||
if units == 'TB':
|
||||
size *= 1099511627776
|
||||
elif units == 'GB':
|
||||
size *= 1073741824
|
||||
elif units == 'MB':
|
||||
size *= 1048576
|
||||
elif units == 'KB':
|
||||
size *= 1024
|
||||
else:
|
||||
return -1
|
||||
|
||||
return size
|
||||
|
||||
def exit_script(return_value=0):
|
||||
"""Exits the script after some cleanup and opens the log (if set)."""
|
||||
# Remove dirs (if empty)
|
||||
for dir in ['BackupDir', 'LogDir', 'TmpDir']:
|
||||
try:
|
||||
dir = global_vars[dir]
|
||||
os.rmdir(dir)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Open Log (if it exists)
|
||||
log = global_vars.get('LogFile', '')
|
||||
if log and os.path.exists(log):
|
||||
try:
|
||||
extract_item('NotepadPlusPlus', silent=True)
|
||||
popen_program(
|
||||
[global_vars['Tools']['NotepadPlusPlus'],
|
||||
global_vars['LogFile']])
|
||||
except Exception:
|
||||
print_error('ERROR: Failed to extract Notepad++ and open log.')
|
||||
pause('Press Enter to exit...')
|
||||
|
||||
# Kill Caffeine if still running
|
||||
kill_process('caffeine.exe')
|
||||
|
||||
# Exit
|
||||
sys.exit(return_value)
|
||||
|
||||
def extract_item(item, filter='', silent=False):
|
||||
"""Extract item from .cbin into .bin."""
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0',
|
||||
'-p{ArchivePassword}'.format(**global_vars),
|
||||
r'-o{BinDir}\{item}'.format(item=item, **global_vars),
|
||||
r'{CBinDir}\{item}.7z'.format(item=item, **global_vars),
|
||||
filter]
|
||||
if not silent:
|
||||
print_standard('Extracting "{item}"...'.format(item=item))
|
||||
try:
|
||||
run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
if not silent:
|
||||
print_warning('WARNING: Errors encountered while exctracting data')
|
||||
|
||||
def get_ticket_number():
|
||||
"""Get TicketNumber from user, save in LogDir, and return as str."""
|
||||
ticket_number = None
|
||||
while ticket_number is None:
|
||||
_input = input('Enter ticket number: ')
|
||||
if re.match(r'^([0-9]+([-_]?\w+|))$', _input):
|
||||
ticket_number = _input
|
||||
with open(r'{LogDir}\TicketNumber'.format(**global_vars), 'w') as f:
|
||||
f.write(ticket_number)
|
||||
return ticket_number
|
||||
|
||||
def human_readable_size(size, decimals=0):
|
||||
"""Convert size in bytes to a human-readable format and return a str."""
|
||||
# Prep string formatting
|
||||
width = 3+decimals
|
||||
if decimals > 0:
|
||||
width += 1
|
||||
|
||||
# Convert size to int
|
||||
try:
|
||||
size = int(size)
|
||||
except ValueError:
|
||||
size = convert_to_bytes(size)
|
||||
|
||||
# Verify we have a valid size
|
||||
if size < 0:
|
||||
return '{size:>{width}} b'.format(size='???', width=width)
|
||||
|
||||
# Convert to sensible units
|
||||
if size >= 1099511627776:
|
||||
size /= 1099511627776
|
||||
units = 'Tb'
|
||||
elif size >= 1073741824:
|
||||
size /= 1073741824
|
||||
units = 'Gb'
|
||||
elif size >= 1048576:
|
||||
size /= 1048576
|
||||
units = 'Mb'
|
||||
elif size >= 1024:
|
||||
size /= 1024
|
||||
units = 'Kb'
|
||||
else:
|
||||
units = ' b'
|
||||
|
||||
# Return
|
||||
return '{size:>{width}.{decimals}f} {units}'.format(
|
||||
size=size, width=width, decimals=decimals, units=units)
|
||||
|
||||
def kill_process(name):
|
||||
"""Kill any running caffeine.exe processes."""
|
||||
for proc in psutil.process_iter():
|
||||
if proc.name() == name:
|
||||
proc.kill()
|
||||
|
||||
def major_exception():
|
||||
"""Display traceback and exit"""
|
||||
print_error('Major exception')
|
||||
print_warning(SUPPORT_MESSAGE)
|
||||
print(traceback.format_exc())
|
||||
print_log(traceback.format_exc())
|
||||
sleep(30)
|
||||
pause('Press Enter to exit...')
|
||||
exit_script(1)
|
||||
|
||||
def menu_select(title='~ Untitled Menu ~',
|
||||
prompt='Please make a selection', secret_exit=False,
|
||||
main_entries=[], action_entries=[], disabled_label='DISABLED'):
|
||||
"""Display options in a menu and return selected option as a str."""
|
||||
# Bail early
|
||||
if not main_entries and not action_entries:
|
||||
raise Exception("MenuError: No items given")
|
||||
|
||||
# Set title
|
||||
if 'Title' in global_vars:
|
||||
title = '{}\n\n{}'.format(global_vars['Title'], title)
|
||||
|
||||
# Build menu
|
||||
menu_splash = '{}\n\n'.format(title)
|
||||
width = len(str(len(main_entries)))
|
||||
valid_answers = []
|
||||
if (secret_exit):
|
||||
valid_answers.append('Q')
|
||||
|
||||
# Add main entries
|
||||
for i in range(len(main_entries)):
|
||||
entry = main_entries[i]
|
||||
# Add Spacer
|
||||
if ('CRLF' in entry):
|
||||
menu_splash += '\n'
|
||||
entry_str = '{number:>{width}}: {name}'.format(
|
||||
number = i+1,
|
||||
width = width,
|
||||
name = entry.get('Display Name', entry['Name']))
|
||||
if entry.get('Disabled', False):
|
||||
entry_str = '{YELLOW}{entry_str} ({disabled}){CLEAR}'.format(
|
||||
entry_str = entry_str,
|
||||
disabled = disabled_label,
|
||||
**COLORS)
|
||||
else:
|
||||
valid_answers.append(str(i+1))
|
||||
menu_splash += '{}\n'.format(entry_str)
|
||||
menu_splash += '\n'
|
||||
|
||||
# Add action entries
|
||||
for entry in action_entries:
|
||||
# Add Spacer
|
||||
if ('CRLF' in entry):
|
||||
menu_splash += '\n'
|
||||
valid_answers.append(entry['Letter'])
|
||||
menu_splash += '{letter:>{width}}: {name}\n'.format(
|
||||
letter = entry['Letter'].upper(),
|
||||
width = len(str(len(action_entries))),
|
||||
name = entry['Name'])
|
||||
menu_splash += '\n'
|
||||
|
||||
answer = ''
|
||||
|
||||
while (answer.upper() not in valid_answers):
|
||||
os.system('cls')
|
||||
print(menu_splash)
|
||||
answer = input('{}: '.format(prompt))
|
||||
|
||||
return answer.upper()
|
||||
|
||||
def non_clobber_rename(full_path):
|
||||
"""Append suffix to path, if necessary, to avoid clobbering path"""
|
||||
new_path = full_path
|
||||
_i = 1;
|
||||
while os.path.exists(new_path):
|
||||
new_path = '{path}_{i}'.format(i=_i, path=full_path)
|
||||
_i += 1
|
||||
|
||||
return new_path
|
||||
|
||||
def pause(prompt='Press Enter to continue... '):
|
||||
"""Simple pause implementation."""
|
||||
input(prompt)
|
||||
|
||||
def ping(addr='google.com'):
|
||||
"""Attempt to ping addr."""
|
||||
cmd = ['ping', '-n', '2', addr]
|
||||
run_program(cmd)
|
||||
|
||||
def popen_program(cmd, pipe=False, minimized=False, shell=False, **kwargs):
|
||||
"""Run program and return a subprocess.Popen object."""
|
||||
startupinfo=None
|
||||
if minimized:
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
startupinfo.dwFlags = subprocess.STARTF_USESHOWWINDOW
|
||||
startupinfo.wShowWindow = 6
|
||||
|
||||
if pipe:
|
||||
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
else:
|
||||
popen_obj = subprocess.Popen(cmd, shell=shell, startupinfo=startupinfo)
|
||||
|
||||
return popen_obj
|
||||
|
||||
def print_error(*args, **kwargs):
|
||||
"""Prints message to screen in RED."""
|
||||
print_standard(*args, color=COLORS['RED'], **kwargs)
|
||||
|
||||
def print_info(*args, **kwargs):
|
||||
"""Prints message to screen in BLUE."""
|
||||
print_standard(*args, color=COLORS['BLUE'], **kwargs)
|
||||
|
||||
def print_standard(message='Generic info',
|
||||
color=None, end='\n', timestamp=True, **kwargs):
|
||||
"""Prints message to screen and log (if set)."""
|
||||
display_message = message
|
||||
if color:
|
||||
display_message = color + message + COLORS['CLEAR']
|
||||
# **COLORS is used below to support non-"standard" color printing
|
||||
print(display_message.format(**COLORS), end=end, **kwargs)
|
||||
print_log(message, end, timestamp)
|
||||
|
||||
def print_success(*args, **kwargs):
|
||||
"""Prints message to screen in GREEN."""
|
||||
print_standard(*args, color=COLORS['GREEN'], **kwargs)
|
||||
|
||||
def print_warning(*args, **kwargs):
|
||||
"""Prints message to screen in YELLOW."""
|
||||
print_standard(*args, color=COLORS['YELLOW'], **kwargs)
|
||||
|
||||
def print_log(message='', end='\n', timestamp=True):
|
||||
time_str = time.strftime("%Y-%m-%d %H%M%z: ") if timestamp else ''
|
||||
if 'LogFile' in global_vars and global_vars['LogFile'] is not None:
|
||||
with open(global_vars['LogFile'], 'a') as f:
|
||||
for line in message.splitlines():
|
||||
f.write('{timestamp}{line}{end}'.format(
|
||||
timestamp = time_str,
|
||||
line = line,
|
||||
end = end))
|
||||
|
||||
def run_program(cmd, args=[], check=True, pipe=True, shell=False):
|
||||
"""Run program and return a subprocess.CompletedProcess object."""
|
||||
if args:
|
||||
# Deprecated so let's raise an exception to find & fix all occurances
|
||||
print_error('ERROR: Using args is no longer supported.')
|
||||
raise Exception
|
||||
cmd = [c for c in cmd if c]
|
||||
if shell:
|
||||
cmd = ' '.join(cmd)
|
||||
|
||||
if pipe:
|
||||
process_return = subprocess.run(cmd, check=check, shell=shell,
|
||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
else:
|
||||
process_return = subprocess.run(cmd, check=check, shell=shell)
|
||||
|
||||
return process_return
|
||||
|
||||
def set_title(title='~Some Title~'):
|
||||
"""Set title.
|
||||
|
||||
Used for window title and menu titles."""
|
||||
global_vars['Title'] = title
|
||||
os.system('title {}'.format(title))
|
||||
|
||||
def show_data(message='~Some message~', data='~Some data~', indent=8, width=32,
|
||||
info=False, warning=False, error=False):
|
||||
"""Display info with formatting."""
|
||||
message = '{indent}{message:<{width}}{data}'.format(
|
||||
indent=' '*indent, width=width, message=message, data=data)
|
||||
if error:
|
||||
print_error(message)
|
||||
elif warning:
|
||||
print_warning(message)
|
||||
elif info:
|
||||
print_info(message)
|
||||
else:
|
||||
print_standard(message)
|
||||
|
||||
def show_info(message='~Some message~', info='~Some info~', indent=8, width=32):
|
||||
show_data(message=message, data=info, indent=indent, width=width)
|
||||
|
||||
def sleep(seconds=2):
|
||||
"""Wait for a while."""
|
||||
time.sleep(seconds)
|
||||
|
||||
def stay_awake():
|
||||
"""Prevent the system from sleeping or hibernating."""
|
||||
# Bail if caffeine is already running
|
||||
for proc in psutil.process_iter():
|
||||
if proc.name() == 'caffeine.exe':
|
||||
return
|
||||
# Extract and run
|
||||
extract_item('Caffeine', silent=True)
|
||||
try:
|
||||
popen_program(global_vars['Tools']['Caffeine'])
|
||||
except Exception:
|
||||
print_error('ERROR: No caffeine available.')
|
||||
print_warning('Please set the power setting to High Performance.')
|
||||
|
||||
def get_exception(s):
|
||||
"""Get exception by name, returns Exception object."""
|
||||
return getattr(sys.modules[__name__], s)
|
||||
|
||||
def try_and_print(message='Trying...',
|
||||
function=None, cs='CS', ns='NS', other_results={},
|
||||
catch_all=True, print_return=False, silent_function=True,
|
||||
indent=8, width=32, *args, **kwargs):
|
||||
"""Run function, print if successful or not, and return dict.
|
||||
|
||||
other_results is in the form of
|
||||
{
|
||||
'Warning': {'ExceptionClassName': 'Result Message'},
|
||||
'Error': {'ExceptionClassName': 'Result Message'}
|
||||
}
|
||||
The the ExceptionClassNames will be excepted conditions
|
||||
and the result string will be printed in the correct color.
|
||||
catch_all=False will result in unspecified exceptions being re-raised."""
|
||||
err = None
|
||||
out = None
|
||||
w_exceptions = other_results.get('Warning', {}).keys()
|
||||
w_exceptions = tuple(get_exception(e) for e in w_exceptions)
|
||||
e_exceptions = other_results.get('Error', {}).keys()
|
||||
e_exceptions = tuple(get_exception(e) for e in e_exceptions)
|
||||
w_results = other_results.get('Warning', {})
|
||||
e_results = other_results.get('Error', {})
|
||||
|
||||
# Run function and catch errors
|
||||
print_standard('{indent}{message:<{width}}'.format(
|
||||
indent=' '*indent, message=message, width=width), end='', flush=True)
|
||||
try:
|
||||
out = function(*args, **kwargs)
|
||||
if print_return:
|
||||
print_standard(out[0], timestamp=False)
|
||||
for item in out[1:]:
|
||||
print_standard('{indent}{item}'.format(
|
||||
indent=' '*(indent+width), item=item))
|
||||
elif silent_function:
|
||||
print_success(cs, timestamp=False)
|
||||
except w_exceptions as e:
|
||||
_result = w_results.get(e.__class__.__name__, 'Warning')
|
||||
print_warning(_result, timestamp=False)
|
||||
err = e
|
||||
except e_exceptions as e:
|
||||
_result = e_results.get(e.__class__.__name__, 'Error')
|
||||
print_error(_result, timestamp=False)
|
||||
err = e
|
||||
except Exception:
|
||||
print_error(ns, timestamp=False)
|
||||
err = traceback.format_exc()
|
||||
|
||||
# Return or raise?
|
||||
if err and not catch_all:
|
||||
raise
|
||||
else:
|
||||
return {'CS': not bool(err), 'Error': err, 'Out': out}
|
||||
|
||||
def upload_data(path, file):
|
||||
"""Add CLIENT_INFO_SERVER to authorized connections and upload file."""
|
||||
if not ENABLED_UPLOAD_DATA:
|
||||
raise GenericError('Feature disabled.')
|
||||
|
||||
extract_item('PuTTY', filter='wizkit.ppk psftp.exe', silent=True)
|
||||
|
||||
# Authorize connection to the server
|
||||
winreg.CreateKey(HKCU, r'Software\SimonTatham\PuTTY\SshHostKeys')
|
||||
with winreg.OpenKey(HKCU, r'Software\SimonTatham\PuTTY\SshHostKeys',
|
||||
access=winreg.KEY_WRITE) as key:
|
||||
winreg.SetValueEx(key,
|
||||
'rsa2@22:{IP}'.format(**CLIENT_INFO_SERVER), 0,
|
||||
winreg.REG_SZ, CLIENT_INFO_SERVER['RegEntry'])
|
||||
|
||||
# Write batch file
|
||||
with open(r'{TmpDir}\psftp.batch'.format(**global_vars),
|
||||
'w', encoding='ascii') as f:
|
||||
f.write('lcd "{path}"\n'.format(path=path))
|
||||
f.write('cd "{Share}"\n'.format(**CLIENT_INFO_SERVER))
|
||||
f.write('mkdir {TicketNumber}\n'.format(**global_vars))
|
||||
f.write('cd {TicketNumber}\n'.format(**global_vars))
|
||||
f.write('put "{file}"\n'.format(file=file))
|
||||
|
||||
# Upload Info
|
||||
cmd = [
|
||||
global_vars['Tools']['PuTTY-PSFTP'],
|
||||
'-noagent',
|
||||
'-i', r'{BinDir}\PuTTY\wizkit.ppk'.format(**global_vars),
|
||||
'{User}@{IP}'.format(**CLIENT_INFO_SERVER),
|
||||
'-b', r'{TmpDir}\psftp.batch'.format(**global_vars)]
|
||||
run_program(cmd)
|
||||
|
||||
def upload_info():
|
||||
"""Upload compressed Info file to the NAS as set in settings.main.py."""
|
||||
if not ENABLED_UPLOAD_DATA:
|
||||
raise GenericError('Feature disabled.')
|
||||
|
||||
path = '{ClientDir}'.format(**global_vars)
|
||||
file = 'Info_{Date-Time}.7z'.format(**global_vars)
|
||||
upload_data(path, file)
|
||||
|
||||
def compress_info():
|
||||
"""Compress ClientDir info folders with 7-Zip for upload_info()."""
|
||||
path = '{ClientDir}'.format(**global_vars)
|
||||
file = 'Info_{Date-Time}.7z'.format(**global_vars)
|
||||
_cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', '-t7z', '-mx=9', '-bso0', '-bse0',
|
||||
r'{}\{}'.format(path, file),
|
||||
r'{ClientDir}\Info'.format(**global_vars)]
|
||||
run_program(_cmd)
|
||||
|
||||
def wait_for_process(name, poll_rate=3):
|
||||
"""Wait for process by name."""
|
||||
running = True
|
||||
while running:
|
||||
sleep(poll_rate)
|
||||
running = False
|
||||
for proc in psutil.process_iter():
|
||||
if re.search(r'^{}'.format(name), proc.name(), re.IGNORECASE):
|
||||
running = True
|
||||
sleep(1)
|
||||
|
||||
# global_vars functions
|
||||
def init_global_vars():
|
||||
"""Sets global variables based on system info."""
|
||||
print_info('Initializing')
|
||||
os.system('title Wizard Kit')
|
||||
init_functions = [
|
||||
['Checking .bin...', find_bin],
|
||||
['Checking environment...', set_common_vars],
|
||||
['Checking OS...', check_os],
|
||||
['Checking tools...', check_tools],
|
||||
['Creating folders...', make_tmp_dirs],
|
||||
['Clearing collisions...', clean_env_vars],
|
||||
]
|
||||
try:
|
||||
for f in init_functions:
|
||||
try_and_print(
|
||||
message=f[0], function=f[1],
|
||||
cs='Done', ns='Error', catch_all=False)
|
||||
except:
|
||||
major_exception()
|
||||
|
||||
def check_os():
|
||||
"""Set OS specific variables."""
|
||||
tmp = {}
|
||||
|
||||
# Query registry
|
||||
path = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion'
|
||||
with winreg.OpenKey(HKLM, path) as key:
|
||||
for name in ['CurrentBuild', 'CurrentVersion', 'ProductName']:
|
||||
try:
|
||||
tmp[name] = winreg.QueryValueEx(key, name)[0]
|
||||
except FileNotFoundError:
|
||||
tmp[name] = 'Unknown'
|
||||
try:
|
||||
tmp['CurrentBuild'] = int(tmp['CurrentBuild'])
|
||||
except ValueError:
|
||||
# This should be interesting...
|
||||
tmp['CurrentBuild'] = -1
|
||||
try:
|
||||
tmp['CurrentVersion'] = float(tmp['CurrentVersion'])
|
||||
except ValueError:
|
||||
# This should also be interesting...
|
||||
tmp['CurrentVersion'] = -1
|
||||
|
||||
# Check bit depth
|
||||
tmp['Arch'] = 32
|
||||
if 'PROGRAMFILES(X86)' in global_vars['Env']:
|
||||
tmp['Arch'] = 64
|
||||
|
||||
# Set name
|
||||
tmp['Name'] = tmp['ProductName']
|
||||
if tmp['CurrentBuild'] == 7601:
|
||||
tmp['Name'] += ' SP1' # Win 7
|
||||
if tmp['CurrentBuild'] == 9600:
|
||||
tmp['Name'] += ' Update' # Win 8.1u
|
||||
if tmp['CurrentBuild'] == 10240:
|
||||
tmp['Name'] += ' Release 1507 "Threshold 1"'
|
||||
if tmp['CurrentBuild'] == 10586:
|
||||
tmp['Name'] += ' Release 1511 "Threshold 2"'
|
||||
if tmp['CurrentBuild'] == 14393:
|
||||
tmp['Name'] += ' Release 1607 "Redstone 1" / "Anniversary Update"'
|
||||
if tmp['CurrentBuild'] == 15063:
|
||||
tmp['Name'] += ' Release 1703 "Redstone 2" / "Creators Update"'
|
||||
if tmp['CurrentBuild'] == 16299:
|
||||
tmp['Name'] += ' Release 1709 "Redstone 3" / "Fall Creators Update"'
|
||||
tmp['Name'] = re.sub(r'\s+', ' ', tmp['Name'])
|
||||
|
||||
# Set display name
|
||||
tmp['DisplayName'] = '{} x{}'.format(tmp['Name'], tmp['Arch'])
|
||||
if tmp['CurrentBuild'] in [7600, 9200, 10240, 10586]:
|
||||
tmp['DisplayName'] += ' (very outdated)'
|
||||
elif tmp['CurrentBuild'] in [7601, 9600, 14393, 15063]:
|
||||
tmp['DisplayName'] += ' (outdated)'
|
||||
elif tmp['CurrentBuild'] == 16299:
|
||||
pass # Current Win10 release
|
||||
else:
|
||||
tmp['DisplayName'] += ' (unrecognized)'
|
||||
|
||||
# Set version
|
||||
if tmp['CurrentVersion'] == 6.0:
|
||||
tmp['Version'] = 'Vista'
|
||||
elif tmp['CurrentVersion'] == 6.1:
|
||||
tmp['Version'] = '7'
|
||||
elif 6.2 <= tmp['CurrentVersion'] <= 6.3:
|
||||
if tmp['CurrentBuild'] <= 9600:
|
||||
tmp['Version'] = '8'
|
||||
elif tmp['CurrentBuild'] >= 10240:
|
||||
tmp['Version'] = '10'
|
||||
else:
|
||||
tmp['Version'] = 'Unknown'
|
||||
|
||||
# == vista ==
|
||||
# 6.0.6000
|
||||
# 6.0.6001 # SP1
|
||||
# 6.0.6002 # SP2
|
||||
# ==== 7 ====
|
||||
# 6.1.7600
|
||||
# 6.1.7601 # SP1
|
||||
# 6.1.7602 # Umm.. where'd this come from?
|
||||
# ==== 8 ====
|
||||
# 6.2.9200
|
||||
# === 8.1 ===
|
||||
# 6.3.9200
|
||||
# === 8.1u ==
|
||||
# 6.3.9600
|
||||
# === 10 v1507 "Threshold 1" ==
|
||||
# 6.3.10240
|
||||
# === 10 v1511 "Threshold 2" ==
|
||||
# 6.3.10586
|
||||
# === 10 v1607 "Redstone 1" "Anniversary Update" ==
|
||||
# 6.3.14393
|
||||
# === 10 v1703 "Redstone 2" "Creators Update" ==
|
||||
# 6.3.15063
|
||||
# === 10 v1709 "Redstone 3" "Fall Creators Update" ==
|
||||
# 6.3.16299
|
||||
global_vars['OS'] = tmp
|
||||
|
||||
def check_tools():
|
||||
"""Set tool variables based on OS bit-depth and tool availability."""
|
||||
if global_vars['OS'].get('Arch', 32) == 64:
|
||||
global_vars['Tools'] = {
|
||||
k: v.get('64', v.get('32')) for (k, v) in TOOLS.items()}
|
||||
else:
|
||||
global_vars['Tools'] = {k: v.get('32') for (k, v) in TOOLS.items()}
|
||||
|
||||
# Fix paths
|
||||
global_vars['Tools'] = {k: os.path.join(global_vars['BinDir'], v)
|
||||
for (k, v) in global_vars['Tools'].items()}
|
||||
|
||||
def clean_env_vars():
|
||||
"""Remove conflicting global_vars and env variables.
|
||||
|
||||
This fixes an issue where both global_vars and
|
||||
global_vars['Env'] are expanded at the same time."""
|
||||
for key in global_vars.keys():
|
||||
global_vars['Env'].pop(key, None)
|
||||
|
||||
def find_bin():
|
||||
"""Find .bin folder in the cwd or it's parents."""
|
||||
wd = os.getcwd()
|
||||
base = None
|
||||
while base is None:
|
||||
if os.path.exists('.bin'):
|
||||
base = os.getcwd()
|
||||
break
|
||||
if re.fullmatch(r'\w:\\', os.getcwd()):
|
||||
break
|
||||
os.chdir('..')
|
||||
os.chdir(wd)
|
||||
if base is None:
|
||||
raise BinNotFoundError
|
||||
global_vars['BaseDir'] = base
|
||||
|
||||
def make_tmp_dirs():
|
||||
"""Make temp directories."""
|
||||
os.makedirs(global_vars['BackupDir'], exist_ok=True)
|
||||
os.makedirs(global_vars['LogDir'], exist_ok=True)
|
||||
os.makedirs(global_vars['TmpDir'], exist_ok=True)
|
||||
|
||||
def set_common_vars():
|
||||
"""Set common variables."""
|
||||
global_vars['Date'] = time.strftime("%Y-%m-%d")
|
||||
global_vars['Date-Time'] = time.strftime("%Y-%m-%d_%H%M_%z")
|
||||
global_vars['Env'] = os.environ.copy()
|
||||
|
||||
global_vars['ArchivePassword'] = ARCHIVE_PASSWORD
|
||||
global_vars['BinDir'] = r'{BaseDir}\.bin'.format(
|
||||
**global_vars)
|
||||
global_vars['CBinDir'] = r'{BaseDir}\.cbin'.format(
|
||||
**global_vars)
|
||||
global_vars['ClientDir'] = r'{SYSTEMDRIVE}\{prefix}'.format(
|
||||
prefix=KIT_NAME_SHORT, **global_vars['Env'])
|
||||
global_vars['BackupDir'] = r'{ClientDir}\Backups\{Date}'.format(
|
||||
**global_vars)
|
||||
global_vars['LogDir'] = r'{ClientDir}\Info\{Date}'.format(
|
||||
**global_vars)
|
||||
global_vars['ProgBackupDir'] = r'{ClientDir}\Backups'.format(
|
||||
**global_vars)
|
||||
global_vars['QuarantineDir'] = r'{ClientDir}\Quarantine'.format(
|
||||
**global_vars)
|
||||
global_vars['TmpDir'] = r'{BinDir}\tmp'.format(
|
||||
**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,628 +0,0 @@
|
|||
# Wizard Kit: Functions - Data
|
||||
|
||||
import ctypes
|
||||
|
||||
from operator import itemgetter
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# Classes
|
||||
class LocalDisk():
|
||||
def __init__(self, disk):
|
||||
self.disk = disk
|
||||
self.name = disk.mountpoint.upper()
|
||||
self.path = self.name
|
||||
def is_dir(self):
|
||||
# Should always be true
|
||||
return True
|
||||
|
||||
# Regex
|
||||
REGEX_EXCL_ITEMS = re.compile(
|
||||
r'^(\.(AppleDB|AppleDesktop|AppleDouble'
|
||||
r'|com\.apple\.timemachine\.supported|dbfseventsd'
|
||||
r'|DocumentRevisions-V100.*|DS_Store|fseventsd|PKInstallSandboxManager'
|
||||
r'|Spotlight.*|SymAV.*|symSchedScanLockxz|TemporaryItems|Trash.*'
|
||||
r'|vol|VolumeIcon\.icns)|desktop\.(ini|.*DB|.*DF)'
|
||||
r'|(hiberfil|pagefile)\.sys|lost\+found|Network\.*Trash\.*Folder'
|
||||
r'|Recycle[dr]|System\.*Volume\.*Information|Temporary\.*Items'
|
||||
r'|Thumbs\.db)$',
|
||||
re.IGNORECASE)
|
||||
REGEX_EXCL_ROOT_ITEMS = re.compile(
|
||||
r'^\\?(boot(mgr|nxt)$|Config.msi'
|
||||
r'|(eula|globdata|install|vc_?red)'
|
||||
r'|.*.sys$|System Volume Information|RECYCLER?|\$Recycle\.bin'
|
||||
r'|\$?Win(dows(.old.*|\.~BT|)$|RE_)|\$GetCurrent|Windows10Upgrade'
|
||||
r'|PerfLogs|Program Files|SYSTEM.SAV'
|
||||
r'|.*\.(esd|swm|wim|dd|map|dmg|image)$)',
|
||||
re.IGNORECASE)
|
||||
REGEX_INCL_ROOT_ITEMS = re.compile(
|
||||
r'^\\?(AdwCleaner|(My\s*|)(Doc(uments?( and Settings|)|s?)|Downloads'
|
||||
r'|Media|Music|Pic(ture|)s?|Vid(eo|)s?)'
|
||||
r'|{prefix}(-?Info|-?Transfer|)'
|
||||
r'|(ProgramData|Recovery|Temp.*|Users)$'
|
||||
r'|.*\.(log|txt|rtf|qb\w*|avi|m4a|m4v|mp4|mkv|jpg|png|tiff?)$)'
|
||||
r''.format(prefix=KIT_NAME_SHORT),
|
||||
re.IGNORECASE)
|
||||
REGEX_WIM_FILE = re.compile(
|
||||
r'\.wim$',
|
||||
re.IGNORECASE)
|
||||
REGEX_WINDOWS_OLD = re.compile(
|
||||
r'^\\Win(dows|)\.old',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
FAST_COPY_EXCLUDES = [
|
||||
r'\*.esd',
|
||||
r'\*.swm',
|
||||
r'\*.wim',
|
||||
r'\*.dd',
|
||||
r'\*.dd.tgz',
|
||||
r'\*.dd.txz',
|
||||
r'\*.map',
|
||||
r'\*.dmg',
|
||||
r'\*.image',
|
||||
r'$RECYCLE.BIN',
|
||||
r'$Recycle.Bin',
|
||||
r'.AppleDB',
|
||||
r'.AppleDesktop',
|
||||
r'.AppleDouble',
|
||||
r'.com.apple.timemachine.supported',
|
||||
r'.dbfseventsd',
|
||||
r'.DocumentRevisions-V100*',
|
||||
r'.DS_Store',
|
||||
r'.fseventsd',
|
||||
r'.PKInstallSandboxManager',
|
||||
r'.Spotlight*',
|
||||
r'.SymAV*',
|
||||
r'.symSchedScanLockxz',
|
||||
r'.TemporaryItems',
|
||||
r'.Trash*',
|
||||
r'.vol',
|
||||
r'.VolumeIcon.icns',
|
||||
r'desktop.ini',
|
||||
r'Desktop?DB',
|
||||
r'Desktop?DF',
|
||||
r'hiberfil.sys',
|
||||
r'lost+found',
|
||||
r'Network?Trash?Folder',
|
||||
r'pagefile.sys',
|
||||
r'Recycled',
|
||||
r'RECYCLER',
|
||||
r'System?Volume?Information',
|
||||
r'Temporary?Items',
|
||||
r'Thumbs.db',
|
||||
]
|
||||
FAST_COPY_ARGS = [
|
||||
'/cmd=noexist_only',
|
||||
'/utf8',
|
||||
'/skip_empty_dir',
|
||||
'/linkdest',
|
||||
'/no_ui',
|
||||
'/auto_close',
|
||||
'/exclude={}'.format(';'.join(FAST_COPY_EXCLUDES)),
|
||||
]
|
||||
# Code borrowed from: https://stackoverflow.com/a/29075319
|
||||
SEM_NORMAL = ctypes.c_uint()
|
||||
SEM_FAILCRITICALERRORS = 1
|
||||
SEM_NOOPENFILEERRORBOX = 0x8000
|
||||
SEM_FAIL = SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS
|
||||
|
||||
def cleanup_transfer(dest_path):
|
||||
"""Fix attributes and move extraneous items outside the Transfer folder."""
|
||||
try:
|
||||
# Remove dest_path if empty
|
||||
os.rmdir(dest_path)
|
||||
except OSError:
|
||||
pass
|
||||
if not os.path.exists(dest_path):
|
||||
# Bail if dest_path was empty and removed
|
||||
raise Exception
|
||||
|
||||
# Fix attributes
|
||||
cmd = ['attrib', '-a', '-h', '-r', '-s', dest_path]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
for root, dirs, files in os.walk(dest_path, topdown=False):
|
||||
for name in dirs:
|
||||
# Remove empty directories and junction points
|
||||
try:
|
||||
os.rmdir(os.path.join(root, name))
|
||||
except OSError:
|
||||
pass
|
||||
for name in files:
|
||||
# "Remove" files based on exclusion regex
|
||||
if REGEX_EXCL_ITEMS.search(name):
|
||||
# Make dest folder
|
||||
dest_name = root.replace(dest_path, dest_path+'.Removed')
|
||||
os.makedirs(dest_name, exist_ok=True)
|
||||
# Set dest filename
|
||||
dest_name = os.path.join(dest_name, name)
|
||||
dest_name = non_clobber_rename(dest_name)
|
||||
source_name = os.path.join(root, name)
|
||||
try:
|
||||
shutil.move(source_name, dest_name)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def is_valid_wim_file(item):
|
||||
"""Checks if the provided os.DirEntry is a valid WIM file, returns bool."""
|
||||
valid = bool(item.is_file() and REGEX_WIM_FILE.search(item.name))
|
||||
if valid:
|
||||
extract_item('wimlib', silent=True)
|
||||
cmd = [global_vars['Tools']['wimlib-imagex'], 'info', item.path]
|
||||
try:
|
||||
run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
valid = False
|
||||
print_log('WARNING: Image "{}" damaged.'.format(item.name))
|
||||
return valid
|
||||
|
||||
def mount_backup_shares():
|
||||
"""Mount the backup shares unless labeled as already mounted."""
|
||||
for server in BACKUP_SERVERS:
|
||||
# Blindly skip if we mounted earlier
|
||||
if server['Mounted']:
|
||||
continue
|
||||
|
||||
mount_network_share(server)
|
||||
|
||||
def mount_network_share(server):
|
||||
"""Mount a network share defined by server."""
|
||||
# Test connection
|
||||
try:
|
||||
ping(server['IP'])
|
||||
except subprocess.CalledProcessError:
|
||||
print_error(
|
||||
r'Failed to mount \\{Name}\{Share}, {IP} unreachable.'.format(
|
||||
**server))
|
||||
sleep(1)
|
||||
return False
|
||||
|
||||
# Mount
|
||||
cmd = r'net use \\{IP}\{Share} /user:{User} {Pass}'.format(**server)
|
||||
cmd = cmd.split(' ')
|
||||
try:
|
||||
run_program(cmd)
|
||||
except Exception:
|
||||
print_warning(r'Failed to mount \\{Name}\{Share} ({IP})'.format(
|
||||
**server))
|
||||
sleep(1)
|
||||
else:
|
||||
print_info('Mounted {Name}'.format(**server))
|
||||
server['Mounted'] = True
|
||||
|
||||
def run_fast_copy(items, dest):
|
||||
"""Copy items to dest using FastCopy."""
|
||||
if not items:
|
||||
raise Exception
|
||||
|
||||
cmd = [global_vars['Tools']['FastCopy'], *FAST_COPY_ARGS]
|
||||
if 'LogFile' in global_vars:
|
||||
cmd.append('/logfile={LogFile}'.format(**global_vars))
|
||||
cmd.extend(items)
|
||||
cmd.append('/to={}\\'.format(dest))
|
||||
|
||||
run_program(cmd)
|
||||
|
||||
def run_wimextract(source, items, dest):
|
||||
"""Extract items from source WIM to dest folder."""
|
||||
if not items:
|
||||
raise Exception
|
||||
extract_item('wimlib', silent=True)
|
||||
|
||||
# Write files.txt
|
||||
with open(r'{}\wim_files.txt'.format(global_vars['TmpDir']), 'w') as f:
|
||||
# Defaults
|
||||
for item in items:
|
||||
f.write('{}\n'.format(item))
|
||||
sleep(1) # For safety?
|
||||
|
||||
# Extract files
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'extract',
|
||||
source, '1',
|
||||
r'@{}\wim_files.txt'.format(global_vars['TmpDir']),
|
||||
'--dest-dir={}\\'.format(dest),
|
||||
'--no-acls',
|
||||
'--nullglob']
|
||||
run_program(cmd)
|
||||
|
||||
def scan_source(source_obj, dest_path):
|
||||
"""Scan source for files/folders to transfer."""
|
||||
selected_items = []
|
||||
|
||||
if source_obj.is_dir():
|
||||
# File-Based
|
||||
print_standard('Scanning source (folder): {}'.format(source_obj.path))
|
||||
selected_items = scan_source_path(source_obj.path, dest_path)
|
||||
else:
|
||||
# Image-Based
|
||||
if REGEX_WIM_FILE.search(source_obj.name):
|
||||
print_standard('Scanning source (image): {}'.format(
|
||||
source_obj.path))
|
||||
selected_items = scan_source_wim(source_obj.path, dest_path)
|
||||
else:
|
||||
print_error('ERROR: Unsupported image: {}'.format(
|
||||
source_obj.path))
|
||||
raise GenericError
|
||||
|
||||
return selected_items
|
||||
|
||||
def scan_source_path(source_path, dest_path, rel_path=None, interactive=True):
|
||||
"""Scan source folder for files/folders to transfer, returns list.
|
||||
|
||||
This will scan the root and (recursively) any Windows.old folders."""
|
||||
rel_path = '\\' + rel_path if rel_path else ''
|
||||
if rel_path:
|
||||
dest_path = dest_path + rel_path
|
||||
selected_items = []
|
||||
win_olds = []
|
||||
|
||||
# Root items
|
||||
root_items = []
|
||||
for item in os.scandir(source_path):
|
||||
if REGEX_INCL_ROOT_ITEMS.search(item.name):
|
||||
root_items.append(item.path)
|
||||
elif not REGEX_EXCL_ROOT_ITEMS.search(item.name):
|
||||
if (not interactive
|
||||
or ask('Copy: "{}{}" ?'.format(rel_path, item.name))):
|
||||
root_items.append(item.path)
|
||||
if REGEX_WINDOWS_OLD.search(item.name):
|
||||
win_olds.append(item)
|
||||
if root_items:
|
||||
selected_items.append({
|
||||
'Message': '{}Root Items...'.format(rel_path),
|
||||
'Items': root_items.copy(),
|
||||
'Destination': dest_path})
|
||||
|
||||
# Fonts
|
||||
if os.path.exists(r'{}\Windows\Fonts'.format(source_path)):
|
||||
selected_items.append({
|
||||
'Message': '{}Fonts...'.format(rel_path),
|
||||
'Items': [r'{}\Windows\Fonts'.format(rel_path)],
|
||||
'Destination': r'{}\Windows'.format(dest_path)})
|
||||
|
||||
# Registry
|
||||
registry_items = []
|
||||
for folder in ['config', 'OEM']:
|
||||
folder = r'Windows\System32\{}'.format(folder)
|
||||
folder = os.path.join(source_path, folder)
|
||||
if os.path.exists(folder):
|
||||
registry_items.append(folder)
|
||||
if registry_items:
|
||||
selected_items.append({
|
||||
'Message': '{}Registry...'.format(rel_path),
|
||||
'Items': registry_items.copy(),
|
||||
'Destination': r'{}\Windows\System32'.format(dest_path)})
|
||||
|
||||
# Windows.old(s)
|
||||
for old in win_olds:
|
||||
selected_items.append(
|
||||
scan_source_path(
|
||||
old.path, dest_path, rel_path=old.name, interactive=False))
|
||||
|
||||
# Done
|
||||
return selected_items
|
||||
|
||||
def scan_source_wim(source_wim, dest_path, rel_path=None, interactive=True):
|
||||
"""Scan source WIM file for files/folders to transfer, returns list.
|
||||
|
||||
This will scan the root and (recursively) any Windows.old folders."""
|
||||
rel_path = '\\' + rel_path if rel_path else ''
|
||||
selected_items = []
|
||||
win_olds = []
|
||||
|
||||
# Scan source
|
||||
extract_item('wimlib', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'], 'dir',
|
||||
source_wim, '1']
|
||||
try:
|
||||
file_list = run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
print_error('ERROR: Failed to get file list.')
|
||||
raise
|
||||
|
||||
# Root Items
|
||||
file_list = [i.strip()
|
||||
for i in file_list.stdout.decode('utf-8', 'ignore').splitlines()
|
||||
if i.count('\\') == 1 and i.strip() != '\\']
|
||||
root_items = []
|
||||
if rel_path:
|
||||
file_list = [i.replace(rel_path, '') for i in file_list]
|
||||
for item in file_list:
|
||||
if REGEX_INCL_ROOT_ITEMS.search(item):
|
||||
root_items.append(item)
|
||||
elif not REGEX_EXCL_ROOT_ITEMS.search(item):
|
||||
if (not interactive
|
||||
or ask('Extract: "{}{}" ?'.format(rel_path, item))):
|
||||
root_items.append('{}{}'.format(rel_path, item))
|
||||
if REGEX_WINDOWS_OLD.search(item):
|
||||
win_olds.append(item)
|
||||
if root_items:
|
||||
selected_items.append({
|
||||
'Message': '{}Root Items...'.format(rel_path),
|
||||
'Items': root_items.copy(),
|
||||
'Destination': dest_path})
|
||||
|
||||
# Fonts
|
||||
if wim_contains(source_wim, r'{}Windows\Fonts'.format(rel_path)):
|
||||
selected_items.append({
|
||||
'Message': '{}Fonts...'.format(rel_path),
|
||||
'Items': [r'{}\Windows\Fonts'.format(rel_path)],
|
||||
'Destination': dest_path})
|
||||
|
||||
# Registry
|
||||
registry_items = []
|
||||
for folder in ['config', 'OEM']:
|
||||
folder = r'{}Windows\System32\{}'.format(rel_path, folder)
|
||||
if wim_contains(source_wim, folder):
|
||||
registry_items.append(folder)
|
||||
if registry_items:
|
||||
selected_items.append({
|
||||
'Message': '{}Registry...'.format(rel_path),
|
||||
'Items': registry_items.copy(),
|
||||
'Destination': dest_path})
|
||||
|
||||
# Windows.old(s)
|
||||
for old in win_olds:
|
||||
scan_source_wim(source_wim, dest_path, rel_path=old, interactive=False)
|
||||
|
||||
# Done
|
||||
return selected_items
|
||||
|
||||
def select_destination(folder_path, prompt='Select destination'):
|
||||
"""Select destination drive, returns path as string."""
|
||||
disk = select_volume(prompt)
|
||||
if 'fixed' not in disk['Disk'].opts:
|
||||
folder_path = folder_path.replace('\\', '-')
|
||||
path = '{disk}{folder_path}_{Date}'.format(
|
||||
disk = disk['Disk'].mountpoint,
|
||||
folder_path = folder_path,
|
||||
**global_vars)
|
||||
|
||||
# Avoid merging with existing folder
|
||||
path = non_clobber_rename(path)
|
||||
os.makedirs(path, exist_ok=True)
|
||||
|
||||
return path
|
||||
|
||||
def select_source(ticket_number):
|
||||
"""Select backup from those found on the BACKUP_SERVERS for the ticket."""
|
||||
selected_source = None
|
||||
local_sources = []
|
||||
remote_sources = []
|
||||
sources = []
|
||||
mount_backup_shares()
|
||||
|
||||
# Check for ticket folders on servers
|
||||
for server in BACKUP_SERVERS:
|
||||
if server['Mounted']:
|
||||
print_standard('Scanning {}...'.format(server['Name']))
|
||||
for d in os.scandir(r'\\{IP}\{Share}'.format(**server)):
|
||||
if (d.is_dir()
|
||||
and d.name.lower().startswith(ticket_number.lower())):
|
||||
# Add folder to remote_sources
|
||||
remote_sources.append({
|
||||
'Name': '{:9}| File-Based: [DIR] {}'.format(
|
||||
server['Name'], d.name),
|
||||
'Server': server,
|
||||
'Sort': d.name,
|
||||
'Source': d})
|
||||
|
||||
# Check for images and subfolders
|
||||
for ticket_path in remote_sources.copy():
|
||||
for item in os.scandir(ticket_path['Source'].path):
|
||||
if item.is_dir():
|
||||
# Add folder to remote_sources
|
||||
remote_sources.append({
|
||||
'Name': r'{:9}| File-Based: [DIR] {}\{}'.format(
|
||||
ticket_path['Server']['Name'], # Server
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Sub-folder
|
||||
),
|
||||
'Server': ticket_path['Server'],
|
||||
'Sort': r'{}\{}'.format(
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Sub-folder
|
||||
),
|
||||
'Source': item})
|
||||
|
||||
# Check for images in folder
|
||||
for subitem in os.scandir(item.path):
|
||||
if REGEX_WIM_FILE.search(item.name):
|
||||
# Add image to remote_sources
|
||||
try:
|
||||
size = human_readable_size(item.stat().st_size)
|
||||
except Exception:
|
||||
size = ' ? ?' # unknown
|
||||
remote_sources.append({
|
||||
'Disabled': bool(not is_valid_wim_file(subitem)),
|
||||
'Name': r'{:9}| Image-Based: {:>7} {}\{}\{}'.format(
|
||||
ticket_path['Server']['Name'], # Server
|
||||
size, # Size (duh)
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Sub-folder
|
||||
subitem.name, # Image file
|
||||
),
|
||||
'Server': ticket_path['Server'],
|
||||
'Sort': r'{}\{}\{}'.format(
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Sub-folder
|
||||
subitem.name, # Image file
|
||||
),
|
||||
'Source': subitem})
|
||||
elif REGEX_WIM_FILE.search(item.name):
|
||||
# Add image to remote_sources
|
||||
try:
|
||||
size = human_readable_size(item.stat().st_size)
|
||||
except Exception:
|
||||
size = ' ? ?' # unknown
|
||||
remote_sources.append({
|
||||
'Disabled': bool(not is_valid_wim_file(item)),
|
||||
'Name': r'{:9}| Image-Based: {:>7} {}\{}'.format(
|
||||
ticket_path['Server']['Name'], # Server
|
||||
size, # Size (duh)
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Image file
|
||||
),
|
||||
'Server': ticket_path['Server'],
|
||||
'Sort': r'{}\{}'.format(
|
||||
ticket_path['Source'].name, # Ticket folder
|
||||
item.name, # Image file
|
||||
),
|
||||
'Source': item})
|
||||
|
||||
# Check for local sources
|
||||
print_standard('Scanning for local sources...')
|
||||
set_thread_error_mode(silent=True) # Prevents "No disk" popups
|
||||
sys_drive = global_vars['Env']['SYSTEMDRIVE']
|
||||
for d in psutil.disk_partitions():
|
||||
if re.search(r'^{}'.format(sys_drive), d.mountpoint, re.IGNORECASE):
|
||||
# Skip current OS drive
|
||||
continue
|
||||
if 'fixed' in d.opts:
|
||||
# Skip DVD, etc
|
||||
local_sources.append({
|
||||
'Name': '{:9}| File-Based: [DISK] {}'.format(
|
||||
' Local', d.mountpoint),
|
||||
'Sort': d.mountpoint,
|
||||
'Source': LocalDisk(d)})
|
||||
set_thread_error_mode(silent=False) # Return to normal
|
||||
|
||||
# Build Menu
|
||||
local_sources.sort(key=itemgetter('Sort'))
|
||||
remote_sources.sort(key=itemgetter('Sort'))
|
||||
sources.extend(local_sources)
|
||||
sources.extend(remote_sources)
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
|
||||
# Select backup from sources
|
||||
if len(sources) > 0:
|
||||
selection = menu_select(
|
||||
'Which backup are we using?',
|
||||
main_entries=sources,
|
||||
action_entries=actions,
|
||||
disabled_label='DAMAGED')
|
||||
if selection == 'Q':
|
||||
umount_backup_shares()
|
||||
exit_script()
|
||||
else:
|
||||
selected_source = sources[int(selection)-1]['Source']
|
||||
else:
|
||||
print_error('ERROR: No backups found for ticket: {}.'.format(
|
||||
ticket_number))
|
||||
umount_backup_shares()
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
|
||||
# Done
|
||||
return selected_source
|
||||
|
||||
def select_volume(title='Select disk', auto_select=True):
|
||||
"""Select disk from attached disks. returns dict."""
|
||||
actions = [{'Name': 'Quit', 'Letter': 'Q'}]
|
||||
disks = []
|
||||
|
||||
# Build list of disks
|
||||
set_thread_error_mode(silent=True) # Prevents "No disk" popups
|
||||
for d in psutil.disk_partitions():
|
||||
info = {
|
||||
'Disk': d,
|
||||
'Name': d.mountpoint}
|
||||
try:
|
||||
usage = psutil.disk_usage(d.device)
|
||||
free = '{free} / {total} available'.format(
|
||||
free = human_readable_size(usage.free, 2),
|
||||
total = human_readable_size(usage.total, 2))
|
||||
except Exception:
|
||||
# Meh, leaving unsupported destinations out
|
||||
pass
|
||||
# free = 'Unknown'
|
||||
# info['Disabled'] = True
|
||||
else:
|
||||
info['Display Name'] = '{} ({})'.format(info['Name'], free)
|
||||
disks.append(info)
|
||||
set_thread_error_mode(silent=False) # Return to normal
|
||||
|
||||
# Skip menu?
|
||||
if len(disks) == 1 and auto_select:
|
||||
return disks[0]
|
||||
|
||||
# Show menu
|
||||
selection = menu_select(title, main_entries=disks, action_entries=actions)
|
||||
if selection == 'Q':
|
||||
exit_script()
|
||||
else:
|
||||
return disks[int(selection)-1]
|
||||
|
||||
def set_thread_error_mode(silent=True):
|
||||
"""Disable or Enable Windows error message dialogs.
|
||||
|
||||
Disable when scanning for disks to avoid popups for empty cardreaders, etc
|
||||
"""
|
||||
# Code borrowed from: https://stackoverflow.com/a/29075319
|
||||
kernel32 = ctypes.WinDLL('kernel32')
|
||||
|
||||
if silent:
|
||||
kernel32.SetThreadErrorMode(SEM_FAIL, ctypes.byref(SEM_NORMAL))
|
||||
else:
|
||||
kernel32.SetThreadErrorMode(SEM_NORMAL, ctypes.byref(SEM_NORMAL))
|
||||
|
||||
def transfer_source(source_obj, dest_path, selected_items):
|
||||
"""Transfer, or extract, files/folders from source to destination."""
|
||||
if source_obj.is_dir():
|
||||
# Run FastCopy for each selection "group"
|
||||
for group in selected_items:
|
||||
try_and_print(message=group['Message'],
|
||||
function=run_fast_copy, cs='Done',
|
||||
items=group['Items'],
|
||||
dest=group['Destination'])
|
||||
else:
|
||||
if REGEX_WIM_FILE.search(source_obj.name):
|
||||
# Extract files from WIM
|
||||
for group in selected_items:
|
||||
try_and_print(message=group['Message'],
|
||||
function=run_wimextract, cs='Done',
|
||||
source=source_obj.path,
|
||||
items=group['Items'],
|
||||
dest=group['Destination'])
|
||||
else:
|
||||
print_error('ERROR: Unsupported image: {}'.format(source_obj.path))
|
||||
raise GenericError
|
||||
|
||||
def umount_backup_shares():
|
||||
"""Unnount the backup shares regardless of current status."""
|
||||
for server in BACKUP_SERVERS:
|
||||
umount_network_share(server)
|
||||
|
||||
def umount_network_share(server):
|
||||
"""Unnount a network share defined by server."""
|
||||
cmd = r'net use \\{IP}\{Share} /delete'.format(**server)
|
||||
cmd = cmd.split(' ')
|
||||
try:
|
||||
run_program(cmd)
|
||||
except Exception:
|
||||
print_error(r'Failed to umount \\{Name}\{Share}.'.format(**server))
|
||||
sleep(1)
|
||||
else:
|
||||
print_info('Umounted {Name}'.format(**server))
|
||||
server['Mounted'] = False
|
||||
|
||||
def wim_contains(source_path, file_path):
|
||||
"""Check if the WIM contains a file or folder."""
|
||||
_cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'], 'dir',
|
||||
source_path, '1',
|
||||
'--path={}'.format(file_path),
|
||||
'--one-file-only']
|
||||
try:
|
||||
run_program(_cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,114 +0,0 @@
|
|||
# Wizard Kit: Functions - Diagnostics
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
AUTORUNS_SETTINGS = {
|
||||
r'Software\Sysinternals\AutoRuns': {
|
||||
'checkvirustotal': 1,
|
||||
'EulaAccepted': 1,
|
||||
'shownomicrosoft': 1,
|
||||
'shownowindows': 1,
|
||||
'showonlyvirustotal': 1,
|
||||
'submitvirustotal': 0,
|
||||
'verifysignatures': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\SigCheck': {
|
||||
'EulaAccepted': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\Streams': {
|
||||
'EulaAccepted': 1,
|
||||
},
|
||||
r'Software\Sysinternals\AutoRuns\VirusTotal': {
|
||||
'VirusTotalTermsAccepted': 1,
|
||||
},
|
||||
}
|
||||
|
||||
def check_connection():
|
||||
"""Check if the system is online and optionally abort the script."""
|
||||
while True:
|
||||
result = try_and_print(message='Ping test...', function=ping, cs='OK')
|
||||
if result['CS']:
|
||||
break
|
||||
else:
|
||||
if not ask('ERROR: System appears offline, try again?'):
|
||||
if ask('Continue anyway?'):
|
||||
break
|
||||
else:
|
||||
abort()
|
||||
|
||||
def run_autoruns():
|
||||
"""Run AutoRuns in the background with VirusTotal checks enabled."""
|
||||
extract_item('Autoruns', filter='autoruns*', silent=True)
|
||||
# Update AutoRuns settings before running
|
||||
for path, settings in AUTORUNS_SETTINGS.items():
|
||||
winreg.CreateKey(HKCU, path)
|
||||
with winreg.OpenKey(HKCU, path, access=winreg.KEY_WRITE) as key:
|
||||
for name, value in settings.items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
||||
popen_program(global_vars['Tools']['AutoRuns'], minimized=True)
|
||||
|
||||
def run_hwinfo_sensors():
|
||||
"""Run HWiNFO sensors."""
|
||||
path = r'{BinDir}\HWiNFO'.format(**global_vars)
|
||||
for bit in [32, 64]:
|
||||
# Configure
|
||||
source = r'{}\general.ini'.format(path)
|
||||
dest = r'{}\HWiNFO{}.ini'.format(path, bit)
|
||||
shutil.copy(source, dest)
|
||||
with open(dest, 'a') as f:
|
||||
f.write('SensorsOnly=1\n')
|
||||
f.write('SummaryOnly=0\n')
|
||||
popen_program(global_vars['Tools']['HWiNFO'])
|
||||
|
||||
def run_xmplay():
|
||||
"""Run XMPlay to test audio."""
|
||||
extract_item('XMPlay', silent=True)
|
||||
cmd = [global_vars['Tools']['XMPlay'],
|
||||
r'{BinDir}\XMPlay\music.7z'.format(**global_vars)]
|
||||
popen_program(cmd)
|
||||
|
||||
def run_hitmanpro():
|
||||
"""Run HitmanPro in the background."""
|
||||
extract_item('HitmanPro', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['HitmanPro'],
|
||||
'/quiet', '/noinstall', '/noupload',
|
||||
r'/log={LogDir}\hitman.xml'.format(**global_vars)]
|
||||
popen_program(cmd)
|
||||
|
||||
def run_process_killer():
|
||||
"""Kill most running processes skipping those in the whitelist.txt."""
|
||||
# borrowed from TronScript (reddit.com/r/TronScript)
|
||||
# credit to /u/cuddlychops06
|
||||
prev_dir = os.getcwd()
|
||||
extract_item('ProcessKiller', silent=True)
|
||||
os.chdir(r'{BinDir}\ProcessKiller'.format(**global_vars))
|
||||
run_program(['ProcessKiller.exe', '/silent'], check=False)
|
||||
os.chdir(prev_dir)
|
||||
|
||||
def run_rkill():
|
||||
"""Run RKill and cleanup afterwards."""
|
||||
extract_item('RKill', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['RKill'],
|
||||
'-l', r'{LogDir}\RKill.log'.format(**global_vars),
|
||||
'-new_console:n', '-new_console:s33V']
|
||||
run_program(cmd, check=False)
|
||||
wait_for_process('RKill')
|
||||
kill_process('notepad.exe')
|
||||
|
||||
# RKill cleanup
|
||||
desktop_path = r'{USERPROFILE}\Desktop'.format(**global_vars['Env'])
|
||||
if os.path.exists(desktop_path):
|
||||
for item in os.scandir(desktop_path):
|
||||
if re.search(r'^RKill', item.name, re.IGNORECASE):
|
||||
dest = re.sub(r'^(.*)\.', '\1_{Date-Time}.'.format(
|
||||
**global_vars), item.name)
|
||||
dest = r'{ClientDir}\Info\{name}'.format(
|
||||
name=dest, **global_vars)
|
||||
dest = non_clobber_rename(dest)
|
||||
shutil.move(item.path, dest)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,382 +0,0 @@
|
|||
# Wizard Kit: Functions - Disk
|
||||
|
||||
from functions.common import *
|
||||
from functions import partition_uids
|
||||
|
||||
# Regex
|
||||
REGEX_BAD_PARTITION = re.compile(r'(RAW|Unknown)', re.IGNORECASE)
|
||||
REGEX_DISK_GPT = re.compile(
|
||||
r'Disk ID: {[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+-[A-Z0-9]+}',
|
||||
re.IGNORECASE)
|
||||
REGEX_DISK_MBR = re.compile(r'Disk ID: [A-Z0-9]+', re.IGNORECASE)
|
||||
REGEX_DISK_RAW = re.compile(r'Disk ID: 00000000', re.IGNORECASE)
|
||||
|
||||
def assign_volume_letters():
|
||||
remove_volume_letters()
|
||||
|
||||
# Write script
|
||||
script = []
|
||||
for vol in get_volumes():
|
||||
script.append('select volume {}'.format(vol['Number']))
|
||||
script.append('assign')
|
||||
|
||||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
def get_boot_mode():
|
||||
boot_mode = 'Legacy'
|
||||
try:
|
||||
reg_key = winreg.OpenKey(
|
||||
winreg.HKEY_LOCAL_MACHINE, r'System\CurrentControlSet\Control')
|
||||
reg_value = winreg.QueryValueEx(reg_key, 'PEFirmwareType')[0]
|
||||
if reg_value == 2:
|
||||
boot_mode = 'UEFI'
|
||||
except:
|
||||
boot_mode = 'Unknown'
|
||||
|
||||
return boot_mode
|
||||
|
||||
def get_disk_details(disk):
|
||||
details = {}
|
||||
script = [
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'detail disk']
|
||||
|
||||
# Run
|
||||
try:
|
||||
result = run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
output = result.stdout.decode().strip()
|
||||
# Remove empty lines
|
||||
tmp = [s.strip() for s in output.splitlines() if s.strip() != '']
|
||||
# Set disk name
|
||||
details['Name'] = tmp[4]
|
||||
# Split each line on ':' skipping those without ':'
|
||||
tmp = [s.split(':') for s in tmp if ':' in s]
|
||||
# Add key/value pairs to the details variable and return dict
|
||||
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
||||
|
||||
return details
|
||||
|
||||
def get_disks():
|
||||
disks = []
|
||||
|
||||
try:
|
||||
# Run script
|
||||
result = run_diskpart(['list disk'])
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
# Append disk numbers
|
||||
output = result.stdout.decode().strip()
|
||||
for tmp in re.findall(r'Disk (\d+)\s+\w+\s+(\d+\s+\w+)', output):
|
||||
num = tmp[0]
|
||||
size = human_readable_size(tmp[1])
|
||||
disks.append({'Number': num, 'Size': size})
|
||||
|
||||
return disks
|
||||
|
||||
def get_partition_details(disk, partition):
|
||||
details = {}
|
||||
script = [
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'select partition {}'.format(partition['Number']),
|
||||
'detail partition']
|
||||
|
||||
# Diskpart details
|
||||
try:
|
||||
# Run script
|
||||
result = run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
# Get volume letter or RAW status
|
||||
output = result.stdout.decode().strip()
|
||||
tmp = re.search(r'Volume\s+\d+\s+(\w|RAW)\s+', output)
|
||||
if tmp:
|
||||
if tmp.group(1).upper() == 'RAW':
|
||||
details['FileSystem'] = RAW
|
||||
else:
|
||||
details['Letter'] = tmp.group(1)
|
||||
# Remove empty lines from output
|
||||
tmp = [s.strip() for s in output.splitlines() if s.strip() != '']
|
||||
# Split each line on ':' skipping those without ':'
|
||||
tmp = [s.split(':') for s in tmp if ':' in s]
|
||||
# Add key/value pairs to the details variable and return dict
|
||||
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
||||
|
||||
# Get MBR type / GPT GUID for extra details on "Unknown" partitions
|
||||
guid = partition_uids.lookup_guid(details.get('Type'))
|
||||
if guid:
|
||||
details.update({
|
||||
'Description': guid.get('Description', '')[:29],
|
||||
'OS': guid.get('OS', 'Unknown')[:27]})
|
||||
|
||||
if 'Letter' in details:
|
||||
# Disk usage
|
||||
try:
|
||||
tmp = psutil.disk_usage('{}:\\'.format(details['Letter']))
|
||||
except OSError as err:
|
||||
details['FileSystem'] = 'Unknown'
|
||||
details['Error'] = err.strerror
|
||||
else:
|
||||
details['Used Space'] = human_readable_size(tmp.used)
|
||||
|
||||
# fsutil details
|
||||
cmd = [
|
||||
'fsutil',
|
||||
'fsinfo',
|
||||
'volumeinfo',
|
||||
'{}:'.format(details['Letter'])
|
||||
]
|
||||
try:
|
||||
result = run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
output = result.stdout.decode().strip()
|
||||
# Remove empty lines from output
|
||||
tmp = [s.strip() for s in output.splitlines() if s.strip() != '']
|
||||
# Add "Feature" lines
|
||||
details['File System Features'] = [s.strip() for s in tmp
|
||||
if ':' not in s]
|
||||
# Split each line on ':' skipping those without ':'
|
||||
tmp = [s.split(':') for s in tmp if ':' in s]
|
||||
# Add key/value pairs to the details variable and return dict
|
||||
details.update({key.strip(): value.strip() for (key, value) in tmp})
|
||||
|
||||
# Set Volume Name
|
||||
details['Name'] = details.get('Volume Name', '')
|
||||
|
||||
# Set FileSystem Type
|
||||
if details.get('FileSystem', '') not in ['RAW', 'Unknown']:
|
||||
details['FileSystem'] = details.get('File System Name', 'Unknown')
|
||||
|
||||
return details
|
||||
|
||||
def get_partitions(disk):
|
||||
partitions = []
|
||||
script = [
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'list partition']
|
||||
|
||||
try:
|
||||
# Run script
|
||||
result = run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
# Append partition numbers
|
||||
output = result.stdout.decode().strip()
|
||||
regex = r'Partition\s+(\d+)\s+\w+\s+(\d+\s+\w+)\s+'
|
||||
for tmp in re.findall(regex, output, re.IGNORECASE):
|
||||
num = tmp[0]
|
||||
size = human_readable_size(tmp[1])
|
||||
partitions.append({'Number': num, 'Size': size})
|
||||
|
||||
return partitions
|
||||
|
||||
def get_table_type(disk):
|
||||
part_type = 'Unknown'
|
||||
script = [
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'uniqueid disk']
|
||||
|
||||
try:
|
||||
result = run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
output = result.stdout.decode().strip()
|
||||
if REGEX_DISK_GPT.search(output):
|
||||
part_type = 'GPT'
|
||||
elif REGEX_DISK_MBR.search(output):
|
||||
part_type = 'MBR'
|
||||
elif REGEX_DISK_RAW.search(output):
|
||||
part_type = 'RAW'
|
||||
|
||||
return part_type
|
||||
|
||||
def get_volumes():
|
||||
vols = []
|
||||
try:
|
||||
result = run_diskpart(['list volume'])
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
# Append volume numbers
|
||||
output = result.stdout.decode().strip()
|
||||
for tmp in re.findall(r'Volume (\d+)\s+([A-Za-z]?)\s+', output):
|
||||
vols.append({'Number': tmp[0], 'Letter': tmp[1]})
|
||||
|
||||
return vols
|
||||
|
||||
def is_bad_partition(par):
|
||||
return 'Letter' not in par or REGEX_BAD_PARTITION.search(par['FileSystem'])
|
||||
|
||||
def prep_disk_for_formatting(disk=None):
|
||||
disk['Format Warnings'] = '\n'
|
||||
width = len(str(len(disk['Partitions'])))
|
||||
|
||||
# Bail early
|
||||
if disk is None:
|
||||
raise Exception('Disk not provided.')
|
||||
|
||||
# Set boot method and partition table type
|
||||
disk['Use GPT'] = True
|
||||
if (get_boot_mode() == 'UEFI'):
|
||||
if (not ask("Setup Windows to use UEFI booting?")):
|
||||
disk['Use GPT'] = False
|
||||
else:
|
||||
if (ask("Setup Windows to use BIOS/Legacy booting?")):
|
||||
disk['Use GPT'] = False
|
||||
|
||||
# Set Display and Warning Strings
|
||||
if len(disk['Partitions']) == 0:
|
||||
disk['Format Warnings'] += 'No partitions found\n'
|
||||
for partition in disk['Partitions']:
|
||||
display = '{size} {fs}'.format(
|
||||
num = partition['Number'],
|
||||
width = width,
|
||||
size = partition['Size'],
|
||||
fs = partition['FileSystem'])
|
||||
|
||||
if is_bad_partition(partition):
|
||||
# Set display string using partition description & OS type
|
||||
display += '\t\t{q}{name}{q}\t{desc} ({os})'.format(
|
||||
display = display,
|
||||
q = '"' if partition['Name'] != '' else '',
|
||||
name = partition['Name'],
|
||||
desc = partition['Description'],
|
||||
os = partition['OS'])
|
||||
else:
|
||||
# List space used instead of partition description & OS type
|
||||
display += ' (Used: {used})\t{q}{name}{q}'.format(
|
||||
used = partition['Used Space'],
|
||||
q = '"' if partition['Name'] != '' else '',
|
||||
name = partition['Name'])
|
||||
# For all partitions
|
||||
partition['Display String'] = display
|
||||
|
||||
def reassign_volume_letter(letter, new_letter='I'):
|
||||
if not letter:
|
||||
# Ignore
|
||||
return None
|
||||
script = [
|
||||
'select volume {}'.format(letter),
|
||||
'remove noerr',
|
||||
'assign letter={}'.format(new_letter)]
|
||||
try:
|
||||
run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
else:
|
||||
return new_letter
|
||||
|
||||
def remove_volume_letters(keep=None):
|
||||
if not keep:
|
||||
keep = ''
|
||||
|
||||
script = []
|
||||
for vol in get_volumes():
|
||||
if vol['Letter'].upper() != keep.upper():
|
||||
script.append('select volume {}'.format(vol['Number']))
|
||||
script.append('remove noerr')
|
||||
|
||||
# Run script
|
||||
try:
|
||||
run_diskpart(script)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
def run_diskpart(script):
|
||||
tempfile = r'{}\diskpart.script'.format(global_vars['Env']['TMP'])
|
||||
|
||||
# Write script
|
||||
with open(tempfile, 'w') as f:
|
||||
for line in script:
|
||||
f.write('{}\n'.format(line))
|
||||
|
||||
# Run script
|
||||
cmd = [
|
||||
r'{}\Windows\System32\diskpart.exe'.format(
|
||||
global_vars['Env']['SYSTEMDRIVE']),
|
||||
'/s', tempfile]
|
||||
result = run_program(cmd)
|
||||
sleep(2)
|
||||
return result
|
||||
|
||||
def scan_disks():
|
||||
"""Get details about the attached disks"""
|
||||
disks = get_disks()
|
||||
|
||||
# Get disk details
|
||||
for disk in disks:
|
||||
# Get partition style
|
||||
disk['Table'] = get_table_type(disk)
|
||||
|
||||
# Get disk name/model and physical details
|
||||
disk.update(get_disk_details(disk))
|
||||
|
||||
# Get partition info for disk
|
||||
disk['Partitions'] = get_partitions(disk)
|
||||
|
||||
for partition in disk['Partitions']:
|
||||
# Get partition details
|
||||
partition.update(get_partition_details(disk, partition))
|
||||
|
||||
# Done
|
||||
return disks
|
||||
|
||||
def select_disk(title='Which disk?', disks=[]):
|
||||
"""Select a disk from the attached disks"""
|
||||
# Build menu
|
||||
disk_options = []
|
||||
for disk in disks:
|
||||
display_name = '{}\t[{}] ({}) {}'.format(
|
||||
disk.get('Size', ''),
|
||||
disk.get('Table', ''),
|
||||
disk.get('Type', ''),
|
||||
disk.get('Name', 'Unknown'),
|
||||
)
|
||||
pwidth=len(str(len(disk['Partitions'])))
|
||||
for partition in disk['Partitions']:
|
||||
# Main text
|
||||
p_name = 'Partition {num:>{width}}: {size} ({fs})'.format(
|
||||
num = partition['Number'],
|
||||
width = pwidth,
|
||||
size = partition['Size'],
|
||||
fs = partition['FileSystem'])
|
||||
if partition['Name']:
|
||||
p_name += '\t"{}"'.format(partition['Name'])
|
||||
|
||||
# Show unsupported partition(s)
|
||||
if is_bad_partition(partition):
|
||||
p_name = '{YELLOW}{p_name}{CLEAR}'.format(
|
||||
p_name=p_name, **COLORS)
|
||||
|
||||
display_name += '\n\t\t\t{}'.format(p_name)
|
||||
if not disk['Partitions']:
|
||||
display_name += '\n\t\t\t{}No partitions found.{}'.format(
|
||||
COLORS['YELLOW'], COLORS['CLEAR'])
|
||||
|
||||
disk_options.append({'Name': display_name, 'Disk': disk})
|
||||
actions = [
|
||||
{'Name': 'Main Menu', 'Letter': 'M'},
|
||||
]
|
||||
|
||||
# Menu loop
|
||||
selection = menu_select(
|
||||
title = title,
|
||||
main_entries = disk_options,
|
||||
action_entries = actions)
|
||||
|
||||
if (selection.isnumeric()):
|
||||
return disk_options[int(selection)-1]['Disk']
|
||||
elif (selection == 'M'):
|
||||
raise GenericAbort
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,465 +0,0 @@
|
|||
# Wizard Kit: Functions - Information
|
||||
|
||||
from borrowed import knownpaths
|
||||
from operator import itemgetter
|
||||
|
||||
from functions.common import *
|
||||
from functions.activation import *
|
||||
|
||||
# Regex
|
||||
REGEX_OFFICE = re.compile(
|
||||
r'(Microsoft (Office\s+'
|
||||
r'(365|Enterprise|Home|Pro(\s|fessional)'
|
||||
r'|Single|Small|Standard|Starter|Ultimate|system)'
|
||||
r'|Works[-\s\d]+\d)'
|
||||
r'|(Libre|Open|Star)\s*Office'
|
||||
r'|WordPerfect|Gnumeric|Abiword)',
|
||||
re.IGNORECASE)
|
||||
|
||||
# STATIC VARIABLES
|
||||
REG_PROFILE_LIST = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList'
|
||||
REG_SHELL_FOLDERS = r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders'
|
||||
TMP_HIVE_PATH = 'TEMP_HIVE_MOUNT'
|
||||
EXTRA_FOLDERS = [
|
||||
'Dropbox',
|
||||
'Google Drive',
|
||||
'OneDrive',
|
||||
'SkyDrive',
|
||||
]
|
||||
SHELL_FOLDERS = {
|
||||
#GUIDs from: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx
|
||||
'Desktop': (
|
||||
'{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}',
|
||||
),
|
||||
'Documents': (
|
||||
'Personal',
|
||||
'{FDD39AD0-238F-46AF-ADB4-6C85480369C7}',
|
||||
),
|
||||
'Downloads': (
|
||||
'{374DE290-123F-4565-9164-39C4925E467B}',
|
||||
),
|
||||
'Favorites': (
|
||||
'{1777F761-68AD-4D8A-87BD-30B759FA33DD}',
|
||||
),
|
||||
'Music': (
|
||||
'My Music',
|
||||
'{4BD8D571-6D19-48D3-BE97-422220080E43}',
|
||||
),
|
||||
'Pictures': (
|
||||
'My Pictures',
|
||||
'{33E28130-4E1E-4676-835A-98395C3BC3BB}',
|
||||
),
|
||||
'Videos': (
|
||||
'My Video',
|
||||
'{18989B1D-99B5-455B-841C-AB7C74E4DDFC}',
|
||||
),
|
||||
}
|
||||
|
||||
def backup_file_list():
|
||||
"""Export current file listing for the system."""
|
||||
extract_item('Everything', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['Everything'],
|
||||
'-nodb',
|
||||
'-create-filelist',
|
||||
r'{LogDir}\File List.txt'.format(**global_vars),
|
||||
global_vars['Env']['SYSTEMDRIVE']]
|
||||
run_program(cmd)
|
||||
|
||||
def backup_power_plans():
|
||||
"""Export current power plans."""
|
||||
os.makedirs(r'{BackupDir}\Power Plans'.format(**global_vars), exist_ok=True)
|
||||
plans = run_program(['powercfg', '/L'])
|
||||
plans = plans.stdout.decode().splitlines()
|
||||
plans = [p for p in plans if re.search(r'^Power Scheme', p)]
|
||||
for p in plans:
|
||||
guid = re.sub(r'Power Scheme GUID:\s+([0-9a-f\-]+).*', r'\1', p)
|
||||
name = re.sub(
|
||||
r'Power Scheme GUID:\s+[0-9a-f\-]+\s+\(([^\)]+)\).*', r'\1', p)
|
||||
out = r'{BackupDir}\Power Plans\{name}.pow'.format(
|
||||
name=name, **global_vars)
|
||||
if not os.path.exists(out):
|
||||
cmd = ['powercfg', '-export', out, guid]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
def backup_registry():
|
||||
"""Backup registry including user hives."""
|
||||
extract_item('erunt', silent=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['ERUNT'],
|
||||
r'{BackupDir}\Registry'.format(**global_vars),
|
||||
'sysreg',
|
||||
'curuser',
|
||||
'otherusers',
|
||||
'/noprogresswindow']
|
||||
run_program(cmd)
|
||||
|
||||
def get_folder_size(path):
|
||||
"""Get (human-readable) size of folder passed, returns str."""
|
||||
size = 'Unknown'
|
||||
cmd = [global_vars['Tools']['Du'], '-nobanner', '-q', path]
|
||||
try:
|
||||
out = run_program(cmd)
|
||||
except FileNotFoundError:
|
||||
# Failed to find folder
|
||||
pass
|
||||
except subprocess.CalledProcessError:
|
||||
# Failed to get folder size
|
||||
pass
|
||||
else:
|
||||
size = out.stdout.decode().splitlines()[4]
|
||||
size = re.sub(r'Size:\s+([\d,]+)\sbytes$', r'\1', size)
|
||||
size = size.replace(',', '')
|
||||
size = human_readable_size(size)
|
||||
return size
|
||||
|
||||
def get_installed_office():
|
||||
"""Get list of installed Office programs."""
|
||||
programs = []
|
||||
log_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
|
||||
**global_vars)
|
||||
with open (log_file, 'r') as f:
|
||||
for line in sorted(f.readlines()):
|
||||
if REGEX_OFFICE.search(line):
|
||||
programs.append(line[4:82].strip())
|
||||
|
||||
if len(programs) == 0:
|
||||
programs = ['No programs found']
|
||||
return programs
|
||||
|
||||
def get_shell_path(folder, user='current'):
|
||||
"""Get shell path using SHGetKnownFolderPath via knownpaths, returns str.
|
||||
|
||||
NOTE: Only works for the current user.
|
||||
Code based on https://gist.github.com/mkropat/7550097
|
||||
"""
|
||||
path = None
|
||||
folderid = None
|
||||
if user.lower() == 'public':
|
||||
user = 'common'
|
||||
try:
|
||||
folderid = getattr(knownpaths.FOLDERID, folder)
|
||||
except AttributeError:
|
||||
# Unknown folder ID, ignore and return None
|
||||
pass
|
||||
|
||||
if folderid:
|
||||
try:
|
||||
path = knownpaths.get_path(folderid, getattr(knownpaths.UserHandle, user))
|
||||
except PathNotFoundError:
|
||||
# Folder not found, ignore and return None
|
||||
pass
|
||||
|
||||
return path
|
||||
|
||||
def get_user_data_paths(user):
|
||||
"""Get user data paths for provided user, returns dict."""
|
||||
hive_path = user['SID']
|
||||
paths = {
|
||||
'Profile': {
|
||||
'Path': None,
|
||||
},
|
||||
'Shell Folders': {},
|
||||
'Extra Folders': {},
|
||||
}
|
||||
unload_hive = False
|
||||
|
||||
if user['Name'] == global_vars['Env']['USERNAME']:
|
||||
# We can use SHGetKnownFolderPath for the current user
|
||||
paths['Profile']['Path'] = get_shell_path('Profile')
|
||||
paths['Shell Folders'] = {f: {'Path': get_shell_path(f)}
|
||||
for f in SHELL_FOLDERS.keys()}
|
||||
else:
|
||||
# We have to use the NTUSER.dat hives which isn't recommended by MS
|
||||
try:
|
||||
key_path = r'{}\{}'.format(REG_PROFILE_LIST, user['SID'])
|
||||
with winreg.OpenKey(HKLM, key_path) as key:
|
||||
paths['Profile']['Path'] = winreg.QueryValueEx(
|
||||
key, 'ProfileImagePath')[0]
|
||||
except Exception:
|
||||
# Profile path not found, leaving as None.
|
||||
pass
|
||||
|
||||
# Shell folders (Prep)
|
||||
if not reg_path_exists(HKU, hive_path) and paths['Profile']['Path']:
|
||||
# User not logged-in, loading hive
|
||||
# Also setting unload_hive so it will be unloaded later.
|
||||
hive_path = TMP_HIVE_PATH
|
||||
cmd = ['reg', 'load', r'HKU\{}'.format(TMP_HIVE_PATH),
|
||||
r'{}\NTUSER.DAT'.format(paths['Profile']['Path'])]
|
||||
unload_hive = True
|
||||
try:
|
||||
run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
# Failed to load user hive
|
||||
pass
|
||||
|
||||
# Shell folders
|
||||
shell_folders = r'{}\{}'.format(hive_path, REG_SHELL_FOLDERS)
|
||||
if (reg_path_exists(HKU, hive_path)
|
||||
and reg_path_exists(HKU, shell_folders)):
|
||||
with winreg.OpenKey(HKU, shell_folders) as key:
|
||||
for folder, values in SHELL_FOLDERS.items():
|
||||
for value in values:
|
||||
try:
|
||||
path = winreg.QueryValueEx(key, value)[0]
|
||||
except FileNotFoundError:
|
||||
# Skip missing values
|
||||
pass
|
||||
else:
|
||||
paths['Shell Folders'][folder] = {'Path': path}
|
||||
# Stop checking values for this folder
|
||||
break
|
||||
|
||||
# Shell folder (extra check)
|
||||
if paths['Profile']['Path']:
|
||||
for folder in SHELL_FOLDERS.keys():
|
||||
folder_path = r'{Path}\{folder}'.format(
|
||||
folder=folder, **paths['Profile'])
|
||||
if (folder not in paths['Shell Folders']
|
||||
and os.path.exists(folder_path)):
|
||||
paths['Shell Folders'][folder] = {'Path': folder_path}
|
||||
|
||||
# Extra folders
|
||||
if paths['Profile']['Path']:
|
||||
for folder in EXTRA_FOLDERS:
|
||||
folder_path = r'{Path}\{folder}'.format(
|
||||
folder=folder, **paths['Profile'])
|
||||
if os.path.exists(folder_path):
|
||||
paths['Extra Folders'][folder] = {'Path': folder_path}
|
||||
|
||||
# Shell folders (cleanup)
|
||||
if unload_hive:
|
||||
cmd = ['reg', 'unload', r'HKU\{}'.format(TMP_HIVE_PATH)]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Done
|
||||
return paths
|
||||
|
||||
def get_user_folder_sizes(users):
|
||||
"""Update list(users) to include folder paths and sizes."""
|
||||
extract_item('du', filter='du*', silent=True)
|
||||
# Configure Du
|
||||
winreg.CreateKey(HKCU, r'Software\Sysinternals\Du')
|
||||
with winreg.OpenKey(HKCU,
|
||||
r'Software\Sysinternals\Du', access=winreg.KEY_WRITE) as key:
|
||||
winreg.SetValueEx(key, 'EulaAccepted', 0, winreg.REG_DWORD, 1)
|
||||
|
||||
for u in users:
|
||||
u.update(get_user_data_paths(u))
|
||||
if u['Profile']['Path']:
|
||||
u['Profile']['Size'] = get_folder_size(u['Profile']['Path'])
|
||||
for folder in u['Shell Folders'].keys():
|
||||
u['Shell Folders'][folder]['Size'] = get_folder_size(
|
||||
u['Shell Folders'][folder]['Path'])
|
||||
for folder in u['Extra Folders'].keys():
|
||||
u['Extra Folders'][folder]['Size'] = get_folder_size(
|
||||
u['Extra Folders'][folder]['Path'])
|
||||
|
||||
def get_user_list():
|
||||
"""Get user list via WMIC, returns list of dicts."""
|
||||
users = []
|
||||
|
||||
# Get user info from WMI
|
||||
cmd = ['wmic', 'useraccount', 'get', '/format:csv']
|
||||
try:
|
||||
out = run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
# Meh, return empty list to avoid a full crash
|
||||
return users
|
||||
|
||||
entries = out.stdout.decode().splitlines()
|
||||
entries = [e.strip().split(',') for e in entries if e.strip()]
|
||||
|
||||
# Add user(s) to dict
|
||||
keys = entries[0]
|
||||
for e in entries[1:]:
|
||||
# Create dict using 1st line (keys)
|
||||
e = dict(zip(keys, e))
|
||||
# Set Active status via 'Disabled' TRUE/FALSE str
|
||||
e['Active'] = bool(e['Disabled'].upper() == 'FALSE')
|
||||
# Assume SIDs ending with 1000+ are "Standard" and others are "System"
|
||||
e['Type'] = 'Standard' if re.search(r'-1\d+$', e['SID']) else 'System'
|
||||
users.append(e)
|
||||
|
||||
# Sort list
|
||||
users.sort(key=itemgetter('Name'))
|
||||
|
||||
# Done
|
||||
return users
|
||||
|
||||
def reg_path_exists(hive, path):
|
||||
"""Test if specified path exists, returns bool."""
|
||||
try:
|
||||
winreg.QueryValue(hive, path)
|
||||
except FileNotFoundError:
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
def run_aida64():
|
||||
"""Run AIDA64 to save system reports."""
|
||||
extract_item('AIDA64', silent=True)
|
||||
# All system info
|
||||
config = r'{BinDir}\AIDA64\full.rpf'.format(**global_vars)
|
||||
report_file = r'{LogDir}\System Information (AIDA64).html'.format(
|
||||
**global_vars)
|
||||
if not os.path.exists(report_file):
|
||||
cmd = [
|
||||
global_vars['Tools']['AIDA64'],
|
||||
'/R', report_file,
|
||||
'/CUSTOM', config,
|
||||
'/HTML', '/SILENT', '/SAFEST']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Installed Programs
|
||||
config = r'{BinDir}\AIDA64\installed_programs.rpf'.format(**global_vars)
|
||||
report_file = r'{LogDir}\Installed Program List (AIDA64).txt'.format(
|
||||
**global_vars)
|
||||
if not os.path.exists(report_file):
|
||||
cmd = [
|
||||
global_vars['Tools']['AIDA64'],
|
||||
'/R', report_file,
|
||||
'/CUSTOM', config,
|
||||
'/TEXT', '/SILENT', '/SAFEST']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Product Keys
|
||||
config = r'{BinDir}\AIDA64\licenses.rpf'.format(**global_vars)
|
||||
report_file = r'{LogDir}\Product Keys (AIDA64).txt'.format(**global_vars)
|
||||
if not os.path.exists(report_file):
|
||||
cmd = [
|
||||
global_vars['Tools']['AIDA64'],
|
||||
'/R', report_file,
|
||||
'/CUSTOM', config,
|
||||
'/TEXT', '/SILENT', '/SAFEST']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
def run_bleachbit():
|
||||
"""Run BleachBit preview and save log.
|
||||
|
||||
This is a preview so no files should be deleted."""
|
||||
if not os.path.exists(global_vars['LogDir']+r'\BleachBit.log'):
|
||||
extract_item('BleachBit', silent=True)
|
||||
cmd = [global_vars['Tools']['BleachBit'], '--preview', '--preset']
|
||||
out = run_program(cmd, check=False)
|
||||
# Save stderr
|
||||
if out.stderr.decode().splitlines():
|
||||
with open(global_vars['LogDir']+r'\BleachBit.err', 'a') as f:
|
||||
for line in out.stderr.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
# Save stdout
|
||||
with open(global_vars['LogDir']+r'\BleachBit.log', 'a') as f:
|
||||
for line in out.stdout.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
|
||||
def show_disk_usage(disk):
|
||||
"""Show free and used space for a specified disk."""
|
||||
print_standard('{:5}'.format(disk.device.replace('/', ' ')),
|
||||
end='', flush=True, timestamp=False)
|
||||
try:
|
||||
usage = psutil.disk_usage(disk.device)
|
||||
display_string = '{percent:>5.2f}% Free ({free} / {total})'.format(
|
||||
percent = 100 - usage.percent,
|
||||
free = human_readable_size(usage.free, 2),
|
||||
total = human_readable_size(usage.total, 2))
|
||||
if usage.percent > 85:
|
||||
print_error(display_string, timestamp=False)
|
||||
elif usage.percent > 75:
|
||||
print_warning(display_string, timestamp=False)
|
||||
else:
|
||||
print_standard(display_string, timestamp=False)
|
||||
except Exception:
|
||||
print_warning('Unknown', timestamp=False)
|
||||
|
||||
def show_free_space(indent=8, width=32):
|
||||
"""Show free space info for all fixed disks."""
|
||||
message = 'Free Space:'
|
||||
for disk in psutil.disk_partitions():
|
||||
try:
|
||||
if 'fixed' in disk.opts:
|
||||
try_and_print(message=message, function=show_disk_usage,
|
||||
ns='Unknown', silent_function=False,
|
||||
indent=indent, width=width, disk=disk)
|
||||
message = ''
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def show_installed_ram():
|
||||
"""Show installed RAM."""
|
||||
mem = psutil.virtual_memory()
|
||||
if mem.total > 5905580032:
|
||||
# > 5.5 Gb so 6Gb or greater
|
||||
print_standard(human_readable_size(mem.total).strip(), timestamp=False)
|
||||
elif mem.total > 3758096384:
|
||||
# > 3.5 Gb so 4Gb or greater
|
||||
print_warning(human_readable_size(mem.total).strip(), timestamp=False)
|
||||
else:
|
||||
print_error(human_readable_size(mem.total).strip(), timestamp=False)
|
||||
|
||||
def show_os_activation():
|
||||
"""Show OS activation info."""
|
||||
act_str = get_activation_string()
|
||||
if windows_is_activated():
|
||||
print_standard(act_str, timestamp=False)
|
||||
elif re.search(r'unavailable', act_str, re.IGNORECASE):
|
||||
print_warning(act_str, timestamp=False)
|
||||
else:
|
||||
print_error(act_str, timestamp=False)
|
||||
|
||||
def show_os_name():
|
||||
"""Show extended OS name (including warnings)."""
|
||||
os_name = global_vars['OS']['DisplayName']
|
||||
if global_vars['OS']['Arch'] == 32:
|
||||
# Show all 32-bit installs as an error message
|
||||
print_error(os_name, timestamp=False)
|
||||
else:
|
||||
if re.search(r'(unrecognized|very outdated)', os_name, re.IGNORECASE):
|
||||
print_error(os_name, timestamp=False)
|
||||
elif re.search(r'outdated', os_name, re.IGNORECASE):
|
||||
print_warning(os_name, timestamp=False)
|
||||
else:
|
||||
print_standard(os_name, timestamp=False)
|
||||
|
||||
def show_temp_files_size():
|
||||
"""Show total size of temp files identified by BleachBit."""
|
||||
size = None
|
||||
with open(r'{LogDir}\BleachBit.log'.format(**global_vars), 'r') as f:
|
||||
for line in f.readlines():
|
||||
if re.search(r'^disk space to be recovered:', line, re.IGNORECASE):
|
||||
size = re.sub(r'.*: ', '', line.strip())
|
||||
size = re.sub(r'(\w)iB$', r' \1b', size)
|
||||
if size is None:
|
||||
print_warning(size, timestamp=False)
|
||||
else:
|
||||
print_standard(size, timestamp=False)
|
||||
|
||||
def show_user_data_summary(indent=8, width=32):
|
||||
"""Print user data folder sizes for all users."""
|
||||
users = get_user_list()
|
||||
users = [u for u in users if u['Active']]
|
||||
get_user_folder_sizes(users)
|
||||
for user in users:
|
||||
print_success('{indent}User: {user}'.format(
|
||||
indent = ' '*int(indent/2),
|
||||
user = user['Name']))
|
||||
for section in ['Profile', None, 'Shell Folders', 'Extra Folders']:
|
||||
folders = []
|
||||
if section is None:
|
||||
# Divider
|
||||
print_standard('{}{}'.format(' '*indent, '-'*(width+6)))
|
||||
elif section == 'Profile':
|
||||
folders = {'Profile': user['Profile']}
|
||||
else:
|
||||
folders = user[section]
|
||||
for folder in folders:
|
||||
print_standard(
|
||||
'{indent}{folder:<{width}}{size:>6} ({path})'.format(
|
||||
indent = ' ' * indent,
|
||||
width = width,
|
||||
folder = folder,
|
||||
size = folders[folder]['Size'],
|
||||
path = folders[folder]['Path']))
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,326 +0,0 @@
|
|||
# Wizard Kit: Functions - PARTITION UIDs
|
||||
# sources: https://en.wikipedia.org/wiki/GUID_Partition_Table
|
||||
# https://en.wikipedia.org/wiki/Partition_type
|
||||
# NOTE: Info has been trimmed for brevity. As such, there may be some inaccuracy.
|
||||
|
||||
PARTITION_UIDS = {
|
||||
'00': {'OS': 'All','Description': 'Empty partition entry'},
|
||||
'01': {'OS': 'DOS','Description': 'FAT12 as primary partition'},
|
||||
'02': {'OS': 'XENIX','Description': 'XENIX root'},
|
||||
'03': {'OS': 'XENIX','Description': 'XENIX usr'},
|
||||
'04': {'OS': 'DOS','Description': 'FAT16 with less than 32 MB'},
|
||||
'05': {'OS': 'DOS / SpeedStor','Description': 'Extended partition'},
|
||||
'06': {'OS': 'DOS1+','Description': 'FAT16B [over 65K sectors]'},
|
||||
'07': {'OS': 'Windows / OS/2 / QNX 2','Description': 'NTFS/exFAT/HPFS/IFS/QNX'},
|
||||
'08': {'OS': 'CBM / DOS / OS/2 / AIX /QNX','Description': 'FAT12-16/AIX/QNY/SplitDrive'},
|
||||
'09': {'OS': 'AIX / QNX / Coherent / OS-9','Description': 'AIX/QNZ/Coherent/RBF'},
|
||||
'0A': {'OS': 'OS/2 / Coherent','Description': 'Boot Manager / Swap'},
|
||||
'0B': {'OS': 'DOS','Description': 'FAT32 with CHS addressing'},
|
||||
'0C': {'OS': 'DOS','Description': 'FAT32 with LBA'},
|
||||
'0D': {'OS': 'Silicon Safe','Description': 'Reserved'},
|
||||
'0E': {'OS': 'DOS','Description': 'FAT16B with LBA'},
|
||||
'0F': {'OS': 'DOS','Description': 'Extended partition with LBA'},
|
||||
'10': {'OS': 'OPUS','Description': 'Unknown'},
|
||||
'11': {'OS': 'Leading Edge MS-DOS / OS/2','Description': 'FAT12/FAT16'},
|
||||
'12': {'OS': 'Compaq Contura','Description': 'conf/diag/hiber/rescue/serv'},
|
||||
'14': {'OS': 'AST DOS / OS/2 / MaverickOS','Description': 'FAT12/FAT16/Omega'},
|
||||
'15': {'OS': 'OS/2 / Maverick OS','Description': 'Hidden extended / Swap'},
|
||||
'16': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16B'},
|
||||
'17': {'OS': 'OS/2 Boot Manager','Description': 'Hidden IFS/HPFS/NTFS/exFAT'},
|
||||
'18': {'OS': 'AST Windows','Description': '0-Volt Suspend/SmartSleep'},
|
||||
'19': {'OS': 'Willowtech Photon coS','Description': 'Willowtech Photon coS'},
|
||||
'1B': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32'},
|
||||
'1C': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT32 with LBA'},
|
||||
'1E': {'OS': 'OS/2 Boot Manager','Description': 'Hidden FAT16 with LBA'},
|
||||
'1F': {'OS': 'OS/2 Boot Manager','Description': 'Hidden extended with LBA'},
|
||||
'20': {'OS': 'Windows Mobile','Description': 'update XIP/Willowsoft OFS1'},
|
||||
'21': {'OS': 'Oxygen','Description': 'SpeedStor / FSo2'},
|
||||
'22': {'OS': 'Oxygen','Description': 'Oxygen Extended Partition'},
|
||||
'23': {'OS': 'Windows Mobile','Description': 'Reserved / boot XIP'},
|
||||
'24': {'OS': 'NEC MS-DOS0','Description': 'Logical FAT12 or FAT16'},
|
||||
'25': {'OS': 'Windows Mobile','Description': 'IMGFS[citation needed]'},
|
||||
'26': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'27': {'OS': 'Win/PQserv/MirOS/RooterBOOT','Description': 'WinRE/Rescue/MirOS/RooterBOOT'},
|
||||
'2A': {'OS': 'AtheOS','Description': 'AthFS/AFS/Reserved'},
|
||||
'2B': {'OS': 'SyllableOS','Description': 'SyllableSecure (SylStor)'},
|
||||
'31': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'32': {'OS': 'NOS','Description': 'Unknown'},
|
||||
'33': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'34': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'35': {'OS': 'OS/2 Server /eComStation','Description': 'JFS'},
|
||||
'36': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'38': {'OS': 'THEOS','Description': 'THEOS version 3.2, 2 GB'},
|
||||
'39': {'OS': 'Plan 9 / THEOS','Description': 'Plan 9 edition 3 / THEOS v4'},
|
||||
'3A': {'OS': 'THEOS','Description': 'THEOS v4, 4 GB'},
|
||||
'3B': {'OS': 'THEOS','Description': 'THEOS v4 extended'},
|
||||
'3C': {'OS': 'PartitionMagic','Description': 'PqRP (image in progress)'},
|
||||
'3D': {'OS': 'PartitionMagic','Description': 'Hidden NetWare'},
|
||||
'3F': {'OS': 'OS/32','Description': 'Unknown'},
|
||||
'40': {'OS': 'PICK / Venix','Description': 'PICK R83 / Venix 80286'},
|
||||
'41': {'OS': 'RISC / Linux / PowerPC','Description': 'Boot / Old Linux/Minix'},
|
||||
'42': {'OS': 'SFS / Linux / Win2K/XP/etc','Description': 'SFS / Old Linux Swap'},
|
||||
'43': {'OS': 'Linux','Description': 'Old Linux native'},
|
||||
'44': {'OS': 'GoBack','Description': 'Norton/WildFire/Adaptec/Roxio'},
|
||||
'45': {'OS': 'Boot-US / EUMEL/ELAN','Description': 'Priam/Boot/EUMEL/ELAN (L2)'},
|
||||
'46': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||
'47': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2)'},
|
||||
'48': {'OS': 'EUMEL/ELAN','Description': 'EUMEL/ELAN (L2), ERGOS L3'},
|
||||
'4A': {'OS': 'AdaOS / ALFS/THIN','Description': 'Aquila / ALFS/THIN'},
|
||||
'4C': {'OS': 'ETH Oberon','Description': 'Aos (A2) file system (76)'},
|
||||
'4D': {'OS': 'QNX Neutrino','Description': 'Primary QNX POSIX volume'},
|
||||
'4E': {'OS': 'QNX Neutrino','Description': 'Secondary QNX POSIX volume'},
|
||||
'4F': {'OS': 'QNX Neutrino / ETH Oberon','Description': '3rd QNX POSIX/Boot/Native'},
|
||||
'50': {'OS': 'DiskMan4/ETH/LynxOS/Novell','Description': 'Alt FS/Read-only/Lynx RTOS'},
|
||||
'51': {'OS': 'Disk Manager 4-6','Description': 'R/W partition (Aux 1)'},
|
||||
'52': {'OS': 'CP/M-80/ System V/AT, V/386','Description': 'CP/M-80'},
|
||||
'53': {'OS': 'Disk Manager 6','Description': 'Auxiliary 3 (WO)'},
|
||||
'54': {'OS': 'Disk Manager 6','Description': 'Dynamic Drive Overlay (DDO)'},
|
||||
'55': {'OS': 'EZ-Drive','Description': 'Maxtor/MaxBlast/DriveGuide'},
|
||||
'56': {'OS': 'AT&T DOS/EZ-Drive/VFeature','Description': 'FAT12~16/EZ-BIOS/VFeature'},
|
||||
'57': {'OS': 'DrivePro','Description': 'VNDI partition'},
|
||||
'5C': {'OS': 'EDISK','Description': 'Priam EDisk Volume'},
|
||||
'61': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'63': {'OS': 'Unix','Description': 'Unix,ISC,SysV,ix,BSD,HURD'},
|
||||
'64': {'OS': 'SpeedStor / NetWare','Description': 'NetWare FS 286/2,PC-ARMOUR'},
|
||||
'65': {'OS': 'NetWare','Description': 'NetWare File System 386'},
|
||||
'66': {'OS': 'NetWare / NetWare','Description': 'NetWare FS 386 / SMS'},
|
||||
'67': {'OS': 'NetWare','Description': 'Wolf Mountain'},
|
||||
'68': {'OS': 'NetWare','Description': 'Unknown'},
|
||||
'69': {'OS': 'NetWare 5 / NetWare','Description': 'Novell Storage Services'},
|
||||
'6E': {'Description': 'Unknown'},
|
||||
'70': {'OS': 'DiskSecure','Description': 'DiskSecure multiboot'},
|
||||
'71': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'72': {'OS': 'APTI systems / Unix V7/x86','Description': 'APTI altFAT12 / V7 / x86'},
|
||||
'73': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'74': {'OS': 'Microsoft, IBM','Description': 'Reserved / Scramdisk'},
|
||||
'75': {'OS': 'PC/IX','Description': 'Unknown'},
|
||||
'76': {'OS': 'Microsoft, IBM','Description': 'Reserved'},
|
||||
'77': {'OS': 'Novell','Description': 'VNDI, M2FS, M2CS'},
|
||||
'78': {'OS': 'Geurt Vos','Description': 'XOSL bootloader file system'},
|
||||
'79': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (CHS, SFN)'},
|
||||
'7A': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16 (LBA, SFN)'},
|
||||
'7B': {'OS': 'APTI conformant systems','Description': 'APTI altFAT16B (CHS, SFN)'},
|
||||
'7C': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (LBA, SFN)'},
|
||||
'7D': {'OS': 'APTI conformant systems','Description': 'APTI altFAT32 (CHS, SFN)'},
|
||||
'7E': {'OS': 'F.I.X. (claim) / PrimoCache','Description': 'Level 2 cache'},
|
||||
'7F': {'OS': 'Varies','Description': 'AltOS DevPartition Standard'},
|
||||
'80': {'OS': 'Minix 1.1-1.4a','Description': 'Minix file system (old)'},
|
||||
'81': {'OS': 'Minix 1.4b+ / Linux','Description': 'MINIX FS/Mitac AdvDiskManager'},
|
||||
'82': {'OS': 'Linux / Sun Microsystems','Description': 'Swap / Solaris x86 / Prime'},
|
||||
'83': {'OS': 'GNU/Linux','Description': 'Any native Linux FS'},
|
||||
'84': {'OS': 'OS/2 / Windows 7','Description': 'Hibernat/HiddenC/RapidStart'},
|
||||
'85': {'OS': 'GNU/Linux','Description': 'Linux extended'},
|
||||
'86': {'OS': 'Windows NT 4 Server / Linux','Description': 'FAT16B mirror/LinuxRAID-old'},
|
||||
'87': {'OS': 'Windows NT 4 Server','Description': 'HPFS/NTFS mirrored volume'},
|
||||
'88': {'OS': 'GNU/Linux','Description': 'Plaintext partition table'},
|
||||
'8A': {'OS': 'AiR-BOOT','Description': 'Linux kernel image'},
|
||||
'8B': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||
'8C': {'OS': 'Windows NT 4 Server','Description': 'FAT32 mirrored volume set'},
|
||||
'8D': {'OS': 'Free FDISK','Description': 'Hidden FAT12'},
|
||||
'8E': {'OS': 'Linux','Description': 'Linux LVM'},
|
||||
'90': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||
'91': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||
'92': {'OS': 'Free FDISK','Description': 'Hidden FAT16B'},
|
||||
'93': {'OS': 'Amoeba / Linux','Description': 'Amoeba native/Hidden Linux'},
|
||||
'94': {'OS': 'Amoeba','Description': 'Amoeba bad block table'},
|
||||
'95': {'OS': 'EXOPC','Description': 'EXOPC native'},
|
||||
'96': {'OS': 'CHRP','Description': 'ISO-9660 file system'},
|
||||
'97': {'OS': 'Free FDISK','Description': 'Hidden FAT32'},
|
||||
'98': {'OS': 'Free FDISK / ROM-DOS','Description': 'Hidden FAT32 / service part'},
|
||||
'99': {'OS': 'early Unix','Description': 'Unknown'},
|
||||
'9A': {'OS': 'Free FDISK','Description': 'Hidden FAT16'},
|
||||
'9B': {'OS': 'Free FDISK','Description': 'Hidden extended partition'},
|
||||
'9E': {'OS': 'VSTA / ForthOS','Description': 'ForthOS (eForth port)'},
|
||||
'9F': {'OS': 'BSD/OS 3.0+, BSDI','Description': 'Unknown'},
|
||||
'A0': {'OS': 'HP/Phoenix/IBM/Toshiba/Sony','Description': 'Diagnostic for HP/Hibernate'},
|
||||
'A1': {'OS': 'HP / Phoenix, NEC','Description': 'HP Vol Expansion/Hibernate'},
|
||||
'A2': {'OS': 'Cyclone V','Description': 'Hard Processor System (HPS)'},
|
||||
'A3': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'A4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'A5': {'OS': 'BSD','Description': 'BSD slice'},
|
||||
'A6': {'OS': 'OpenBSD','Description': 'HP Vol Expansion/BSD slice'},
|
||||
'A7': {'OS': 'NeXT','Description': 'NeXTSTEP'},
|
||||
'A8': {'OS': 'Darwin, Mac OS X','Description': 'Apple Darwin, Mac OS X UFS'},
|
||||
'A9': {'OS': 'NetBSD','Description': 'NetBSD slice'},
|
||||
'AA': {'OS': 'MS-DOS','Description': 'Olivetti DOS FAT12(1.44 MB)'},
|
||||
'AB': {'OS': 'Darwin, Mac OS X / GO! OS','Description': 'Apple Darwin/OS X boot/GO!'},
|
||||
'AD': {'OS': 'RISC OS','Description': 'ADFS / FileCore format'},
|
||||
'AE': {'OS': 'ShagOS','Description': 'ShagOS file system'},
|
||||
'AF': {'OS': 'ShagOS','Description': 'OS X HFS & HFS+/ShagOS Swap'},
|
||||
'B0': {'OS': 'Boot-Star','Description': 'Boot-Star dummy partition'},
|
||||
'B1': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||
'B2': {'OS': 'QNX 6.x','Description': 'QNX Neutrino power-safe FS'},
|
||||
'B3': {'OS': 'QNX 6.x','Description': 'HPVolExpansion/QNX Neutrino'},
|
||||
'B4': {'OS': 'HP','Description': 'HP Vol Expansion(SpeedStor)'},
|
||||
'B6': {'OS': 'Windows NT 4 Server','Description': 'HPVolExpansion/FAT16Bmirror'},
|
||||
'B7': {'OS': 'BSDI / Windows NT 4 Server','Description': 'BSDI,Swap,HPFS/NTFS mirror'},
|
||||
'B8': {'OS': 'BSDI (before 3.0)','Description': 'BSDI Swap / native FS'},
|
||||
'BB': {'OS': 'Acronis/BootWizard/WinNT 4','Description': 'BootWizard/OEM/FAT32 mirror'},
|
||||
'BC': {'OS': 'Acronis/WinNT/BackupCapsule','Description': 'FAT32RAID/SecureZone/Backup'},
|
||||
'BD': {'OS': 'BonnyDOS/286','Description': 'Unknown'},
|
||||
'BE': {'OS': 'Solaris 8','Description': 'Solaris 8 boot'},
|
||||
'BF': {'OS': 'Solaris','Description': 'Solaris x86'},
|
||||
'C0': {'OS': 'DR-DOS,MultiuserDOS,REAL/32','Description': 'Secured FAT (under 32 MB)'},
|
||||
'C1': {'OS': 'DR DOS','Description': 'Secured FAT12'},
|
||||
'C2': {'OS': 'Power Boot','Description': 'Hidden Linux native FS'},
|
||||
'C3': {'OS': 'Power Boot','Description': 'Hidden Linux Swap'},
|
||||
'C4': {'OS': 'DR DOS','Description': 'Secured FAT16'},
|
||||
'C5': {'OS': 'DR DOS','Description': 'Secured extended partition'},
|
||||
'C6': {'OS': 'DR DOS / WinNT 4 Server','Description': 'Secured FAT16B/FAT16Bmirror'},
|
||||
'C7': {'OS': 'Syrinx / WinNT 4 Server','Description': 'Syrinx boot/HPFS/NTFSmirror'},
|
||||
'C8': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'C9': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'CA': {'Description': "DR-DOS Reserved (since '97)"},
|
||||
'CB': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||
'CC': {'OS': 'DR-DOSx / WinNT 4 Server','Description': 'Secured FAT32/FAT32 mirror'},
|
||||
'CD': {'OS': 'CTOS','Description': 'Memory dump'},
|
||||
'CE': {'OS': 'DR-DOSx','Description': 'Secured FAT16B'},
|
||||
'CF': {'OS': 'DR-DOSx','Description': 'Secured extended partition'},
|
||||
'D0': {'OS': 'Multiuser DOS, REAL/32','Description': 'Secured FAT (over 32 MB)'},
|
||||
'D1': {'OS': 'Multiuser DOS','Description': 'Secured FAT12'},
|
||||
'D4': {'OS': 'Multiuser DOS','Description': 'Secured FAT16'},
|
||||
'D5': {'OS': 'Multiuser DOS','Description': 'Secured extended partition'},
|
||||
'D6': {'OS': 'Multiuser DOS','Description': 'Secured FAT16B'},
|
||||
'D8': {'OS': 'Digital Research','Description': 'CP/M-86 [citation needed]'},
|
||||
'DA': {'OS': 'Powercopy Backup','Description': 'Non-FS data / Shielded disk'},
|
||||
'DB': {'OS': 'CP/M-86/CDOS/CTOS/D800/DRMK','Description': 'CP/M-86/ConcDOS/Boot/FAT32'},
|
||||
'DD': {'OS': 'CTOS','Description': 'Hidden memory dump'},
|
||||
'DE': {'OS': 'Dell','Description': 'FAT16 utility/diagnostic'},
|
||||
'DF': {'OS': 'DG/UX / BootIt / Aviion','Description': 'DG/UX Virt DiskMan / EMBRM'},
|
||||
'E0': {'OS': 'STMicroelectronics','Description': 'ST AVFS'},
|
||||
'E1': {'OS': 'SpeedStor','Description': 'ExtendedFAT12 >1023cylinder'},
|
||||
'E2': {'Description': 'DOS read-only (XFDISK)'},
|
||||
'E3': {'OS': 'SpeedStor','Description': 'DOS read-only'},
|
||||
'E4': {'OS': 'SpeedStor','Description': 'ExtendedFAT16 <1024cylinder'},
|
||||
'E5': {'OS': 'Tandy MS-DOS','Description': 'Logical FAT12 or FAT16'},
|
||||
'E6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'E8': {'OS': 'LUKS','Description': 'Linux Unified Key Setup'},
|
||||
'EB': {'OS': 'BeOS, Haiku','Description': 'BFS'},
|
||||
'EC': {'OS': 'SkyOS','Description': 'SkyFS'},
|
||||
'ED': {'OS': 'Sprytix / EDD 4','Description': 'EDC loader / GPT hybrid MBR'},
|
||||
'EE': {'OS': 'EFI','Description': 'GPT protective MBR'},
|
||||
'EF': {'OS': 'EFI','Description': 'EFI system partition'},
|
||||
'F0': {'OS': 'Linux / OS/32','Description': 'PA-RISC Linux boot loader.'},
|
||||
'F1': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F2': {'OS': 'SperryIT DOS/Unisys DOS','Description': 'Logical FAT12/FAT16'},
|
||||
'F3': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F4': {'OS': 'SpeedStor / Prologue','Description': '"large"DOS part/NGF/TwinFS'},
|
||||
'F5': {'OS': 'Prologue','Description': 'MD0-MD9 part for NGF/TwinFS'},
|
||||
'F6': {'OS': 'SpeedStor','Description': 'Unknown'},
|
||||
'F7': {'OS': 'O.S.G. / X1','Description': 'EFAT / Solid State FS'},
|
||||
'F9': {'OS': 'Linux','Description': 'pCache ext2/ext3 cache'},
|
||||
'FA': {'OS': 'Bochs','Description': 'x86 emulator'},
|
||||
'FB': {'OS': 'VMware','Description': 'VMware VMFS partition'},
|
||||
'FC': {'OS': 'VMware','Description': 'Swap / VMKCORE kernel dump'},
|
||||
'FD': {'OS': 'Linux / FreeDOS','Description': 'LinuxRAID/Reserved4FreeDOS'},
|
||||
'FE': {'OS': 'SpeedStor/LANstep/NT/Linux','Description': 'PS/2/DiskAdmin/old LinuxLVM'},
|
||||
'FF': {'OS': 'XENIX','Description': 'XENIX bad block table'},
|
||||
'00000000-0000-0000-0000-000000000000': {'Description': 'Unused entry'},
|
||||
'024DEE41-33E7-11D3-9D69-0008C781F39F': {'Description': 'MBR partition scheme'},
|
||||
'C12A7328-F81F-11D2-BA4B-00A0C93EC93B': {'Description': 'EFI System partition'},
|
||||
'21686148-6449-6E6F-744E-656564454649': {'Description': 'BIOS Boot partition'},
|
||||
'D3BFE2DE-3DAF-11DF-BA40-E3A556D89593': {'Description': 'Intel Fast Flash (iFFS) partition (for Intel Rapid Start technology)'},
|
||||
'F4019732-066E-4E12-8273-346C5641494F': {'Description': 'Sony boot partition'},
|
||||
'BFBFAFE7-A34F-448A-9A5B-6213EB736C22': {'Description': 'Lenovo boot partition'},
|
||||
'E3C9E316-0B5C-4DB8-817D-F92DF00215AE': {'OS': 'Windows', 'Description': 'Microsoft Reserved Partition (MSR)'},
|
||||
'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7': {'OS': 'Windows', 'Description': 'Basic data partition'},
|
||||
'5808C8AA-7E8F-42E0-85D2-E1E90434CFB3': {'OS': 'Windows', 'Description': 'Logical Disk Manager (LDM) metadata partition'},
|
||||
'AF9B60A0-1431-4F62-BC68-3311714A69AD': {'OS': 'Windows', 'Description': 'Logical Disk Manager data partition'},
|
||||
'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC': {'OS': 'Windows', 'Description': 'Windows Recovery Environment'},
|
||||
'37AFFC90-EF7D-4E96-91C3-2D7AE055B174': {'OS': 'Windows', 'Description': 'IBM General Parallel File System (GPFS) partition'},
|
||||
'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D': {'OS': 'Windows', 'Description': 'Storage Spaces partition'},
|
||||
'75894C1E-3AEB-11D3-B7C1-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Data partition'},
|
||||
'E2A1E728-32E3-11D6-A682-7B03A0000000': {'OS': 'HP-UX', 'Description': 'Service Partition'},
|
||||
'0FC63DAF-8483-4772-8E79-3D69D8477DE4': {'OS': 'Linux', 'Description': 'Linux filesystem data'},
|
||||
'A19D880F-05FC-4D3B-A006-743F0F84911E': {'OS': 'Linux', 'Description': 'RAID partition'},
|
||||
'44479540-F297-41B2-9AF7-D131D5F0458A': {'OS': 'Linux', 'Description': 'Root partition (x86)'},
|
||||
'4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709': {'OS': 'Linux', 'Description': 'Root partition (x86-64)'},
|
||||
'69DAD710-2CE4-4E3C-B16C-21A1D49ABED3': {'OS': 'Linux', 'Description': 'Root partition (32-bit ARM)'},
|
||||
'B921B045-1DF0-41C3-AF44-4C6F280D3FAE': {'OS': 'Linux', 'Description': 'Root partition (64-bit ARM)/AArch64)'},
|
||||
'0657FD6D-A4AB-43C4-84E5-0933C84B4F4F': {'OS': 'Linux', 'Description': 'Swap partition'},
|
||||
'E6D6D379-F507-44C2-A23C-238F2A3DF928': {'OS': 'Linux', 'Description': 'Logical Volume Manager (LVM) partition'},
|
||||
'933AC7E1-2EB4-4F13-B844-0E14E2AEF915': {'OS': 'Linux', 'Description': '/home partition'},
|
||||
'3B8F8425-20E0-4F3B-907F-1A25A76F98E8': {'OS': 'Linux', 'Description': '/srv (server data) partition'},
|
||||
'7FFEC5C9-2D00-49B7-8941-3EA10A5586B7': {'OS': 'Linux', 'Description': 'Plain dm-crypt partition'},
|
||||
'CA7D7CCB-63ED-4C53-861C-1742536059CC': {'OS': 'Linux', 'Description': 'LUKS partition'},
|
||||
'8DA63339-0007-60C0-C436-083AC8230908': {'OS': 'Linux', 'Description': 'Reserved'},
|
||||
'83BD6B9D-7F41-11DC-BE0B-001560B84F0F': {'OS': 'FreeBSD', 'Description': 'Boot partition'},
|
||||
'516E7CB4-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Data partition'},
|
||||
'516E7CB5-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Swap partition'},
|
||||
'516E7CB6-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Unix File System (UFS) partition'},
|
||||
'516E7CB8-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'Vinum volume manager partition'},
|
||||
'516E7CBA-6ECF-11D6-8FF8-00022D09712B': {'OS': 'FreeBSD', 'Description': 'ZFS partition'},
|
||||
'48465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Hierarchical File System Plus (HFS+) partition'},
|
||||
'55465300-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple UFS'},
|
||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'OS X Darwin', 'Description': 'ZFS'},
|
||||
'52414944-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition'},
|
||||
'52414944-5F4F-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple RAID partition, offline'},
|
||||
'426F6F74-0000-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Boot partition (Recovery HD)'},
|
||||
'4C616265-6C00-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Label'},
|
||||
'5265636F-7665-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple TV Recovery partition'},
|
||||
'53746F72-6167-11AA-AA11-00306543ECAC': {'OS': 'OS X Darwin', 'Description': 'Apple Core Storage (i.e. Lion FileVault) partition'},
|
||||
'6A82CB45-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Boot partition'},
|
||||
'6A85CF4D-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Root partition'},
|
||||
'6A87C46F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Swap partition'},
|
||||
'6A8B642B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Backup partition'},
|
||||
'6A898CC3-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/usr partition'},
|
||||
'6A8EF2E9-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/var partition'},
|
||||
'6A90BA39-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': '/home partition'},
|
||||
'6A9283A5-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Alternate sector'},
|
||||
'6A945A3B-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos', 'Description': 'Reserved partition'},
|
||||
'6A9630D1-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A980767-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A96237F-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'6A8D2AC7-1DD2-11B2-99A6-080020736631': {'OS': 'Solaris illumos'},
|
||||
'49F48D32-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Swap partition'},
|
||||
'49F48D5A-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'FFS partition'},
|
||||
'49F48D82-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'LFS partition'},
|
||||
'49F48DAA-B10E-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'RAID partition'},
|
||||
'2DB519C4-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Concatenated partition'},
|
||||
'2DB519EC-B10F-11DC-B99B-0019D1879648': {'OS': 'NetBSD', 'Description': 'Encrypted partition'},
|
||||
'FE3A2A5D-4F32-41A7-B725-ACCC3285A309': {'OS': 'ChromeOS', 'Description': 'ChromeOS kernel'},
|
||||
'3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC': {'OS': 'ChromeOS', 'Description': 'ChromeOS rootfs'},
|
||||
'2E0A753D-9E48-43B0-8337-B15192CB1B5E': {'OS': 'ChromeOS', 'Description': 'ChromeOS future use'},
|
||||
'42465331-3BA3-10F1-802A-4861696B7521': {'OS': 'Haiku', 'Description': 'Haiku BFS'},
|
||||
'85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Boot partition'},
|
||||
'85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Data partition'},
|
||||
'85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Swap partition'},
|
||||
'0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Unix File System (UFS) partition'},
|
||||
'85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'Vinum volume manager partition'},
|
||||
'85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7': {'OS': 'MidnightBSD', 'Description': 'ZFS partition'},
|
||||
'45B0969E-9B03-4F30-B4C6-B4B80CEFF106': {'OS': 'Ceph', 'Description': 'Ceph Journal'},
|
||||
'45B0969E-9B03-4F30-B4C6-5EC00CEFF106': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt Encrypted Journal'},
|
||||
'4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph OSD'},
|
||||
'4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt OSD'},
|
||||
'89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph disk in creation'},
|
||||
'89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE': {'OS': 'Ceph', 'Description': 'Ceph dm-crypt disk in creation'},
|
||||
'824CC7A0-36A8-11E3-890A-952519AD3F61': {'OS': 'OpenBSD', 'Description': 'Data partition'},
|
||||
'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1': {'OS': 'QNX', 'Description': 'Power-safe (QNX6) file system'},
|
||||
'C91818F9-8025-47AF-89D2-F030D7000C2C': {'OS': 'Plan 9', 'Description': 'Plan 9 partition'},
|
||||
'9D275380-40AD-11DB-BF97-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'vmkcore (coredump partition)'},
|
||||
'AA31E02A-400F-11DB-9590-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMFS filesystem partition'},
|
||||
'9198EFFC-31C0-11DB-8F78-000C2911D1B8': {'OS': 'VMware ESX', 'Description': 'VMware Reserved'},
|
||||
'2568845D-2332-4675-BC39-8FA5A4748D15': {'OS': 'Android-IA', 'Description': 'Bootloader'},
|
||||
'114EAFFE-1552-4022-B26E-9B053604CF84': {'OS': 'Android-IA', 'Description': 'Bootloader2'},
|
||||
'49A4D17F-93A3-45C1-A0DE-F50B2EBE2599': {'OS': 'Android-IA', 'Description': 'Boot'},
|
||||
'4177C722-9E92-4AAB-8644-43502BFD5506': {'OS': 'Android-IA', 'Description': 'Recovery'},
|
||||
'EF32A33B-A409-486C-9141-9FFB711F6266': {'OS': 'Android-IA', 'Description': 'Misc'},
|
||||
'20AC26BE-20B7-11E3-84C5-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Metadata'},
|
||||
'38F428E6-D326-425D-9140-6E0EA133647C': {'OS': 'Android-IA', 'Description': 'System'},
|
||||
'A893EF21-E428-470A-9E55-0668FD91A2D9': {'OS': 'Android-IA', 'Description': 'Cache'},
|
||||
'DC76DDA9-5AC1-491C-AF42-A82591580C0D': {'OS': 'Android-IA', 'Description': 'Data'},
|
||||
'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1': {'OS': 'Android-IA', 'Description': 'Persistent'},
|
||||
'8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80': {'OS': 'Android-IA', 'Description': 'Factory'},
|
||||
'767941D0-2085-11E3-AD3B-6CFDB94711E9': {'OS': 'Android-IA', 'Description': 'Fastboot / Tertiary'},
|
||||
'AC6D7924-EB71-4DF8-B48D-E267B27148FF': {'OS': 'Android-IA', 'Description': 'OEM'},
|
||||
'7412F7D5-A156-4B13-81DC-867174929325': {'OS': 'ONIE', 'Description': 'Boot'},
|
||||
'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149': {'OS': 'ONIE', 'Description': 'Config'},
|
||||
'9E1A2D38-C612-4316-AA26-8B49521E5A8B': {'OS': 'PowerPC', 'Description': 'PReP boot'},
|
||||
'BC13C2FF-59E6-4262-A352-B275FD6F7172': {'OS': 'Freedesktop', 'Description': 'Extended Boot Partition ($BOOT)'},
|
||||
}
|
||||
|
||||
def lookup_guid(guid):
|
||||
return PARTITION_UIDS.get(guid.upper(), {})
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,111 +0,0 @@
|
|||
# Wizard Kit: Functions - Product Keys
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# Regex
|
||||
REGEX_REGISTRY_DIRS = re.compile(
|
||||
r'^(config$|RegBack$|System32$|Transfer|Win)',
|
||||
re.IGNORECASE)
|
||||
REGEX_SOFTWARE_HIVE = re.compile(r'^Software$', re.IGNORECASE)
|
||||
|
||||
def extract_keys():
|
||||
"""Extract keys from provided hives and return a dict."""
|
||||
keys = {}
|
||||
|
||||
# Extract keys
|
||||
extract_item('ProduKey', silent=True)
|
||||
for hive in find_software_hives():
|
||||
cmd = [
|
||||
global_vars['Tools']['ProduKey'],
|
||||
'/IEKeys', '0',
|
||||
'/WindowsKeys', '1',
|
||||
'/OfficeKeys', '1',
|
||||
'/ExtractEdition', '1',
|
||||
'/nosavereg',
|
||||
'/regfile', hive,
|
||||
'/scomma', '']
|
||||
try:
|
||||
out = run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
# Ignore and return empty dict
|
||||
pass
|
||||
else:
|
||||
for line in out.stdout.decode().splitlines():
|
||||
# Add key to keys under product only if unique
|
||||
tmp = line.split(',')
|
||||
product = tmp[0]
|
||||
key = tmp[2]
|
||||
if product not in keys:
|
||||
keys[product] = []
|
||||
if key not in keys[product]:
|
||||
keys[product].append(key)
|
||||
|
||||
# Done
|
||||
return keys
|
||||
|
||||
def list_clientdir_keys():
|
||||
"""List product keys found in hives inside the ClientDir."""
|
||||
keys = extract_keys()
|
||||
key_list = []
|
||||
if keys:
|
||||
for product in sorted(keys):
|
||||
key_list.append(product)
|
||||
for key in sorted(keys[product]):
|
||||
key_list.append(' {key}'.format(key=key))
|
||||
else:
|
||||
key_list.append('No keys found.')
|
||||
|
||||
return key_list
|
||||
|
||||
def find_software_hives():
|
||||
"""Search for transferred SW hives and return a list."""
|
||||
hives = []
|
||||
search_paths = [global_vars['ClientDir']]
|
||||
|
||||
while len(search_paths) > 0:
|
||||
for item in os.scandir(search_paths.pop(0)):
|
||||
if item.is_dir() and REGEX_REGISTRY_DIRS.search(item.name):
|
||||
search_paths.append(item.path)
|
||||
if item.is_file() and REGEX_SOFTWARE_HIVE.search(item.name):
|
||||
hives.append(item.path)
|
||||
|
||||
return hives
|
||||
|
||||
def get_product_keys():
|
||||
"""List product keys from saved report."""
|
||||
keys = []
|
||||
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
|
||||
with open (log_file, 'r') as f:
|
||||
for line in f.readlines():
|
||||
if re.search(r'^Product Name', line):
|
||||
line = re.sub(r'^Product Name\s+:\s+(.*)', r'\1', line.strip())
|
||||
keys.append(line)
|
||||
|
||||
if keys:
|
||||
return keys
|
||||
else:
|
||||
return ['No product keys found']
|
||||
|
||||
def run_produkey():
|
||||
"""Run ProduKey and save report in the ClientDir."""
|
||||
extract_item('ProduKey', silent=True)
|
||||
log_file = r'{LogDir}\Product Keys (ProduKey).txt'.format(**global_vars)
|
||||
if not os.path.exists(log_file):
|
||||
# Clear current configuration
|
||||
for config in ['ProduKey.cfg', 'ProduKey64.cfg']:
|
||||
config = r'{BinDir}\ProduKey\{config}'.format(
|
||||
config=config, **global_vars)
|
||||
try:
|
||||
if os.path.exists(config):
|
||||
os.remove(config)
|
||||
except Exception:
|
||||
pass
|
||||
cmd = [
|
||||
global_vars['Tools']['ProduKey'],
|
||||
'/nosavereg',
|
||||
'/stext',
|
||||
log_file]
|
||||
run_program(cmd, check=False)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,126 +0,0 @@
|
|||
# Wizard Kit: Functions - Repairs
|
||||
|
||||
from functions.common import *
|
||||
|
||||
def run_chkdsk(repair=False):
|
||||
"""Run CHKDSK scan or schedule offline repairs."""
|
||||
if repair:
|
||||
run_chkdsk_offline()
|
||||
else:
|
||||
run_chkdsk_scan()
|
||||
|
||||
def run_chkdsk_scan():
|
||||
"""Run CHKDSK in a "split window" and report errors."""
|
||||
if global_vars['OS']['Version'] in ['8', '10']:
|
||||
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE'], '/scan', '/perf']
|
||||
else:
|
||||
cmd = ['chkdsk', global_vars['Env']['SYSTEMDRIVE']]
|
||||
out = run_program(cmd, check=False)
|
||||
# retcode == 0: no issues
|
||||
# retcode == 1: fixed issues (also happens when chkdsk.exe is killed?)
|
||||
# retcode == 2: issues
|
||||
if int(out.returncode) > 0:
|
||||
# print_error(' ERROR: CHKDSK encountered errors')
|
||||
raise GenericError
|
||||
|
||||
# Save stderr
|
||||
with open(r'{LogDir}\CHKDSK.err'.format(**global_vars), 'a') as f:
|
||||
for line in out.stderr.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
# Save stdout
|
||||
with open(r'{LogDir}\CHKDSK.log'.format(**global_vars), 'a') as f:
|
||||
for line in out.stdout.decode().splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
|
||||
def run_chkdsk_offline():
|
||||
"""Set filesystem 'dirty bit' to force a chkdsk during next boot."""
|
||||
cmd = [
|
||||
'fsutil', 'dirty',
|
||||
'set',
|
||||
global_vars['Env']['SYSTEMDRIVE']]
|
||||
out = run_program(cmd, check=False)
|
||||
if int(out.returncode) > 0:
|
||||
raise GenericError
|
||||
|
||||
def run_dism(repair=False):
|
||||
"""Run DISM /RestoreHealth, then /CheckHealth, and then report errors."""
|
||||
if global_vars['OS']['Version'] in ['8', '10']:
|
||||
if repair:
|
||||
# Restore Health
|
||||
cmd = [
|
||||
'DISM', '/Online',
|
||||
'/Cleanup-Image', '/RestoreHealth',
|
||||
r'/LogPath:"{LogDir}\DISM_RestoreHealth.log"'.format(
|
||||
**global_vars),
|
||||
'-new_console:n', '-new_console:s33V']
|
||||
else:
|
||||
# Scan Health
|
||||
cmd = [
|
||||
'DISM', '/Online',
|
||||
'/Cleanup-Image', '/ScanHealth',
|
||||
r'/LogPath:"{LogDir}\DISM_ScanHealth.log"'.format(
|
||||
**global_vars),
|
||||
'-new_console:n', '-new_console:s33V']
|
||||
run_program(cmd, pipe=False, check=False, shell=True)
|
||||
wait_for_process('dism')
|
||||
# Now check health
|
||||
cmd = [
|
||||
'DISM', '/Online',
|
||||
'/Cleanup-Image', '/CheckHealth',
|
||||
r'/LogPath:"{LogDir}\DISM_CheckHealth.log"'.format(**global_vars)]
|
||||
result = run_program(cmd, shell=True).stdout.decode()
|
||||
# Check result
|
||||
if 'no component store corruption detected' not in result.lower():
|
||||
raise GenericError
|
||||
else:
|
||||
raise UnsupportedOSError
|
||||
|
||||
def run_kvrt():
|
||||
"""Run KVRT."""
|
||||
extract_item('KVRT', silent=True)
|
||||
os.makedirs(global_vars['QuarantineDir'], exist_ok=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['KVRT'],
|
||||
'-accepteula', '-dontcryptsupportinfo', '-fixednames',
|
||||
'-d', global_vars['QuarantineDir'],
|
||||
'-processlevel', '3']
|
||||
popen_program(cmd, pipe=False)
|
||||
|
||||
def run_sfc_scan():
|
||||
"""Run SFC in a "split window" and report errors."""
|
||||
cmd = [
|
||||
r'{SYSTEMROOT}\System32\sfc.exe'.format(**global_vars['Env']),
|
||||
'/scannow']
|
||||
out = run_program(cmd, check=False)
|
||||
# Save stderr
|
||||
with open(r'{LogDir}\SFC.err'.format(**global_vars), 'a') as f:
|
||||
for line in out.stderr.decode('utf-8', 'ignore').splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
# Save stdout
|
||||
with open(r'{LogDir}\SFC.log'.format(**global_vars), 'a') as f:
|
||||
for line in out.stdout.decode('utf-8', 'ignore').splitlines():
|
||||
f.write(line.strip() + '\n')
|
||||
# Check result
|
||||
log_text = out.stdout.decode('utf-8', 'ignore').replace('\0', '')
|
||||
if re.findall(r'did\s+not\s+find\s+any\s+integrity\s+violations', log_text):
|
||||
pass
|
||||
elif re.findall(r'successfully\s+repaired\s+them', log_text):
|
||||
raise GenericRepair
|
||||
else:
|
||||
raise GenericError
|
||||
|
||||
def run_tdsskiller():
|
||||
"""Run TDSSKiller."""
|
||||
extract_item('TDSSKiller', silent=True)
|
||||
os.makedirs(r'{QuarantineDir}\TDSSKiller'.format(
|
||||
**global_vars), exist_ok=True)
|
||||
cmd = [
|
||||
global_vars['Tools']['TDSSKiller'],
|
||||
'-l', r'{LogDir}\TDSSKiller.log'.format(**global_vars),
|
||||
'-qpath', r'{QuarantineDir}\TDSSKiller'.format(**global_vars),
|
||||
'-accepteula', '-accepteulaksn',
|
||||
'-dcexact', '-tdlfs']
|
||||
run_program(cmd, pipe=False)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,272 +0,0 @@
|
|||
# Wizard Kit: Functions - Setup
|
||||
|
||||
from functions.common import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
HKCU = winreg.HKEY_CURRENT_USER
|
||||
HKLM = winreg.HKEY_LOCAL_MACHINE
|
||||
SETTINGS_CLASSIC_START = {
|
||||
r'Software\IvoSoft\ClassicShell\Settings': {},
|
||||
r'Software\IvoSoft\ClassicStartMenu': {
|
||||
'DWORD Items': {'ShowedStyle2': 1},
|
||||
},
|
||||
r'Software\IvoSoft\ClassicStartMenu\MRU': {},
|
||||
r'Software\IvoSoft\ClassicStartMenu\Settings': {
|
||||
'DWORD Items': {'SkipMetro': 1},
|
||||
'SZ Items': {
|
||||
'MenuStyle': 'Win7',
|
||||
'RecentPrograms': 'Recent',
|
||||
},
|
||||
},
|
||||
}
|
||||
SETTINGS_EXPLORER_SYSTEM = {
|
||||
# Disable Telemetry
|
||||
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
||||
'DWORD Items': {'AllowTelemetry': 0},
|
||||
},
|
||||
r'SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\DataCollection': {
|
||||
'DWORD Items': {'AllowTelemetry': 0},
|
||||
'WOW64_32': True,
|
||||
},
|
||||
r'SOFTWARE\Policies\Microsoft\Windows\DataCollection': {
|
||||
'DWORD Items': {'AllowTelemetry': 0},
|
||||
},
|
||||
# Disable Wi-Fi Sense
|
||||
r'Software\Microsoft\PolicyManager\default\WiFi\AllowWiFiHotSpotReporting': {
|
||||
'DWORD Items': {'Value': 0},
|
||||
},
|
||||
r'Software\Microsoft\PolicyManager\default\WiFi\AllowAutoConnectToWiFiSenseHotspots': {
|
||||
'DWORD Items': {'Value': 0},
|
||||
},
|
||||
# Disable Location Tracking
|
||||
r'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Sensor\Overrides\{BFA794E4-F964-4FDB-90F6-51056BFE4B44}': {
|
||||
'DWORD Items': {'SensorPermissionState': 0},
|
||||
},
|
||||
r'System\CurrentControlSet\Services\lfsvc\Service\Configuration': {
|
||||
'Status': {'Value': 0},
|
||||
},
|
||||
}
|
||||
SETTINGS_EXPLORER_USER = {
|
||||
# Disable Cortana
|
||||
r'Software\Microsoft\Personalization\Settings': {
|
||||
'DWORD Items': {'AcceptedPrivacyPolicy': 0},
|
||||
},
|
||||
r'Software\Microsoft\InputPersonalization': {
|
||||
'DWORD Items': {
|
||||
'RestrictImplicitTextCollection': 1,
|
||||
'RestrictImplicitInkCollection': 1
|
||||
},
|
||||
},
|
||||
r'Software\Microsoft\InputPersonalization\TrainedDataStore': {
|
||||
'DWORD Items': {'HarvestContacts': 1},
|
||||
},
|
||||
# Hide Search button / box
|
||||
r'Software\Microsoft\Windows\CurrentVersion\Search': {
|
||||
'DWORD Items': {'SearchboxTaskbarMode': 0},
|
||||
},
|
||||
# Change default Explorer view to "Computer"
|
||||
r'Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced': {
|
||||
'DWORD Items': {'LaunchTo': 1},
|
||||
},
|
||||
}
|
||||
SETTINGS_GOOGLE_CHROME = {
|
||||
r'Software\Google\Chrome\Extensions': {
|
||||
'WOW64_32': True,
|
||||
},
|
||||
r'Software\Google\Chrome\Extensions\cjpalhdlnbpafiamejdnhcphjbkeiagm': {
|
||||
'SZ Items': {
|
||||
'update_url': 'https://clients2.google.com/service/update2/crx'},
|
||||
'WOW64_32': True,
|
||||
},
|
||||
r'Software\Google\Chrome\Extensions\pgdnlhfefecpicbbihgmbmffkjpaplco': {
|
||||
'SZ Items': {
|
||||
'update_url': 'https://clients2.google.com/service/update2/crx'},
|
||||
'WOW64_32': True,
|
||||
},
|
||||
}
|
||||
VCR_REDISTS = [
|
||||
{'Name': 'Visual C++ 2008 SP1 x32...',
|
||||
'Cmd': [r'2008sp1\x32\vcredist.exe', '/qb! /norestart']},
|
||||
{'Name': 'Visual C++ 2008 SP1 x64...',
|
||||
'Cmd': [r'2008sp1\x64\vcredist.exe', '/qb! /norestart']},
|
||||
{'Name': 'Visual C++ 2010 x32...',
|
||||
'Cmd': [r'2010sp1\x32\vcredist.exe', '/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2010 x64...',
|
||||
'Cmd': [r'2010sp1\x64\vcredist.exe', '/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2012 Update 4 x32...',
|
||||
'Cmd': [r'2012u4\x32\vcredist.exe', '/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2012 Update 4 x64...',
|
||||
'Cmd': [r'2012u4\x64\vcredist.exe', '/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2013 x32...',
|
||||
'Cmd': [r'2013\x32\vcredist.exe', '/install',
|
||||
'/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2013 x64...',
|
||||
'Cmd': [r'2013\x64\vcredist.exe', '/install',
|
||||
'/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2017 x32...',
|
||||
'Cmd': [r'2017\x32\vcredist.exe', '/install',
|
||||
'/passive', '/norestart']},
|
||||
{'Name': 'Visual C++ 2017 x64...',
|
||||
'Cmd': [r'2017\x64\vcredist.exe', '/install',
|
||||
'/passive', '/norestart']},
|
||||
]
|
||||
|
||||
def config_classicstart():
|
||||
"""Configure ClassicStart."""
|
||||
# User level, not system level
|
||||
cs_exe = r'{PROGRAMFILES}\Classic Shell\ClassicStartMenu.exe'.format(
|
||||
**global_vars['Env'])
|
||||
skin = r'{PROGRAMFILES}\Classic Shell\Skins\Metro-Win10-Black.skin7'.format(
|
||||
**global_vars['Env'])
|
||||
extract_item('ClassicStartSkin', silent=True)
|
||||
|
||||
# Stop Classic Start
|
||||
run_program([cs_exe, '-exit'], check=False)
|
||||
sleep(1)
|
||||
kill_process('ClassicStartMenu.exe')
|
||||
|
||||
# Configure
|
||||
write_registry_settings(SETTINGS_CLASSIC_START, all_users=False)
|
||||
if global_vars['OS']['Version'] == '10' and os.path.exists(skin):
|
||||
# Enable Win10 theme if on Win10
|
||||
key_path = r'Software\IvoSoft\ClassicStartMenu\Settings'
|
||||
with winreg.OpenKey(HKCU, key_path, access=winreg.KEY_WRITE) as key:
|
||||
winreg.SetValueEx(
|
||||
key, 'SkinW7', 0, winreg.REG_SZ, 'Metro-Win10-Black')
|
||||
winreg.SetValueEx(key, 'SkinVariationW7', 0, winreg.REG_SZ, '')
|
||||
|
||||
# Pin Browser to Start Menu (Classic)
|
||||
firefox = r'{PROGRAMDATA}\Start Menu\Programs\Mozilla Firefox.lnk'.format(
|
||||
**global_vars['Env'])
|
||||
chrome = r'{PROGRAMDATA}\Start Menu\Programs\Google Chrome.lnk'.format(
|
||||
**global_vars['Env'])
|
||||
dest_path = r'{APPDATA}\ClassicShell\Pinned'.format(**global_vars['Env'])
|
||||
source = None
|
||||
dest = None
|
||||
if os.path.exists(firefox):
|
||||
source = firefox
|
||||
dest = r'{}\Mozilla Firefox.lnk'.format(dest_path)
|
||||
elif os.path.exists(chrome):
|
||||
source = chrome
|
||||
dest = r'{}\Google Chrome.lnk'.format(dest_path)
|
||||
if source:
|
||||
try:
|
||||
os.makedirs(dest_path, exist_ok=True)
|
||||
shutil.copy(source, dest)
|
||||
except Exception:
|
||||
pass # Meh, it's fine without
|
||||
|
||||
# (Re)start Classic Start
|
||||
run_program([cs_exe, '-exit'], check=False)
|
||||
sleep(1)
|
||||
kill_process('ClassicStartMenu.exe')
|
||||
sleep(1)
|
||||
popen_program(cs_exe)
|
||||
|
||||
def write_registry_settings(settings, all_users=False):
|
||||
"""Write registry values from custom dict of dicts."""
|
||||
hive = HKCU
|
||||
if all_users:
|
||||
hive = HKLM
|
||||
for k, v in settings.items():
|
||||
# CreateKey
|
||||
access = winreg.KEY_WRITE
|
||||
if 'WOW64_32' in v:
|
||||
access = access | winreg.KEY_WOW64_32KEY
|
||||
winreg.CreateKeyEx(hive, k, 0, access)
|
||||
|
||||
# Create values
|
||||
with winreg.OpenKeyEx(hive, k, 0, access) as key:
|
||||
for name, value in v.get('DWORD Items', {}).items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_DWORD, value)
|
||||
for name, value in v.get('SZ Items', {}).items():
|
||||
winreg.SetValueEx(key, name, 0, winreg.REG_SZ, value)
|
||||
|
||||
def config_explorer_system():
|
||||
"""Configure Windows Explorer for all users via Registry settings."""
|
||||
write_registry_settings(SETTINGS_EXPLORER_SYSTEM, all_users=True)
|
||||
|
||||
def config_explorer_user():
|
||||
"""Configure Windows Explorer for current user via Registry settings."""
|
||||
write_registry_settings(SETTINGS_EXPLORER_USER, all_users=False)
|
||||
|
||||
def update_clock():
|
||||
"""Set Timezone and sync clock."""
|
||||
run_program(['tzutil' ,'/s', TIME_ZONE], check=False)
|
||||
run_program(['net', 'stop', 'w32ime'], check=False)
|
||||
run_program(
|
||||
['w32tm', '/config', '/syncfromflags:manual',
|
||||
'/manualpeerlist:"us.pool.ntp.org time.nist.gov time.windows.com"',
|
||||
],
|
||||
check=False)
|
||||
run_program(['net', 'start', 'w32ime'], check=False)
|
||||
run_program(['w32tm', '/resync', '/nowait'], check=False)
|
||||
|
||||
# Installations
|
||||
def install_adobe_reader():
|
||||
"""Install Adobe Reader."""
|
||||
cmd = [
|
||||
r'{BaseDir}\Installers\Extras\Office\Adobe Reader DC.exe'.format(
|
||||
**global_vars),
|
||||
'/sAll',
|
||||
'/msi', '/norestart', '/quiet',
|
||||
'ALLUSERS=1',
|
||||
'EULA_ACCEPT=YES']
|
||||
try_and_print(message='Adobe Reader DC...', function=run_program, cmd=cmd)
|
||||
|
||||
def install_chrome_extensions():
|
||||
"""Update registry to 'install' Google Chrome extensions for all users."""
|
||||
write_registry_settings(SETTINGS_GOOGLE_CHROME, all_users=True)
|
||||
|
||||
def install_classicstart_skin():
|
||||
"""Extract ClassicStart skin to installation folder."""
|
||||
if global_vars['OS']['Version'] not in ['8', '10']:
|
||||
raise UnsupportedOSError
|
||||
extract_item('ClassicStartSkin', silent=True)
|
||||
source = r'{BinDir}\ClassicStartSkin\Metro-Win10-Black.skin7'.format(
|
||||
**global_vars)
|
||||
dest_path = r'{PROGRAMFILES}\Classic Shell\Skins'.format(
|
||||
**global_vars['Env'])
|
||||
dest = r'{}\Metro-Win10-Black.skin7'.format(dest_path)
|
||||
os.makedirs(dest_path, exist_ok=True)
|
||||
shutil.copy(source, dest)
|
||||
|
||||
def install_firefox_extensions():
|
||||
"""Extract Firefox extensions to installation folder."""
|
||||
dist_path = r'{PROGRAMFILES}\Mozilla Firefox\distribution\extensions'.format(
|
||||
**global_vars['Env'])
|
||||
# Extract extension(s) to distribution folder
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'], 'x', '-aos', '-bso0', '-bse0',
|
||||
'-p{ArchivePassword}'.format(**global_vars),
|
||||
'-o{dist_path}'.format(dist_path=dist_path),
|
||||
r'{CBinDir}\FirefoxExtensions.7z'.format(**global_vars)]
|
||||
run_program(cmd)
|
||||
|
||||
def install_ninite_bundle(mse=False):
|
||||
"""Run Ninite file(s) based on OS version."""
|
||||
if global_vars['OS']['Version'] in ['8', '10']:
|
||||
# Modern selection
|
||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Modern.exe'.format(
|
||||
**global_vars))
|
||||
else:
|
||||
# Legacy selection
|
||||
if mse:
|
||||
cmd = r'{BaseDir}\Installers\Extras\Security'.format(**global_vars)
|
||||
cmd += r'\Microsoft Security Essentials.exe'
|
||||
popen_program(cmd)
|
||||
popen_program(r'{BaseDir}\Installers\Extras\Bundles\Legacy.exe'.format(
|
||||
**global_vars))
|
||||
|
||||
def install_vcredists():
|
||||
"""Install all supported Visual C++ runtimes."""
|
||||
extract_item('_vcredists', silent=True)
|
||||
prev_dir = os.getcwd()
|
||||
os.chdir(r'{BinDir}\_vcredists'.format(**global_vars))
|
||||
for vcr in VCR_REDISTS:
|
||||
try_and_print(message=vcr['Name'], function=run_program, cmd=vcr['Cmd'])
|
||||
|
||||
os.chdir(prev_dir)
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,891 +0,0 @@
|
|||
# Wizard Kit: Functions - Build / Update
|
||||
|
||||
import requests
|
||||
|
||||
from functions.common import *
|
||||
from functions.data import *
|
||||
from settings.launchers import *
|
||||
from settings.music import *
|
||||
from settings.sources import *
|
||||
|
||||
def compress_and_remove_item(item):
|
||||
try:
|
||||
compress_item(item)
|
||||
except:
|
||||
raise GenericError
|
||||
else:
|
||||
remove_item(item.path)
|
||||
|
||||
def compress_item(item):
|
||||
# Prep
|
||||
prev_dir = os.getcwd()
|
||||
dest = '{}.7z'.format(item.path)
|
||||
wd = item.path
|
||||
include_str = '*'
|
||||
if os.path.isfile(wd):
|
||||
wd = os.path.abspath(r'{}\{}'.format(wd, os.path.pardir))
|
||||
include_str = item.name
|
||||
os.chdir(wd)
|
||||
|
||||
# Compress
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', dest,
|
||||
'-t7z', '-mx=7', '-myx=7', '-ms=on', '-mhe', '-bso0', '-bse0',
|
||||
'-p{}'.format(ARCHIVE_PASSWORD),
|
||||
include_str,
|
||||
]
|
||||
run_program(cmd)
|
||||
|
||||
# Done
|
||||
os.chdir(prev_dir)
|
||||
|
||||
def download_generic(out_dir, out_name, source_url):
|
||||
"""Downloads a file using requests."""
|
||||
## Code based on this Q&A: https://stackoverflow.com/q/16694907
|
||||
### Asked by: https://stackoverflow.com/users/427457/roman-podlinov
|
||||
### Edited by: https://stackoverflow.com/users/657427/christophe-roussy
|
||||
### Using answer: https://stackoverflow.com/a/39217788
|
||||
### Answer from: https://stackoverflow.com/users/4323/john-zwinck
|
||||
os.makedirs(out_dir, exist_ok=True)
|
||||
out_path = '{}/{}'.format(out_dir, out_name)
|
||||
try:
|
||||
r = requests.get(source_url, stream=True)
|
||||
with open(out_path, 'wb') as f:
|
||||
shutil.copyfileobj(r.raw, f)
|
||||
r.close()
|
||||
except:
|
||||
raise GenericError('Failed to download file.')
|
||||
|
||||
def download_to_temp(out_name, source_url):
|
||||
download_generic(global_vars['TmpDir'], out_name, source_url)
|
||||
|
||||
def extract_generic(source, dest, mode='x', sz_args=[]):
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
mode, source, r'-o{}'.format(dest),
|
||||
'-aoa', '-bso0', '-bse0',
|
||||
]
|
||||
cmd.extend(sz_args)
|
||||
run_program(cmd)
|
||||
|
||||
def extract_temp_to_bin(source, item, mode='x', sz_args=[]):
|
||||
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
||||
dest = r'{}\{}'.format(global_vars['BinDir'], item)
|
||||
extract_generic(source, dest, mode, sz_args)
|
||||
|
||||
def extract_temp_to_cbin(source, item, mode='x', sz_args=[]):
|
||||
source = r'{}\{}'.format(global_vars['TmpDir'], source)
|
||||
dest = r'{}\{}'.format(global_vars['CBinDir'], item)
|
||||
include_path = r'{}\_include\{}'.format(global_vars['CBinDir'], item)
|
||||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
extract_generic(source, dest, mode, sz_args)
|
||||
|
||||
def generate_launcher(section, name, options):
|
||||
# Prep
|
||||
dest = r'{}\{}'.format(global_vars['BaseDir'], section)
|
||||
if section == '(Root)':
|
||||
dest = global_vars['BaseDir']
|
||||
full_path = r'{}\{}.cmd'.format(dest, name)
|
||||
template = r'{}\Scripts\Launcher_Template.cmd'.format(global_vars['BinDir'])
|
||||
|
||||
# Format options
|
||||
f_options = {}
|
||||
for opt in options.keys():
|
||||
# Values need to be a list to support the multi-line extra code sections
|
||||
if opt == 'Extra Code':
|
||||
f_options['rem EXTRA_CODE'] = options['Extra Code']
|
||||
elif re.search(r'^L_\w+', opt, re.IGNORECASE):
|
||||
new_opt = 'set {}='.format(opt)
|
||||
f_options[new_opt] = ['set {}={}'.format(opt, options[opt])]
|
||||
|
||||
# Read template and update using f_options
|
||||
out_text = []
|
||||
with open(template, 'r') as f:
|
||||
for line in f.readlines():
|
||||
# Strip all lines to let Python handle/correct the CRLF endings
|
||||
line = line.strip()
|
||||
if line in f_options:
|
||||
# Extend instead of append to support extra code sections
|
||||
out_text.extend(f_options[line])
|
||||
else:
|
||||
out_text.append(line)
|
||||
|
||||
# Write file
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
with open(full_path, 'w') as f:
|
||||
# f.writelines(out_text)
|
||||
f.write('\n'.join(out_text))
|
||||
|
||||
def remove_item(item_path):
|
||||
if os.path.exists(item_path):
|
||||
if os.path.isdir(item_path):
|
||||
shutil.rmtree(item_path, ignore_errors=True)
|
||||
else:
|
||||
os.remove(item_path)
|
||||
|
||||
def remove_from_kit(item):
|
||||
item_locations = []
|
||||
for p in [global_vars['BinDir'], global_vars['CBinDir']]:
|
||||
item_locations.append(r'{}\{}'.format(p, item))
|
||||
item_locations.append(r'{}\_Drivers\{}'.format(p, item))
|
||||
for item_path in item_locations:
|
||||
remove_item(item_path)
|
||||
|
||||
def remove_from_temp(item):
|
||||
item_path = r'{}\{}'.format(global_vars['TmpDir'], item)
|
||||
remove_item(item_path)
|
||||
|
||||
def resolve_dynamic_url(source_url, regex):
|
||||
"""Scan source_url for a url using the regex provided; returns str."""
|
||||
# Load the download page
|
||||
try:
|
||||
download_page = requests.get(source_url)
|
||||
except Exception:
|
||||
# "Fail silently as the download_to_temp() function will catch it
|
||||
return None
|
||||
|
||||
# Scan for the url using the regex provided
|
||||
url = None
|
||||
for line in download_page.content.decode().splitlines():
|
||||
if re.search(regex, line):
|
||||
url = line.strip()
|
||||
url = re.sub(r'.*(a |)href="([^"]+)".*', r'\2', url)
|
||||
url = re.sub(r".*(a |)href='([^']+)'.*", r'\2', url)
|
||||
break
|
||||
|
||||
# Return
|
||||
return url
|
||||
|
||||
def scan_for_net_installers(server, family_name, min_year):
|
||||
if not server['Mounted']:
|
||||
mount_network_share(server)
|
||||
|
||||
if server['Mounted']:
|
||||
for year in os.scandir(r'\\{IP}\{Share}'.format(**server)):
|
||||
if int(year.name) < min_year:
|
||||
# Don't support outdated installers
|
||||
continue
|
||||
for version in os.scandir(year.path):
|
||||
section = r'Installers\Extras\{}\{}'.format(
|
||||
family_name, year.name)
|
||||
if section not in LAUNCHERS:
|
||||
LAUNCHERS[section] = {}
|
||||
name = version.name
|
||||
if re.search(r'(exe|msi)$', name, re.IGNORECASE):
|
||||
name = name[:-4]
|
||||
if name not in LAUNCHERS[section]:
|
||||
LAUNCHERS[section][name] = {
|
||||
'L_TYPE': family_name,
|
||||
'L_PATH': year.name,
|
||||
'L_ITEM': version.name,
|
||||
}
|
||||
umount_network_share(server)
|
||||
|
||||
## Data Recovery ##
|
||||
def update_testdisk():
|
||||
# Stop running processes
|
||||
for exe in ['fidentify_win.exe', 'photorec_win.exe',
|
||||
'qphotorec_win.exe', 'testdisk_win.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('TestDisk')
|
||||
|
||||
# Download
|
||||
download_to_temp('testdisk_wip.zip', SOURCE_URLS['TestDisk'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('testdisk_wip.zip', 'TestDisk')
|
||||
dest = r'{}\TestDisk'.format(global_vars['CBinDir'])
|
||||
for item in os.scandir(r'{}\testdisk-7.1-WIP'.format(dest)):
|
||||
dest_item = '{}\{}'.format(dest, item.name)
|
||||
if not os.path.exists(dest_item):
|
||||
shutil.move(item.path, dest_item)
|
||||
shutil.rmtree(
|
||||
r'{}\TestDisk\testdisk-7.1-WIP'.format(global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('testdisk_wip.zip')
|
||||
|
||||
## Data Transfers ##
|
||||
def update_fastcopy():
|
||||
## NOTE: Lives in .bin uncompressed
|
||||
# Stop running processes
|
||||
for process in ['FastCopy.exe', 'FastCopy64.exe']:
|
||||
kill_process(process)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('FastCopy')
|
||||
|
||||
# Download
|
||||
download_to_temp('FastCopy32.zip', SOURCE_URLS['FastCopy32'])
|
||||
download_to_temp('FastCopy64.zip', SOURCE_URLS['FastCopy64'])
|
||||
|
||||
# Extract
|
||||
extract_temp_to_bin('FastCopy64.zip', 'FastCopy', sz_args=['FastCopy.exe'])
|
||||
shutil.move(
|
||||
r'{}\FastCopy\FastCopy.exe'.format(global_vars['BinDir']),
|
||||
r'{}\FastCopy\FastCopy64.exe'.format(global_vars['BinDir']))
|
||||
extract_temp_to_bin('FastCopy32.zip', 'FastCopy', sz_args=[r'-x!setup.exe', r'-x!*.dll'])
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('FastCopy32.zip')
|
||||
remove_from_temp('FastCopy64.zip')
|
||||
|
||||
def update_wimlib():
|
||||
# Stop running processes
|
||||
kill_process('wimlib-imagex.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('wimlib')
|
||||
|
||||
# Download
|
||||
download_to_temp('wimlib32.zip', SOURCE_URLS['wimlib32'])
|
||||
download_to_temp('wimlib64.zip', SOURCE_URLS['wimlib64'])
|
||||
|
||||
# Extract
|
||||
extract_generic(
|
||||
r'{}\wimlib32.zip'.format(global_vars['TmpDir']),
|
||||
r'{}\wimlib\x32'.format(global_vars['CBinDir']))
|
||||
extract_generic(
|
||||
r'{}\wimlib64.zip'.format(global_vars['TmpDir']),
|
||||
r'{}\wimlib\x64'.format(global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('wimlib32.zip')
|
||||
remove_from_temp('wimlib64.zip')
|
||||
|
||||
def update_xyplorer():
|
||||
# Stop running processes
|
||||
kill_process('XYplorerFree.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('XYplorerFree')
|
||||
|
||||
# Download
|
||||
download_to_temp('xyplorer_free.zip', SOURCE_URLS['XYplorerFree'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('xyplorer_free.zip', 'XYplorerFree')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('xyplorer_free.zip')
|
||||
|
||||
## Diagnostics ##
|
||||
def update_aida64():
|
||||
# Stop running processes
|
||||
kill_process('notepadplusplus.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('AIDA64')
|
||||
|
||||
# Download
|
||||
download_to_temp('aida64.zip', SOURCE_URLS['AIDA64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('aida64.zip', 'AIDA64')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('aida64.zip')
|
||||
|
||||
def update_autoruns():
|
||||
# Stop running processes
|
||||
kill_process('Autoruns.exe')
|
||||
kill_process('Autoruns64.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('Autoruns')
|
||||
|
||||
# Download
|
||||
download_to_temp('Autoruns.zip', SOURCE_URLS['Autoruns'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('Autoruns.zip', 'Autoruns')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('Autoruns.zip')
|
||||
|
||||
def update_bleachbit():
|
||||
# Stop running processes
|
||||
kill_process('bleachbit.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('BleachBit')
|
||||
|
||||
# Download
|
||||
download_to_temp('bleachbit.zip', SOURCE_URLS['BleachBit'])
|
||||
download_to_temp('Winapp2.zip', SOURCE_URLS['Winapp2'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('bleachbit.zip', 'BleachBit')
|
||||
extract_generic(
|
||||
r'{}\Winapp2.zip'.format(global_vars['TmpDir']),
|
||||
r'{}\BleachBit\cleaners'.format(global_vars['CBinDir']),
|
||||
mode='e', sz_args=[r'Winapp2-master\Non-CCleaner\Winapp2.ini'])
|
||||
|
||||
# Move files into place
|
||||
dest = r'{}\BleachBit'.format(global_vars['CBinDir'])
|
||||
for item in os.scandir(r'{}\BleachBit-Portable'.format(dest)):
|
||||
dest_item = '{}\{}'.format(dest, item.name)
|
||||
if not os.path.exists(dest_item):
|
||||
shutil.move(item.path, dest_item)
|
||||
shutil.rmtree(
|
||||
r'{}\BleachBit\BleachBit-Portable'.format(global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('bleachbit.zip')
|
||||
remove_from_temp('Winapp2.zip')
|
||||
|
||||
def update_bluescreenview():
|
||||
# Stop running processes
|
||||
for exe in ['BlueScreenView.exe', 'BlueScreenView64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('BlueScreenView')
|
||||
|
||||
# Download
|
||||
download_to_temp('bluescreenview32.zip', SOURCE_URLS['BlueScreenView32'])
|
||||
download_to_temp('bluescreenview64.zip', SOURCE_URLS['BlueScreenView64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('bluescreenview64.zip', 'BlueScreenView', sz_args=['BlueScreenView.exe'])
|
||||
shutil.move(
|
||||
r'{}\BlueScreenView\BlueScreenView.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\BlueScreenView\BlueScreenView64.exe'.format(global_vars['CBinDir']))
|
||||
extract_temp_to_cbin('bluescreenview32.zip', 'BlueScreenView')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('bluescreenview32.zip')
|
||||
remove_from_temp('bluescreenview64.zip')
|
||||
|
||||
def update_erunt():
|
||||
# Stop running processes
|
||||
kill_process('ERUNT.EXE')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('ERUNT')
|
||||
|
||||
# Download
|
||||
download_to_temp('erunt.zip', SOURCE_URLS['ERUNT'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('erunt.zip', 'ERUNT')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('erunt.zip')
|
||||
|
||||
def update_hitmanpro():
|
||||
# Stop running processes
|
||||
for exe in ['HitmanPro.exe', 'HitmanPro64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('HitmanPro')
|
||||
|
||||
# Download
|
||||
dest = r'{}\HitmanPro'.format(global_vars['CBinDir'])
|
||||
download_generic(dest, 'HitmanPro.exe', SOURCE_URLS['HitmanPro32'])
|
||||
download_generic(dest, 'HitmanPro64.exe', SOURCE_URLS['HitmanPro64'])
|
||||
|
||||
def update_hwinfo():
|
||||
## NOTE: Lives in .bin uncompressed
|
||||
# Stop running processes
|
||||
for exe in ['HWiNFO32.exe', 'HWiNFO64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Download
|
||||
download_to_temp('HWiNFO32.zip', SOURCE_URLS['HWiNFO32'])
|
||||
download_to_temp('HWiNFO64.zip', SOURCE_URLS['HWiNFO64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_bin('HWiNFO32.zip', 'HWiNFO')
|
||||
extract_temp_to_bin('HWiNFO64.zip', 'HWiNFO')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('HWiNFO32.zip')
|
||||
remove_from_temp('HWiNFO64.zip')
|
||||
|
||||
def update_produkey():
|
||||
# Stop running processes
|
||||
for exe in ['ProduKey.exe', 'ProduKey64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('ProduKey')
|
||||
|
||||
# Download
|
||||
download_to_temp('produkey32.zip', SOURCE_URLS['ProduKey32'])
|
||||
download_to_temp('produkey64.zip', SOURCE_URLS['ProduKey64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('produkey64.zip', 'ProduKey', sz_args=['ProduKey.exe'])
|
||||
shutil.move(
|
||||
r'{}\ProduKey\ProduKey.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\ProduKey\ProduKey64.exe'.format(global_vars['CBinDir']))
|
||||
extract_temp_to_cbin('produkey32.zip', 'ProduKey')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('produkey32.zip')
|
||||
remove_from_temp('produkey64.zip')
|
||||
|
||||
## Drivers ##
|
||||
def update_intel_rst():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Intel RST')
|
||||
|
||||
# Prep
|
||||
dest = r'{}\_Drivers\Intel RST'.format(global_vars['CBinDir'])
|
||||
include_path = r'{}\_include\_Drivers\Intel RST'.format(
|
||||
global_vars['CBinDir'])
|
||||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
|
||||
# Download
|
||||
for name, url in RST_SOURCES.items():
|
||||
download_generic(dest, name, url)
|
||||
|
||||
def update_intel_ssd_toolbox():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Intel SSD Toolbox.exe')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\_Drivers\Intel SSD Toolbox'.format(global_vars['CBinDir']),
|
||||
'Intel SSD Toolbox.exe',
|
||||
SOURCE_URLS['Intel SSD Toolbox'])
|
||||
|
||||
def update_samsung_magician():
|
||||
# Remove existing folders
|
||||
remove_from_kit('Samsung Magician.exe')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\_Drivers\Samsung Magician'.format(global_vars['CBinDir']),
|
||||
'Samsung Magician.exe',
|
||||
SOURCE_URLS['Samsung Magician'])
|
||||
|
||||
def update_sdi_origin():
|
||||
# Download aria2
|
||||
download_to_temp('aria2.zip', SOURCE_URLS['aria2'])
|
||||
aria_source = r'{}\aria2.zip'.format(global_vars['TmpDir'])
|
||||
aria_dest = r'{}\aria2'.format(global_vars['TmpDir'])
|
||||
aria = r'{}\aria2c.exe'.format(aria_dest)
|
||||
extract_generic(aria_source, aria_dest, mode='e')
|
||||
|
||||
# Prep for torrent download
|
||||
download_to_temp('sdio.torrent', SOURCE_URLS['SDIO Torrent'])
|
||||
sdio_torrent = r'{}\sdio.torrent'.format(global_vars['TmpDir'])
|
||||
out = run_program([aria, sdio_torrent, '-S'])
|
||||
indexes = []
|
||||
for line in out.stdout.decode().splitlines():
|
||||
r = re.search(r'^\s*(\d+)\|(.*)', line)
|
||||
if r and not re.search(r'(\.(bat|inf)|Video|Server|Printer|XP)', line, re.IGNORECASE):
|
||||
indexes.append(int(r.group(1)))
|
||||
indexes = [str(i) for i in sorted(indexes)]
|
||||
|
||||
# Download SDI Origin
|
||||
cmd = [
|
||||
aria,
|
||||
'--select-file={}'.format(','.join(indexes)),
|
||||
'-d', aria_dest,
|
||||
'--seed-time=0',
|
||||
sdio_torrent,
|
||||
'-new_console:n', '-new_console:s33V',
|
||||
]
|
||||
run_program(cmd, pipe=False, check=False, shell=True)
|
||||
sleep(1)
|
||||
wait_for_process('aria2c')
|
||||
|
||||
# Download SDI Origin extra themes
|
||||
download_to_temp('sdio_themes.zip', SOURCE_URLS['SDIO Themes'])
|
||||
theme_source = r'{}\sdio_themes.zip'.format(global_vars['TmpDir'])
|
||||
theme_dest = r'{}\SDIO_Update\tools\SDI\themes'.format(aria_dest)
|
||||
extract_generic(theme_source, theme_dest)
|
||||
|
||||
# Move files into place
|
||||
for item in os.scandir(r'{}\SDIO_Update'.format(aria_dest)):
|
||||
dest_item = '{}\_Drivers\SDIO\{}'.format(
|
||||
global_vars['BinDir'], item.name)
|
||||
r = re.search(r'^SDIO_x?(64|)_?R.*exe$', item.name, re.IGNORECASE)
|
||||
if r:
|
||||
dest_item = dest_item.replace(item.name, 'SDIO{}.exe'.format(
|
||||
r.group(1)))
|
||||
if (not os.path.exists(dest_item)
|
||||
and not re.search(r'\.(inf|bat)$', item.name, re.IGNORECASE)):
|
||||
shutil.move(item.path, dest_item)
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('aria2')
|
||||
remove_from_temp('aria2.zip')
|
||||
remove_from_temp('sdio.torrent')
|
||||
remove_from_temp('sdio_themes.zip')
|
||||
|
||||
## Installers ##
|
||||
def update_adobe_reader_dc():
|
||||
# Prep
|
||||
dest = r'{}\Installers\Extras\Office'.format(
|
||||
global_vars['BaseDir'])
|
||||
|
||||
# Remove existing installer
|
||||
try:
|
||||
os.remove(r'{}\Adobe Reader DC.exe'.format(dest))
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
dest, 'Adobe Reader DC.exe', SOURCE_URLS['Adobe Reader DC'])
|
||||
|
||||
def update_office():
|
||||
# Remove existing folders
|
||||
remove_from_kit('_Office')
|
||||
|
||||
# Prep
|
||||
dest = r'{}\_Office'.format(global_vars['CBinDir'])
|
||||
include_path = r'{}\_include\_Office'.format(global_vars['CBinDir'])
|
||||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
|
||||
# Download and extract
|
||||
for year in ['2013', '2016']:
|
||||
name = 'odt{}.exe'.format(year)
|
||||
url = 'Office Deployment Tool {}'.format(year)
|
||||
download_to_temp(name, SOURCE_URLS[url])
|
||||
cmd = [
|
||||
r'{}\odt{}.exe'.format(global_vars['TmpDir'], year),
|
||||
r'/extract:{}\{}'.format(global_vars['TmpDir'], year),
|
||||
'/quiet',
|
||||
]
|
||||
run_program(cmd)
|
||||
shutil.move(
|
||||
r'{}\{}'.format(global_vars['TmpDir'], year),
|
||||
r'{}\_Office\{}'.format(global_vars['CBinDir'], year))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('odt2013.exe')
|
||||
remove_from_temp('odt2016.exe')
|
||||
|
||||
def update_classic_start_skin():
|
||||
# Remove existing folders
|
||||
remove_from_kit('ClassicStartSkin')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\ClassicStartSkin'.format(global_vars['CBinDir']),
|
||||
'Metro-Win10-Black.skin7',
|
||||
SOURCE_URLS['ClassicStartSkin'])
|
||||
|
||||
def update_vcredists():
|
||||
# Remove existing folders
|
||||
remove_from_kit('_vcredists')
|
||||
|
||||
# Prep
|
||||
dest = r'{}\_vcredists'.format(global_vars['CBinDir'])
|
||||
include_path = r'{}\_include\_vcredists'.format(global_vars['CBinDir'])
|
||||
if os.path.exists(include_path):
|
||||
shutil.copytree(include_path, dest)
|
||||
|
||||
# Download
|
||||
for year in VCREDIST_SOURCES.keys():
|
||||
for bit in ['32', '64']:
|
||||
dest = r'{}\_vcredists\{}\x{}'.format(
|
||||
global_vars['CBinDir'], year, bit)
|
||||
download_generic(
|
||||
dest,
|
||||
'vcredist.exe',
|
||||
VCREDIST_SOURCES[year][bit])
|
||||
|
||||
def update_one_ninite(section, dest, name, url, indent=8, width=40):
|
||||
# Prep
|
||||
url = 'https://ninite.com/{}/ninite.exe'.format(url)
|
||||
|
||||
# Download
|
||||
download_generic(out_dir=dest, out_name=name, source_url=url)
|
||||
|
||||
# Copy to Installers folder
|
||||
installer_parent = r'{}\Installers\Extras\{}'.format(
|
||||
global_vars['BaseDir'], section)
|
||||
installer_dest = r'{}\{}'.format(installer_parent, name)
|
||||
os.makedirs(installer_parent, exist_ok=True)
|
||||
if os.path.exists(installer_dest):
|
||||
remove_item(installer_dest)
|
||||
shutil.copy(r'{}\{}'.format(dest, name), installer_dest)
|
||||
|
||||
def update_all_ninite(indent=8, width=40, other_results={}):
|
||||
print_info('{}Ninite'.format(' '*int(indent/2)))
|
||||
for section in sorted(NINITE_SOURCES.keys()):
|
||||
print_success('{}{}'.format(' '*int(indent/4*3), section))
|
||||
dest = r'{}\_Ninite\{}'.format(global_vars['CBinDir'], section)
|
||||
for name, url in sorted(NINITE_SOURCES[section].items()):
|
||||
try_and_print(message=name, function=update_one_ninite,
|
||||
other_results=other_results, indent=indent, width=width,
|
||||
section=section, dest=dest, name=name, url=url)
|
||||
|
||||
## Misc ##
|
||||
def update_caffeine():
|
||||
# Stop running processes
|
||||
kill_process('caffeine.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('Caffeine')
|
||||
|
||||
# Download
|
||||
download_to_temp('caffeine.zip', SOURCE_URLS['Caffeine'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('caffeine.zip', 'Caffeine')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('caffeine.zip')
|
||||
|
||||
def update_du():
|
||||
# Stop running processes
|
||||
kill_process('du.exe')
|
||||
kill_process('du64.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('Du')
|
||||
|
||||
# Download
|
||||
download_to_temp('du.zip', SOURCE_URLS['Du'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('du.zip', 'Du')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('du.zip')
|
||||
|
||||
def update_everything():
|
||||
# Stop running processes
|
||||
for exe in ['Everything.exe', 'Everything64.exe']:
|
||||
kill_process(exe)
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('Everything')
|
||||
|
||||
# Download
|
||||
download_to_temp('everything32.zip', SOURCE_URLS['Everything32'])
|
||||
download_to_temp('everything64.zip', SOURCE_URLS['Everything64'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('everything64.zip', 'Everything', sz_args=['Everything.exe'])
|
||||
shutil.move(
|
||||
r'{}\Everything\Everything.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\Everything\Everything64.exe'.format(global_vars['CBinDir']))
|
||||
extract_temp_to_cbin('everything32.zip', 'Everything')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('everything32.zip')
|
||||
remove_from_temp('everything64.zip')
|
||||
|
||||
def update_firefox_ublock_origin():
|
||||
# Remove existing folders
|
||||
remove_from_kit('FirefoxExtensions')
|
||||
|
||||
# Download
|
||||
download_to_temp('ff-uBO.xpi', SOURCE_URLS['Firefox uBO'])
|
||||
|
||||
# Extract files
|
||||
extract_generic(
|
||||
r'{}\ff-uBO.xpi'.format(global_vars['TmpDir']),
|
||||
r'{}\FirefoxExtensions\uBlock0@raymondhill.net'.format(
|
||||
global_vars['CBinDir']))
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('ff-uBO.xpi')
|
||||
|
||||
def update_notepadplusplus():
|
||||
# Stop running processes
|
||||
kill_process('notepadplusplus.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('NotepadPlusPlus')
|
||||
|
||||
# Download
|
||||
download_to_temp('npp.7z', SOURCE_URLS['NotepadPlusPlus'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('npp.7z', 'NotepadPlusPlus')
|
||||
shutil.move(
|
||||
r'{}\NotepadPlusPlus\notepad++.exe'.format(global_vars['CBinDir']),
|
||||
r'{}\NotepadPlusPlus\notepadplusplus.exe'.format(global_vars['CBinDir'])
|
||||
)
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('npp.7z')
|
||||
|
||||
def update_putty():
|
||||
# Stop running processes
|
||||
kill_process('PUTTY.EXE')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('PuTTY')
|
||||
|
||||
# Download
|
||||
download_to_temp('putty.zip', SOURCE_URLS['PuTTY'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('putty.zip', 'PuTTY')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('putty.zip')
|
||||
|
||||
def update_treesizefree():
|
||||
# Stop running processes
|
||||
kill_process('TreeSizeFree.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('TreeSizeFree')
|
||||
|
||||
# Download
|
||||
download_to_temp(
|
||||
'treesizefree.zip.gz', SOURCE_URLS['TreeSizeFree'])
|
||||
|
||||
# Extract files
|
||||
## NOTE: When downloaded using requests it is a .zip.gz?
|
||||
source = r'{}\treesizefree.zip.gz'.format(global_vars['TmpDir'])
|
||||
extract_generic(source, global_vars['TmpDir'])
|
||||
extract_temp_to_cbin('treesizefree.zip', 'TreeSizeFree')
|
||||
|
||||
# Cleanup
|
||||
remove_from_temp('treesizefree.zip')
|
||||
remove_from_temp('treesizefree.zip.gz')
|
||||
|
||||
def update_xmplay():
|
||||
# Stop running processes
|
||||
kill_process('xmplay.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('XMPlay')
|
||||
|
||||
# Download
|
||||
download_to_temp('xmplay.zip', SOURCE_URLS['XMPlay'])
|
||||
download_to_temp('xmp-7z.zip', SOURCE_URLS['XMPlay 7z'])
|
||||
download_to_temp('xmp-gme.zip', SOURCE_URLS['XMPlay Game'])
|
||||
download_to_temp('xmp-rar.zip', SOURCE_URLS['XMPlay RAR'])
|
||||
download_to_temp('WAModern.zip', SOURCE_URLS['XMPlay WAModern'])
|
||||
|
||||
# Extract files
|
||||
extract_temp_to_cbin('xmplay.zip', 'XMPlay',
|
||||
mode='e', sz_args=['xmplay.exe', 'xmplay.txt'])
|
||||
for item in ['xmp-7z', 'xmp-gme', 'xmp-rar', 'WAModern']:
|
||||
filter = []
|
||||
if item == 'WAModern':
|
||||
filter.append('WAModern NightVision.xmpskin')
|
||||
extract_generic(
|
||||
r'{}\{}.zip'.format(global_vars['TmpDir'], item),
|
||||
r'{}\XMPlay\plugins'.format(global_vars['CBinDir']),
|
||||
mode='e', sz_args=filter)
|
||||
|
||||
# Download Music
|
||||
dest = r'{}\XMPlay\music_tmp\MOD'.format(global_vars['CBinDir'])
|
||||
for mod in MUSIC_MOD:
|
||||
name = mod.split('#')[-1]
|
||||
url = 'https://api.modarchive.org/downloads.php?moduleid={}'.format(mod)
|
||||
download_generic(dest, name, url)
|
||||
dest = r'{}\XMPlay\music_tmp\SNES'.format(global_vars['CBinDir'])
|
||||
for game in MUSIC_SNES:
|
||||
name = '{}.rsn'.format(game)
|
||||
url = 'http://snesmusic.org/v2/download.php?spcNow={}'.format(game)
|
||||
download_generic(dest, name, url)
|
||||
|
||||
# Compress Music
|
||||
cmd = [
|
||||
global_vars['Tools']['SevenZip'],
|
||||
'a', r'{}\XMPlay\music.7z'.format(global_vars['CBinDir']),
|
||||
'-t7z', '-mx=9', '-bso0', '-bse0',
|
||||
r'{}\XMPlay\music_tmp\*'.format(global_vars['CBinDir']),
|
||||
]
|
||||
run_program(cmd)
|
||||
|
||||
# Cleanup
|
||||
remove_item(r'{}\XMPlay\music_tmp'.format(global_vars['CBinDir']))
|
||||
remove_from_temp('xmplay.zip')
|
||||
remove_from_temp('xmp-7z.zip')
|
||||
remove_from_temp('xmp-gme.zip')
|
||||
remove_from_temp('xmp-rar.zip')
|
||||
remove_from_temp('WAModern.zip')
|
||||
|
||||
## Repairs ##
|
||||
def update_adwcleaner():
|
||||
# Stop running processes
|
||||
kill_process('AdwCleaner.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('AdwCleaner')
|
||||
|
||||
# Download
|
||||
url = resolve_dynamic_url(
|
||||
SOURCE_URLS['AdwCleaner'],
|
||||
'id="downloadLink"')
|
||||
download_generic(
|
||||
r'{}\AdwCleaner'.format(global_vars['CBinDir']), 'AdwCleaner.exe', url)
|
||||
|
||||
def update_kvrt():
|
||||
# Stop running processes
|
||||
kill_process('KVRT.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('KVRT')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\KVRT'.format(global_vars['CBinDir']),
|
||||
'KVRT.exe',
|
||||
SOURCE_URLS['KVRT'])
|
||||
|
||||
def update_rkill():
|
||||
# Stop running processes
|
||||
kill_process('RKill.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('RKill')
|
||||
|
||||
# Download
|
||||
url = resolve_dynamic_url(
|
||||
SOURCE_URLS['RKill'],
|
||||
'href.*rkill\.exe')
|
||||
download_generic(
|
||||
r'{}\RKill'.format(global_vars['CBinDir']), 'RKill.exe', url)
|
||||
|
||||
def update_tdsskiller():
|
||||
# Stop running processes
|
||||
kill_process('TDSSKiller.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('TDSSKiller')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
r'{}\TDSSKiller'.format(global_vars['CBinDir']),
|
||||
'TDSSKiller.exe',
|
||||
SOURCE_URLS['TDSSKiller'])
|
||||
|
||||
## Uninstallers ##
|
||||
def update_iobit_uninstaller():
|
||||
# Stop running processes
|
||||
kill_process('IObitUninstallerPortable.exe')
|
||||
|
||||
# Remove existing folders
|
||||
remove_from_kit('IObitUninstallerPortable')
|
||||
|
||||
# Download
|
||||
download_generic(
|
||||
global_vars['CBinDir'],
|
||||
'IObitUninstallerPortable.exe',
|
||||
SOURCE_URLS['IOBit_Uninstaller'])
|
||||
|
||||
# "Install"
|
||||
cmd = r'{}\IObitUninstallerPortable.exe'.format(global_vars['CBinDir'])
|
||||
popen_program(cmd)
|
||||
sleep(1)
|
||||
wait_for_process('IObitUninstallerPortable')
|
||||
|
||||
# Cleanup
|
||||
remove_from_kit('IObitUninstallerPortable.exe')
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,228 +0,0 @@
|
|||
# Wizard Kit: Functions - Windows Setup
|
||||
|
||||
from functions.data import *
|
||||
from functions.disk import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
WINDOWS_VERSIONS = [
|
||||
{'Name': 'Windows 7 Home Basic',
|
||||
'Image File': 'Win7',
|
||||
'Image Name': 'Windows 7 HOMEBASIC'},
|
||||
{'Name': 'Windows 7 Home Premium',
|
||||
'Image File': 'Win7',
|
||||
'Image Name': 'Windows 7 HOMEPREMIUM'},
|
||||
{'Name': 'Windows 7 Professional',
|
||||
'Image File': 'Win7',
|
||||
'Image Name': 'Windows 7 PROFESSIONAL'},
|
||||
{'Name': 'Windows 7 Ultimate',
|
||||
'Image File': 'Win7',
|
||||
'Image Name': 'Windows 7 ULTIMATE'},
|
||||
|
||||
{'Name': 'Windows 8.1',
|
||||
'Image File': 'Win8',
|
||||
'Image Name': 'Windows 8.1',
|
||||
'CRLF': True},
|
||||
{'Name': 'Windows 8.1 Pro',
|
||||
'Image File': 'Win8',
|
||||
'Image Name': 'Windows 8.1 Pro'},
|
||||
|
||||
{'Name': 'Windows 10 Home',
|
||||
'Image File': 'Win10',
|
||||
'Image Name': 'Windows 10 Home',
|
||||
'CRLF': True},
|
||||
{'Name': 'Windows 10 Pro',
|
||||
'Image File': 'Win10',
|
||||
'Image Name': 'Windows 10 Pro'},
|
||||
]
|
||||
|
||||
def find_windows_image(windows_version):
|
||||
"""Search for a Windows source image file, returns dict.
|
||||
|
||||
Searches on local disks and then the WINDOWS_SERVER share."""
|
||||
image = {}
|
||||
imagefile = windows_version['Image File']
|
||||
imagename = windows_version['Image Name']
|
||||
|
||||
# Search local source
|
||||
set_thread_error_mode(silent=True) # Prevents "No disk" popups
|
||||
for d in psutil.disk_partitions():
|
||||
for ext in ['esd', 'wim', 'swm']:
|
||||
path = '{}images\{}.{}'.format(d.mountpoint, imagefile, ext)
|
||||
if os.path.isfile(path) and wim_contains_image(path, imagename):
|
||||
image['Path'] = path
|
||||
image['Source'] = letter
|
||||
if ext == 'swm':
|
||||
image['Glob'] = '--ref="{}*.swm"'.format(image['Path'][:-4])
|
||||
break
|
||||
set_thread_error_mode(silent=False) # Return to normal
|
||||
|
||||
# Check for network source
|
||||
if not image:
|
||||
mount_windows_share()
|
||||
if WINDOWS_SERVER['Mounted']:
|
||||
for ext in ['esd', 'wim', 'swm']:
|
||||
path = r'\\{}\{}\images\{}.{}'.format(
|
||||
WINDOWS_SERVER['IP'],
|
||||
WINDOWS_SERVER['Share'],
|
||||
imagefile,
|
||||
ext)
|
||||
if os.path.isfile(path) and wim_contains_image(path, imagename):
|
||||
image['Path'] = path
|
||||
image['Source'] = None
|
||||
if ext == 'swm':
|
||||
image['Glob'] = '--ref="{}*.swm"'.format(
|
||||
image['Path'][:-4])
|
||||
break
|
||||
|
||||
# Display image to be used (if any) and return
|
||||
if image:
|
||||
print_info('Using image: {}'.format(image['Path']))
|
||||
return image
|
||||
else:
|
||||
print_error('Failed to find Windows source image for {}'.format(
|
||||
windows_version['Name']))
|
||||
raise GenericAbort
|
||||
|
||||
def format_disk(disk, use_gpt):
|
||||
"""Format disk for use as a Windows OS disk."""
|
||||
if use_gpt:
|
||||
format_gpt(disk)
|
||||
else:
|
||||
format_mbr(disk)
|
||||
|
||||
def format_gpt(disk):
|
||||
"""Format disk for use as a Windows OS disk using the GPT layout."""
|
||||
script = [
|
||||
# Partition table
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'clean',
|
||||
'convert gpt',
|
||||
|
||||
# System partition
|
||||
# NOTE: ESP needs to be >= 260 for Advanced Format 4K disks
|
||||
'create partition efi size=500',
|
||||
'format quick fs=fat32 label="System"',
|
||||
'assign letter="S"',
|
||||
|
||||
# Microsoft Reserved (MSR) partition
|
||||
'create partition msr size=128',
|
||||
|
||||
# Windows partition
|
||||
'create partition primary',
|
||||
'format quick fs=ntfs label="Windows"',
|
||||
'assign letter="W"',
|
||||
|
||||
# Recovery Tools partition
|
||||
'shrink minimum=500',
|
||||
'create partition primary',
|
||||
'format quick fs=ntfs label="Recovery Tools"',
|
||||
'assign letter="T"',
|
||||
'set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"',
|
||||
'gpt attributes=0x8000000000000001',
|
||||
]
|
||||
|
||||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
def format_mbr(disk):
|
||||
"""Format disk for use as a Windows OS disk using the MBR layout."""
|
||||
script = [
|
||||
# Partition table
|
||||
'select disk {}'.format(disk['Number']),
|
||||
'clean',
|
||||
|
||||
# System partition
|
||||
'create partition primary size=100',
|
||||
'format fs=ntfs quick label="System Reserved"',
|
||||
'active',
|
||||
'assign letter="S"',
|
||||
|
||||
# Windows partition
|
||||
'create partition primary',
|
||||
'format fs=ntfs quick label="Windows"',
|
||||
'assign letter="W"',
|
||||
|
||||
# Recovery Tools partition
|
||||
'shrink minimum=500',
|
||||
'create partition primary',
|
||||
'format quick fs=ntfs label="Recovery"',
|
||||
'assign letter="T"',
|
||||
'set id=27',
|
||||
]
|
||||
|
||||
# Run
|
||||
run_diskpart(script)
|
||||
|
||||
def mount_windows_share():
|
||||
"""Mount the Windows images share unless labeled as already mounted."""
|
||||
if not WINDOWS_SERVER['Mounted']:
|
||||
mount_network_share(WINDOWS_SERVER)
|
||||
|
||||
def select_windows_version():
|
||||
actions = [
|
||||
{'Name': 'Main Menu', 'Letter': 'M'},
|
||||
]
|
||||
|
||||
# Menu loop
|
||||
selection = menu_select(
|
||||
title = 'Which version of Windows are we installing?',
|
||||
main_entries = WINDOWS_VERSIONS,
|
||||
action_entries = actions)
|
||||
|
||||
if selection.isnumeric():
|
||||
return WINDOWS_VERSIONS[int(selection)-1]
|
||||
elif selection == 'M':
|
||||
raise GenericAbort
|
||||
|
||||
def setup_windows(windows_image, windows_version):
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'apply',
|
||||
windows_image['Path'],
|
||||
windows_version['Image Name'],
|
||||
'W:\\']
|
||||
if 'Glob' in windows_image:
|
||||
cmd.extend(windows_image['Glob'])
|
||||
run_program(cmd)
|
||||
|
||||
def setup_windows_re(windows_version, windows_letter='W', tools_letter='T'):
|
||||
win = r'{}:\Windows'.format(windows_letter)
|
||||
winre = r'{}\System32\Recovery\WinRE.wim'.format(win)
|
||||
dest = r'{}:\Recovery\WindowsRE'.format(tools_letter)
|
||||
|
||||
# Copy WinRE.wim
|
||||
os.makedirs(dest, exist_ok=True)
|
||||
shutil.copy(winre, r'{}\WinRE.wim'.format(dest))
|
||||
|
||||
# Set location
|
||||
cmd = [
|
||||
r'{}\System32\ReAgentc.exe'.format(win),
|
||||
'/setreimage',
|
||||
'/path', dest,
|
||||
'/target', win]
|
||||
run_program(cmd)
|
||||
|
||||
def update_boot_partition(system_letter='S', windows_letter='W', mode='ALL'):
|
||||
cmd = [
|
||||
r'{}\Windows\System32\bcdboot.exe'.format(
|
||||
global_vars['Env']['SYSTEMDRIVE']),
|
||||
r'{}:\Windows'.format(windows_letter),
|
||||
'/s', '{}:'.format(system_letter),
|
||||
'/f', mode]
|
||||
run_program(cmd)
|
||||
|
||||
def wim_contains_image(filename, imagename):
|
||||
cmd = [
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
'info',
|
||||
filename,
|
||||
imagename]
|
||||
try:
|
||||
run_program(cmd)
|
||||
except subprocess.CalledProcessError:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,440 +0,0 @@
|
|||
# Wizard Kit: WinPE Menus
|
||||
|
||||
from functions.backup import *
|
||||
from functions.disk import *
|
||||
from functions.windows_setup import *
|
||||
|
||||
# STATIC VARIABLES
|
||||
FAST_COPY_PE_ARGS = [
|
||||
'/cmd=noexist_only',
|
||||
'/utf8',
|
||||
'/skip_empty_dir',
|
||||
'/linkdest',
|
||||
'/no_ui',
|
||||
'/auto_close',
|
||||
'/exclude={}'.format(';'.join(FAST_COPY_EXCLUDES)),
|
||||
]
|
||||
PE_TOOLS = {
|
||||
'BlueScreenView': {
|
||||
'Path': r'BlueScreenView\BlueScreenView.exe',
|
||||
},
|
||||
'FastCopy': {
|
||||
'Path': r'FastCopy\FastCopy.exe',
|
||||
'Args': FAST_COPY_PE_ARGS,
|
||||
},
|
||||
'HWiNFO': {
|
||||
'Path': r'HWiNFO\HWiNFO.exe',
|
||||
},
|
||||
'NT Password Editor': {
|
||||
'Path': r'NT Password Editor\ntpwedit.exe',
|
||||
},
|
||||
'Notepad++': {
|
||||
'Path': r'NotepadPlusPlus\NotepadPlusPlus.exe',
|
||||
},
|
||||
'PhotoRec': {
|
||||
'Path': r'TestDisk\photorec_win.exe',
|
||||
'Args': ['-new_console:n'],
|
||||
},
|
||||
'Prime95': {
|
||||
'Path': r'Prime95\prime95.exe',
|
||||
},
|
||||
'ProduKey': {
|
||||
'Path': r'ProduKey\ProduKey.exe',
|
||||
},
|
||||
'Q-Dir': {
|
||||
'Path': r'Q-Dir\Q-Dir.exe',
|
||||
},
|
||||
'TestDisk': {
|
||||
'Path': r'TestDisk\testdisk_win.exe',
|
||||
'Args': ['-new_console:n'],
|
||||
},
|
||||
}
|
||||
|
||||
def check_pe_tools():
|
||||
for k in PE_TOOLS.keys():
|
||||
PE_TOOLS[k]['Path'] = r'{}\{}'.format(
|
||||
global_vars['BinDir'], PE_TOOLS[k]['Path'])
|
||||
global_vars['Tools']['wimlib-imagex'] = re.sub(
|
||||
r'\\x(32|64)',
|
||||
r'',
|
||||
global_vars['Tools']['wimlib-imagex'],
|
||||
re.IGNORECASE)
|
||||
|
||||
def menu_backup():
|
||||
"""Take backup images of partition(s) in the WIM format."""
|
||||
errors = False
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'PathNotFoundError': 'Missing',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericAbort': 'Skipped',
|
||||
'GenericRepair': 'Repaired',
|
||||
}}
|
||||
set_title('{}: Backup Menu'.format(KIT_NAME_FULL))
|
||||
|
||||
# Set ticket Number
|
||||
clear_screen()
|
||||
print_standard('{}\n'.format(global_vars['Title']))
|
||||
ticket_number = get_ticket_number()
|
||||
|
||||
# Mount backup shares
|
||||
mount_backup_shares()
|
||||
|
||||
# Select destination
|
||||
destination = select_backup_destination(auto_select=False)
|
||||
|
||||
# Scan disks
|
||||
try_and_print(
|
||||
message = 'Assigning letters...',
|
||||
function = assign_volume_letters,
|
||||
other_results = other_results)
|
||||
result = try_and_print(
|
||||
message = 'Getting disk info...',
|
||||
function = scan_disks,
|
||||
other_results = other_results)
|
||||
if result['CS']:
|
||||
disks = result['Out']
|
||||
else:
|
||||
print_error('ERROR: No disks found.')
|
||||
raise GenericAbort
|
||||
|
||||
# Select disk to backup
|
||||
disk = select_disk('For which disk are we creating backups?', disks)
|
||||
if not disk:
|
||||
raise GenericAbort
|
||||
|
||||
# "Prep" disk
|
||||
prep_disk_for_backup(destination, disk, ticket_number)
|
||||
|
||||
# Display details for backup task
|
||||
clear_screen()
|
||||
print_info('Create Backup - Details:\n')
|
||||
show_data(message='Ticket:', data=ticket_number)
|
||||
show_data(
|
||||
message = 'Source:',
|
||||
data = '[{}] ({}) {} {}'.format(
|
||||
disk.get('Table', ''),
|
||||
disk.get('Type', ''),
|
||||
disk.get('Name', 'Unknown'),
|
||||
disk.get('Size', ''),
|
||||
),
|
||||
)
|
||||
show_data(
|
||||
message = 'Destination:',
|
||||
data = destination.get('Display Name', destination['Name']),
|
||||
)
|
||||
for par in disk['Partitions']:
|
||||
message = 'Partition {}:'.format(par['Number'])
|
||||
data = par['Display String']
|
||||
if par['Number'] in disk['Bad Partitions']:
|
||||
show_data(message=message, data=data, width=30, warning=True)
|
||||
if 'Error' in par:
|
||||
show_data(message='', data=par['Error'], error=True)
|
||||
elif par['Image Exists']:
|
||||
show_data(message=message, data=data, width=30, info=True)
|
||||
else:
|
||||
show_data(message=message, data=data, width=30)
|
||||
print_standard(disk['Backup Warnings'])
|
||||
|
||||
# Ask to proceed
|
||||
if (not ask('Proceed with backup?')):
|
||||
raise GenericAbort
|
||||
|
||||
# Backup partition(s)
|
||||
print_info('\n\nStarting task.\n')
|
||||
for par in disk['Partitions']:
|
||||
result = try_and_print(
|
||||
message = 'Partition {} Backup...'.format(par['Number']),
|
||||
function = backup_partition,
|
||||
other_results = other_results,
|
||||
disk = disk,
|
||||
par = par)
|
||||
if not result['CS'] and not isinstance(result['Error'], GenericAbort):
|
||||
errors = True
|
||||
par['Error'] = result['Error']
|
||||
|
||||
# Verify backup(s)
|
||||
if disk['Valid Partitions']:
|
||||
print_info('\n\nVerifying backup images(s)\n')
|
||||
for par in disk['Partitions']:
|
||||
if par['Number'] in disk['Bad Partitions']:
|
||||
continue # Skip verification
|
||||
result = try_and_print(
|
||||
message = 'Partition {} Image...'.format(par['Number']),
|
||||
function = verify_wim_backup,
|
||||
other_results = other_results,
|
||||
partition = par)
|
||||
if not result['CS']:
|
||||
errors = True
|
||||
par['Error'] = result['Error']
|
||||
|
||||
# Print summary
|
||||
if errors:
|
||||
print_warning('\nErrors were encountered and are detailed below.')
|
||||
for par in [p for p in disk['Partitions'] if 'Error' in p]:
|
||||
print_standard(' Partition {} Error:'.format(par['Number']))
|
||||
if hasattr(par['Error'], 'stderr'):
|
||||
try:
|
||||
par['Error'] = par['Error'].stderr.decode()
|
||||
except:
|
||||
# Deal with badly formatted error message
|
||||
pass
|
||||
try:
|
||||
par['Error'] = par['Error'].splitlines()
|
||||
par['Error'] = [line.strip() for line in par['Error']]
|
||||
par['Error'] = [line for line in par['Error'] if line]
|
||||
for line in par['Error']:
|
||||
print_error('\t{}'.format(line))
|
||||
except:
|
||||
print_error('\t{}'.format(par['Error']))
|
||||
else:
|
||||
print_success('\nNo errors were encountered during imaging.')
|
||||
if 'LogFile' in global_vars and ask('\nReview log?'):
|
||||
cmd = [
|
||||
global_vars['Tools']['NotepadPlusPlus'],
|
||||
global_vars['LogFile']]
|
||||
try:
|
||||
popen_program(cmd)
|
||||
except Exception:
|
||||
print_error('ERROR: Failed to open log.')
|
||||
sleep(30)
|
||||
pause('\nPress Enter to return to main menu... ')
|
||||
|
||||
def menu_root():
|
||||
check_pe_tools()
|
||||
menus = [
|
||||
{'Name': 'Create Backups', 'Menu': menu_backup},
|
||||
{'Name': 'Setup Windows', 'Menu': menu_setup},
|
||||
{'Name': 'Misc Tools', 'Menu': menu_tools},
|
||||
]
|
||||
actions = [
|
||||
{'Name': 'Command Prompt', 'Letter': 'C'},
|
||||
{'Name': 'Reboot', 'Letter': 'R'},
|
||||
{'Name': 'Shutdown', 'Letter': 'S'},
|
||||
]
|
||||
|
||||
# Main loop
|
||||
while True:
|
||||
set_title(KIT_NAME_FULL)
|
||||
selection = menu_select(
|
||||
title = 'Main Menu',
|
||||
main_entries = menus,
|
||||
action_entries = actions,
|
||||
secret_exit = True)
|
||||
|
||||
if (selection.isnumeric()):
|
||||
try:
|
||||
menus[int(selection)-1]['Menu']()
|
||||
except GenericAbort:
|
||||
print_warning('\nAborted\n')
|
||||
pause('Press Enter to return to main menu... ')
|
||||
elif (selection == 'C'):
|
||||
run_program(['cmd', '-new_console:n'], check=False)
|
||||
elif (selection == 'R'):
|
||||
run_program(['wpeutil', 'reboot'])
|
||||
elif (selection == 'S'):
|
||||
run_program(['wpeutil', 'shutdown'])
|
||||
else:
|
||||
sys.exit()
|
||||
|
||||
def menu_setup():
|
||||
"""Format a disk (MBR/GPT), apply a Windows image, and setup boot files."""
|
||||
errors = False
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'PathNotFoundError': 'Missing',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericAbort': 'Skipped',
|
||||
'GenericRepair': 'Repaired',
|
||||
}}
|
||||
set_title('{}: Setup Menu'.format(KIT_NAME_FULL))
|
||||
|
||||
# Set ticket ID
|
||||
clear_screen()
|
||||
print_standard('{}\n'.format(global_vars['Title']))
|
||||
ticket_number = get_ticket_number()
|
||||
|
||||
# Select the version of Windows to apply
|
||||
windows_version = select_windows_version()
|
||||
|
||||
# Find Windows image
|
||||
windows_image = find_windows_image(windows_version)
|
||||
|
||||
# Scan disks
|
||||
try_and_print(
|
||||
message = 'Assigning letters...',
|
||||
function = assign_volume_letters,
|
||||
other_results = other_results)
|
||||
result = try_and_print(
|
||||
message = 'Getting disk info...',
|
||||
function = scan_disks,
|
||||
other_results = other_results)
|
||||
if result['CS']:
|
||||
disks = result['Out']
|
||||
else:
|
||||
print_error('ERROR: No disks found.')
|
||||
raise GenericAbort
|
||||
|
||||
# Select disk to use as the OS disk
|
||||
dest_disk = select_disk('To which disk are we installing Windows?', disks)
|
||||
if not dest_disk:
|
||||
raise GenericAbort
|
||||
|
||||
# "Prep" disk
|
||||
prep_disk_for_formatting(dest_disk)
|
||||
|
||||
# Display details for setup task
|
||||
clear_screen()
|
||||
print_info('Setup Windows - Details:\n')
|
||||
show_data(message='Ticket:', data=ticket_number)
|
||||
show_data(message='Installing:', data=windows_version['Name'])
|
||||
show_data(
|
||||
message = 'Boot Method:',
|
||||
data = 'UEFI (GPT)' if dest_disk['Use GPT'] else 'Legacy (MBR)')
|
||||
show_data(message='Using Image:', data=windows_image['Path'])
|
||||
show_data(
|
||||
message = 'ERASING:',
|
||||
data = '[{}] ({}) {} {}\n'.format(
|
||||
dest_disk.get('Table', ''),
|
||||
dest_disk.get('Type', ''),
|
||||
dest_disk.get('Name', 'Unknown'),
|
||||
dest_disk.get('Size', ''),
|
||||
),
|
||||
warning = True)
|
||||
for par in dest_disk['Partitions']:
|
||||
show_data(
|
||||
message = 'Partition {}:'.format(par['Number']),
|
||||
data = par['Display String'],
|
||||
warning = True)
|
||||
print_warning(dest_disk['Format Warnings'])
|
||||
|
||||
if (not ask('Is this correct?')):
|
||||
raise GenericAbort
|
||||
|
||||
# Safety check
|
||||
print_standard('\nSAFETY CHECK')
|
||||
print_warning('All data will be DELETED from the '
|
||||
'disk and partition(s) listed above.')
|
||||
print_warning('This is irreversible and will lead '
|
||||
'to {CLEAR}{RED}DATA LOSS.'.format(**COLORS))
|
||||
if (not ask('Asking again to confirm, is this correct?')):
|
||||
raise GenericAbort
|
||||
|
||||
# Remove volume letters so S, T, & W can be used below
|
||||
remove_volume_letters(keep=windows_image['Source'])
|
||||
new_letter = reassign_volume_letter(letter=windows_image['Source'])
|
||||
if new_letter:
|
||||
windows_image['Source'] = new_letter
|
||||
|
||||
# Format and partition disk
|
||||
result = try_and_print(
|
||||
message = 'Formatting disk...',
|
||||
function = format_disk,
|
||||
other_results = other_results,
|
||||
disk = dest_disk,
|
||||
use_gpt = dest_disk['Use GPT'])
|
||||
if not result['CS']:
|
||||
# We need to crash as the disk is in an unknown state
|
||||
print_error('ERROR: Failed to format disk.')
|
||||
raise GenericAbort
|
||||
|
||||
# Apply Image
|
||||
result = try_and_print(
|
||||
message = 'Applying image...',
|
||||
function = setup_windows,
|
||||
other_results = other_results,
|
||||
windows_image = windows_image,
|
||||
windows_version = windows_version)
|
||||
if not result['CS']:
|
||||
# We need to crash as the disk is in an unknown state
|
||||
print_error('ERROR: Failed to apply image.')
|
||||
raise GenericAbort
|
||||
|
||||
# Create Boot files
|
||||
try_and_print(
|
||||
message = 'Updating boot files...',
|
||||
function = update_boot_partition,
|
||||
other_results = other_results)
|
||||
|
||||
# Setup WinRE
|
||||
try_and_print(
|
||||
message = 'Updating recovery tools...',
|
||||
function = setup_windows_re,
|
||||
other_results = other_results,
|
||||
windows_version = windows_version)
|
||||
|
||||
# Print summary
|
||||
print_standard('\nDone.')
|
||||
if 'LogFile' in global_vars and ask('\nReview log?'):
|
||||
cmd = [
|
||||
global_vars['Tools']['NotepadPlusPlus'],
|
||||
global_vars['LogFile']]
|
||||
try:
|
||||
popen_program(cmd)
|
||||
except Exception:
|
||||
print_error('ERROR: Failed to open log.')
|
||||
sleep(30)
|
||||
pause('\nPress Enter to return to main menu... ')
|
||||
|
||||
def menu_tools():
|
||||
tools = [{'Name': k} for k in sorted(PE_TOOLS.keys())]
|
||||
actions = [{'Name': 'Main Menu', 'Letter': 'M'},]
|
||||
set_title(KIT_NAME_FULL)
|
||||
|
||||
# Menu loop
|
||||
while True:
|
||||
selection = menu_select(
|
||||
title = 'Tools Menu',
|
||||
main_entries = tools,
|
||||
action_entries = actions)
|
||||
if (selection.isnumeric()):
|
||||
name = tools[int(selection)-1]['Name']
|
||||
cmd = [PE_TOOLS[name]['Path']] + PE_TOOLS[name].get('Args', [])
|
||||
if name == 'Blue Screen View':
|
||||
# Select path to scan
|
||||
minidump_path = select_minidump_path()
|
||||
if minidump_path:
|
||||
cmd.extend(['/MiniDumpFolder', minidump_path])
|
||||
try:
|
||||
popen_program(cmd)
|
||||
except Exception:
|
||||
print_error('Failed to run {}'.format(name))
|
||||
sleep(2)
|
||||
pause()
|
||||
elif (selection == 'M'):
|
||||
break
|
||||
|
||||
def select_minidump_path():
|
||||
dumps = []
|
||||
|
||||
# Assign volume letters first
|
||||
assign_volume_letters()
|
||||
|
||||
# Search for minidumps
|
||||
set_thread_error_mode(silent=True) # Prevents "No disk" popups
|
||||
for d in psutil.disk_partitions():
|
||||
if global_vars['Env']['SYSTEMDRIVE'].upper() in d.mountpoint:
|
||||
# Skip RAMDisk
|
||||
continue
|
||||
if os.path.exists(r'{}Windows\MiniDump'.format(d.mountpoint)):
|
||||
dumps.append({'Name': r'{}Windows\MiniDump'.format(d.mountpoint)})
|
||||
set_thread_error_mode(silent=False) # Return to normal
|
||||
|
||||
# Check results before showing menu
|
||||
if len(dumps) == 0:
|
||||
print_error('ERROR: No BSoD / MiniDump paths found')
|
||||
sleep(2)
|
||||
return None
|
||||
|
||||
# Menu
|
||||
selection = menu_select(
|
||||
title = 'Which BSoD / MiniDump path are we scanning?',
|
||||
main_entries = dumps)
|
||||
return dumps[int(selection) - 1]['Name']
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
# Wizard Kit: Install the standard SW bundle based on the OS version
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SW Bundle Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\Install SW Bundle.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: SW Bundle Tool\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
answer_extensions = ask('Install Extensions?')
|
||||
answer_adobe_reader = ask('Install Adobe Reader?')
|
||||
answer_vcr = ask('Install Visual C++ Runtimes?')
|
||||
answer_ninite = ask('Install Ninite Bundle?')
|
||||
if answer_ninite and global_vars['OS']['Version'] in ['7']:
|
||||
# Vista is dead, not going to check for it
|
||||
answer_mse = ask('Install MSE?')
|
||||
else:
|
||||
answer_mse = False
|
||||
|
||||
print_info('Installing Programs')
|
||||
if answer_adobe_reader:
|
||||
install_adobe_reader()
|
||||
if answer_vcr:
|
||||
install_vcredists()
|
||||
if answer_ninite:
|
||||
try_and_print(message='Ninite bundle...',
|
||||
function=install_ninite_bundle, cs='Started', mse=answer_mse)
|
||||
if answer_extensions:
|
||||
wait_for_process('ninite.exe')
|
||||
print_info('Installing Extensions')
|
||||
try_and_print(message='Classic Shell skin...',
|
||||
function=install_classicstart_skin,
|
||||
other_results=other_results)
|
||||
try_and_print(message='Google Chrome extensions...',
|
||||
function=install_chrome_extensions)
|
||||
try_and_print(message='Mozilla Firefox extensions...',
|
||||
function=install_firefox_extensions)
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
# Wizard Kit: Install Visual C++ Runtimes
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Install Visual C++ Runtimes'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\Install Visual C++ Runtimes.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: Install Visual C++ Runtimes\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
}}
|
||||
|
||||
if ask('Install Visual C++ Runtimes?'):
|
||||
install_vcredists()
|
||||
else:
|
||||
abort()
|
||||
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
# Wizard Kit: Enter SafeMode by editing the BCD
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# STATIC VARIABLES
|
||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.common import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
clear_screen()
|
||||
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
|
||||
if not ask('Enable booting to SafeMode (with Networking)?'):
|
||||
abort()
|
||||
|
||||
# Edit BCD to set safeboot as default
|
||||
cmd = ['bcdedit', '/set', '{default}', 'safeboot', 'network']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Enable MSI access under safemode
|
||||
cmd = ['reg', 'add', REG_MSISERVER, '/f']
|
||||
run_program(cmd, check=False)
|
||||
cmd = ['reg', 'add', REG_MSISERVER, '/ve',
|
||||
'/t', 'REG_SZ', '/d', 'Service', '/f']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
## Done ##
|
||||
pause('Press Enter to reboot...')
|
||||
cmd = ['shutdown', '-r', '-t', '3']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Done
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,42 +0,0 @@
|
|||
# Wizard Kit: Exit SafeMode by editing the BCD
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# STATIC VARIABLES
|
||||
REG_MSISERVER = r'HKLM\SYSTEM\CurrentControlSet\Control\SafeBoot\Network\MSIServer'
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.common import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SafeMode Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
clear_screen()
|
||||
print_info('{}: SafeMode Tool\n'.format(KIT_NAME_FULL))
|
||||
if not ask('Disable booting to SafeMode?'):
|
||||
abort()
|
||||
|
||||
# Edit BCD to remove safeboot value
|
||||
for boot in ['{current}', '{default}']:
|
||||
cmd = ['bcdedit', '/deletevalue', boot, 'safeboot']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Disable MSI access under safemode
|
||||
cmd = ['reg', 'delete', REG_MSISERVER, '/f']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
## Done ##
|
||||
pause('Press Enter to reboot...')
|
||||
cmd = ['shutdown', '-r', '-t', '3']
|
||||
run_program(cmd, check=False)
|
||||
|
||||
# Done
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,586 +0,0 @@
|
|||
# Wizard Kit: Settings - Launchers
|
||||
|
||||
LAUNCHERS = {
|
||||
r'(Root)': {
|
||||
'Activate Windows': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'activate.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'Enter SafeMode': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'safemode_enter.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'Exit SafeMode': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'safemode_exit.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'System Checklist': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'system_checklist.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'System Diagnostics': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'system_diagnostics.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'User Checklist': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'user_checklist.py',
|
||||
},
|
||||
},
|
||||
r'Data Recovery': {
|
||||
'PhotoRec (CLI)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TestDisk',
|
||||
'L_ITEM': 'photorec_win.exe',
|
||||
'L_ELEV': 'True',
|
||||
'L__CLI': 'True',
|
||||
},
|
||||
'PhotoRec': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TestDisk',
|
||||
'L_ITEM': 'qphotorec_win.exe',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'TestDisk': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TestDisk',
|
||||
'L_ITEM': 'testdisk_win.exe',
|
||||
'L_ELEV': 'True',
|
||||
'L__CLI': 'True',
|
||||
},
|
||||
},
|
||||
r'Data Transfers': {
|
||||
'FastCopy (as ADMIN)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'FastCopy',
|
||||
'L_ITEM': 'FastCopy.exe',
|
||||
'L_ARGS': (
|
||||
r' /logfile=%log_dir%\FastCopy.log'
|
||||
r' /cmd=noexist_only'
|
||||
r' /utf8'
|
||||
r' /skip_empty_dir'
|
||||
r' /linkdest'
|
||||
r' /exclude='
|
||||
r'$RECYCLE.BIN;'
|
||||
r'$Recycle.Bin;'
|
||||
r'.AppleDB;'
|
||||
r'.AppleDesktop;'
|
||||
r'.AppleDouble;'
|
||||
r'.com.apple.timemachine.supported;'
|
||||
r'.dbfseventsd;'
|
||||
r'.DocumentRevisions-V100*;'
|
||||
r'.DS_Store;'
|
||||
r'.fseventsd;'
|
||||
r'.PKInstallSandboxManager;'
|
||||
r'.Spotlight*;'
|
||||
r'.SymAV*;'
|
||||
r'.symSchedScanLockxz;'
|
||||
r'.TemporaryItems;'
|
||||
r'.Trash*;'
|
||||
r'.vol;'
|
||||
r'.VolumeIcon.icns;'
|
||||
r'desktop.ini;'
|
||||
r'Desktop?DB;'
|
||||
r'Desktop?DF;'
|
||||
r'hiberfil.sys;'
|
||||
r'lost+found;'
|
||||
r'Network?Trash?Folder;'
|
||||
r'pagefile.sys;'
|
||||
r'Recycled;'
|
||||
r'RECYCLER;'
|
||||
r'System?Volume?Information;'
|
||||
r'Temporary?Items;'
|
||||
r'Thumbs.db'
|
||||
r' /to=%client_dir%\Transfer_%iso_date%\ '
|
||||
),
|
||||
'L_ELEV': 'True',
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info /Transfer',
|
||||
],
|
||||
},
|
||||
'FastCopy': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'FastCopy',
|
||||
'L_ITEM': 'FastCopy.exe',
|
||||
'L_ARGS': (
|
||||
r' /logfile=%log_dir%\FastCopy.log'
|
||||
r' /cmd=noexist_only'
|
||||
r' /utf8'
|
||||
r' /skip_empty_dir'
|
||||
r' /linkdest'
|
||||
r' /exclude='
|
||||
r'$RECYCLE.BIN;'
|
||||
r'$Recycle.Bin;'
|
||||
r'.AppleDB;'
|
||||
r'.AppleDesktop;'
|
||||
r'.AppleDouble;'
|
||||
r'.com.apple.timemachine.supported;'
|
||||
r'.dbfseventsd;'
|
||||
r'.DocumentRevisions-V100*;'
|
||||
r'.DS_Store;'
|
||||
r'.fseventsd;'
|
||||
r'.PKInstallSandboxManager;'
|
||||
r'.Spotlight*;'
|
||||
r'.SymAV*;'
|
||||
r'.symSchedScanLockxz;'
|
||||
r'.TemporaryItems;'
|
||||
r'.Trash*;'
|
||||
r'.vol;'
|
||||
r'.VolumeIcon.icns;'
|
||||
r'desktop.ini;'
|
||||
r'Desktop?DB;'
|
||||
r'Desktop?DF;'
|
||||
r'hiberfil.sys;'
|
||||
r'lost+found;'
|
||||
r'Network?Trash?Folder;'
|
||||
r'pagefile.sys;'
|
||||
r'Recycled;'
|
||||
r'RECYCLER;'
|
||||
r'System?Volume?Information;'
|
||||
r'Temporary?Items;'
|
||||
r'Thumbs.db'
|
||||
r' /to=%client_dir%\Transfer_%iso_date%\ '
|
||||
),
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info /Transfer',
|
||||
],
|
||||
},
|
||||
'KVRT': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'KVRT',
|
||||
'L_ITEM': 'KVRT.exe',
|
||||
'L_ARGS': (
|
||||
r' -accepteula'
|
||||
r' -d %q_dir%'
|
||||
r' -processlevel 3'
|
||||
r' -dontcryptsupportinfo'
|
||||
r' -fixednames'
|
||||
),
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
|
||||
r'set "q_dir=%client_dir%\Quarantine\KVRT"',
|
||||
r'mkdir "%q_dir%">nul 2>&1',
|
||||
],
|
||||
},
|
||||
'Transferred Keys': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'transferred_keys.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'User Data Transfer': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'user_data_transfer.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'XYplorer (as ADMIN)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'XYplorerFree',
|
||||
'L_ITEM': 'XYplorerFree.exe',
|
||||
'L_ARGS': r'/exp /win=max %userprofile%',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'XYplorer': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'XYplorerFree',
|
||||
'L_ITEM': 'XYplorerFree.exe',
|
||||
'L_ARGS': r'/exp /win=max %userprofile%',
|
||||
},
|
||||
},
|
||||
r'Diagnostics': {
|
||||
'HWiNFO': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
],
|
||||
},
|
||||
'ProduKey': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'ProduKey',
|
||||
'L_ITEM': 'ProduKey.exe',
|
||||
'L_ELEV': 'True',
|
||||
'Extra Code': [
|
||||
r'if exist "%bin%\ProduKey" (',
|
||||
r' del "%bin%\ProduKey\ProduKey.cfg" 2>nul',
|
||||
r' del "%bin%\ProduKey\ProduKey64.cfg" 2>nul',
|
||||
r')',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Diagnostics\Extras': {
|
||||
'AIDA64': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'AIDA64',
|
||||
'L_ITEM': 'aida64.exe',
|
||||
},
|
||||
'Autoruns (with VirusTotal Scan)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'Autoruns',
|
||||
'L_ITEM': 'Autoruns.exe',
|
||||
'L_ARGS': '-e',
|
||||
'Extra Code': [
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
],
|
||||
},
|
||||
'BleachBit': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'BleachBit',
|
||||
'L_ITEM': 'bleachbit.exe',
|
||||
},
|
||||
'BlueScreenView': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'BlueScreenView',
|
||||
'L_ITEM': 'BlueScreenView.exe',
|
||||
},
|
||||
'ERUNT': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'erunt',
|
||||
'L_ITEM': 'ERUNT.EXE',
|
||||
'L_ARGS': '%client_dir%\Backups\%iso_date%\Registry sysreg curuser otherusers',
|
||||
'L_ELEV': 'True',
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
||||
],
|
||||
},
|
||||
'HitmanPro': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HitmanPro',
|
||||
'L_ITEM': 'HitmanPro.exe',
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
||||
],
|
||||
},
|
||||
'HWiNFO (Sensors)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=1)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Drivers': {
|
||||
'Intel RST (Current Release)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': '_Drivers\Intel RST',
|
||||
'L_ITEM': 'SetupRST_15.8.exe',
|
||||
'L_7ZIP': 'SetupRST_15.8.exe',
|
||||
},
|
||||
'Intel RST (Previous Releases)': {
|
||||
'L_TYPE': 'Folder',
|
||||
'L_PATH': '_Drivers\Intel RST',
|
||||
'L_ITEM': '.',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Intel SSD Toolbox': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': r'_Drivers\Intel SSD Toolbox',
|
||||
'L_ITEM': 'Intel SSD Toolbox.exe',
|
||||
},
|
||||
'Samsing Magician': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': r'_Drivers\Samsung Magician',
|
||||
'L_ITEM': 'Samsung Magician.exe',
|
||||
},
|
||||
'Snappy Driver Installer Origin': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': '_Drivers\SDIO',
|
||||
'L_ITEM': 'SDIO.exe',
|
||||
},
|
||||
},
|
||||
r'Drivers\Extras': {
|
||||
'Acer': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
r'start "" "http://us.acer.com/ac/en/US/content/drivers"',
|
||||
],
|
||||
},
|
||||
'Lenovo': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
r'start "" "https://pcsupport.lenovo.com/us/en/"',
|
||||
],
|
||||
},
|
||||
'Toshiba': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'HWiNFO',
|
||||
'L_ITEM': 'HWiNFO.exe',
|
||||
'Extra Code': [
|
||||
r'for %%a in (32 64) do (',
|
||||
r' copy /y "%bin%\HWiNFO\general.ini" "%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SensorsOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r' (echo SummaryOnly=0)>>"%bin%\HWiNFO\HWiNFO%%a.ini"',
|
||||
r')',
|
||||
r'start "" "http://support.toshiba.com/drivers"',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Installers': {
|
||||
'SW Bundle': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'install_sw_bundle.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
},
|
||||
r'Installers\Extras\Office\2013': {
|
||||
'Home and Business 2013 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2013',
|
||||
'L_ITEM': 'hb_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Business 2013 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2013',
|
||||
'L_ITEM': 'hb_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2013 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2013',
|
||||
'L_ITEM': 'hs_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2013 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2013',
|
||||
'L_ITEM': 'hs_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
},
|
||||
r'Installers\Extras\Office\2016': {
|
||||
'Home and Business 2016 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hb_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Business 2016 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hb_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2016 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hs_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Home and Student 2016 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': 'hs_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Office 365 2016 (x32)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': '365_32.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
'Office 365 2016 (x64)': {
|
||||
'L_TYPE': 'Office',
|
||||
'L_PATH': '2016',
|
||||
'L_ITEM': '365_64.xml',
|
||||
'L_NCMD': 'True',
|
||||
},
|
||||
},
|
||||
r'Installers\Extras\Runtimes': {
|
||||
'Visual C++ Runtimes': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'install_vcredists.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
},
|
||||
r'Misc': {
|
||||
'ConEmu (as ADMIN)': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'ConEmu',
|
||||
'L_ITEM': 'ConEmu.exe',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'ConEmu': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'ConEmu',
|
||||
'L_ITEM': 'ConEmu.exe',
|
||||
},
|
||||
'Everything': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'Everything',
|
||||
'L_ITEM': 'Everything.exe',
|
||||
'L_ARGS': '-nodb',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'Notepad++': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'notepadplusplus',
|
||||
'L_ITEM': 'notepadplusplus.exe',
|
||||
},
|
||||
'PuTTY': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'PuTTY',
|
||||
'L_ITEM': 'PUTTY.EXE',
|
||||
},
|
||||
'TreeSizeFree': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TreeSizeFree',
|
||||
'L_ITEM': 'TreeSizeFree.exe',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'Update Kit': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'update_kit.py',
|
||||
},
|
||||
'XMPlay': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'XMPlay',
|
||||
'L_ITEM': 'xmplay.exe',
|
||||
'L_ARGS': '"%bin%\XMPlay\music.7z"',
|
||||
},
|
||||
},
|
||||
r'Repairs': {
|
||||
'AdwCleaner': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'AdwCleaner',
|
||||
'L_ITEM': 'AdwCleaner.exe',
|
||||
},
|
||||
'Autoruns': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'Autoruns',
|
||||
'L_ITEM': 'Autoruns.exe',
|
||||
'L_ARGS': '-e',
|
||||
'Extra Code': [
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v checkvirustotal /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownomicrosoft /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v shownowindows /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v showonlyvirustotal /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v submitvirustotal /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns /v verifysignatures /t REG_DWORD /d 0 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\SigCheck /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\Streams /v EulaAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
r'reg add HKCU\Software\Sysinternals\AutoRuns\VirusTotal /v VirusTotalTermsAccepted /t REG_DWORD /d 1 /f >nul',
|
||||
],
|
||||
},
|
||||
'CHKDSK': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'check_disk.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'DISM': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'dism.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'KVRT': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'KVRT',
|
||||
'L_ITEM': 'KVRT.exe',
|
||||
'L_ARGS': (
|
||||
r' -accepteula'
|
||||
r' -d %q_dir%'
|
||||
r' -processlevel 3'
|
||||
r' -dontcryptsupportinfo'
|
||||
r' -fixednames'
|
||||
),
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
|
||||
r'set "q_dir=%client_dir%\Quarantine\KVRT"',
|
||||
r'mkdir "%q_dir%">nul 2>&1',
|
||||
],
|
||||
},
|
||||
'RKill': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'RKill',
|
||||
'L_ITEM': 'RKill.exe',
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Info',
|
||||
],
|
||||
},
|
||||
'SFC Scan': {
|
||||
'L_TYPE': 'PyScript',
|
||||
'L_PATH': 'Scripts',
|
||||
'L_ITEM': 'sfc_scan.py',
|
||||
'L_ELEV': 'True',
|
||||
},
|
||||
'TDSSKiller': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'TDSSKiller',
|
||||
'L_ITEM': 'TDSSKiller.exe',
|
||||
'L_ARGS': (
|
||||
r' -l %log_dir%\TDSSKiller.log'
|
||||
r' -qpath %q_dir%'
|
||||
r' -accepteula'
|
||||
r' -accepteulaksn'
|
||||
r' -dcexact'
|
||||
r' -tdlfs'
|
||||
),
|
||||
'Extra Code': [
|
||||
r'call "%bin%\Scripts\init_client_dir.cmd" /Quarantine',
|
||||
r'set "q_dir=%client_dir%\Quarantine\TDSSKiller"',
|
||||
r'mkdir "%q_dir%">nul 2>&1',
|
||||
],
|
||||
},
|
||||
},
|
||||
r'Uninstallers': {
|
||||
'IObit Uninstaller': {
|
||||
'L_TYPE': 'Executable',
|
||||
'L_PATH': 'IObitUninstallerPortable',
|
||||
'L_ITEM': 'IObitUninstallerPortable.exe',
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
# Wizard Kit: Settings - Main / Branding
|
||||
|
||||
# Features
|
||||
ENABLED_UPLOAD_DATA = False
|
||||
|
||||
# STATIC VARIABLES (also used by .cmd files)
|
||||
## Not using spaces aroung '=' for easier .cmd substrings
|
||||
ARCHIVE_PASSWORD='Abracadabra'
|
||||
KIT_NAME_FULL='Wizard Kit'
|
||||
KIT_NAME_SHORT='WK'
|
||||
OFFICE_SERVER_IP='10.0.0.10'
|
||||
QUICKBOOKS_SERVER_IP='10.0.0.10'
|
||||
SUPPORT_MESSAGE='Please let 2Shirt know by opening an issue on GitHub'
|
||||
TIME_ZONE='Pacific Standard Time' # Always use "Standard Time" (DST is applied correctly)
|
||||
|
||||
# SERVER VARIABLES
|
||||
## NOTE: Windows can only use one user per server. This means that if
|
||||
## one server serves multiple shares then you have to use the same
|
||||
## user/password for all of those shares.
|
||||
BACKUP_SERVERS = [
|
||||
{ 'IP': '10.0.0.10',
|
||||
'Name': 'ServerOne',
|
||||
'Mounted': False,
|
||||
'Share': 'Backups',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
},
|
||||
{ 'IP': '10.0.0.11',
|
||||
'Name': 'ServerTwo',
|
||||
'Mounted': False,
|
||||
'Share': 'Backups',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
},
|
||||
]
|
||||
CLIENT_INFO_SERVER = {
|
||||
'IP': '10.0.0.10',
|
||||
'RegEntry': r'0x10001,0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000',
|
||||
'Share': '/srv/ClientInfo',
|
||||
'User': 'upload',
|
||||
}
|
||||
OFFICE_SERVER = {
|
||||
'IP': OFFICE_SERVER_IP,
|
||||
'Name': 'ServerOne',
|
||||
'Mounted': False,
|
||||
'Share': 'Office',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
}
|
||||
QUICKBOOKS_SERVER = {
|
||||
'IP': QUICKBOOKS_SERVER_IP,
|
||||
'Name': 'ServerOne',
|
||||
'Mounted': False,
|
||||
'Share': 'QuickBooks',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
}
|
||||
WINDOWS_SERVER = {
|
||||
'IP': '10.0.0.10',
|
||||
'Name': 'ServerOne',
|
||||
'Mounted': False,
|
||||
'Share': 'Windows',
|
||||
'User': 'restore',
|
||||
'Pass': 'Abracadabra',
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,70 +0,0 @@
|
|||
# Wizard Kit: Settings - Music
|
||||
|
||||
MUSIC_MOD = [
|
||||
'104208#banana_boat.mod',
|
||||
'114971#tilbury_fair.mod',
|
||||
'132563#ufo_tune.mod',
|
||||
'135906#magnetik_girl.xm',
|
||||
'140628#autumn_in_budapest.xm',
|
||||
'143198#summer_memories_3.xm',
|
||||
'144405#hillbilly_billyboy.xm',
|
||||
'154795#4mat_-_eternity.xm',
|
||||
'155845#bookworm.mo3',
|
||||
'155914#battleofsteel.xm',
|
||||
'158975#1_channel_moog.it',
|
||||
'165495#trans.s3m',
|
||||
'168513#necros_-_introspection.s3m',
|
||||
'169628#radix_-_feng_shui_schematics.xm',
|
||||
'175238#unknown48_-_twilight.mod',
|
||||
'33432#ambrozia.xm',
|
||||
'33460#amigatre.mod',
|
||||
'34594#CHARIOT.S3M',
|
||||
'34596#BUTTERFL.XM',
|
||||
'34654#CTGOBLIN.S3M',
|
||||
'35151#bananasplit.mod',
|
||||
'35280#DEADLOCK.XM',
|
||||
'38591#compo_liam.xm',
|
||||
'39987#crystald.s3m',
|
||||
'40475#ELYSIUM.MOD',
|
||||
'42146#enigma.mod',
|
||||
'42519#GHOST2.MOD',
|
||||
'42560#GSLINGER.MOD',
|
||||
'42872#existing.xm',
|
||||
'50427#nf-stven.xm',
|
||||
'51549#overture.mod',
|
||||
'54250#SATELL.S3M',
|
||||
'54313#realmk.s3m',
|
||||
'55789#scrambld.mod',
|
||||
'57934#spacedeb.mod',
|
||||
'59344#stardstm.mod',
|
||||
'60395#2ND_PM.S3M',
|
||||
'66187#external.xm',
|
||||
'66343#beek-substitutionology.it',
|
||||
'67561#radix-unreal_superhero.xm',
|
||||
'70829#inside_out.s3m',
|
||||
'83779#beyond_music.mod',
|
||||
]
|
||||
|
||||
MUSIC_SNES = [
|
||||
'actr',
|
||||
'crock',
|
||||
'ct',
|
||||
'dkc',
|
||||
'dkq',
|
||||
'ff6',
|
||||
'fz',
|
||||
'loz3',
|
||||
'mmx',
|
||||
'ptws',
|
||||
'scv4',
|
||||
'sf',
|
||||
'sf2',
|
||||
'sgng',
|
||||
'smk',
|
||||
'smw',
|
||||
'yi',
|
||||
'zamn'
|
||||
]
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,203 +0,0 @@
|
|||
# Wizard Kit: Settings - Sources
|
||||
|
||||
SOURCE_URLS = {
|
||||
'AIDA64': 'http://download.aida64.com/aida64engineer595.zip',
|
||||
'Adobe Reader DC': 'http://ardownload.adobe.com/pub/adobe/reader/win/AcrobatDC/1800920044/AcroRdrDC1800920044_en_US.exe',
|
||||
'AdwCleaner': 'https://toolslib.net/downloads/finish/1-adwcleaner/',
|
||||
'Autoruns': 'https://download.sysinternals.com/files/Autoruns.zip',
|
||||
'BleachBit': 'https://download.bleachbit.org/beta/1.17/BleachBit-1.17-portable.zip',
|
||||
'BlueScreenView32': 'http://www.nirsoft.net/utils/bluescreenview.zip',
|
||||
'BlueScreenView64': 'http://www.nirsoft.net/utils/bluescreenview-x64.zip',
|
||||
'Caffeine': 'http://www.zhornsoftware.co.uk/caffeine/caffeine.zip',
|
||||
'ClassicStartSkin': 'http://www.classicshell.net/forum/download/file.php?id=3001&sid=9a195960d98fd754867dcb63d9315335',
|
||||
'Du': 'https://download.sysinternals.com/files/DU.zip',
|
||||
'ERUNT': 'http://www.aumha.org/downloads/erunt.zip',
|
||||
'Everything32': 'https://www.voidtools.com/Everything-1.4.1.877.x86.zip',
|
||||
'Everything64': 'https://www.voidtools.com/Everything-1.4.1.877.x64.zip',
|
||||
'FastCopy32': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332.zip',
|
||||
'FastCopy64': 'http://ftp.vector.co.jp/69/28/2323/FastCopy332_x64.zip',
|
||||
'Firefox uBO': 'https://addons.mozilla.org/firefox/downloads/file/764482/ublock_origin-1.14.18-an+fx.xpi?src=dp-btn-primary',
|
||||
'HWiNFO32': 'http://app.oldfoss.com:81/download/HWiNFO/hw32_560.zip',
|
||||
'HWiNFO64': 'http://app.oldfoss.com:81/download/HWiNFO/hw64_560.zip',
|
||||
'HitmanPro32': 'https://dl.surfright.nl/HitmanPro.exe',
|
||||
'HitmanPro64': 'https://dl.surfright.nl/HitmanPro_x64.exe',
|
||||
'IOBit_Uninstaller': 'https://portableapps.com/redirect/?a=IObitUninstallerPortable&t=http%3A%2F%2Fdownloads.portableapps.com%2Fportableapps%2Fiobituninstallerportable%2FIObitUninstallerPortable_7.0.2.49.paf.exe',
|
||||
'Intel SSD Toolbox': r'https://downloadmirror.intel.com/27330/eng/Intel%20SSD%20Toolbox%20-%20v3.4.9.exe',
|
||||
'KVRT': 'http://devbuilds.kaspersky-labs.com/devbuilds/KVRT/latest/full/KVRT.exe',
|
||||
'NotepadPlusPlus': 'https://notepad-plus-plus.org/repository/7.x/7.5.2/npp.7.5.2.bin.minimalist.7z',
|
||||
'Office Deployment Tool 2013': 'https://download.microsoft.com/download/6/2/3/6230F7A2-D8A9-478B-AC5C-57091B632FCF/officedeploymenttool_x86_4827-1000.exe',
|
||||
'Office Deployment Tool 2016': 'https://download.microsoft.com/download/2/7/A/27AF1BE6-DD20-4CB4-B154-EBAB8A7D4A7E/officedeploymenttool_8529.3600.exe',
|
||||
'ProduKey32': 'http://www.nirsoft.net/utils/produkey.zip',
|
||||
'ProduKey64': 'http://www.nirsoft.net/utils/produkey-x64.zip',
|
||||
'PuTTY': 'https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip',
|
||||
'RKill': 'https://www.bleepingcomputer.com/download/rkill/dl/10/',
|
||||
'SDIO Themes': 'http://snappy-driver-installer.org/downloads/SDIO_Themes.zip',
|
||||
'SDIO Torrent': 'http://snappy-driver-installer.org/downloads/SDIO_Update.torrent',
|
||||
'Samsung Magician': 'http://downloadcenter.samsung.com/content/SW/201710/20171019164455812/Samsung_Magician_Installer.exe',
|
||||
'TDSSKiller': 'https://media.kaspersky.com/utilities/VirusUtilities/EN/tdsskiller.exe',
|
||||
'TestDisk': 'https://www.cgsecurity.org/testdisk-7.1-WIP.win.zip',
|
||||
'TreeSizeFree': 'https://www.jam-software.com/treesize_free/TreeSizeFree-Portable.zip',
|
||||
'wimlib32': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-i686-bin.zip',
|
||||
'wimlib64': 'https://wimlib.net/downloads/wimlib-1.12.0-windows-x86_64-bin.zip',
|
||||
'Winapp2': 'https://github.com/MoscaDotTo/Winapp2/archive/master.zip',
|
||||
'XMPlay 7z': 'http://support.xmplay.com/files/16/xmp-7z.zip?v=800962',
|
||||
'XMPlay Game': 'http://support.xmplay.com/files/12/xmp-gme.zip?v=515637',
|
||||
'XMPlay RAR': 'http://support.xmplay.com/files/16/xmp-rar.zip?v=409646',
|
||||
'XMPlay WAModern': 'http://support.xmplay.com/files/10/WAModern.zip?v=207099',
|
||||
'XMPlay': 'http://support.xmplay.com/files/20/xmplay3823.zip?v=115916',
|
||||
'XYplorerFree': 'https://www.xyplorer.com/download/xyplorer_free_noinstall.zip',
|
||||
'aria2': 'https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1-win-32bit-build1.zip',
|
||||
}
|
||||
VCREDIST_SOURCES = {
|
||||
'2008sp1': {
|
||||
'32': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe',
|
||||
'64': 'https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x64.exe',
|
||||
},
|
||||
'2010sp1': {
|
||||
'32': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe',
|
||||
'64': 'https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe',
|
||||
},
|
||||
'2012u4': {
|
||||
'32': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe',
|
||||
'64': 'https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe',
|
||||
},
|
||||
'2013': {
|
||||
'32': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x86.exe',
|
||||
'64': 'https://download.microsoft.com/download/0/5/6/056dcda9-d667-4e27-8001-8a0c6971d6b1/vcredist_x64.exe',
|
||||
},
|
||||
'2017': {
|
||||
'32': 'https://download.visualstudio.microsoft.com/download/pr/11100229/78c1e864d806e36f6035d80a0e80399e/VC_redist.x86.exe',
|
||||
'64': 'https://download.visualstudio.microsoft.com/download/pr/11100230/15ccb3f02745c7b206ad10373cbca89b/VC_redist.x64.exe',
|
||||
},
|
||||
}
|
||||
NINITE_SOURCES = {
|
||||
'Bundles': {
|
||||
'Runtimes.exe': '.net4.7-air-java8-silverlight',
|
||||
'Legacy.exe': '.net4.7-7zip-air-chrome-firefox-java8-silverlight-vlc',
|
||||
'Modern.exe': '.net4.7-7zip-air-chrome-classicstart-firefox-java8-silverlight-vlc',
|
||||
},
|
||||
'Audio-Video': {
|
||||
'AIMP.exe': 'aimp',
|
||||
'Audacity.exe': 'audacity',
|
||||
'CCCP.exe': 'cccp',
|
||||
'Foobar2000.exe': 'foobar',
|
||||
'GOM.exe': 'gom',
|
||||
'HandBrake.exe': 'handbrake',
|
||||
'iTunes.exe': 'itunes',
|
||||
'K-Lite Codecs.exe': 'klitecodecs',
|
||||
'MediaMonkey.exe': 'mediamonkey',
|
||||
'MusicBee.exe': 'musicbee',
|
||||
'Spotify.exe': 'spotify',
|
||||
'VLC.exe': 'vlc',
|
||||
'Winamp.exe': 'winamp',
|
||||
},
|
||||
'Cloud Storage': {
|
||||
'Dropbox.exe': 'dropbox',
|
||||
'Google Backup & Sync.exe': 'googlebackupandsync',
|
||||
'Mozy.exe': 'mozy',
|
||||
'OneDrive.exe': 'onedrive',
|
||||
'SugarSync.exe': 'sugarsync',
|
||||
},
|
||||
'Communication': {
|
||||
'Pidgin.exe': 'pidgin',
|
||||
'Skype.exe': 'skype',
|
||||
'Trillian.exe': 'trillian',
|
||||
},
|
||||
'Compression': {
|
||||
'7-Zip.exe': '7zip',
|
||||
'PeaZip.exe': 'peazip',
|
||||
'WinRAR.exe': 'winrar',
|
||||
},
|
||||
'Developer': {
|
||||
'Eclipse.exe': 'eclipse',
|
||||
'FileZilla.exe': 'filezilla',
|
||||
'JDK 8.exe': 'jdk8',
|
||||
'JDK 8 (x64).exe': 'jdkx8',
|
||||
'Notepad++.exe': 'notepadplusplus',
|
||||
'PuTTY.exe': 'putty',
|
||||
'Python 2.exe': 'python',
|
||||
'Visual Studio Code.exe': 'vscode',
|
||||
'WinMerge.exe': 'winmerge',
|
||||
'WinSCP.exe': 'winscp',
|
||||
},
|
||||
'File Sharing': {
|
||||
'qBittorrent.exe': 'qbittorrent',
|
||||
},
|
||||
'Image-Photo': {
|
||||
'Blender.exe': 'blender',
|
||||
'FastStone.exe': 'faststone',
|
||||
'GIMP.exe': 'gimp',
|
||||
'Greenshot.exe': 'greenshot',
|
||||
'Inkscape.exe': 'inkscape',
|
||||
'IrfanView.exe': 'irfanview',
|
||||
'Krita.exe': 'krita',
|
||||
'Paint.NET.exe': 'paint.net',
|
||||
'ShareX.exe': 'sharex',
|
||||
'XnView.exe': 'xnview',
|
||||
},
|
||||
'Misc': {
|
||||
'Evernote.exe': 'evernote',
|
||||
'Everything.exe': 'everything',
|
||||
'KeePass 2.exe': 'keepass2',
|
||||
'Google Earth.exe': 'googleearth',
|
||||
'NV Access.exe': 'nvda',
|
||||
'Steam.exe': 'steam',
|
||||
},
|
||||
'Office': {
|
||||
'CutePDF.exe': 'cutepdf',
|
||||
'Foxit Reader.exe': 'foxit',
|
||||
'LibreOffice.exe': 'libreoffice',
|
||||
'OpenOffice.exe': 'openoffice',
|
||||
'PDFCreator.exe': 'pdfcreator',
|
||||
'SumatraPDF.exe': 'sumatrapdf',
|
||||
'Thunderbird.exe': 'thunderbird',
|
||||
},
|
||||
'Runtimes': {
|
||||
'Adobe Air.exe': 'air',
|
||||
'dotNET.exe': '.net4.7',
|
||||
'Java 8.exe': 'java8',
|
||||
'Shockwave.exe': 'shockwave',
|
||||
'Silverlight.exe': 'silverlight',
|
||||
},
|
||||
'Security': {
|
||||
'Avast.exe': 'avast',
|
||||
'AVG.exe': 'avg',
|
||||
'Avira.exe': 'avira',
|
||||
'Microsoft Security Essentials.exe': 'essentials',
|
||||
'Malwarebytes Anti-Malware.exe': 'malwarebytes',
|
||||
'Spybot 2.exe': 'spybot2',
|
||||
'SUPERAntiSpyware.exe': 'super',
|
||||
},
|
||||
'Utilities': {
|
||||
'CDBurnerXP.exe': 'cdburnerxp',
|
||||
'Classic Start.exe': 'classicstart',
|
||||
'Glary Utilities.exe': 'glary',
|
||||
'ImgBurn.exe': 'imgburn',
|
||||
'InfraRecorder.exe': 'infrarecorder',
|
||||
'Launchy.exe': 'launchy',
|
||||
'RealVNC.exe': 'realvnc',
|
||||
'Revo Uninstaller.exe': 'revo',
|
||||
'TeamViewer 12.exe': 'teamviewer12',
|
||||
'TeraCopy.exe': 'teracopy',
|
||||
'WinDirStat.exe': 'windirstat',
|
||||
},
|
||||
'Web Browsers': {
|
||||
'Google Chrome.exe': 'chrome',
|
||||
'Mozilla Firefox.exe': 'firefox',
|
||||
'Opera Chromium.exe': 'operaChromium',
|
||||
},
|
||||
}
|
||||
RST_SOURCES = {
|
||||
#SetupRST_12.0.exe : Removed from download center?
|
||||
#SetupRST_12.5.exe : Removed from download center?
|
||||
#SetupRST_12.8.exe : Removed from download center?
|
||||
'SetupRST_12.9.exe': 'https://downloadmirror.intel.com/23496/eng/SetupRST.exe',
|
||||
#SetupRST_13.x.exe : Broken, doesn't support > .NET 4.5
|
||||
'SetupRST_14.0.exe': 'https://downloadmirror.intel.com/25091/eng/SetupRST.exe',
|
||||
'SetupRST_14.8.exe': 'https://downloadmirror.intel.com/26759/eng/setuprst.exe',
|
||||
'SetupRST_15.8.exe': 'https://downloadmirror.intel.com/27147/eng/SetupRST.exe',
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
# Wizard Kit: Settings - Tools
|
||||
|
||||
TOOLS = {
|
||||
# NOTE: BinDir will be prepended to these paths at runtime
|
||||
'AIDA64': {
|
||||
'32': r'AIDA64\aida64.exe'},
|
||||
'AutoRuns': {
|
||||
'32': r'Autoruns\autoruns.exe',
|
||||
'64': r'Autoruns\autoruns64.exe'},
|
||||
'BleachBit': {
|
||||
'32': r'BleachBit\bleachbit_console.exe'},
|
||||
'Caffeine': {
|
||||
'32': r'Caffeine\caffeine.exe'},
|
||||
'Du': {
|
||||
'32': r'Du\du.exe',
|
||||
'64': r'Du\du64.exe'},
|
||||
'ERUNT': {
|
||||
'32': r'ERUNT\ERUNT.EXE'},
|
||||
'Everything': {
|
||||
'32': r'Everything\Everything.exe',
|
||||
'64': r'Everything\Everything64.exe'},
|
||||
'FastCopy': {
|
||||
'32': r'FastCopy\FastCopy.exe',
|
||||
'64': r'FastCopy\FastCopy64.exe'},
|
||||
'HitmanPro': {
|
||||
'32': r'HitmanPro\HitmanPro.exe',
|
||||
'64': r'HitmanPro\HitmanPro64.exe'},
|
||||
'HWiNFO': {
|
||||
'32': r'HWiNFO\HWiNFO.exe',
|
||||
'64': r'HWiNFO\HWiNFO64.exe'},
|
||||
'KVRT': {
|
||||
'32': r'KVRT\KVRT.exe'},
|
||||
'NotepadPlusPlus': {
|
||||
'32': r'NotepadPlusPlus\notepadplusplus.exe'},
|
||||
'ProduKey': {
|
||||
'32': r'ProduKey\ProduKey.exe',
|
||||
'64': r'ProduKey\ProduKey64.exe'},
|
||||
'PuTTY-PSFTP': {
|
||||
'32': r'PuTTY\PSFTP.EXE'},
|
||||
'RKill': {
|
||||
'32': r'RKill\RKill.exe'},
|
||||
'SevenZip': {
|
||||
'32': r'7-Zip\7za.exe',
|
||||
'64': r'7-Zip\7za64.exe'},
|
||||
'TDSSKiller': {
|
||||
'32': r'TDSSKiller\TDSSKiller.exe'},
|
||||
'wimlib-imagex': {
|
||||
'32': r'wimlib\x32\wimlib-imagex.exe',
|
||||
'64': r'wimlib\x64\wimlib-imagex.exe'},
|
||||
'XMPlay': {
|
||||
'32': r'XMPlay\xmplay.exe'},
|
||||
}
|
||||
|
||||
if __name__ == '__main__':
|
||||
print("This file is not meant to be called directly.")
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
# Wizard Kit: Check, and possibly repair, system file health via SFC
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: SFC Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\SFC Tool.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: SFC Tool\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
}}
|
||||
if ask('Run a SFC scan now?'):
|
||||
try_and_print(message='SFC scan...',
|
||||
function=run_sfc_scan, other_results=other_results)
|
||||
else:
|
||||
abort()
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter to exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
# Wizard Kit: System Checklist
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.activation import *
|
||||
from functions.cleanup import *
|
||||
from functions.diags import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: System Checklist Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\System Checklist.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: System Checklist Tool\n'.format(KIT_NAME_FULL))
|
||||
ticket_number = get_ticket_number()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
'BIOSKeyNotFoundError': 'BIOS key not found',
|
||||
},
|
||||
'Warning': {}}
|
||||
print_info('Starting System Checklist for Ticket #{}\n'.format(
|
||||
ticket_number))
|
||||
|
||||
# Configure
|
||||
print_info('Configure')
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
try_and_print(message='Explorer...',
|
||||
function=config_explorer_system, cs='Done')
|
||||
try_and_print(message='Updating Clock...',
|
||||
function=update_clock, cs='Done')
|
||||
|
||||
# Cleanup
|
||||
print_info('Cleanup')
|
||||
try_and_print(message='Desktop...',
|
||||
function=cleanup_desktop, cs='Done')
|
||||
try_and_print(message='AdwCleaner...',
|
||||
function=cleanup_adwcleaner, cs='Done')
|
||||
|
||||
# Export system info
|
||||
print_info('Backup System Information')
|
||||
try_and_print(message='AIDA64 reports...',
|
||||
function=run_aida64, cs='Done')
|
||||
try_and_print(message='File listing...',
|
||||
function=backup_file_list, cs='Done')
|
||||
try_and_print(message='Power plans...',
|
||||
function=backup_power_plans, cs='Done')
|
||||
try_and_print(message='Product Keys...',
|
||||
function=run_produkey, cs='Done')
|
||||
try_and_print(message='Registry...',
|
||||
function=backup_registry, cs='Done')
|
||||
|
||||
# User data
|
||||
print_info('User Data')
|
||||
show_user_data_summary()
|
||||
|
||||
# Summary
|
||||
print_info('Summary')
|
||||
try_and_print(message='Operating System:',
|
||||
function=show_os_name, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='Activation:',
|
||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
||||
if (not windows_is_activated()
|
||||
and global_vars['OS']['Version'] in ('8', '10')):
|
||||
try_and_print(message='BIOS Activation:',
|
||||
function=activate_with_bios,
|
||||
other_results=other_results)
|
||||
try_and_print(message='Installed Office:',
|
||||
function=get_installed_office, ns='Unknown', print_return=True)
|
||||
show_free_space()
|
||||
try_and_print(message='Installed RAM:',
|
||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
||||
|
||||
# Upload info
|
||||
if ENABLED_UPLOAD_DATA:
|
||||
print_info('Finalizing')
|
||||
try_and_print(message='Compressing Info...',
|
||||
function=compress_info, cs='Done')
|
||||
try_and_print(message='Uploading to NAS...',
|
||||
function=upload_info, cs='Done')
|
||||
|
||||
# Play audio, show devices, open Windows updates, and open Activation
|
||||
popen_program(['mmc', 'devmgmt.msc'])
|
||||
run_hwinfo_sensors()
|
||||
popen_program(['control', '/name', 'Microsoft.WindowsUpdate'])
|
||||
if not windows_is_activated():
|
||||
popen_program('slui')
|
||||
sleep(3)
|
||||
run_xmplay()
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,124 +0,0 @@
|
|||
# Wizard Kit: System Diagnostics
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.browsers import *
|
||||
from functions.diags import *
|
||||
from functions.info import *
|
||||
from functions.product_keys import *
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: System Diagnostics Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\System Diagnostics.log'.format(
|
||||
**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: System Diagnostics Tool\n'.format(KIT_NAME_FULL))
|
||||
ticket_number = get_ticket_number()
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
},
|
||||
'Warning': {
|
||||
'GenericRepair': 'Repaired',
|
||||
'UnsupportedOSError': 'Unsupported OS',
|
||||
}}
|
||||
print_info('Starting System Diagnostics for Ticket #{}\n'.format(
|
||||
ticket_number))
|
||||
|
||||
# Sanitize Environment
|
||||
print_info('Sanitizing Environment')
|
||||
# try_and_print(message='Killing processes...',
|
||||
# function=run_process_killer, cs='Done')
|
||||
try_and_print(message='Running RKill...',
|
||||
function=run_rkill, cs='Done')
|
||||
try_and_print(message='Running TDSSKiller...',
|
||||
function=run_tdsskiller, cs='Done')
|
||||
|
||||
# Re-run if earlier process was stopped.
|
||||
stay_awake()
|
||||
|
||||
# Start diags
|
||||
print_info('Starting Background Scans')
|
||||
check_connection()
|
||||
try_and_print(message='Running HitmanPro...',
|
||||
function=run_hitmanpro, cs='Started')
|
||||
try_and_print(message='Running Autoruns...',
|
||||
function=run_autoruns, cs='Started')
|
||||
|
||||
# OS Health Checks
|
||||
print_info('OS Health Checks')
|
||||
try_and_print(
|
||||
message='CHKDSK ({SYSTEMDRIVE})...'.format(**global_vars['Env']),
|
||||
function=run_chkdsk, other_results=other_results)
|
||||
try_and_print(message='SFC scan...',
|
||||
function=run_sfc_scan, other_results=other_results)
|
||||
try_and_print(message='DISM CheckHealth...',
|
||||
function=run_dism, other_results=other_results, repair=False)
|
||||
|
||||
# Scan for supported browsers
|
||||
print_info('Scanning for browsers')
|
||||
scan_for_browsers()
|
||||
|
||||
# Export system info
|
||||
print_info('Backup System Information')
|
||||
try_and_print(message='AIDA64 reports...',
|
||||
function=run_aida64, cs='Done')
|
||||
try_and_print(message='BleachBit report...',
|
||||
function=run_bleachbit, cs='Done')
|
||||
backup_browsers()
|
||||
try_and_print(message='File listing...',
|
||||
function=backup_file_list, cs='Done')
|
||||
try_and_print(message='Power plans...',
|
||||
function=backup_power_plans, cs='Done')
|
||||
try_and_print(message='Product Keys...',
|
||||
function=run_produkey, cs='Done')
|
||||
try_and_print(message='Registry...',
|
||||
function=backup_registry, cs='Done')
|
||||
|
||||
# Summary
|
||||
print_info('Summary')
|
||||
try_and_print(message='Temp Size:',
|
||||
function=show_temp_files_size, silent_function=False)
|
||||
show_free_space()
|
||||
try_and_print(message='Installed RAM:',
|
||||
function=show_installed_ram, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='Installed Office:',
|
||||
function=get_installed_office, ns='Unknown', print_return=True)
|
||||
try_and_print(message='Product Keys:',
|
||||
function=get_product_keys, ns='Unknown', print_return=True)
|
||||
try_and_print(message='Operating System:',
|
||||
function=show_os_name, ns='Unknown', silent_function=False)
|
||||
try_and_print(message='',
|
||||
function=show_os_activation, ns='Unknown', silent_function=False)
|
||||
|
||||
# User data
|
||||
print_info('User Data')
|
||||
try:
|
||||
show_user_data_summary()
|
||||
except Exception:
|
||||
print_error(' Unknown error.')
|
||||
|
||||
# Upload info
|
||||
if ENABLED_UPLOAD_DATA:
|
||||
print_info('Finalizing')
|
||||
try_and_print(message='Compressing Info...',
|
||||
function=compress_info, cs='Done')
|
||||
try_and_print(message='Uploading to NAS...',
|
||||
function=upload_info, cs='Done')
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter to exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# Wizard Kit: Search for product keys in the transfer folder
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.product_keys import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Transferred Key Finder'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\Transferred Keys.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: Transferred Key Finder\n'.format(KIT_NAME_FULL))
|
||||
try_and_print(message='Searching for keys...',
|
||||
function=list_clientdir_keys, print_return=True)
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,143 +0,0 @@
|
|||
# Wizard Kit: Download the latest versions of the programs in the kit
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.update import *
|
||||
init_global_vars()
|
||||
os.system('title {}: Kit Update Tool'.format(KIT_NAME_FULL))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
clear_screen()
|
||||
print_info('{}: Kit Update Tool\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Error': {
|
||||
'CalledProcessError': 'Unknown Error',
|
||||
}}
|
||||
|
||||
## Prep ##
|
||||
update_sdio = ask('Update SDI Origin?')
|
||||
|
||||
## Download ##
|
||||
print_success('Downloading tools')
|
||||
|
||||
# Data Recovery
|
||||
print_info(' Data Recovery')
|
||||
try_and_print(message='TestDisk / PhotoRec...', function=update_testdisk, other_results=other_results, width=40)
|
||||
|
||||
# Data Transfers
|
||||
print_info(' Data Transfers')
|
||||
try_and_print(message='FastCopy...', function=update_fastcopy, other_results=other_results, width=40)
|
||||
try_and_print(message='wimlib...', function=update_wimlib, other_results=other_results, width=40)
|
||||
try_and_print(message='XYplorer...', function=update_xyplorer, other_results=other_results, width=40)
|
||||
|
||||
# Diagnostics
|
||||
print_info(' Diagnostics')
|
||||
try_and_print(message='AIDA64...', function=update_aida64, other_results=other_results, width=40)
|
||||
try_and_print(message='Autoruns...', function=update_autoruns, other_results=other_results, width=40)
|
||||
try_and_print(message='BleachBit...', function=update_bleachbit, other_results=other_results, width=40)
|
||||
try_and_print(message='BlueScreenView...', function=update_bluescreenview, other_results=other_results, width=40)
|
||||
try_and_print(message='ERUNT...', function=update_erunt, other_results=other_results, width=40)
|
||||
try_and_print(message='HitmanPro...', function=update_hitmanpro, other_results=other_results, width=40)
|
||||
try_and_print(message='HWiNFO...', function=update_hwinfo, other_results=other_results, width=40)
|
||||
try_and_print(message='ProduKey...', function=update_produkey, other_results=other_results, width=40)
|
||||
|
||||
# Drivers
|
||||
print_info(' Drivers')
|
||||
try_and_print(message='Intel RST...', function=update_intel_rst, other_results=other_results, width=40)
|
||||
try_and_print(message='Intel SSD Toolbox...', function=update_intel_ssd_toolbox, other_results=other_results, width=40)
|
||||
try_and_print(message='Samsing Magician...', function=update_samsung_magician, other_results=other_results, width=40)
|
||||
if update_sdio:
|
||||
try_and_print(message='Snappy Driver Installer Origin...', function=update_sdi_origin, other_results=other_results, width=40)
|
||||
|
||||
# Installers
|
||||
print_info(' Installers')
|
||||
try_and_print(message='Adobe Reader DC...', function=update_adobe_reader_dc, other_results=other_results, width=40)
|
||||
try_and_print(message='MS Office...', function=update_office, other_results=other_results, width=40)
|
||||
try_and_print(message='Visual C++ Runtimes...', function=update_vcredists, other_results=other_results, width=40)
|
||||
update_all_ninite(other_results=other_results, width=40)
|
||||
|
||||
# Misc
|
||||
print_info(' Misc')
|
||||
try_and_print(message='Caffeine...', function=update_caffeine, other_results=other_results, width=40)
|
||||
try_and_print(message='Classic Start Skin...', function=update_classic_start_skin, other_results=other_results, width=40)
|
||||
try_and_print(message='Du...', function=update_du, other_results=other_results, width=40)
|
||||
try_and_print(message='Everything...', function=update_everything, other_results=other_results, width=40)
|
||||
try_and_print(message='FirefoxExtensions...', function=update_firefox_ublock_origin, other_results=other_results, width=40)
|
||||
try_and_print(message='PuTTY...', function=update_putty, other_results=other_results, width=40)
|
||||
try_and_print(message='Notepad++...', function=update_notepadplusplus, other_results=other_results, width=40)
|
||||
try_and_print(message='TreeSizeFree...', function=update_treesizefree, other_results=other_results, width=40)
|
||||
try_and_print(message='XMPlay...', function=update_xmplay, other_results=other_results, width=40)
|
||||
|
||||
# Repairs
|
||||
print_info(' Repairs')
|
||||
try_and_print(message='AdwCleaner...', function=update_adwcleaner, other_results=other_results, width=40)
|
||||
try_and_print(message='KVRT...', function=update_kvrt, other_results=other_results, width=40)
|
||||
try_and_print(message='RKill...', function=update_rkill, other_results=other_results, width=40)
|
||||
try_and_print(message='TDSSKiller...', function=update_tdsskiller, other_results=other_results, width=40)
|
||||
|
||||
# Uninstallers
|
||||
print_info(' Uninstallers')
|
||||
try_and_print(message='IObit Uninstaller...', function=update_iobit_uninstaller, other_results=other_results, width=40)
|
||||
|
||||
## Review ##
|
||||
print_standard('Please review the results and download/extract any missing items to .cbin')
|
||||
pause('Press Enter to compress the .cbin items')
|
||||
|
||||
## Compress ##
|
||||
print_success('Compressing tools')
|
||||
print_info(' _Drivers')
|
||||
for item in os.scandir(r'{}\_Drivers'.format(global_vars['CBinDir'])):
|
||||
if not re.search(r'^(_Drivers|.*7z)$', item.name, re.IGNORECASE):
|
||||
try_and_print(
|
||||
message='{}...'.format(item.name),
|
||||
function=compress_and_remove_item,
|
||||
other_results = other_results,
|
||||
width=40,
|
||||
item = item)
|
||||
print_info(' .cbin')
|
||||
for item in os.scandir(global_vars['CBinDir']):
|
||||
if not re.search(r'^(_Drivers|_include|.*7z)$', item.name, re.IGNORECASE):
|
||||
try_and_print(
|
||||
message='{}...'.format(item.name),
|
||||
function=compress_and_remove_item,
|
||||
other_results = other_results,
|
||||
width=40,
|
||||
item = item)
|
||||
|
||||
## Search for network Office/QuickBooks installers & add to LAUNCHERS
|
||||
print_success('Scanning for network installers')
|
||||
scan_for_net_installers(OFFICE_SERVER, 'Office', min_year=2010)
|
||||
scan_for_net_installers(QUICKBOOKS_SERVER, 'QuickBooks', min_year=2015)
|
||||
|
||||
## Generate Launchers
|
||||
print_success('Generating launchers')
|
||||
for section in sorted(LAUNCHERS.keys()):
|
||||
print_info(' {}'.format(section))
|
||||
for name, options in sorted(LAUNCHERS[section].items()):
|
||||
try_and_print(message=name, function=generate_launcher,
|
||||
section=section, name=name, options=options,
|
||||
other_results=other_results, width=40)
|
||||
|
||||
# Rename "Copy WizardKit.cmd" (if necessary)
|
||||
source = r'{}\Scripts\Copy WizardKit.cmd'.format(global_vars['BinDir'])
|
||||
dest = r'{}\Copy {}.cmd'.format(global_vars['BaseDir'], KIT_NAME_FULL)
|
||||
if os.path.exists(source):
|
||||
try:
|
||||
shutil.move(source, dest)
|
||||
except Exception:
|
||||
print_error(' Failed to rename "{}.cmd" to "{}.cmd"'.format(
|
||||
'Copy WizardKit', KIT_NAME_FULL))
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
# Wizard Kit: User Checklist
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.browsers import *
|
||||
from functions.cleanup import *
|
||||
from functions.setup import *
|
||||
init_global_vars()
|
||||
os.system('title {}: User Checklist Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\User Checklist ({USERNAME}).log'.format(
|
||||
**global_vars, **global_vars['Env'])
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: User Checklist\n'.format(KIT_NAME_FULL))
|
||||
other_results = {
|
||||
'Warning': {
|
||||
'NotInstalledError': 'Not installed',
|
||||
'NoProfilesError': 'No profiles found',
|
||||
}}
|
||||
answer_config_browsers = ask('Install adblock?')
|
||||
if answer_config_browsers:
|
||||
answer_reset_browsers = ask(
|
||||
'Reset browsers to safe defaults first?')
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
answer_config_classicshell = ask('Configure ClassicShell?')
|
||||
answer_config_explorer_user = ask('Configure Explorer?')
|
||||
|
||||
# Cleanup
|
||||
print_info('Cleanup')
|
||||
try_and_print(message='Desktop...',
|
||||
function=cleanup_desktop, cs='Done')
|
||||
|
||||
# Scan for supported browsers
|
||||
print_info('Scanning for browsers')
|
||||
scan_for_browsers()
|
||||
|
||||
# Homepages
|
||||
print_info('Current homepages')
|
||||
list_homepages()
|
||||
|
||||
# Backup
|
||||
print_info('Backing up browsers')
|
||||
backup_browsers()
|
||||
|
||||
# Reset
|
||||
if answer_config_browsers and answer_reset_browsers:
|
||||
print_info('Resetting browsers')
|
||||
reset_browsers()
|
||||
|
||||
# Configure
|
||||
print_info('Configuring programs')
|
||||
if answer_config_browsers:
|
||||
install_adblock()
|
||||
if global_vars['OS']['Version'] == '10':
|
||||
if answer_config_classicshell:
|
||||
try_and_print(message='ClassicStart...',
|
||||
function=config_classicstart, cs='Done')
|
||||
if answer_config_explorer_user:
|
||||
try_and_print(message='Explorer...',
|
||||
function=config_explorer_user, cs='Done')
|
||||
if (not answer_config_browsers
|
||||
and not answer_config_classicshell
|
||||
and not answer_config_explorer_user):
|
||||
print_warning(' Skipped')
|
||||
else:
|
||||
if not answer_config_browsers:
|
||||
print_warning(' Skipped')
|
||||
|
||||
# Done
|
||||
print_standard('\nDone.')
|
||||
pause('Press Enter to exit...')
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
# Wizard Kit: Copy user data to the system from a local or network source
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.data import *
|
||||
from functions.repairs import *
|
||||
init_global_vars()
|
||||
os.system('title {}: User Data Transfer Tool'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\User Data Transfer.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
# Prep
|
||||
stay_awake()
|
||||
clear_screen()
|
||||
print_info('{}: User Data Transfer Tool\n'.format(KIT_NAME_FULL))
|
||||
ticket_number = get_ticket_number()
|
||||
folder_path = r'{}\Transfer'.format(KIT_NAME_SHORT)
|
||||
dest = select_destination(folder_path=folder_path,
|
||||
prompt='Which disk are we transferring to?')
|
||||
source = select_source(ticket_number)
|
||||
items = scan_source(source, dest)
|
||||
|
||||
# Transfer
|
||||
clear_screen()
|
||||
print_info('Transfer Details:\n')
|
||||
show_info('Ticket:', ticket_number)
|
||||
show_info('Source:', source.path)
|
||||
show_info('Destination:', dest)
|
||||
|
||||
if (not ask('Proceed with transfer?')):
|
||||
umount_backup_shares()
|
||||
abort()
|
||||
|
||||
print_info('Transferring Data')
|
||||
transfer_source(source, dest, items)
|
||||
try_and_print(message='Removing extra files...',
|
||||
function=cleanup_transfer, cs='Done', dest_path=dest)
|
||||
umount_backup_shares()
|
||||
|
||||
# Done
|
||||
run_kvrt()
|
||||
print_standard('\nDone.')
|
||||
pause("Press Enter to exit...")
|
||||
exit_script()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
# Wizard Kit: WinPE Root Menu
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Init
|
||||
os.chdir(os.path.dirname(os.path.realpath(__file__)))
|
||||
sys.path.append(os.getcwd())
|
||||
from functions.winpe_menus import *
|
||||
init_global_vars()
|
||||
set_title('{}: Root Menu'.format(KIT_NAME_FULL))
|
||||
global_vars['LogFile'] = r'{LogDir}\WinPE.log'.format(**global_vars)
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
menu_root()
|
||||
except SystemExit:
|
||||
pass
|
||||
except:
|
||||
major_exception()
|
||||
|
|
@ -1,99 +0,0 @@
|
|||
InfoPage="Computer;Summary"
|
||||
InfoPage="Computer;Computer Name"
|
||||
InfoPage="Computer;DMI"
|
||||
InfoPage="Computer;IPMI"
|
||||
InfoPage="Computer;Overclock"
|
||||
InfoPage="Computer;Power Management"
|
||||
InfoPage="Computer;Portable Computer"
|
||||
InfoPage="Motherboard;CPU"
|
||||
InfoPage="Motherboard;CPUID"
|
||||
InfoPage="Motherboard;Motherboard"
|
||||
InfoPage="Motherboard;Memory"
|
||||
InfoPage="Motherboard;SPD"
|
||||
InfoPage="Motherboard;Chipset"
|
||||
InfoPage="Motherboard;BIOS"
|
||||
InfoPage="Motherboard;ACPI"
|
||||
InfoPage="Operating System;Operating System"
|
||||
InfoPage="Operating System;Processes"
|
||||
InfoPage="Operating System;System Drivers"
|
||||
InfoPage="Operating System;Services"
|
||||
InfoPage="Operating System;AX Files"
|
||||
InfoPage="Operating System;DLL Files"
|
||||
InfoPage="Operating System;Certificates"
|
||||
InfoPage="Operating System;UpTime"
|
||||
InfoPage="Server;Share"
|
||||
InfoPage="Server;Opened Files"
|
||||
InfoPage="Server;Account Security"
|
||||
InfoPage="Server;Logon"
|
||||
InfoPage="Server;Users"
|
||||
InfoPage="Server;Local Groups"
|
||||
InfoPage="Server;Global Groups"
|
||||
InfoPage="Display;Windows Video"
|
||||
InfoPage="Display;PCI / AGP Video"
|
||||
InfoPage="Display;GPU"
|
||||
InfoPage="Display;Monitor"
|
||||
InfoPage="Display;Desktop"
|
||||
InfoPage="Display;Multi-Monitor"
|
||||
InfoPage="Display;Video Modes"
|
||||
InfoPage="Display;OpenGL"
|
||||
InfoPage="Display;GPGPU"
|
||||
InfoPage="Display;Mantle"
|
||||
InfoPage="Display;Vulkan"
|
||||
InfoPage="Display;Fonts"
|
||||
InfoPage="Multimedia;Windows Audio"
|
||||
InfoPage="Multimedia;PCI / PnP Audio"
|
||||
InfoPage="Multimedia;HD Audio"
|
||||
InfoPage="Multimedia;OpenAL"
|
||||
InfoPage="Multimedia;Audio Codecs"
|
||||
InfoPage="Multimedia;Video Codecs"
|
||||
InfoPage="Multimedia;MCI"
|
||||
InfoPage="Multimedia;SAPI"
|
||||
InfoPage="Storage;Windows Storage"
|
||||
InfoPage="Storage;Logical Drives"
|
||||
InfoPage="Storage;Physical Drives"
|
||||
InfoPage="Storage;Optical Drives"
|
||||
InfoPage="Storage;ASPI"
|
||||
InfoPage="Storage;ATA"
|
||||
InfoPage="Storage;SMART"
|
||||
InfoPage="Network;Windows Network"
|
||||
InfoPage="Network;PCI / PnP Network"
|
||||
InfoPage="Network;RAS"
|
||||
InfoPage="Network;Net Resources"
|
||||
InfoPage="Network;IAM"
|
||||
InfoPage="Network;Internet"
|
||||
InfoPage="Network;Routes"
|
||||
InfoPage="Network;IE Cookie"
|
||||
InfoPage="Network;Browser History"
|
||||
InfoPage="DirectX;DirectX Files"
|
||||
InfoPage="DirectX;DirectX Video"
|
||||
InfoPage="DirectX;DirectX Sound"
|
||||
InfoPage="Devices;Windows Devices"
|
||||
InfoPage="Devices;Physical Devices"
|
||||
InfoPage="Devices;PCI Devices"
|
||||
InfoPage="Devices;USB Devices"
|
||||
InfoPage="Devices;Device Resources"
|
||||
InfoPage="Devices;Input"
|
||||
InfoPage="Devices;Printers"
|
||||
InfoPage="Software;Auto Start"
|
||||
InfoPage="Software;Scheduled"
|
||||
InfoPage="Software;Installed Programs"
|
||||
InfoPage="Software;Licenses"
|
||||
InfoPage="Software;File Types"
|
||||
InfoPage="Software;Desktop Gadgets"
|
||||
InfoPage="Security;Windows Security"
|
||||
InfoPage="Security;Windows Update"
|
||||
InfoPage="Security;Anti-Virus"
|
||||
InfoPage="Security;Firewall"
|
||||
InfoPage="Security;Anti-Spyware"
|
||||
InfoPage="Security;Anti-Trojan"
|
||||
InfoPage="Config;Regional"
|
||||
InfoPage="Config;Environment"
|
||||
InfoPage="Config;Control Panel"
|
||||
InfoPage="Config;Recycle Bin"
|
||||
InfoPage="Config;System Files"
|
||||
InfoPage="Config;System Folders"
|
||||
InfoPage="Config;Event Logs"
|
||||
InfoPage="Database;Database Software"
|
||||
InfoPage="Database;BDE Drivers"
|
||||
InfoPage="Database;ODBC Drivers"
|
||||
InfoPage="Database;ODBC Data Sources"
|
||||
|
|
@ -1 +0,0 @@
|
|||
InfoPage="Software;Installed Programs"
|
||||
|
|
@ -1 +0,0 @@
|
|||
InfoPage="Software;Licenses"
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
[Portable]
|
||||
|
||||
[bleachbit]
|
||||
auto_hide = False
|
||||
auto_start = False
|
||||
check_beta = False
|
||||
check_online_updates = False
|
||||
shred = False
|
||||
exit_done = False
|
||||
delete_confirmation = True
|
||||
units_iec = True
|
||||
update_winapp2 = False
|
||||
first_start = True
|
||||
version = 1.17
|
||||
|
||||
[hashpath]
|
||||
|
||||
[list/shred_drives]
|
||||
|
||||
[preserve_languages]
|
||||
en = True
|
||||
|
||||
[tree]
|
||||
adobe_reader = True
|
||||
adobe_reader.cache = True
|
||||
adobe_reader.tmp = True
|
||||
amule = True
|
||||
amule.tmp = True
|
||||
chromium = True
|
||||
chromium.cache = True
|
||||
firefox = True
|
||||
firefox.cache = True
|
||||
gimp = True
|
||||
gimp.tmp = True
|
||||
google_chrome = True
|
||||
google_chrome.cache = True
|
||||
google_earth = True
|
||||
google_earth.temporary_files = True
|
||||
hippo_opensim_viewer = True
|
||||
hippo_opensim_viewer.cache = True
|
||||
internet_explorer = True
|
||||
internet_explorer.temporary_files = True
|
||||
java = True
|
||||
java.cache = True
|
||||
libreoffice = True
|
||||
libreoffice.cache = True
|
||||
liferea = True
|
||||
liferea.cache = True
|
||||
miro = True
|
||||
miro.cache = True
|
||||
openofficeorg = True
|
||||
openofficeorg.cache = True
|
||||
opera = True
|
||||
opera.cache = True
|
||||
pidgin = True
|
||||
pidgin.cache = True
|
||||
safari = True
|
||||
safari.cache = True
|
||||
seamonkey = True
|
||||
seamonkey.cache = True
|
||||
secondlife_viewer = True
|
||||
secondlife_viewer.Cache = True
|
||||
system = True
|
||||
system.recycle_bin = True
|
||||
system.tmp = True
|
||||
thunderbird = True
|
||||
thunderbird.cache = True
|
||||
vuze = True
|
||||
vuze.cache = True
|
||||
vuze.tmp = True
|
||||
yahoo_messenger = True
|
||||
yahoo_messenger.cache = True
|
||||
winapp2_windows = True
|
||||
winapp2_windows.cbs_logs = True
|
||||
winapp2_windows.cbs_logs_more = True
|
||||
winapp2_windows.windows_cbs_logs_more = True
|
||||
|
||||
|
|
@ -1 +0,0 @@
|
|||
Broken. "requires" .NET 4.5 but fails to accept .NET 4.6 or newer (which we install).
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="32" Channel="Current">
|
||||
<Product ID="O365ProPlusRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="64" Channel="Current">
|
||||
<Product ID="O365ProPlusRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="32" Channel="Current">
|
||||
<Product ID="HomeBusinessRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="64" Channel="Current">
|
||||
<Product ID="HomeBusinessRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="32" Channel="Current">
|
||||
<Product ID="HomeStudentRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
<Configuration>
|
||||
<Add OfficeClientEdition="64" Channel="Current">
|
||||
<Product ID="HomeStudentRetail">
|
||||
<Language ID="en-us" />
|
||||
</Product>
|
||||
</Add>
|
||||
</Configuration>
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
@echo off
|
||||
setlocal
|
||||
|
||||
start "" /wait "2008sp1\x32\vcredist.exe" /qb! /norestart
|
||||
start "" /wait "2008sp1\x64\vcredist.exe" /qb! /norestart
|
||||
|
||||
start "" /wait "2010\x32\vcredist.exe" /passive /norestart
|
||||
start "" /wait "2010\x64\vcredist.exe" /passive /norestart
|
||||
|
||||
start "" /wait "2012u4\x32\vcredist.exe" /passive /norestart
|
||||
start "" /wait "2012u4\x64\vcredist.exe" /passive /norestart
|
||||
|
||||
start "" /wait "2013\x32\vcredist.exe" /install /passive /norestart
|
||||
start "" /wait "2013\x64\vcredist.exe" /install /passive /norestart
|
||||
|
||||
start "" /wait "2015u3\x32\vcredist.exe" /install /passive /norestart
|
||||
start "" /wait "2015u3\x64\vcredist.exe" /install /passive /norestart
|
||||
|
||||
start "" /wait "2017\x32\vcredist.exe" /install /passive /norestart
|
||||
start "" /wait "2017\x64\vcredist.exe" /install /passive /norestart
|
||||
|
||||
endlocal
|
||||
48
.gitignore
vendored
|
|
@ -1,40 +1,8 @@
|
|||
**/__pycache__/*
|
||||
*.bak
|
||||
*.exe
|
||||
.bin/7-Zip/
|
||||
.bin/AIDA64/
|
||||
.bin/BleachBit/
|
||||
.bin/ClassicStartSkin/
|
||||
.bin/ConEmu/
|
||||
.bin/Erunt/
|
||||
.bin/Everything/
|
||||
.bin/FastCopy/
|
||||
.bin/HWiNFO/HWiNFO*.ini
|
||||
.bin/NotepadPlusPlus/
|
||||
.bin/ProcessKiller/
|
||||
.bin/ProduKey/
|
||||
.bin/Python/
|
||||
.bin/Tmp/
|
||||
.bin/XMPlay/
|
||||
.bin/_Drivers/SDIO/
|
||||
.cbin/*.7z
|
||||
.cbin/AIDA64/
|
||||
.cbin/Autoruns/
|
||||
.cbin/BleachBit-Portable/
|
||||
.cbin/BlueScreenView/
|
||||
.cbin/Caffeine/
|
||||
.cbin/Du/
|
||||
.cbin/Everything/
|
||||
.cbin/FirefoxExtensions/
|
||||
.cbin/IObitUninstallerPortable/
|
||||
.cbin/ProduKey/
|
||||
.cbin/TestDisk/
|
||||
.cbin/TreeSizeFree-Portable/
|
||||
.cbin/XMPlay/
|
||||
.cbin/XYplorerFree/
|
||||
.cbin/_Drivers/
|
||||
.cbin/_Office/
|
||||
.cbin/_vcredists/
|
||||
.cbin/wimlib/
|
||||
BUILD*/
|
||||
OUT*/
|
||||
**/__pycache__
|
||||
**/*.7z
|
||||
**/*.DS_Store
|
||||
**/*.bak
|
||||
**/*.exe
|
||||
**/*.swp
|
||||
setup/BUILD*
|
||||
setup/OUT*
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
[InternetShortcut]
|
||||
URL=https://support.amd.com/en-us/download
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[InternetShortcut]
|
||||
URL=https://ftp.dell.com/browse_for_drivers/
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[InternetShortcut]
|
||||
URL=https://downloads.dell.com/published/Pages/index.html
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
[InternetShortcut]
|
||||
URL=http://support.dell.com/
|
||||
IDList=
|
||||
HotKey=0
|
||||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://www.majorgeeks.com/files/details/device_remover_543c.html
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=https://www.wagnardsoft.com/
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[InternetShortcut]
|
||||
URL=http://support.hp.com/us-en/drivers
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=https://www.intel.com/content/www/us/en/support/detect.html
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
[InternetShortcut]
|
||||
URL=https://www.nvidia.com/Download/index.aspx?lang=en-us
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://www.samsung.com/semiconductor/minisite/ssd/download/tools.html
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,11
|
||||
[InternetShortcut]
|
||||
URL=https://www.backblaze.com/gen/install_backblaze-af9duk
|
||||
IDList=
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
Windows Registry Editor Version 5.00
|
||||
|
||||
;Delete entries acording to http://support.microsoft.com/kb/314060
|
||||
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E965-E325-11CE-BFC1-08002BE10318}]
|
||||
"UpperFilters"=-
|
||||
"LowerFilters"=-
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://www.nirsoft.net/outlook_office_software.html
|
||||
HotKey=0
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://www.nirsoft.net/password_recovery_tools.html
|
||||
HotKey=0
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
IDList=
|
||||
URL=http://live.sysinternals.com/
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://kb.eset.com/esetkb/index?page=content&id=SOLN146
|
||||
IDList=
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://www.avg.com/us-en/utilities
|
||||
IDList=
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://files.avast.com/iavs9x/avastclear.exe
|
||||
IDList=
|
||||
HotKey=0
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://dlpro.antivir.com/package/regcleaner/win32/en/avira_registry_cleaner_en.zip
|
||||
IDList=
|
||||
HotKey=0
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://download.eset.com/special/ESETUninstaller.exe
|
||||
IDList=
|
||||
HotKey=0
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://media.kaspersky.com/utilities/ConsumerUtilities/kavremvr.exe
|
||||
IDList=
|
||||
HotKey=0
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://www.malwarebytes.org/mbam-clean.exe
|
||||
IDList=
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,2
|
||||
[InternetShortcut]
|
||||
URL=http://download.mcafee.com/products/licensed/cust_support_patches/MCPR.exe
|
||||
IDList=
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[{000214A0-0000-0000-C000-000000000046}]
|
||||
Prop3=19,1
|
||||
[InternetShortcut]
|
||||
URL=ftp://ftp.symantec.com/public/english_us_canada/removal_tools/Norton_Removal_Tool.exe
|
||||
IDList=
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
[LaunchApp]
|
||||
[LaunchApps]
|
||||
wpeinit
|
||||
wpeutil updatebootinfo
|
||||
cd /d "%SystemDrive%\.bin"
|
||||
"%SystemDrive%\.bin\ConEmu\ConEmu.exe", /cmd cmd /k cd "%SystemDrive%\.bin" & python "%SystemDrive%\.bin\Scripts\winpe_root_menu.py"
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
@echo off
|
||||
python "%SystemDrive%\.bin\Scripts\winpe_root_menu.py"
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
[CPU-Z]
|
||||
VERSION=1.7.7.0
|
||||
TextFontName=
|
||||
TextFontSize=14
|
||||
TextFontColor=000080
|
||||
LabelFontName=
|
||||
LabelFontSize=14
|
||||
ACPI=1
|
||||
PCI=1
|
||||
MaxPCIBus=256
|
||||
DMI=1
|
||||
Sensor=1
|
||||
SMBus=1
|
||||
Display=1
|
||||
UseDisplayAPI=1
|
||||
BusClock=1
|
||||
Chipset=1
|
||||
SPD=1
|
||||
XOC=0
|
||||
CheckUpdates=0
|
||||
|
|
@ -1,671 +0,0 @@
|
|||
[Benchmark_CPU]
|
||||
Intel Pentium-100=707
|
||||
Intel Pentium-120/Notebook=835
|
||||
Intel Pentium-166/QDI=1380
|
||||
Cyrix 6x86MX-PR300=1411
|
||||
AMD-K6-166/QDI=1482
|
||||
Intel Pentium MMX-200=1484
|
||||
Cyrix MII-PR333=1518
|
||||
Intel Mobile Pentium MMX-233=1642
|
||||
Intel Pentium Pro-166 Dual CPU=1679
|
||||
AMD-K6-200/DTK=1777
|
||||
AMD-K6-200/QDI=1778
|
||||
Intel Pentium Pro-200=1944
|
||||
AMD-K6-233/DTK=2067
|
||||
Intel P2-233/Siemens=2350
|
||||
VIA Cyrix III 533/133=2362
|
||||
Intel Celeron-266/BXmaster=2586
|
||||
Intel P2-266/Siemens=2603
|
||||
AMD-K6-2-300/PCChips M577=2655
|
||||
Intel Celeron 300=2883
|
||||
Intel Celeron-300/PCChips=2922
|
||||
AMD-K6-2-350/FIC=3092
|
||||
AMD-K6-III-400=3524
|
||||
AMD-K6-III-400/FIC VA-503A=3557
|
||||
Intel Celeron-366/BXmaster=3718
|
||||
Intel P2-400/Siemens=3886
|
||||
Intel Celeron-400/BXmaster=3890
|
||||
AMD-K6-2-450/FIC=3964
|
||||
AMD-K6-III-448/FIC VA-503A=3975
|
||||
AMD-K6-III-450=3978
|
||||
Intel Mobile P2-400/Scenic=4047
|
||||
Intel Celeron-413/BXmaster=4175
|
||||
Intel Celeron-433=4219
|
||||
Intel P3-450/CC820=4363
|
||||
Intel P3-450/Siemens=4372
|
||||
Intel Celeron-450=4555
|
||||
Intel Celeron-300A@467=4686
|
||||
Intel Celeron-466/BXmaster=4789
|
||||
Intel P3-500/GA-6BXDS=5021
|
||||
Intel Pentium III Xeon-550=5299
|
||||
Intel Celeron-525/BXmaster=5314
|
||||
Intel P3-550/Siemens=5543
|
||||
Intel Celeron-550/BXmaster=5579
|
||||
Intel Celeron-575/BXmaster=5845
|
||||
Intel Celeron-616/BXmaster=5999
|
||||
Intel P3-617/GA-BX2000=6241
|
||||
AMD Athlon-600/AMD-750=6303
|
||||
AMD Duron-600/KT133=6436
|
||||
Intel P3-650/BX=6497
|
||||
AMD Athlon-650/KX133=6749
|
||||
AMD Duron-650/KT133=6971
|
||||
Intel P3-700/BX=7013
|
||||
AMD Athlon-700/KX133=7185
|
||||
AMD Duron-700/KT133=7507
|
||||
Intel Celeron-815/BXmaster=7985
|
||||
AMD Athlon-750/KT133=8085
|
||||
AMD Athlon-800/AMD-750=8286
|
||||
AMD Duron-800/KT133=8580
|
||||
Intel P3-650@870/BX=8675
|
||||
AMD Duron-850/KT133=9120
|
||||
Intel P3-650@917/BX=9175
|
||||
AMD Duron-900/KT133=9654
|
||||
AMD Duron-928 (9x103)=9952
|
||||
Intel Celeron-566@1010=10115
|
||||
VIA Antaur-1000=6108
|
||||
VIA C3-1333=7601
|
||||
AMD Duron-950/KT133=10190
|
||||
AMD Athlon-1000/KT133=10734
|
||||
AMD Athlon-1200/KT133=12949
|
||||
AMD Athlon XP 1500+/KT133=14297
|
||||
AMD Athlon XP 2000+/KT133A=17691
|
||||
AMD Athlon XP 2200+/KT133A=19490
|
||||
AMD Athlon XP-M 2500+/KM400=19590
|
||||
AMD Athlon XP-M 3000+/SiS748=23391
|
||||
Intel P3-1000/i815=10381
|
||||
Intel P4-1600=6636
|
||||
Intel P4-1800=7445
|
||||
Intel P4-2000=8272
|
||||
Intel P4-2500=11051
|
||||
Intel Pentium-M ULV-1000=10515
|
||||
Intel Pentium-M-1300=13590
|
||||
Intel Pentium-M-1600=16856
|
||||
Intel Pentium-M 735=16958
|
||||
Intel Pentium-M 755=20008
|
||||
Intel Pentium-M 770=21163
|
||||
Intel P4-2800(noHT)/i875P=12399
|
||||
Intel P4-3066(noHT)/i845PE=13479
|
||||
Intel P4-3000E(noHT)/i915P=22136
|
||||
Intel P4-3000 530 (HT)=34013
|
||||
Intel P4-3200E(noHT)/i875P=23446
|
||||
Intel P4-3600E(noHT)/i925X=26424
|
||||
Intel Xeon-3800(HT)=55028
|
||||
AMD Athlon64 3200+=23814
|
||||
AMD Athlon64 3800+=28731
|
||||
AMD Athlon64 FX-53=28727
|
||||
AMD Opteron 248=25920
|
||||
AMD Turion64 ML-34+=18520
|
||||
AMD Turion64 X2 TL-60=47697
|
||||
AMD Athlon 64 X2 4400+=52867
|
||||
Intel Core Duo T2600 (1core)=20293
|
||||
Intel Core Duo T2600 (2core)=40849
|
||||
Intel Core 2 Duo E6700=51765
|
||||
Intel Core 2 Duo T7400=53238
|
||||
Transmeta Crusoe TM5800-1000=6382
|
||||
2xIntel Xeon 5150/5000P=131832
|
||||
4xIntel Xeon MP 7040=180052
|
||||
Intel Core 2 Extreme QX6700=129908
|
||||
AMD Phenom 9500=103687
|
||||
Intel Atom 230=15438
|
||||
Intel Core i5-520M=94834
|
||||
Intel Core i7-860=180329
|
||||
Intel Core i7-820QM=123279
|
||||
Intel Core i7-980X=347501
|
||||
Intel Core i5-2520M=111448
|
||||
Intel Core i7-3820=265424
|
||||
|
||||
[Benchmark_FPU]
|
||||
Intel Pentium-100=1109
|
||||
VIA Cyrix III 533/133=1327
|
||||
Intel Pentium 120/Notebook=1350
|
||||
Intel Pentium Pro-166 Dual CPU=1663
|
||||
Intel Pentium Pro-200=1934
|
||||
Cyrix 6x86MX-PR300=2304
|
||||
Intel P2-233/Siemens=2323
|
||||
AMD-K6-166/QDI=2533
|
||||
Cyrix MII-PR333=2585
|
||||
Intel Celeron-266/BXmaster=2630
|
||||
Intel Mobile Pentium MMX-233=2647
|
||||
Intel P2-266/Siemens=2662
|
||||
Intel Celeron-300=2862
|
||||
AMD-K6-200/DTK=2999
|
||||
AMD-K6-200/QDI=3041
|
||||
AMD-K6-233/DTK=3492
|
||||
Intel Celeron-366/BXmaster=3650
|
||||
Intel P2-400/Siemens=3968
|
||||
Intel Celeron-400/BXmaster=3972
|
||||
Intel Mobile P2-400/Scenic=3973
|
||||
Intel Celeron-413/BXmaster=4097
|
||||
Intel Celeron-433=4304
|
||||
Intel P3-450/CC820=4444
|
||||
Intel P3-450/Siemens=4452
|
||||
Intel Celeron-450=4472
|
||||
Intel Celeron-300A@467=4599
|
||||
AMD-K6-2-300/PCChips M577=4605
|
||||
Intel Celeron-466/BXmaster=4628
|
||||
Intel P3-500/GA-6BXDS=4958
|
||||
Intel Celeron-525/BXmaster=5215
|
||||
AMD-K6-2-350/FIC=5368
|
||||
Intel Pentium III Xeon-550=5417
|
||||
Intel P3-550/Siemens=5440
|
||||
Intel Celeron-550/BXmaster=5477
|
||||
Intel Celeron-575/BXmaster=5738
|
||||
Intel Celeron-616/BXmaster=5897
|
||||
Intel P3-617/GA-BX2000=6114
|
||||
AMD-K6-III-400/FIC VA-503A=6166
|
||||
AMD-K6-III-400=6169
|
||||
Intel P3-650/BX=6446
|
||||
AMD-K6-2-450/FIC=6876
|
||||
AMD-K6-III-448/FIC VA-503A=6893
|
||||
AMD-K6-III-450=6895
|
||||
Intel P3-700/BX=6942
|
||||
Intel Celeron-815/BXmaster=7799
|
||||
Intel P3-650@870/BX=8614
|
||||
Intel P3-650@917/BX=9080
|
||||
VIA C3-1333=3160
|
||||
AMD Duron-600/KT133=9132
|
||||
AMD Athlon-600/AMD-750=9231
|
||||
AMD Athlon-650/KX133=9888
|
||||
Intel Celeron-566@1010=9977
|
||||
AMD Athlon-700/KX133=10527
|
||||
AMD Athlon-750/KT133=11457
|
||||
AMD Athlon-800/AMD-750=12149
|
||||
AMD Duron-850/KT133=12954
|
||||
AMD Duron-900/KT133=13712
|
||||
AMD Duron-928 (9x103)=14150
|
||||
AMD Duron-950/KT133=14479
|
||||
AMD Athlon-1000/KT133=15252
|
||||
AMD Athlon-1200/KT133=18378
|
||||
AMD Athlon XP 1500+/KT133=20757
|
||||
AMD Athlon XP 1800+=23375
|
||||
AMD Athlon XP 2000+/KT133A=25693
|
||||
AMD Athlon XP 2200+/KT133A=28296
|
||||
AMD Athlon XP-M 2500+/KM400=28877
|
||||
AMD Athlon XP-M 3000+/SiS748=34104
|
||||
Intel P3-1000/i815=9813
|
||||
Intel P4-1600=3282
|
||||
Intel P4-1800=3833
|
||||
Intel P4-2000=4256
|
||||
Intel P4-2500=6020
|
||||
Intel Pentium-M ULV-1000=8547
|
||||
Intel Pentium-M-1300=11089
|
||||
Intel Pentium-M-1600=13614
|
||||
Intel Pentium-M 735=14211
|
||||
Intel Pentium-M 755=16772
|
||||
Intel Pentium-M 770=17807
|
||||
Intel P4-2800(noHT)/i875P=6799
|
||||
Intel P4-3066(noHT)/i845PE=7396
|
||||
Intel P4-3000 530 (HT)=9220
|
||||
Intel P4-3200E(noHT)/i875P=6578
|
||||
Intel P4-3600E(noHT)/i925X=8163
|
||||
Intel Xeon-3800(HT)=17241
|
||||
AMD Athlon64 3200+=31194
|
||||
AMD Athlon64 3800+=37379
|
||||
AMD Athlon64 FX-53=37426
|
||||
AMD Opteron 248=34115
|
||||
AMD Turion64 ML-34+=28056
|
||||
AMD Turion64 X2 TL-60=62143
|
||||
AMD Athlon 64 X2 4400+=68974
|
||||
Intel Core Duo T2600 (1core)=16967
|
||||
Intel Core Duo T2600 (2core)=34039
|
||||
Intel Core 2 Duo E6600=36031
|
||||
Intel Core 2 Duo E6700=40075
|
||||
Intel Core 2 Duo T7400=32659
|
||||
Transmeta Crusoe TM5800-1000=4251
|
||||
2xIntel Xeon 5150/5000P=80725
|
||||
4xIntel Xeon MP 7040=54379
|
||||
Intel Core 2 Extreme QX6700=80338
|
||||
AMD Phenom 9500=133430
|
||||
Intel Atom 230=10769
|
||||
Intel Core i5-520M=60634
|
||||
Intel Core i7-860=131820
|
||||
Intel Core i7-820QM=90751
|
||||
Intel Core i7-980X=215620
|
||||
Intel Core i5-2520M=55354
|
||||
Intel Core i7-3820=130252
|
||||
|
||||
[Benchmark_MMX]
|
||||
AMD-K6-166/QDI=909
|
||||
AMD-K6-200/QDI=1070
|
||||
Intel P2-266/440LX=1339
|
||||
VIA Cyrix III 533/133=1815
|
||||
Intel Pentium MMX-200=2041
|
||||
Intel Mobile Pentium MMX-233=2363
|
||||
Intel P2-233/440BX=2390
|
||||
Intel Celeron-300=2931
|
||||
Intel Celeron-366=3742
|
||||
Intel Celeron-450=4602
|
||||
Intel Celeron-300A@467=4737
|
||||
Intel P3-500/GA-6BXDS=5009
|
||||
AMD Duron-600/KT133=5454
|
||||
Intel P3-550/Siemens=5513
|
||||
AMD Athlon-650/KX133=5906
|
||||
AMD Athlon-700/Abit KA7=6356
|
||||
Intel P3-650/BX=6490
|
||||
AMD Duron-750/KT133=6823
|
||||
AMD Athlon-750/KT133=6846
|
||||
Intel P3-700/BX=7025
|
||||
AMD Duron-800/KT133=7277
|
||||
AMD Duron-850/KT133=7738
|
||||
AMD Duron-900/KT133=8192
|
||||
AMD Duron-928 (9x103)=8448
|
||||
AMD Duron-950/KT133=8645
|
||||
Intel P3-650@870/BX=8706
|
||||
AMD Athlon-1000/KT133=9110
|
||||
Intel P3-650@917/BX=9173
|
||||
Intel Celeron-566@1010=10080
|
||||
VIA C3-1333=6063
|
||||
AMD Athlon-1200/KT133=10998
|
||||
AMD Athlon XP 1500+/KT133=12125
|
||||
AMD Athlon XP 1800+=13642
|
||||
AMD Athlon XP 2000+/KT133A=15013
|
||||
AMD Athlon XP 2200+/KT133A=16516
|
||||
AMD Athlon XP-M 2500+/KM400=16858
|
||||
AMD Athlon XP-M 3000+/SiS748=20040
|
||||
Intel P3-1000=9903
|
||||
Intel P4-1600=14468
|
||||
Intel P4-1800=16319
|
||||
Intel P4-2000=18140
|
||||
Intel P4-2500=22681
|
||||
Intel Pentium-M ULV-1000=9937
|
||||
Intel Pentium-M-1300=12865
|
||||
Intel Pentium-M-1600=15835
|
||||
Intel Pentium-M 735=16839
|
||||
Intel Pentium-M 755=19869
|
||||
Intel Pentium-M 770=21149
|
||||
Intel P4-2800(noHT)/i875P=24478
|
||||
Intel P4-3066(noHT)/i845PE=26437
|
||||
Intel P4-3000 530 (HT)=27352
|
||||
Intel P4-3200E(noHT)/i875P=22592
|
||||
Intel P4-3600E(noHT)/i925X=25314
|
||||
Intel Xeon-3800(HT)=53268
|
||||
AMD Athlon64 3200+=18228
|
||||
AMD Athlon64 3800+=21859
|
||||
AMD Athlon64 FX-53=21856
|
||||
AMD Opteron 248=19926
|
||||
AMD Turion64 ML-34+=16403
|
||||
AMD Turion64 X2 TL-60=36363
|
||||
AMD Athlon 64 X2 4400+=40282
|
||||
Intel Core Duo T2600 (1core)=21423
|
||||
Intel Core Duo T2600 (2core)=42912
|
||||
Intel Core 2 Duo E6600=74154
|
||||
Intel Core 2 Duo E6700=82312
|
||||
Intel Core 2 Duo T7400=67321
|
||||
Transmeta Crusoe TM5800-1000=5272
|
||||
2xIntel Xeon 5150/5000P=51186
|
||||
4xIntel Xeon MP 7040=83086
|
||||
Intel Core 2 Extreme QX6700=165067
|
||||
AMD Phenom 9500=80202
|
||||
Intel Atom 230=14545
|
||||
Intel Core i5-520M=80822
|
||||
Intel Core i7-860=171336
|
||||
Intel Core i7-820QM=115063
|
||||
Intel Core i7-980X=261051
|
||||
Intel Core i5-2520M=81444
|
||||
Intel Core i7-3820=160178
|
||||
|
||||
[Benchmark_Memory]
|
||||
Intel Pentium-100/FPM=69
|
||||
Intel Pentium Pro-166 Dual CPU=78
|
||||
AMD-K6-166/QDI/EDO=85
|
||||
Intel Pentium MMX-200/EDO=92
|
||||
AMD-K6-200/QDI/EDO=93
|
||||
Intel Pentium MMX-233/PC66=101
|
||||
Intel P2-233/440BX/PC66=111
|
||||
VIA Cyrix III 533/133=114
|
||||
Intel P2-266/440BX/PC66=117
|
||||
AMD-K6-III-400=135
|
||||
Intel Celeron-366/PC66=163
|
||||
AMD Duron-600/KT133=173
|
||||
AMD Athlon-700/KX133/PC133=202
|
||||
AMD Athlon-650/KX133=205
|
||||
Intel P3-500/GA-6BXDS/PC100=209
|
||||
Intel P3-550/Siemens/PC100=215
|
||||
Intel Celeron-300A@467/PC66=209
|
||||
Intel Celeron-300/PC66=146
|
||||
Intel P3-650/BX/PC100=238
|
||||
Intel P3-700/BX/PC100=211
|
||||
AMD Athlon-750/KT133/PC133=214
|
||||
AMD Duron-750/KT133=263
|
||||
Intel Celeron-566@1010=273
|
||||
VIA C3-1333/CN400=223
|
||||
AMD Duron-950/KT133=275
|
||||
AMD Duron-928 (9x103)/KT133=292
|
||||
AMD Duron-1100/SiS745/DDR333=477
|
||||
AMD Athlon XP-M 2500+/DDR333=548
|
||||
Intel P3-650@917/FSB140=310
|
||||
Intel P3-1000/PC133=218
|
||||
Intel P4-1600/i850=1115
|
||||
Intel P4-2000/i850/PC800=1245
|
||||
Intel P4-1800/i845G/DDR266=867
|
||||
Intel P4-2500/i845/DDR266=757
|
||||
Intel Pentium-M-1600/DDR266=830
|
||||
Intel Pentium-M 735/855PM/DDR400=971
|
||||
Intel P4-3066/i845PE/DDR266=1028
|
||||
Intel P4-2800/i875P/2Ch/DDR400=2056
|
||||
Intel P4-3200E/i875P/2Ch/DDR400=2342
|
||||
Intel P4-3600E/i915P/DDR2-533=2556
|
||||
Intel P4-3600E/i925X/DDR2-533=2844
|
||||
Intel Xeon-3800/E7525/DDR2-400=1635
|
||||
AMD Athlon64 3200+/1Ch/DDR400=1266
|
||||
AMD Athlon64 3800+/2Ch/DDR400=2375
|
||||
AMD Athlon64 FX-53/2Ch/DDR400=2166
|
||||
AMD Opteron 248/DDR266=947
|
||||
AMD Turion64 ML-34+=1071
|
||||
Intel Core 2 Duo E6700/DDR2-800=2894
|
||||
Transmeta Crusoe TM5800-1000=337
|
||||
2xIntel Xeon 5150/5000P/DDR2-667F=2919
|
||||
4xIntel Xeon MP 7040=1721
|
||||
AMD Phenom 9500=1795
|
||||
Intel Atom 230/945/DDR2-800=1682
|
||||
Intel Core i5-520M=5235
|
||||
Intel Core i7-860/DDR3-667/2CH=6506
|
||||
Intel Core i7-820QM=5424
|
||||
Intel Core i7-980X=9343
|
||||
Intel Core i7-3820/DDR3-1600/4CH=13366
|
||||
|
||||
[Benchmark_Disk_ReadBurst]
|
||||
Fujitsu MPB3043ATU E/PIO=4.03
|
||||
Seagate ST38410A/PIO=4.33
|
||||
Maxtor 91021U2/PIO=4.61
|
||||
Maxtor 92041U4/PIO=4.82
|
||||
Quantum Fireball_TM2110S300X=6.83
|
||||
SEAGATE ST51080N=7.92
|
||||
Seagate ST31277A=8,37
|
||||
IBM DCAS-32160 S65A=8.65
|
||||
QUANTUM FIREBALL ST3.2A/PIO=14.74
|
||||
Seagate ST39102LW Cheetah=30.05
|
||||
IBM DJNA-370910/UDMA66=15.27
|
||||
Seagate ST34321A/UDMA33=21.03
|
||||
Seagate ST38421A=23.82
|
||||
Seagate ST34310A=23.88
|
||||
QUANTUM FIREBALL SE2.1A=26.43
|
||||
Maxtor 91021U2/UDMA33=29.13
|
||||
Maxtor 54098U8/UDMA33=29.5
|
||||
IBM DTTA-350430=29.7
|
||||
IBM-DPTA-371360=29.86
|
||||
Seagate ST320420A=47.3
|
||||
IBM-DJNA-371350=27.87
|
||||
IBM-DTLA-307030/ATA100=82.22
|
||||
SEAGATE Cheetah X15/RAID=137.08
|
||||
IBM Deskstar 60GXP/ATA100=81.98
|
||||
MAXTOR 4K020H1/ATA100=84.58
|
||||
Seagate ST317221A/UDMA66=42.03
|
||||
Maxtor 6E040L0=79.36
|
||||
Seagate ST380021A/ATA100=73.11
|
||||
HITACHI DK23EA-40=80.04
|
||||
WDC WD800JB/ATA100=85.71
|
||||
TOSHIBA MK4019GAX=83.60
|
||||
Maxtor MaxLine III SATA+NCQ=119.96
|
||||
ST312002 6AS=106.61
|
||||
Maxtor Atlas 10K5 73SCA=145.86
|
||||
WDC WD3200YS-01PGB0=167.33
|
||||
Hitachi HTE726040M9AT00=84.61
|
||||
Seagate ST3160827AS=120.88
|
||||
WDC WD5000AADS-00S9B0=122.87
|
||||
Hitachi HTS545032B9A=161.10
|
||||
Seagate ST1000DM003-9YN1=282.43
|
||||
|
||||
[Benchmark_Disk_ReadRandom]
|
||||
Hitachi HTE726040M9AT00=22.82
|
||||
Maxtor Atlas 10K5 73SCA=31.61
|
||||
Seagate ST3160827AS=32.26
|
||||
FUJITSU MHV2080BH=17.79
|
||||
TOSHIBA MK8034GSX=18.12
|
||||
ST916082 1AS=22.27
|
||||
WDC WD5000AADS-00S9B0=24.58
|
||||
Hitachi HTS545032B9A=24.72
|
||||
Seagate ST1000DM003-9YN1=37.09
|
||||
|
||||
[Benchmark_Disk_RandomAccess]
|
||||
SEAGATE ST51080N=20.96
|
||||
Quantum Fireball_TM2110S300X=20.74
|
||||
Seagate ST34321A/UDMA33=17.21
|
||||
Seagate ST38410A/PIO=17.17
|
||||
Seagate ST31277A=16.75
|
||||
Fujitsu MPB3043ATU E=16.18
|
||||
IBM DTTA-350430=16.5
|
||||
IBM DCAS-32160 S65A=15.95
|
||||
Maxtor 92041U4/PIO=15.81
|
||||
Seagate ST34310A=15.56
|
||||
Maxtor 91021U2/PIO=15.66
|
||||
Seagate ST38421A=15.71
|
||||
QUANTUM FIREBALL ST3.2A=15.50
|
||||
QUANTUM FIREBALL SE2.1A=14.94
|
||||
Maxtor 54098U8/UDMA33=13.77
|
||||
Seagate ST320420A=12.57
|
||||
IBM DJNA-370910/UDMA66=12.10
|
||||
Seagate ST39102LW Cheetah=8.78
|
||||
IBM-DPTA-371360=13.37
|
||||
IBM-DJNA-371350=13.38
|
||||
IBM-DTLA-307030/ATA100=12.44
|
||||
IBM-DTLA-307030/ATA100+AAM=22.34
|
||||
SEAGATE Cheetah X15/RAID=5.65
|
||||
IBM Deskstar 60GXP=12.70
|
||||
MAXTOR 4K020H1/ATA100=19.12
|
||||
Seagate ST317221A/UDMA66=16.60
|
||||
Maxtor 6E040L0=14.52
|
||||
Seagate ST380021A/ATA100=14.58
|
||||
HITACHI DK23EA-40=19.40
|
||||
WDC WD800JB/ATA100=13.61
|
||||
TOSHIBA MK4019GAX=18.61
|
||||
Maxtor MaxLine III SATA+NCQ=15.82
|
||||
ST312002 6AS=12.51
|
||||
Maxtor Atlas 10K5 73SCA=10.16
|
||||
WDC WD3200YS-01PGB0=13.16
|
||||
Hitachi HTE726040M9AT00=12.90
|
||||
Seagate ST3160827AS=11.65
|
||||
Seagate ST380215A=14.82
|
||||
WDC WD5000AADS-00S9B0=17.37
|
||||
Hitachi HTS545032B9A=22.16
|
||||
Seagate ST1000DM003-9YN1=15.53
|
||||
|
||||
[LogfileSettings]
|
||||
COMP=1
|
||||
COMP_SP=1
|
||||
COMP_Name=1
|
||||
COMP_Os=1
|
||||
COMP_User=0
|
||||
CPU=1
|
||||
CPU_Name=1
|
||||
CPU_ID=1
|
||||
CPU_Vendor=1
|
||||
CPU_Stepping=1
|
||||
CPU_Type=1
|
||||
CPU_BrandID=1
|
||||
CPU_PN=1
|
||||
CPU_Clock=1
|
||||
CPU_MaxFreq=1
|
||||
CPU_CacheL1=1
|
||||
CPU_CacheL2=1
|
||||
CPU_TLB_I=1
|
||||
CPU_TLB_D=1
|
||||
CPU_Features=1
|
||||
CPU_PIROM=1
|
||||
MEM=1
|
||||
MEM_TotalSize=1
|
||||
MEM_Timing=1
|
||||
MEM_Row=1
|
||||
MEM_Row_Size=1
|
||||
MEM_Row_Type=1
|
||||
MEM_Row_Speed=1
|
||||
MEM_Row_Model=1
|
||||
MEM_Row_ECC=1
|
||||
MEM_Row_Date=1
|
||||
MEM_Row_SN=1
|
||||
MEM_Row_Cfg=1
|
||||
MEM_Row_Latency=1
|
||||
MEM_Row_Features=1
|
||||
MEM_Row_iFeatures=1
|
||||
BUS=1
|
||||
BUS_PCI=1
|
||||
BUS_PCI_DevName=1
|
||||
BUS_PCI_DevNumber=1
|
||||
BUS_PCI_Resources=1
|
||||
BUS_PCI_Features=1
|
||||
BUS_PCI_DevSpecific=1
|
||||
BUS_PCIX_Features=1
|
||||
BUS_PCIe_Features=1
|
||||
BUS_PCI_DRV_INFO=1
|
||||
BUS_EISA=1
|
||||
DMI=1
|
||||
DMI_0=1
|
||||
DMI_1=1
|
||||
DMI_2=1
|
||||
DMI_3=1
|
||||
DMI_4=1
|
||||
DMI_5=1
|
||||
DMI_6=1
|
||||
DMI_7=1
|
||||
DMI_8=1
|
||||
DMI_9=1
|
||||
DMI_10=1
|
||||
DMI_11=1
|
||||
DMI_12=1
|
||||
DMI_13=1
|
||||
DMI_14=1
|
||||
DMI_15=1
|
||||
DMI_16=1
|
||||
DMI_17=1
|
||||
DMI_18=1
|
||||
DMI_19=1
|
||||
DMI_20=1
|
||||
DMI_21=1
|
||||
DMI_22=1
|
||||
DMI_23=1
|
||||
DMI_24=1
|
||||
DMI_25=1
|
||||
DMI_26=1
|
||||
DMI_27=1
|
||||
DMI_28=1
|
||||
DMI_29=1
|
||||
DMI_30=1
|
||||
DMI_31=1
|
||||
DMI_32=1
|
||||
DMI_33=1
|
||||
DMI_34=1
|
||||
DMI_35=1
|
||||
DMI_36=1
|
||||
DMI_37=1
|
||||
DMI_38=1
|
||||
DMI_39=1
|
||||
DMI_129=1
|
||||
DMI_130=1
|
||||
DMI_131=1
|
||||
VIDEO=1
|
||||
VIDEO_Chipset=1
|
||||
VIDEO_Memory=1
|
||||
VIDEO_Card=1
|
||||
VIDEO_Bus=1
|
||||
VIDEO_RAMDAC=1
|
||||
VIDEO_BIOSver=1
|
||||
VIDEO_Clock=1
|
||||
VIDEO_HWID=1
|
||||
VIDEO_DRV_INFO=1
|
||||
VIDEO_DirectX=1
|
||||
MON=1
|
||||
MON_Name=1
|
||||
MON_SN=1
|
||||
MON_Date=1
|
||||
MON_Dimensions=1
|
||||
MON_DisplayType=1
|
||||
MON_InputSignal=1
|
||||
MON_Gamma=1
|
||||
MON_DPMSinput=1
|
||||
MON_DPMSmodes=1
|
||||
MOBO=1
|
||||
MOBO_Model=1
|
||||
MOBO_Chipset=1
|
||||
MOBO_CompName=1
|
||||
MOBO_MachineType=1
|
||||
MOBO_Slots=1
|
||||
MOBO_BIOS_Manuf=1
|
||||
MOBO_BIOS_Date=1
|
||||
MOBO_PNP_Devs=1
|
||||
MOBO_PNP_Nodes=1
|
||||
MOBO_ACPI_Devs=1
|
||||
MOBO_ACPI_Enum=1
|
||||
DRIVE=1
|
||||
DRIVE_IDE=1
|
||||
DRIVE_IDE_Ctrller=1
|
||||
DRIVE_IDE_Channel=1
|
||||
DRIVE_IDE_Model=1
|
||||
DRIVE_IDE_Rev=1
|
||||
DRIVE_IDE_SN=1
|
||||
DRIVE_IDE_Capacity=1
|
||||
DRIVE_IDE_Geometry=1
|
||||
DRIVE_IDE_Cache=1
|
||||
DRIVE_IDE_Xfer=1
|
||||
DRIVE_IDE_BasicCapab=1
|
||||
DRIVE_IDE_ATA2Capab=1
|
||||
DRIVE_IDE_SMART=1
|
||||
DRIVE_SCSI=1
|
||||
DRIVE_SCSI_ID=1
|
||||
DRIVE_SCSI_Desc=1
|
||||
DRIVE_SCSI_Class=1
|
||||
DRIVE_Floppy=1
|
||||
NETWORK=1
|
||||
NETWORK_HWID=1
|
||||
NETWORK_DRV_INFO=1
|
||||
AUDIO=1
|
||||
AUDIO_DRV_INFO=1
|
||||
AUDIO_HWID=1
|
||||
PORTS=1
|
||||
BUS_USB=1
|
||||
BUS_USB_DRV_INFO=1
|
||||
BATTERY=1
|
||||
SENSORS=1
|
||||
|
||||
[Settings]
|
||||
HighestIdeAddress=0
|
||||
AcpiEnum=0
|
||||
SWSMI=1
|
||||
DebugMode=0
|
||||
SMBus=1
|
||||
TempScale=C
|
||||
AC97CodecID=1
|
||||
SkipProblematicPciDev=0
|
||||
GPUI2C=1
|
||||
LPC=1
|
||||
DefReportType=5
|
||||
TPM=0
|
||||
PCIdirect=1
|
||||
OpenSystemSummary=0
|
||||
RememberPreferences=1
|
||||
LargeFonts=0
|
||||
OpenSensors=0
|
||||
MinimalizeMainWnd=0
|
||||
MinimalizeSensors=0
|
||||
PersistentDriver=0
|
||||
UseHPET=1
|
||||
AutoUpdate=0
|
||||
GPUI2CNVAPI=1
|
||||
GPUI2CADL=0
|
||||
SensorsOnly=0
|
||||
AcpiEval=1
|
||||
CpuClkFromBusClk=1
|
||||
BusClkPolling=1
|
||||
SMBusAdrExclude=11111111111111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000
|
||||
GPUI2CBusExclude=00000000
|
||||
SensorsSM=1
|
||||
IoctlKernel=0
|
||||
SummaryOnly=0
|
||||
WakeGPUs=1
|
||||
KeepTheme=0
|
||||
FlushBuffers=1
|
||||
iMEsupport=1
|
||||
GPUI2Ccaching=1
|
||||
CSMI_SAS_Support=1
|
||||
DebugDirect=1
|
||||
MinimalizeSensorsClose=0
|
||||
WakeGPUsExt=0
|
||||
PollSleepingGPUs=0
|
||||
ShowWelcomeAndProgress=1
|
||||
EnablePchTherm=0
|
||||
ReorderGPUs=1
|
||||
NvmlSupport=1
|
||||
DecimalSeparator=.
|
||||
ThousandsSeparator=,
|
||||
CsvSeparator=,
|
||||
MinimizeGraphs=1
|
||||
TextButtons=0
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
@echo off
|
||||
|
||||
start "" %SystemDrive%\.bin\NotepadPlusPlus\notepadplusplus.exe %2 %3 %4 %5 %6 %7 %8 %9
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
[Start]
|
||||
m_lang_id=1
|
||||
QDir_Id=0
|
||||
useColorStart=1
|
||||
Als=12
|
||||
designe_mode=2
|
||||
showCmd=3
|
||||
StartCrash=0
|
||||
default_tab=
|
||||
Max=1
|
||||
show_ext_in_type=1
|
||||
title_info=1
|
||||
adresbar_style=1
|
||||
useTreeColor=1
|
||||
useColor=1
|
||||
[Favoriten]
|
||||
Ordner=.\Favoriten\
|
||||
[Q]
|
||||
Link=.\Favoriten\Quick-Link\
|
||||
[Q-Dir]
|
||||
Lizenz=1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[Vorschau]
|
||||
Filter=*.avi;*.bmp;*.gif;*.ico;*.jpeg;*.jpg;*.mp*;*.pdf;*.png;*.wm*;
|
||||
[Filter2]
|
||||
0=#Hidden=1=-1=1=1=-1=0
|
||||
1=*.zip;*.rar;*.gz;*.7z;=1=00AA00=-1=1=-1=0
|
||||
2=*.mp*;*.avi;*.wma;=1=DD0058=-1=1=-1=0
|
||||
3=#DIR=1=008800=-1=1=-1=0
|
||||
4=*.jpg;*.jpeg;*.png,*.gif;*.bmp;*.ico=1=BB00BB=-1=1=-1=0
|
||||
5=*.html;*.htm;*.url=1=456789=-1=1=-1=0
|
||||
6=*.pl;*.cgi;*.php;*.pdf;*.doc;*.rtf;*.xls=1=BB8844=-1=1=-1=0
|
||||
7=*.cpp;*.hpp;*.h=1=DD0058=-1=1=-1=0
|
||||
8=*.exe;*.dll;*.bat=1=FF0000=-1=1=-1=0
|
||||
9=*=1=0000BB=-1=1=-1=0
|
||||
10=#BG=1=-1=-1=1=-1=0
|
||||
11=#BG-A=1=-1=-1=1=-1=0
|
||||
[Ordner]
|
||||
Filter=
|
||||
[Column_OS_6.1_Ploder1]
|
||||
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
|
||||
Spatlen_291=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%2D%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%30%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%00%00%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%EE%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0E%00%00%00%69%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%91%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0C%00%00%00%46%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%00%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-563719693|772
|
||||
[Column_OS_6.1_Ploder2]
|
||||
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
|
||||
[Column_OS_6.1_Ploder3]
|
||||
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
|
||||
[Column_OS_6.1_Ploder4]
|
||||
Spatlen_::{20D04FE0-3AEA-1069-A2D8-08002B30309D}=%1C%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%F1%F1%F1%F1%14%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%D0%02%00%00%CC%02%00%00%31%53%50%53%05%D5%CD%D5%9C%2E%1B%10%93%97%08%00%2B%2C%F9%AE%83%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%46%00%4D%00%54%00%49%00%44%00%00%00%08%00%00%00%4E%00%00%00%7B%00%42%00%37%00%32%00%35%00%46%00%31%00%33%00%30%00%2D%00%34%00%37%00%45%00%46%00%2D%00%31%00%30%00%31%00%41%00%2D%00%41%00%35%00%46%00%31%00%2D%00%30%00%32%00%36%00%30%00%38%00%43%00%39%00%45%00%45%00%42%00%41%00%43%00%7D%00%00%00%00%00%33%00%00%00%22%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%44%00%69%00%72%00%65%00%63%00%74%00%69%00%6F%00%6E%00%00%00%13%00%00%00%01%00%00%00%5B%00%00%00%0A%00%00%00%00%53%00%6F%00%72%00%74%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%1C%00%00%00%01%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%01%00%00%00%25%00%00%00%14%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%56%00%69%00%65%00%77%00%00%00%0B%00%00%00%FF%FF%00%00%1B%00%00%00%0A%00%00%00%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%04%00%00%00%23%00%00%00%12%00%00%00%00%49%00%63%00%6F%00%6E%00%53%00%69%00%7A%00%65%00%00%00%13%00%00%00%10%00%00%00%BD%00%00%00%10%00%00%00%00%43%00%6F%00%6C%00%49%00%6E%00%66%00%6F%00%00%00%42%00%00%00%1E%00%00%00%70%00%72%00%6F%00%70%00%34%00%32%00%39%00%34%00%39%00%36%00%37%00%32%00%39%00%35%00%00%00%00%00%78%00%00%00%FD%DF%DF%FD%10%00%00%00%00%00%00%00%00%00%00%00%04%00%00%00%18%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%0A%00%00%00%8C%00%00%00%30%F1%25%B7%EF%47%1A%10%A5%F1%02%60%8C%9E%EB%AC%04%00%00%00%AF%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%03%00%00%00%70%00%00%00%35%4B%17%9B%FF%40%D2%11%A2%7E%00%C0%4F%C3%08%71%02%00%00%00%70%00%00%00%2F%00%00%00%1E%00%00%00%00%47%00%72%00%6F%00%75%00%70%00%42%00%79%00%4B%00%65%00%79%00%3A%00%50%00%49%00%44%00%00%00%13%00%00%00%04%00%00%00%1F%00%00%00%0E%00%00%00%00%46%00%46%00%6C%00%61%00%67%00%73%00%00%00%13%00%00%00%05%00%20%40%31%00%00%00%20%00%00%00%00%4C%00%6F%00%67%00%69%00%63%00%61%00%6C%00%56%00%69%00%65%00%77%00%4D%00%6F%00%64%00%65%00%00%00%13%00%00%00%01%00%00%00%00%00%00%00%00%00%00%00|CODEMODE1|-1905896973|772
|
||||
[Programs_State]
|
||||
Disable=0
|
||||
[Quick-Links]
|
||||
WK=%systemdrive%/WK
|
||||
[Options]
|
||||
Start=7
|
||||
[X-Size]
|
||||
mode=1
|
||||
dig=0
|
||||
fld_size=1
|
||||
ths_sep=1
|
||||
type=0
|
||||
precent=1
|
||||
ff_cnt=1
|
||||
block_no_focus=1
|
||||
nosort_fld_size=1
|
||||
6
.pre-commit-config.yaml
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
repos:
|
||||
- repo: https://github.com/charliermarsh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: 'v0.0.257'
|
||||
hooks:
|
||||
- id: ruff
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
:: Wizard Kit: Build Tool Launcher ::
|
||||
|
||||
@echo off
|
||||
|
||||
:Init
|
||||
setlocal
|
||||
title Wizard Kit: Build Tool
|
||||
call :CheckFlags %*
|
||||
|
||||
:LaunchPrep
|
||||
rem Verifies the environment before launching item
|
||||
if not exist ".bin\Scripts\build_kit.ps1" (goto ErrorBuildKitMissing)
|
||||
|
||||
:PrepNewKit
|
||||
rem Copy base files to a new folder OUT_KIT
|
||||
robocopy /e .bin OUT_KIT\.bin
|
||||
robocopy /e .cbin OUT_KIT\.cbin
|
||||
copy LICENSE.txt OUT_KIT\LICENSE.txt
|
||||
copy README.md OUT_KIT\README.md
|
||||
copy Images\ConEmu.png OUT_KIT\.bin\ConEmu\
|
||||
mkdir OUT_KIT\.cbin >nul 2>&1
|
||||
attrib +h OUT_KIT\.bin >nul 2>&1
|
||||
attrib +h OUT_KIT\.cbin >nul 2>&1
|
||||
|
||||
:Launch
|
||||
rem Calls the Launch.cmd script using the variables defined above
|
||||
set "file=OUT_KIT\.bin\Scripts\build_kit.ps1"
|
||||
powershell -executionpolicy bypass -noprofile -file %file% || goto ErrorUnknown
|
||||
goto Exit
|
||||
|
||||
:: Functions ::
|
||||
:CheckFlags
|
||||
rem Loops through all arguments to check for accepted flags
|
||||
set DEBUG=
|
||||
for %%f in (%*) do (
|
||||
if /i "%%f" == "/DEBUG" (@echo on & set "DEBUG=/DEBUG")
|
||||
)
|
||||
@exit /b 0
|
||||
|
||||
:: Errors ::
|
||||
:ErrorBuildKitMissing
|
||||
echo.
|
||||
echo ERROR: build_kit.ps1 script not found.
|
||||
goto Abort
|
||||
|
||||
:ErrorUnknown
|
||||
echo.
|
||||
echo ERROR: Encountered an unknown error.
|
||||
goto Abort
|
||||
|
||||
:Abort
|
||||
color 4e
|
||||
echo Aborted.
|
||||
echo.
|
||||
echo Press any key to exit...
|
||||
pause>nul
|
||||
color
|
||||
rem Set errorlevel to 1 by calling color incorrectly
|
||||
color 00
|
||||
goto Exit
|
||||
|
||||
:: Cleanup and exit ::
|
||||
:Exit
|
||||
endlocal
|
||||
exit /b %errorlevel%
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
Copyright (c) 2017 Alan Mason
|
||||
Copyright (c) 2023 Alan Mason
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
|
|
|||
100
README.md
|
|
@ -1,61 +1,39 @@
|
|||
# Wizard Kit #
|
||||
|
||||
A collection of scripts to help technicians service Windows systems.
|
||||
|
||||
## Main Kit ##
|
||||
|
||||
### Build Requirements ###
|
||||
|
||||
* PowerShell 3.0 or newer<sup>1</sup>
|
||||
* 6 Gb disk space
|
||||
|
||||
### Initial Setup ###
|
||||
|
||||
* Replace artwork as desired
|
||||
* Run `Build Kit.cmd` which will do the following:
|
||||
* Download 7-Zip, ConEmu, Notepad++, and Python (including wheel packages)
|
||||
* Open `.bin\Scripts\settings\main.py` in Notepad++ for configuration
|
||||
* Update the rest of the tools with the `.bin\Scripts\update_kit.py` script
|
||||
|
||||
### Layout ###
|
||||
|
||||
* Root
|
||||
* Main script launchers:
|
||||
* `.bin`
|
||||
* Extracted programs: As compressed tools are run they will be extracted here.
|
||||
* `Scripts`
|
||||
* "Real" scripts live here and are run via their respective launchers.
|
||||
* `.cbin`
|
||||
* This folder holds the compressed and encrypted tool archives.
|
||||
* They are extracted at runtime as needed.
|
||||
* `Data Recovery`
|
||||
* This folder is not copied by `Copy WizardKit.cmd` to help discourage
|
||||
* recovering data to the same drive.
|
||||
* `Data Transfers`
|
||||
* `Diagnostics`
|
||||
* `Drivers`
|
||||
* `Installers`
|
||||
* `Misc`
|
||||
* `Repairs`
|
||||
* `Uninstallers`
|
||||
|
||||
## Windows PE ##
|
||||
|
||||
### Build Requirements ###
|
||||
|
||||
* Windows Assessment and Deployment Kit for Windows 10
|
||||
* PowerShell 3.0 or newer<sup>1</sup>
|
||||
* 2 Gb disk space
|
||||
|
||||
### Initial Setup ###
|
||||
|
||||
* (If not done above)
|
||||
* Replace artwork as desired
|
||||
* Edit `.bin\Scripts\settings\main.py`
|
||||
* Run `Build PE.cmd` which will do the following:
|
||||
* Load the WADK environment
|
||||
* Download all tools
|
||||
* Build both 32-bit & 64-bit PE images (exported as ISO files)
|
||||
|
||||
#### Notes ####
|
||||
1. PowerShell 6.0 on Windows 7 is not supported by the build script.
|
||||
# WizardKit #
|
||||
|
||||
A collection of tools to help technicians service computers.
|
||||
|
||||
## Overview ##
|
||||
|
||||
There are a few main parts to this project and their uses:
|
||||
|
||||
* Live Linux image
|
||||
* Hardware diagnostics
|
||||
* CPU stress tests with temperature monitoring
|
||||
* Health checks/tests for storage drives
|
||||
* Misc other diagnostics
|
||||
* Data recovery
|
||||
* General data transfers from many possible filesystems
|
||||
* Bit-level drive duplication based on ddrescue
|
||||
* Live macOS image
|
||||
* Hardware diagnostics
|
||||
* CPU stress tests with temperature monitoring
|
||||
* Health checks/tests for storage drives
|
||||
* Data recovery
|
||||
* _(Currently under development)_
|
||||
* Live WinPE image
|
||||
* _(Currently under development)_
|
||||
* Windows Kit _(intended for UFDs)_
|
||||
* Automated repairs
|
||||
* AV scans
|
||||
* Windows health checks
|
||||
* Automated setup
|
||||
* Install software
|
||||
* System configuration
|
||||
|
||||
## Combined UFD ##
|
||||
|
||||
All parts can be combined onto a single UFD!
|
||||
|
||||
* Compatible with most legacy and UEFI bootloaders
|
||||
* Custom boot menus
|
||||
* To get started run `build-ufd` under the live Linux image
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 113 KiB |
BIN
images/Linux.png
Normal file
|
After Width: | Height: | Size: 110 KiB |
BIN
images/Pxelinux.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
images/Syslinux.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 168 KiB |
BIN
images/WizardHat.xcf
Normal file
122
images/logo.svg
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="32"
|
||||
height="32"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r"
|
||||
sodipodi:docname="logo.svg"
|
||||
inkscape:export-filename="/home/thewizardpp/projects/logos/logo512x512.png"
|
||||
inkscape:export-xdpi="1440"
|
||||
inkscape:export-ydpi="1440">
|
||||
<defs
|
||||
id="defs4">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 526.18109 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="744.09448 : 526.18109 : 1"
|
||||
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
|
||||
id="perspective10" />
|
||||
<filter
|
||||
id="filter3668"
|
||||
inkscape:label="Drop shadow"
|
||||
width="1.5"
|
||||
height="1.5"
|
||||
x="-.25"
|
||||
y="-.25">
|
||||
<feGaussianBlur
|
||||
id="feGaussianBlur3670"
|
||||
in="SourceAlpha"
|
||||
stdDeviation="1,000000"
|
||||
result="blur" />
|
||||
<feColorMatrix
|
||||
id="feColorMatrix3672"
|
||||
result="bluralpha"
|
||||
type="matrix"
|
||||
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0,500000 0 " />
|
||||
<feOffset
|
||||
id="feOffset3674"
|
||||
in="bluralpha"
|
||||
dx="1,000000"
|
||||
dy="1,000000"
|
||||
result="offsetBlur" />
|
||||
<feMerge
|
||||
id="feMerge3676">
|
||||
<feMergeNode
|
||||
id="feMergeNode3678"
|
||||
in="offsetBlur" />
|
||||
<feMergeNode
|
||||
id="feMergeNode3680"
|
||||
in="SourceGraphic" />
|
||||
</feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="15.839192"
|
||||
inkscape:cx="16.469461"
|
||||
inkscape:cy="15.775995"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer2"
|
||||
showgrid="false"
|
||||
inkscape:window-width="1152"
|
||||
inkscape:window-height="844"
|
||||
inkscape:window-x="-2"
|
||||
inkscape:window-y="93"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer2"
|
||||
inkscape:label="Layer"
|
||||
style="display:inline">
|
||||
<g
|
||||
id="g3613"
|
||||
transform="matrix(1.0696952,0,0,1.0696952,-1.9682871,1.2767394)">
|
||||
<path
|
||||
sodipodi:nodetypes="cssssss"
|
||||
d="m 28.466519,15.480445 c -1.690444,-0.411311 -3.880242,0.0024 -6.862802,1.703057 -4.343818,2.477 -5.647804,4.7124 -10.531132,6.5262 -2.7416801,1.0184 -7.1725478,1.2727 -6.7296333,-1.9563 0.4055207,-2.9564 4.8746766,-5.683963 10.7473903,-5.268022 7.253753,0.513753 7.780294,2.643843 11.236758,2.445771 4.073631,-0.233438 3.02577,-3.235043 2.139419,-3.450706 z"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
id="path2822"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccscsc"
|
||||
id="path2832"
|
||||
d="m 22.349625,16.595174 c -5.498466,2.959917 -4.603518,5.10607 -10.999048,3.821601 1.40216,-4.418086 4.962036,-16.95097 7.147841,-17.2692571 1.878431,-0.2735287 4.924495,4.2931483 4.924495,4.2931483 0,0 -3.661803,-2.9673231 -4.16688,-1.7046325 -0.593183,1.4829546 2.39459,8.4145833 3.093592,10.8591403 z"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccc"
|
||||
id="path3611"
|
||||
d="m 22.074942,15.74979 c 1.515307,-0.313608 1.831341,-0.3546 3.377477,-0.485523 1.799175,-0.173029 3.187957,0.237433 3.187957,0.237433"
|
||||
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.4 KiB |
BIN
images/macOS.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
BIN
images/rEFInd.png
Normal file
|
After Width: | Height: | Size: 98 KiB |