puppet 6.17.0-x64-mingw32 → 7.1.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (622) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +3 -4
  4. data/Gemfile.lock +32 -30
  5. data/README.md +2 -3
  6. data/Rakefile +4 -12
  7. data/conf/fileserver.conf +5 -10
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/osx/file_mapping.yaml +0 -5
  10. data/ext/project_data.yaml +2 -14
  11. data/ext/redhat/puppet.spec.erb +0 -1
  12. data/ext/windows/service/daemon.rb +6 -5
  13. data/install.rb +21 -17
  14. data/lib/puppet.rb +11 -20
  15. data/lib/puppet/agent/locker.rb +0 -7
  16. data/lib/puppet/application.rb +172 -98
  17. data/lib/puppet/application/agent.rb +8 -3
  18. data/lib/puppet/application/apply.rb +18 -20
  19. data/lib/puppet/application/device.rb +100 -104
  20. data/lib/puppet/application/doc.rb +1 -1
  21. data/lib/puppet/application/filebucket.rb +15 -11
  22. data/lib/puppet/application/lookup.rb +16 -4
  23. data/lib/puppet/application/ssl.rb +1 -1
  24. data/lib/puppet/application_support.rb +7 -0
  25. data/lib/puppet/configurer.rb +46 -19
  26. data/lib/puppet/configurer/downloader.rb +31 -10
  27. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  28. data/lib/puppet/confine.rb +1 -1
  29. data/lib/puppet/confine/any.rb +1 -1
  30. data/lib/puppet/defaults.rb +116 -162
  31. data/lib/puppet/environments.rb +72 -62
  32. data/lib/puppet/face/catalog.rb +1 -1
  33. data/lib/puppet/face/config.rb +56 -16
  34. data/lib/puppet/face/epp.rb +12 -2
  35. data/lib/puppet/face/facts.rb +66 -6
  36. data/lib/puppet/face/help.rb +1 -1
  37. data/lib/puppet/face/node.rb +3 -3
  38. data/lib/puppet/face/node/clean.rb +10 -2
  39. data/lib/puppet/face/plugin.rb +5 -8
  40. data/lib/puppet/feature/base.rb +1 -1
  41. data/lib/puppet/ffi/posix.rb +10 -0
  42. data/lib/puppet/ffi/posix/constants.rb +14 -0
  43. data/lib/puppet/ffi/posix/functions.rb +24 -0
  44. data/lib/puppet/ffi/windows.rb +12 -0
  45. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  46. data/lib/puppet/ffi/windows/constants.rb +404 -0
  47. data/lib/puppet/ffi/windows/functions.rb +628 -0
  48. data/lib/puppet/ffi/windows/structs.rb +338 -0
  49. data/lib/puppet/file_bucket/dipper.rb +1 -1
  50. data/lib/puppet/file_serving/configuration.rb +0 -5
  51. data/lib/puppet/file_serving/configuration/parser.rb +3 -32
  52. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  53. data/lib/puppet/file_serving/mount.rb +1 -2
  54. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  55. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  56. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  57. data/lib/puppet/file_system/file_impl.rb +3 -3
  58. data/lib/puppet/forge/repository.rb +0 -1
  59. data/lib/puppet/functions/epp.rb +1 -0
  60. data/lib/puppet/functions/inline_epp.rb +1 -0
  61. data/lib/puppet/functions/lstrip.rb +4 -4
  62. data/lib/puppet/functions/new.rb +8 -3
  63. data/lib/puppet/functions/reverse_each.rb +1 -1
  64. data/lib/puppet/functions/rstrip.rb +4 -4
  65. data/lib/puppet/functions/step.rb +1 -1
  66. data/lib/puppet/functions/strip.rb +4 -4
  67. data/lib/puppet/generate/models/type/type.rb +4 -1
  68. data/lib/puppet/gettext/config.rb +5 -5
  69. data/lib/puppet/gettext/module_translations.rb +4 -4
  70. data/lib/puppet/http.rb +23 -13
  71. data/lib/puppet/http/client.rb +165 -115
  72. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  73. data/lib/puppet/http/errors.rb +16 -0
  74. data/lib/puppet/http/external_client.rb +5 -7
  75. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  76. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  77. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  78. data/lib/puppet/http/proxy.rb +137 -0
  79. data/lib/puppet/http/redirector.rb +4 -12
  80. data/lib/puppet/http/resolver.rb +10 -23
  81. data/lib/puppet/http/resolver/server_list.rb +23 -45
  82. data/lib/puppet/http/resolver/settings.rb +7 -10
  83. data/lib/puppet/http/resolver/srv.rb +11 -15
  84. data/lib/puppet/http/response.rb +36 -54
  85. data/lib/puppet/http/response_converter.rb +24 -0
  86. data/lib/puppet/http/response_net_http.rb +42 -0
  87. data/lib/puppet/http/retry_after_handler.rb +4 -13
  88. data/lib/puppet/http/service.rb +15 -27
  89. data/lib/puppet/http/service/ca.rb +11 -22
  90. data/lib/puppet/http/service/compiler.rb +23 -70
  91. data/lib/puppet/http/service/file_server.rb +19 -28
  92. data/lib/puppet/http/service/puppetserver.rb +53 -0
  93. data/lib/puppet/http/service/report.rb +8 -10
  94. data/lib/puppet/http/session.rb +16 -24
  95. data/lib/puppet/{network/http → http}/site.rb +1 -2
  96. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  97. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  98. data/lib/puppet/indirector/exec.rb +1 -1
  99. data/lib/puppet/indirector/fact_search.rb +60 -0
  100. data/lib/puppet/indirector/facts/facter.rb +27 -6
  101. data/lib/puppet/indirector/facts/json.rb +27 -0
  102. data/lib/puppet/indirector/facts/rest.rb +3 -22
  103. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  104. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  105. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  106. data/lib/puppet/indirector/file_metadata/http.rb +1 -0
  107. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  108. data/lib/puppet/indirector/file_server.rb +1 -8
  109. data/lib/puppet/indirector/generic_http.rb +0 -11
  110. data/lib/puppet/indirector/hiera.rb +4 -0
  111. data/lib/puppet/indirector/indirection.rb +1 -1
  112. data/lib/puppet/indirector/json.rb +5 -1
  113. data/lib/puppet/indirector/msgpack.rb +1 -1
  114. data/lib/puppet/indirector/node/json.rb +8 -0
  115. data/lib/puppet/indirector/node/rest.rb +2 -4
  116. data/lib/puppet/indirector/report/json.rb +34 -0
  117. data/lib/puppet/indirector/report/processor.rb +2 -2
  118. data/lib/puppet/indirector/report/rest.rb +3 -8
  119. data/lib/puppet/indirector/request.rb +1 -102
  120. data/lib/puppet/indirector/rest.rb +12 -263
  121. data/lib/puppet/indirector/yaml.rb +1 -1
  122. data/lib/puppet/module.rb +1 -2
  123. data/lib/puppet/module_tool/applications.rb +0 -1
  124. data/lib/puppet/network/authconfig.rb +2 -96
  125. data/lib/puppet/network/authorization.rb +13 -35
  126. data/lib/puppet/network/format_support.rb +2 -2
  127. data/lib/puppet/network/formats.rb +2 -1
  128. data/lib/puppet/network/http.rb +3 -3
  129. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  130. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  131. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  132. data/lib/puppet/network/http/connection.rb +247 -316
  133. data/lib/puppet/network/http/handler.rb +0 -1
  134. data/lib/puppet/network/http/route.rb +2 -2
  135. data/lib/puppet/network/http_pool.rb +16 -34
  136. data/lib/puppet/node.rb +1 -30
  137. data/lib/puppet/node/environment.rb +12 -5
  138. data/lib/puppet/node/facts.rb +17 -0
  139. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  140. data/lib/puppet/pal/pal_impl.rb +93 -14
  141. data/lib/puppet/parameter.rb +1 -1
  142. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  143. data/lib/puppet/parser/compiler.rb +0 -198
  144. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  145. data/lib/puppet/parser/functions.rb +21 -17
  146. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  147. data/lib/puppet/parser/resource.rb +0 -69
  148. data/lib/puppet/parser/templatewrapper.rb +1 -1
  149. data/lib/puppet/parser/type_loader.rb +2 -2
  150. data/lib/puppet/pops/adaptable.rb +7 -13
  151. data/lib/puppet/pops/adapters.rb +8 -4
  152. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  153. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -8
  154. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  155. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  156. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  157. data/lib/puppet/pops/issues.rb +0 -5
  158. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  159. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  160. data/lib/puppet/pops/loaders.rb +18 -11
  161. data/lib/puppet/pops/lookup/context.rb +1 -1
  162. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  163. data/lib/puppet/pops/model/ast.pp +0 -42
  164. data/lib/puppet/pops/model/ast.rb +0 -290
  165. data/lib/puppet/pops/model/factory.rb +0 -45
  166. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  167. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  168. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  169. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  170. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  171. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  172. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  173. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  174. data/lib/puppet/pops/types/iterable.rb +34 -8
  175. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  176. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  177. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  178. data/lib/puppet/pops/types/type_parser.rb +0 -4
  179. data/lib/puppet/pops/types/types.rb +0 -1
  180. data/lib/puppet/pops/validation/checker4_0.rb +28 -52
  181. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  182. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  183. data/lib/puppet/provider.rb +0 -13
  184. data/lib/puppet/provider/file/windows.rb +1 -1
  185. data/lib/puppet/provider/nameservice.rb +0 -18
  186. data/lib/puppet/provider/package/apt.rb +34 -0
  187. data/lib/puppet/provider/package/dpkg.rb +1 -11
  188. data/lib/puppet/provider/package/gem.rb +27 -5
  189. data/lib/puppet/provider/package/pip.rb +0 -1
  190. data/lib/puppet/provider/package/pip2.rb +17 -0
  191. data/lib/puppet/provider/package/pkg.rb +0 -4
  192. data/lib/puppet/provider/package/portage.rb +1 -1
  193. data/lib/puppet/provider/package/puppet_gem.rb +6 -4
  194. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  195. data/lib/puppet/provider/package/yum.rb +1 -0
  196. data/lib/puppet/provider/package/zypper.rb +3 -0
  197. data/lib/puppet/provider/service/smf.rb +191 -73
  198. data/lib/puppet/provider/user/aix.rb +3 -3
  199. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  200. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  201. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  202. data/lib/puppet/reference/configuration.rb +2 -0
  203. data/lib/puppet/reference/indirection.rb +1 -1
  204. data/lib/puppet/resource.rb +1 -89
  205. data/lib/puppet/resource/catalog.rb +1 -14
  206. data/lib/puppet/resource/type.rb +5 -120
  207. data/lib/puppet/resource/type_collection.rb +3 -48
  208. data/lib/puppet/runtime.rb +1 -2
  209. data/lib/puppet/settings.rb +84 -35
  210. data/lib/puppet/settings/base_setting.rb +26 -2
  211. data/lib/puppet/settings/integer_setting.rb +17 -0
  212. data/lib/puppet/settings/port_setting.rb +15 -0
  213. data/lib/puppet/settings/priority_setting.rb +5 -4
  214. data/lib/puppet/ssl.rb +10 -6
  215. data/lib/puppet/ssl/base.rb +3 -5
  216. data/lib/puppet/ssl/certificate.rb +0 -6
  217. data/lib/puppet/ssl/certificate_request.rb +1 -12
  218. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  219. data/lib/puppet/ssl/oids.rb +3 -1
  220. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  221. data/lib/puppet/ssl/state_machine.rb +3 -1
  222. data/lib/puppet/ssl/verifier.rb +2 -0
  223. data/lib/puppet/test/test_helper.rb +11 -6
  224. data/lib/puppet/transaction.rb +3 -9
  225. data/lib/puppet/transaction/persistence.rb +1 -1
  226. data/lib/puppet/transaction/report.rb +10 -8
  227. data/lib/puppet/trusted_external.rb +2 -2
  228. data/lib/puppet/type.rb +4 -79
  229. data/lib/puppet/type/file.rb +7 -9
  230. data/lib/puppet/type/file/checksum.rb +1 -1
  231. data/lib/puppet/type/file/source.rb +29 -9
  232. data/lib/puppet/type/filebucket.rb +4 -4
  233. data/lib/puppet/type/notify.rb +2 -2
  234. data/lib/puppet/type/package.rb +5 -13
  235. data/lib/puppet/type/service.rb +4 -0
  236. data/lib/puppet/type/user.rb +19 -4
  237. data/lib/puppet/util.rb +26 -12
  238. data/lib/puppet/util/autoload.rb +9 -7
  239. data/lib/puppet/util/character_encoding.rb +9 -5
  240. data/lib/puppet/util/execution.rb +2 -13
  241. data/lib/puppet/util/http_proxy.rb +2 -215
  242. data/lib/puppet/util/monkey_patches.rb +0 -46
  243. data/lib/puppet/util/posix.rb +53 -4
  244. data/lib/puppet/util/rdoc.rb +0 -7
  245. data/lib/puppet/util/retry_action.rb +1 -1
  246. data/lib/puppet/util/rubygems.rb +5 -1
  247. data/lib/puppet/util/run_mode.rb +14 -2
  248. data/lib/puppet/util/windows.rb +3 -7
  249. data/lib/puppet/util/windows/daemon.rb +360 -0
  250. data/lib/puppet/util/windows/error.rb +1 -0
  251. data/lib/puppet/util/windows/eventlog.rb +4 -9
  252. data/lib/puppet/util/windows/file.rb +8 -242
  253. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  254. data/lib/puppet/util/windows/process.rb +4 -226
  255. data/lib/puppet/util/windows/security.rb +4 -4
  256. data/lib/puppet/util/windows/service.rb +9 -460
  257. data/lib/puppet/util/windows/string.rb +12 -13
  258. data/lib/puppet/util/windows/user.rb +219 -0
  259. data/lib/puppet/util/yaml.rb +0 -22
  260. data/lib/puppet/vendor/require_vendored.rb +0 -1
  261. data/lib/puppet/version.rb +1 -1
  262. data/lib/puppet/x509.rb +5 -1
  263. data/lib/puppet/x509/cert_provider.rb +29 -1
  264. data/locales/puppet.pot +656 -1351
  265. data/man/man5/puppet.conf.5 +72 -97
  266. data/man/man8/puppet-agent.8 +6 -3
  267. data/man/man8/puppet-apply.8 +1 -1
  268. data/man/man8/puppet-catalog.8 +1 -1
  269. data/man/man8/puppet-config.8 +6 -6
  270. data/man/man8/puppet-describe.8 +1 -1
  271. data/man/man8/puppet-device.8 +1 -1
  272. data/man/man8/puppet-doc.8 +1 -1
  273. data/man/man8/puppet-epp.8 +1 -1
  274. data/man/man8/puppet-facts.8 +55 -9
  275. data/man/man8/puppet-filebucket.8 +6 -6
  276. data/man/man8/puppet-generate.8 +1 -1
  277. data/man/man8/puppet-help.8 +1 -1
  278. data/man/man8/puppet-lookup.8 +2 -2
  279. data/man/man8/puppet-module.8 +1 -58
  280. data/man/man8/puppet-node.8 +7 -4
  281. data/man/man8/puppet-parser.8 +1 -1
  282. data/man/man8/puppet-plugin.8 +1 -1
  283. data/man/man8/puppet-report.8 +4 -1
  284. data/man/man8/puppet-resource.8 +1 -1
  285. data/man/man8/puppet-script.8 +1 -1
  286. data/man/man8/puppet-ssl.8 +1 -1
  287. data/man/man8/puppet.8 +2 -2
  288. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  289. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  290. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  291. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  292. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  293. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  294. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  295. data/spec/integration/application/agent_spec.rb +70 -61
  296. data/spec/integration/application/apply_spec.rb +150 -150
  297. data/spec/integration/application/doc_spec.rb +16 -6
  298. data/spec/integration/application/filebucket_spec.rb +78 -29
  299. data/spec/integration/application/help_spec.rb +44 -0
  300. data/spec/integration/application/lookup_spec.rb +13 -0
  301. data/spec/integration/application/module_spec.rb +68 -0
  302. data/spec/integration/application/plugin_spec.rb +76 -4
  303. data/spec/integration/configurer_spec.rb +14 -0
  304. data/spec/integration/data_binding_spec.rb +82 -0
  305. data/spec/integration/defaults_spec.rb +32 -3
  306. data/spec/integration/directory_environments_spec.rb +17 -17
  307. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  308. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  309. data/spec/integration/network/http_pool_spec.rb +3 -21
  310. data/spec/integration/node/environment_spec.rb +1 -1
  311. data/spec/integration/parser/catalog_spec.rb +0 -38
  312. data/spec/integration/parser/node_spec.rb +0 -9
  313. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  314. data/spec/integration/type/file_spec.rb +5 -4
  315. data/spec/integration/util/execution_spec.rb +22 -0
  316. data/spec/integration/util/windows/adsi_spec.rb +2 -2
  317. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  318. data/spec/integration/util/windows/process_spec.rb +26 -32
  319. data/spec/integration/util/windows/security_spec.rb +1 -1
  320. data/spec/integration/util/windows/user_spec.rb +7 -0
  321. data/spec/integration/util_spec.rb +7 -33
  322. data/spec/lib/puppet_spec/matchers.rb +0 -80
  323. data/spec/lib/puppet_spec/puppetserver.rb +9 -1
  324. data/spec/lib/puppet_spec/settings.rb +7 -1
  325. data/spec/shared_contexts/types_setup.rb +2 -0
  326. data/spec/spec_helper.rb +2 -0
  327. data/spec/unit/agent_spec.rb +0 -2
  328. data/spec/unit/application/agent_spec.rb +3 -4
  329. data/spec/unit/application/config_spec.rb +224 -4
  330. data/spec/unit/application/doc_spec.rb +2 -2
  331. data/spec/unit/application/face_base_spec.rb +6 -4
  332. data/spec/unit/application/facts_spec.rb +74 -8
  333. data/spec/unit/application/filebucket_spec.rb +41 -39
  334. data/spec/unit/application/resource_spec.rb +3 -1
  335. data/spec/unit/application/ssl_spec.rb +17 -4
  336. data/spec/unit/application_spec.rb +43 -4
  337. data/spec/unit/certificate_factory_spec.rb +1 -1
  338. data/spec/unit/configurer/downloader_spec.rb +14 -0
  339. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  340. data/spec/unit/configurer_spec.rb +96 -44
  341. data/spec/unit/confine_spec.rb +2 -1
  342. data/spec/unit/context/trusted_information_spec.rb +2 -6
  343. data/spec/unit/defaults_spec.rb +26 -32
  344. data/spec/unit/environments_spec.rb +173 -32
  345. data/spec/unit/face/config_spec.rb +65 -12
  346. data/spec/unit/face/facts_spec.rb +4 -0
  347. data/spec/unit/face/node_spec.rb +16 -4
  348. data/spec/unit/face/plugin_spec.rb +73 -33
  349. data/spec/unit/file_bucket/file_spec.rb +1 -1
  350. data/spec/unit/file_serving/configuration/parser_spec.rb +14 -18
  351. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  352. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  353. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  354. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  355. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  356. data/spec/unit/file_system_spec.rb +1 -2
  357. data/spec/unit/functions/camelcase_spec.rb +1 -1
  358. data/spec/unit/functions/capitalize_spec.rb +1 -1
  359. data/spec/unit/functions/downcase_spec.rb +1 -1
  360. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  361. data/spec/unit/functions/upcase_spec.rb +1 -1
  362. data/spec/unit/http/client_spec.rb +7 -9
  363. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  364. data/spec/unit/http/external_client_spec.rb +4 -4
  365. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  366. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  367. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  368. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  369. data/spec/unit/http/resolver_spec.rb +34 -15
  370. data/spec/unit/http/service/ca_spec.rb +2 -3
  371. data/spec/unit/http/service/compiler_spec.rb +51 -65
  372. data/spec/unit/http/service/file_server_spec.rb +5 -6
  373. data/spec/unit/http/service/puppetserver_spec.rb +112 -0
  374. data/spec/unit/http/service/report_spec.rb +2 -3
  375. data/spec/unit/http/service_spec.rb +1 -3
  376. data/spec/unit/http/session_spec.rb +24 -35
  377. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  378. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  379. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  380. data/spec/unit/indirector/facts/facter_spec.rb +97 -0
  381. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  382. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  383. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  384. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  385. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  386. data/spec/unit/indirector/file_server_spec.rb +1 -15
  387. data/spec/unit/indirector/json_spec.rb +8 -8
  388. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  389. data/spec/unit/indirector/node/json_spec.rb +33 -0
  390. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  391. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  392. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  393. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  394. data/spec/unit/indirector/request_spec.rb +2 -266
  395. data/spec/unit/indirector/rest_spec.rb +98 -752
  396. data/spec/unit/indirector/yaml_spec.rb +7 -7
  397. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  398. data/spec/unit/network/authconfig_spec.rb +2 -132
  399. data/spec/unit/network/authorization_spec.rb +2 -55
  400. data/spec/unit/network/format_support_spec.rb +3 -2
  401. data/spec/unit/network/formats_spec.rb +4 -4
  402. data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -97
  403. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  404. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  405. data/spec/unit/network/http/api_spec.rb +10 -0
  406. data/spec/unit/network/http/connection_spec.rb +19 -41
  407. data/spec/unit/network/http/handler_spec.rb +0 -6
  408. data/spec/unit/network/http_pool_spec.rb +0 -4
  409. data/spec/unit/node/environment_spec.rb +51 -22
  410. data/spec/unit/node_spec.rb +2 -54
  411. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  412. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  413. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  414. data/spec/unit/pops/loaders/loaders_spec.rb +76 -21
  415. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  416. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  417. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  418. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  419. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  420. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  421. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  422. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  423. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  424. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  425. data/spec/unit/pops/visitor_spec.rb +1 -1
  426. data/spec/unit/provider/exec_spec.rb +4 -3
  427. data/spec/unit/provider/nameservice_spec.rb +0 -57
  428. data/spec/unit/provider/package/apt_spec.rb +77 -0
  429. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  430. data/spec/unit/provider/package/dpkg_spec.rb +22 -55
  431. data/spec/unit/provider/package/gem_spec.rb +32 -0
  432. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  433. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  434. data/spec/unit/provider/package/puppet_gem_spec.rb +6 -2
  435. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  436. data/spec/unit/provider/package/yum_spec.rb +31 -0
  437. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  438. data/spec/unit/provider/service/base_spec.rb +2 -4
  439. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  440. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  441. data/spec/unit/provider/service/debian_spec.rb +3 -5
  442. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  443. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  444. data/spec/unit/provider/service/init_spec.rb +45 -5
  445. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  446. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  447. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  448. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  449. data/spec/unit/provider/service/runit_spec.rb +2 -1
  450. data/spec/unit/provider/service/smf_spec.rb +402 -166
  451. data/spec/unit/provider/service/src_spec.rb +3 -5
  452. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  453. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  454. data/spec/unit/provider/service/windows_spec.rb +28 -1
  455. data/spec/unit/provider/user/aix_spec.rb +5 -0
  456. data/spec/unit/provider/user/pw_spec.rb +2 -0
  457. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  458. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  459. data/spec/unit/provider_spec.rb +0 -12
  460. data/spec/unit/puppet_pal_2pec.rb +40 -0
  461. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  462. data/spec/unit/reports/store_spec.rb +17 -13
  463. data/spec/unit/resource/type_collection_spec.rb +2 -22
  464. data/spec/unit/resource_spec.rb +0 -56
  465. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  466. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  467. data/spec/unit/settings/port_setting_spec.rb +31 -0
  468. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  469. data/spec/unit/settings_spec.rb +586 -239
  470. data/spec/unit/ssl/base_spec.rb +36 -3
  471. data/spec/unit/ssl/certificate_request_spec.rb +15 -45
  472. data/spec/unit/ssl/certificate_spec.rb +2 -11
  473. data/spec/unit/ssl/ssl_provider_spec.rb +11 -8
  474. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  475. data/spec/unit/ssl/verifier_spec.rb +0 -21
  476. data/spec/unit/transaction/persistence_spec.rb +15 -0
  477. data/spec/unit/transaction/report_spec.rb +2 -2
  478. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  479. data/spec/unit/transaction_spec.rb +45 -79
  480. data/spec/unit/type/file/checksum_spec.rb +6 -6
  481. data/spec/unit/type/file/content_spec.rb +1 -1
  482. data/spec/unit/type/file/ensure_spec.rb +1 -1
  483. data/spec/unit/type/file/mode_spec.rb +1 -1
  484. data/spec/unit/type/file/source_spec.rb +1 -2
  485. data/spec/unit/type/file_spec.rb +12 -6
  486. data/spec/unit/type/filebucket_spec.rb +1 -1
  487. data/spec/unit/type/package_spec.rb +1 -1
  488. data/spec/unit/type/service_spec.rb +35 -2
  489. data/spec/unit/type/user_spec.rb +31 -2
  490. data/spec/unit/type_spec.rb +20 -0
  491. data/spec/unit/util/backups_spec.rb +0 -2
  492. data/spec/unit/util/character_encoding_spec.rb +4 -4
  493. data/spec/unit/util/command_line_spec.rb +11 -6
  494. data/spec/unit/util/execution_spec.rb +0 -29
  495. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  496. data/spec/unit/util/posix_spec.rb +357 -15
  497. data/spec/unit/util/rubygems_spec.rb +2 -2
  498. data/spec/unit/util/run_mode_spec.rb +27 -127
  499. data/spec/unit/util/storage_spec.rb +3 -1
  500. data/spec/unit/util/windows/string_spec.rb +1 -3
  501. data/spec/unit/util/yaml_spec.rb +0 -54
  502. data/spec/unit/util_spec.rb +0 -18
  503. metadata +84 -261
  504. data/conf/auth.conf +0 -150
  505. data/lib/puppet/application/cert.rb +0 -76
  506. data/lib/puppet/application/key.rb +0 -4
  507. data/lib/puppet/application/man.rb +0 -4
  508. data/lib/puppet/application/status.rb +0 -4
  509. data/lib/puppet/face/key.rb +0 -16
  510. data/lib/puppet/face/man.rb +0 -145
  511. data/lib/puppet/face/module/build.rb +0 -14
  512. data/lib/puppet/face/module/generate.rb +0 -14
  513. data/lib/puppet/face/module/search.rb +0 -103
  514. data/lib/puppet/face/status.rb +0 -51
  515. data/lib/puppet/indirector/certificate/file.rb +0 -9
  516. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  517. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  518. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  519. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  520. data/lib/puppet/indirector/file_content/http.rb +0 -22
  521. data/lib/puppet/indirector/key/file.rb +0 -46
  522. data/lib/puppet/indirector/key/memory.rb +0 -7
  523. data/lib/puppet/indirector/ssl_file.rb +0 -162
  524. data/lib/puppet/indirector/status.rb +0 -3
  525. data/lib/puppet/indirector/status/local.rb +0 -12
  526. data/lib/puppet/indirector/status/rest.rb +0 -27
  527. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  528. data/lib/puppet/network/auth_config_parser.rb +0 -90
  529. data/lib/puppet/network/authstore.rb +0 -283
  530. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  531. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  532. data/lib/puppet/network/http/base_pool.rb +0 -36
  533. data/lib/puppet/network/http/compression.rb +0 -127
  534. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  535. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  536. data/lib/puppet/network/rest_controller.rb +0 -2
  537. data/lib/puppet/network/rights.rb +0 -210
  538. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  539. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  540. data/lib/puppet/parser/environment_compiler.rb +0 -202
  541. data/lib/puppet/pops/types/enumeration.rb +0 -16
  542. data/lib/puppet/resource/capability_finder.rb +0 -154
  543. data/lib/puppet/rest/errors.rb +0 -15
  544. data/lib/puppet/rest/response.rb +0 -35
  545. data/lib/puppet/rest/route.rb +0 -85
  546. data/lib/puppet/rest/routes.rb +0 -135
  547. data/lib/puppet/ssl/host.rb +0 -505
  548. data/lib/puppet/ssl/key.rb +0 -61
  549. data/lib/puppet/ssl/validator.rb +0 -61
  550. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  551. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  552. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  553. data/lib/puppet/status.rb +0 -40
  554. data/lib/puppet/util/connection.rb +0 -88
  555. data/lib/puppet/util/ssl.rb +0 -83
  556. data/lib/puppet/util/windows/api_types.rb +0 -295
  557. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  558. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  559. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  560. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  561. data/lib/puppet/vendor/pathspec/README.md +0 -53
  562. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  563. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  564. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  565. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  566. data/man/man8/puppet-key.8 +0 -126
  567. data/man/man8/puppet-man.8 +0 -76
  568. data/man/man8/puppet-status.8 +0 -108
  569. data/spec/integration/faces/config_spec.rb +0 -91
  570. data/spec/integration/faces/documentation_spec.rb +0 -57
  571. data/spec/integration/file_bucket/file_spec.rb +0 -50
  572. data/spec/integration/file_serving/content_spec.rb +0 -7
  573. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  574. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  575. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  576. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  577. data/spec/integration/module_tool/forge_spec.rb +0 -51
  578. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  579. data/spec/integration/network/authconfig_spec.rb +0 -256
  580. data/spec/integration/provider/service/init_spec.rb +0 -48
  581. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  582. data/spec/integration/provider/service/windows_spec.rb +0 -50
  583. data/spec/integration/reference/providers_spec.rb +0 -21
  584. data/spec/integration/reports_spec.rb +0 -13
  585. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  586. data/spec/integration/ssl/host_spec.rb +0 -72
  587. data/spec/integration/ssl/key_spec.rb +0 -99
  588. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  589. data/spec/unit/capability_spec.rb +0 -414
  590. data/spec/unit/face/catalog_spec.rb +0 -6
  591. data/spec/unit/face/key_spec.rb +0 -9
  592. data/spec/unit/face/man_spec.rb +0 -25
  593. data/spec/unit/face/module/search_spec.rb +0 -231
  594. data/spec/unit/face/module_spec.rb +0 -3
  595. data/spec/unit/face/status_spec.rb +0 -9
  596. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  597. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  598. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  599. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  600. data/spec/unit/indirector/key/file_spec.rb +0 -79
  601. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  602. data/spec/unit/indirector/status/local_spec.rb +0 -10
  603. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  604. data/spec/unit/man_spec.rb +0 -31
  605. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  606. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  607. data/spec/unit/network/authstore_spec.rb +0 -422
  608. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  609. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  610. data/spec/unit/network/http/compression_spec.rb +0 -240
  611. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  612. data/spec/unit/network/http_spec.rb +0 -9
  613. data/spec/unit/network/rights_spec.rb +0 -439
  614. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  615. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  616. data/spec/unit/resource/capability_finder_spec.rb +0 -143
  617. data/spec/unit/rest/route_spec.rb +0 -132
  618. data/spec/unit/ssl/host_spec.rb +0 -650
  619. data/spec/unit/ssl/key_spec.rb +0 -173
  620. data/spec/unit/ssl/validator_spec.rb +0 -278
  621. data/spec/unit/status_spec.rb +0 -45
  622. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -0,0 +1,404 @@
1
+ require 'puppet/ffi/windows'
2
+
3
+ module Puppet::FFI::Windows
4
+ module Constants
5
+ extend FFI::Library
6
+
7
+ FILE_ATTRIBUTE_READONLY = 0x00000001
8
+ FILE_ATTRIBUTE_DIRECTORY = 0x00000010
9
+
10
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379607(v=vs.85).aspx
11
+ # The right to use the object for synchronization. This enables a thread to
12
+ # wait until the object is in the signaled state. Some object types do not
13
+ # support this access right.
14
+ SYNCHRONIZE = 0x100000
15
+ # The right to delete the object.
16
+ DELETE = 0x00010000
17
+ # The right to read the information in the object's security descriptor, not including the information in the system access control list (SACL).
18
+ # READ_CONTROL = 0x00020000
19
+ # The right to modify the discretionary access control list (DACL) in the object's security descriptor.
20
+ WRITE_DAC = 0x00040000
21
+ # The right to change the owner in the object's security descriptor.
22
+ WRITE_OWNER = 0x00080000
23
+
24
+ # Combines DELETE, READ_CONTROL, WRITE_DAC, and WRITE_OWNER access.
25
+ STANDARD_RIGHTS_REQUIRED = 0xf0000
26
+ # Currently defined to equal READ_CONTROL.
27
+ STANDARD_RIGHTS_READ = 0x20000
28
+ # Currently defined to equal READ_CONTROL.
29
+ STANDARD_RIGHTS_WRITE = 0x20000
30
+ # Currently defined to equal READ_CONTROL.
31
+ STANDARD_RIGHTS_EXECUTE = 0x20000
32
+ # Combines DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, and SYNCHRONIZE access.
33
+ STANDARD_RIGHTS_ALL = 0x1F0000
34
+ SPECIFIC_RIGHTS_ALL = 0xFFFF
35
+
36
+ FILE_READ_DATA = 1
37
+ FILE_WRITE_DATA = 2
38
+ FILE_APPEND_DATA = 4
39
+ FILE_READ_EA = 8
40
+ FILE_WRITE_EA = 16
41
+ FILE_EXECUTE = 32
42
+ FILE_DELETE_CHILD = 64
43
+ FILE_READ_ATTRIBUTES = 128
44
+ FILE_WRITE_ATTRIBUTES = 256
45
+
46
+ FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF
47
+
48
+ FILE_GENERIC_READ =
49
+ STANDARD_RIGHTS_READ |
50
+ FILE_READ_DATA |
51
+ FILE_READ_ATTRIBUTES |
52
+ FILE_READ_EA |
53
+ SYNCHRONIZE
54
+
55
+ FILE_GENERIC_WRITE =
56
+ STANDARD_RIGHTS_WRITE |
57
+ FILE_WRITE_DATA |
58
+ FILE_WRITE_ATTRIBUTES |
59
+ FILE_WRITE_EA |
60
+ FILE_APPEND_DATA |
61
+ SYNCHRONIZE
62
+
63
+ FILE_GENERIC_EXECUTE =
64
+ STANDARD_RIGHTS_EXECUTE |
65
+ FILE_READ_ATTRIBUTES |
66
+ FILE_EXECUTE |
67
+ SYNCHRONIZE
68
+
69
+ REPLACEFILE_WRITE_THROUGH = 0x1
70
+ REPLACEFILE_IGNORE_MERGE_ERRORS = 0x2
71
+ REPLACEFILE_IGNORE_ACL_ERRORS = 0x3
72
+
73
+ INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF #define INVALID_FILE_ATTRIBUTES (DWORD (-1))
74
+
75
+ IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003
76
+ IO_REPARSE_TAG_HSM = 0xC0000004
77
+ IO_REPARSE_TAG_HSM2 = 0x80000006
78
+ IO_REPARSE_TAG_SIS = 0x80000007
79
+ IO_REPARSE_TAG_WIM = 0x80000008
80
+ IO_REPARSE_TAG_CSV = 0x80000009
81
+ IO_REPARSE_TAG_DFS = 0x8000000A
82
+ IO_REPARSE_TAG_SYMLINK = 0xA000000C
83
+ IO_REPARSE_TAG_DFSR = 0x80000012
84
+ IO_REPARSE_TAG_DEDUP = 0x80000013
85
+ IO_REPARSE_TAG_NFS = 0x80000014
86
+
87
+ FILE_ATTRIBUTE_REPARSE_POINT = 0x400
88
+
89
+ GENERIC_READ = 0x80000000
90
+ GENERIC_WRITE = 0x40000000
91
+ GENERIC_EXECUTE = 0x20000000
92
+ GENERIC_ALL = 0x10000000
93
+ METHOD_BUFFERED = 0
94
+ FILE_SHARE_READ = 1
95
+ FILE_SHARE_WRITE = 2
96
+ OPEN_EXISTING = 3
97
+ FILE_DEVICE_FILE_SYSTEM = 0x00000009
98
+ FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
99
+ FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
100
+ SHGFI_DISPLAYNAME = 0x000000200
101
+ SHGFI_PIDL = 0x000000008
102
+
103
+ ERROR_FILE_NOT_FOUND = 2
104
+ ERROR_PATH_NOT_FOUND = 3
105
+ ERROR_ALREADY_EXISTS = 183
106
+
107
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364571(v=vs.85).aspx
108
+ FSCTL_GET_REPARSE_POINT = 0x900a8
109
+
110
+ MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384
111
+
112
+ # Priority constants
113
+ # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setpriorityclass
114
+ ABOVE_NORMAL_PRIORITY_CLASS = 0x0008000
115
+ BELOW_NORMAL_PRIORITY_CLASS = 0x0004000
116
+ HIGH_PRIORITY_CLASS = 0x0000080
117
+ IDLE_PRIORITY_CLASS = 0x0000040
118
+ NORMAL_PRIORITY_CLASS = 0x0000020
119
+ REALTIME_PRIORITY_CLASS = 0x0000010
120
+
121
+ # Process Access Rights
122
+ # https://docs.microsoft.com/en-us/windows/win32/procthread/process-security-and-access-rights
123
+ PROCESS_TERMINATE = 0x00000001
124
+ PROCESS_SET_INFORMATION = 0x00000200
125
+ PROCESS_QUERY_INFORMATION = 0x00000400
126
+ PROCESS_ALL_ACCESS = 0x001F0FFF
127
+ PROCESS_VM_READ = 0x00000010
128
+
129
+ # Process creation flags
130
+ # https://docs.microsoft.com/en-us/windows/win32/procthread/process-creation-flags
131
+ CREATE_BREAKAWAY_FROM_JOB = 0x01000000
132
+ CREATE_DEFAULT_ERROR_MODE = 0x04000000
133
+ CREATE_NEW_CONSOLE = 0x00000010
134
+ CREATE_NEW_PROCESS_GROUP = 0x00000200
135
+ CREATE_NO_WINDOW = 0x08000000
136
+ CREATE_PROTECTED_PROCESS = 0x00040000
137
+ CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000
138
+ CREATE_SEPARATE_WOW_VDM = 0x00000800
139
+ CREATE_SHARED_WOW_VDM = 0x00001000
140
+ CREATE_SUSPENDED = 0x00000004
141
+ CREATE_UNICODE_ENVIRONMENT = 0x00000400
142
+ DEBUG_ONLY_THIS_PROCESS = 0x00000002
143
+ DEBUG_PROCESS = 0x00000001
144
+ DETACHED_PROCESS = 0x00000008
145
+ INHERIT_PARENT_AFFINITY = 0x00010000
146
+
147
+ # Logon options
148
+ LOGON_WITH_PROFILE = 0x00000001
149
+
150
+ # STARTUPINFOA constants
151
+ # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/ns-processthreadsapi-startupinfoa
152
+ STARTF_USESTDHANDLES = 0x00000100
153
+
154
+ # Miscellaneous
155
+ HANDLE_FLAG_INHERIT = 0x00000001
156
+ SEM_FAILCRITICALERRORS = 0x00000001
157
+ SEM_NOGPFAULTERRORBOX = 0x00000002
158
+
159
+ # Error constants
160
+ INVALID_HANDLE_VALUE = FFI::Pointer.new(-1).address
161
+
162
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379626(v=vs.85).aspx
163
+ TOKEN_INFORMATION_CLASS = enum(
164
+ :TokenUser, 1,
165
+ :TokenGroups,
166
+ :TokenPrivileges,
167
+ :TokenOwner,
168
+ :TokenPrimaryGroup,
169
+ :TokenDefaultDacl,
170
+ :TokenSource,
171
+ :TokenType,
172
+ :TokenImpersonationLevel,
173
+ :TokenStatistics,
174
+ :TokenRestrictedSids,
175
+ :TokenSessionId,
176
+ :TokenGroupsAndPrivileges,
177
+ :TokenSessionReference,
178
+ :TokenSandBoxInert,
179
+ :TokenAuditPolicy,
180
+ :TokenOrigin,
181
+ :TokenElevationType,
182
+ :TokenLinkedToken,
183
+ :TokenElevation,
184
+ :TokenHasRestrictions,
185
+ :TokenAccessInformation,
186
+ :TokenVirtualizationAllowed,
187
+ :TokenVirtualizationEnabled,
188
+ :TokenIntegrityLevel,
189
+ :TokenUIAccess,
190
+ :TokenMandatoryPolicy,
191
+ :TokenLogonSid,
192
+ :TokenIsAppContainer,
193
+ :TokenCapabilities,
194
+ :TokenAppContainerSid,
195
+ :TokenAppContainerNumber,
196
+ :TokenUserClaimAttributes,
197
+ :TokenDeviceClaimAttributes,
198
+ :TokenRestrictedUserClaimAttributes,
199
+ :TokenRestrictedDeviceClaimAttributes,
200
+ :TokenDeviceGroups,
201
+ :TokenRestrictedDeviceGroups,
202
+ :TokenSecurityAttributes,
203
+ :TokenIsRestricted,
204
+ :MaxTokenInfoClass
205
+ )
206
+
207
+ # Service error codes
208
+ # https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--1000-1299-
209
+ ERROR_SERVICE_DOES_NOT_EXIST = 0x00000424
210
+
211
+ # Service control codes
212
+ # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-controlserviceexw
213
+ SERVICE_CONTROL_STOP = 0x00000001
214
+ SERVICE_CONTROL_PAUSE = 0x00000002
215
+ SERVICE_CONTROL_CONTINUE = 0x00000003
216
+ SERVICE_CONTROL_INTERROGATE = 0x00000004
217
+ SERVICE_CONTROL_SHUTDOWN = 0x00000005
218
+ SERVICE_CONTROL_PARAMCHANGE = 0x00000006
219
+ SERVICE_CONTROL_NETBINDADD = 0x00000007
220
+ SERVICE_CONTROL_NETBINDREMOVE = 0x00000008
221
+ SERVICE_CONTROL_NETBINDENABLE = 0x00000009
222
+ SERVICE_CONTROL_NETBINDDISABLE = 0x0000000A
223
+ SERVICE_CONTROL_DEVICEEVENT = 0x0000000B
224
+ SERVICE_CONTROL_HARDWAREPROFILECHANGE = 0x0000000C
225
+ SERVICE_CONTROL_POWEREVENT = 0x0000000D
226
+ SERVICE_CONTROL_SESSIONCHANGE = 0x0000000E
227
+ SERVICE_CONTROL_PRESHUTDOWN = 0x0000000F
228
+ SERVICE_CONTROL_TIMECHANGE = 0x00000010
229
+ SERVICE_CONTROL_TRIGGEREVENT = 0x00000020
230
+ SERVICE_CONTROL_SIGNALS = {
231
+ SERVICE_CONTROL_STOP => :SERVICE_CONTROL_STOP,
232
+ SERVICE_CONTROL_PAUSE => :SERVICE_CONTROL_PAUSE,
233
+ SERVICE_CONTROL_CONTINUE => :SERVICE_CONTROL_CONTINUE,
234
+ SERVICE_CONTROL_INTERROGATE => :SERVICE_CONTROL_INTERROGATE,
235
+ SERVICE_CONTROL_SHUTDOWN => :SERVICE_CONTROL_SHUTDOWN,
236
+ SERVICE_CONTROL_PARAMCHANGE => :SERVICE_CONTROL_PARAMCHANGE,
237
+ SERVICE_CONTROL_NETBINDADD => :SERVICE_CONTROL_NETBINDADD,
238
+ SERVICE_CONTROL_NETBINDREMOVE => :SERVICE_CONTROL_NETBINDREMOVE,
239
+ SERVICE_CONTROL_NETBINDENABLE => :SERVICE_CONTROL_NETBINDENABLE,
240
+ SERVICE_CONTROL_NETBINDDISABLE => :SERVICE_CONTROL_NETBINDDISABLE,
241
+ SERVICE_CONTROL_DEVICEEVENT => :SERVICE_CONTROL_DEVICEEVENT,
242
+ SERVICE_CONTROL_HARDWAREPROFILECHANGE => :SERVICE_CONTROL_HARDWAREPROFILECHANGE,
243
+ SERVICE_CONTROL_POWEREVENT => :SERVICE_CONTROL_POWEREVENT,
244
+ SERVICE_CONTROL_SESSIONCHANGE => :SERVICE_CONTROL_SESSIONCHANGE,
245
+ SERVICE_CONTROL_PRESHUTDOWN => :SERVICE_CONTROL_PRESHUTDOWN,
246
+ SERVICE_CONTROL_TIMECHANGE => :SERVICE_CONTROL_TIMECHANGE,
247
+ SERVICE_CONTROL_TRIGGEREVENT => :SERVICE_CONTROL_TRIGGEREVENT
248
+ }
249
+
250
+ # Service start type codes
251
+ # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-changeserviceconfigw
252
+ SERVICE_AUTO_START = 0x00000002
253
+ SERVICE_BOOT_START = 0x00000000
254
+ SERVICE_DEMAND_START = 0x00000003
255
+ SERVICE_DISABLED = 0x00000004
256
+ SERVICE_SYSTEM_START = 0x00000001
257
+ SERVICE_START_TYPES = {
258
+ SERVICE_AUTO_START => :SERVICE_AUTO_START,
259
+ SERVICE_BOOT_START => :SERVICE_BOOT_START,
260
+ SERVICE_DEMAND_START => :SERVICE_DEMAND_START,
261
+ SERVICE_DISABLED => :SERVICE_DISABLED,
262
+ SERVICE_SYSTEM_START => :SERVICE_SYSTEM_START,
263
+ }
264
+
265
+ # Service type codes
266
+ # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-changeserviceconfigw
267
+ SERVICE_FILE_SYSTEM_DRIVER = 0x00000002
268
+ SERVICE_KERNEL_DRIVER = 0x00000001
269
+ SERVICE_WIN32_OWN_PROCESS = 0x00000010
270
+ SERVICE_WIN32_SHARE_PROCESS = 0x00000020
271
+ SERVICE_USER_OWN_PROCESS = 0x00000050
272
+ SERVICE_USER_SHARE_PROCESS = 0x00000060
273
+ # Available only if service is also SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS
274
+ SERVICE_INTERACTIVE_PROCESS = 0x00000100
275
+ ALL_SERVICE_TYPES =
276
+ SERVICE_FILE_SYSTEM_DRIVER |
277
+ SERVICE_KERNEL_DRIVER |
278
+ SERVICE_WIN32_OWN_PROCESS |
279
+ SERVICE_WIN32_SHARE_PROCESS
280
+
281
+ # Current state codes
282
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/ns-winsvc-_service_status_process
283
+ SERVICE_CONTINUE_PENDING = 0x00000005
284
+ SERVICE_PAUSE_PENDING = 0x00000006
285
+ SERVICE_PAUSED = 0x00000007
286
+ SERVICE_RUNNING = 0x00000004
287
+ SERVICE_START_PENDING = 0x00000002
288
+ SERVICE_STOP_PENDING = 0x00000003
289
+ SERVICE_STOPPED = 0x00000001
290
+ UNSAFE_PENDING_STATES = [SERVICE_START_PENDING, SERVICE_STOP_PENDING]
291
+ FINAL_STATES = {
292
+ SERVICE_CONTINUE_PENDING => SERVICE_RUNNING,
293
+ SERVICE_PAUSE_PENDING => SERVICE_PAUSED,
294
+ SERVICE_START_PENDING => SERVICE_RUNNING,
295
+ SERVICE_STOP_PENDING => SERVICE_STOPPED
296
+ }
297
+ SERVICE_STATES = {
298
+ SERVICE_CONTINUE_PENDING => :SERVICE_CONTINUE_PENDING,
299
+ SERVICE_PAUSE_PENDING => :SERVICE_PAUSE_PENDING,
300
+ SERVICE_PAUSED => :SERVICE_PAUSED,
301
+ SERVICE_RUNNING => :SERVICE_RUNNING,
302
+ SERVICE_START_PENDING => :SERVICE_START_PENDING,
303
+ SERVICE_STOP_PENDING => :SERVICE_STOP_PENDING,
304
+ SERVICE_STOPPED => :SERVICE_STOPPED,
305
+ }
306
+
307
+ # Service accepts control codes
308
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/ns-winsvc-_service_status_process
309
+ SERVICE_ACCEPT_STOP = 0x00000001
310
+ SERVICE_ACCEPT_PAUSE_CONTINUE = 0x00000002
311
+ SERVICE_ACCEPT_SHUTDOWN = 0x00000004
312
+ SERVICE_ACCEPT_PARAMCHANGE = 0x00000008
313
+ SERVICE_ACCEPT_NETBINDCHANGE = 0x00000010
314
+ SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x00000020
315
+ SERVICE_ACCEPT_POWEREVENT = 0x00000040
316
+ SERVICE_ACCEPT_SESSIONCHANGE = 0x00000080
317
+ SERVICE_ACCEPT_PRESHUTDOWN = 0x00000100
318
+ SERVICE_ACCEPT_TIMECHANGE = 0x00000200
319
+ SERVICE_ACCEPT_TRIGGEREVENT = 0x00000400
320
+ SERVICE_ACCEPT_USER_LOGOFF = 0x00000800
321
+
322
+ # Service manager access codes
323
+ # https://docs.microsoft.com/en-us/windows/desktop/Services/service-security-and-access-rights
324
+ SC_MANAGER_CREATE_SERVICE = 0x00000002
325
+ SC_MANAGER_CONNECT = 0x00000001
326
+ SC_MANAGER_ENUMERATE_SERVICE = 0x00000004
327
+ SC_MANAGER_LOCK = 0x00000008
328
+ SC_MANAGER_MODIFY_BOOT_CONFIG = 0x00000020
329
+ SC_MANAGER_QUERY_LOCK_STATUS = 0x00000010
330
+ SC_MANAGER_ALL_ACCESS =
331
+ STANDARD_RIGHTS_REQUIRED |
332
+ SC_MANAGER_CREATE_SERVICE |
333
+ SC_MANAGER_CONNECT |
334
+ SC_MANAGER_ENUMERATE_SERVICE |
335
+ SC_MANAGER_LOCK |
336
+ SC_MANAGER_MODIFY_BOOT_CONFIG |
337
+ SC_MANAGER_QUERY_LOCK_STATUS
338
+
339
+ # Service access codes
340
+ # https://docs.microsoft.com/en-us/windows/desktop/Services/service-security-and-access-rights
341
+ SERVICE_CHANGE_CONFIG = 0x0002
342
+ SERVICE_ENUMERATE_DEPENDENTS = 0x0008
343
+ SERVICE_INTERROGATE = 0x0080
344
+ SERVICE_PAUSE_CONTINUE = 0x0040
345
+ SERVICE_QUERY_STATUS = 0x0004
346
+ SERVICE_QUERY_CONFIG = 0x0001
347
+ SERVICE_START = 0x0010
348
+ SERVICE_STOP = 0x0020
349
+ SERVICE_USER_DEFINED_CONTROL = 0x0100
350
+ SERVICE_ALL_ACCESS =
351
+ STANDARD_RIGHTS_REQUIRED |
352
+ SERVICE_CHANGE_CONFIG |
353
+ SERVICE_ENUMERATE_DEPENDENTS |
354
+ SERVICE_INTERROGATE |
355
+ SERVICE_PAUSE_CONTINUE |
356
+ SERVICE_QUERY_STATUS |
357
+ SERVICE_QUERY_CONFIG |
358
+ SERVICE_START |
359
+ SERVICE_STOP |
360
+ SERVICE_USER_DEFINED_CONTROL
361
+
362
+ # Service config codes
363
+ # From the windows 10 SDK:
364
+ # //
365
+ # // Value to indicate no change to an optional parameter
366
+ # //
367
+ # #define SERVICE_NO_CHANGE 0xffffffff
368
+ # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-changeserviceconfig2w
369
+ SERVICE_CONFIG_DESCRIPTION = 0x00000001
370
+ SERVICE_CONFIG_FAILURE_ACTIONS = 0x00000002
371
+ SERVICE_CONFIG_DELAYED_AUTO_START_INFO = 0x00000003
372
+ SERVICE_CONFIG_FAILURE_ACTIONS_FLAG = 0x00000004
373
+ SERVICE_CONFIG_SERVICE_SID_INFO = 0x00000005
374
+ SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO = 0x00000006
375
+ SERVICE_CONFIG_PRESHUTDOWN_INFO = 0x00000007
376
+ SERVICE_CONFIG_TRIGGER_INFO = 0x00000008
377
+ SERVICE_CONFIG_PREFERRED_NODE = 0x00000009
378
+ SERVICE_CONFIG_LAUNCH_PROTECTED = 0x00000012
379
+ SERVICE_NO_CHANGE = 0xffffffff
380
+ SERVICE_CONFIG_TYPES = {
381
+ SERVICE_CONFIG_DESCRIPTION => :SERVICE_CONFIG_DESCRIPTION,
382
+ SERVICE_CONFIG_FAILURE_ACTIONS => :SERVICE_CONFIG_FAILURE_ACTIONS,
383
+ SERVICE_CONFIG_DELAYED_AUTO_START_INFO => :SERVICE_CONFIG_DELAYED_AUTO_START_INFO,
384
+ SERVICE_CONFIG_FAILURE_ACTIONS_FLAG => :SERVICE_CONFIG_FAILURE_ACTIONS_FLAG,
385
+ SERVICE_CONFIG_SERVICE_SID_INFO => :SERVICE_CONFIG_SERVICE_SID_INFO,
386
+ SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO => :SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO,
387
+ SERVICE_CONFIG_PRESHUTDOWN_INFO => :SERVICE_CONFIG_PRESHUTDOWN_INFO,
388
+ SERVICE_CONFIG_TRIGGER_INFO => :SERVICE_CONFIG_TRIGGER_INFO,
389
+ SERVICE_CONFIG_PREFERRED_NODE => :SERVICE_CONFIG_PREFERRED_NODE,
390
+ SERVICE_CONFIG_LAUNCH_PROTECTED => :SERVICE_CONFIG_LAUNCH_PROTECTED,
391
+ }
392
+
393
+ # Service enum codes
394
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-enumservicesstatusexa
395
+ SERVICE_ACTIVE = 0x00000001
396
+ SERVICE_INACTIVE = 0x00000002
397
+ SERVICE_STATE_ALL =
398
+ SERVICE_ACTIVE |
399
+ SERVICE_INACTIVE
400
+
401
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/ns-winsvc-_enum_service_status_processw
402
+ SERVICENAME_MAX = 256
403
+ end
404
+ end
@@ -0,0 +1,628 @@
1
+ require 'puppet/ffi/windows'
2
+
3
+ module Puppet::FFI::Windows
4
+ module Functions
5
+
6
+ extend FFI::Library
7
+ include Puppet::FFI::Windows::Constants
8
+
9
+ ffi_convention :stdcall
10
+
11
+ # https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-sethandleinformation
12
+ # BOOL SetHandleInformation(
13
+ # HANDLE hObject,
14
+ # DWORD dwMask,
15
+ # DWORD dwFlags
16
+ # );
17
+ ffi_lib :kernel32
18
+ attach_function_private :SetHandleInformation, [:handle, :dword, :dword], :win32_bool
19
+
20
+ # https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-seterrormode
21
+ # UINT SetErrorMode(
22
+ # UINT uMode
23
+ # );
24
+ ffi_lib :kernel32
25
+ attach_function_private :SetErrorMode, [:uint], :uint
26
+
27
+ # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessw
28
+ # BOOL CreateProcessW(
29
+ # LPCWSTR lpApplicationName,
30
+ # LPWSTR lpCommandLine,
31
+ # LPSECURITY_ATTRIBUTES lpProcessAttributes,
32
+ # LPSECURITY_ATTRIBUTES lpThreadAttributes,
33
+ # BOOL bInheritHandles,
34
+ # DWORD dwCreationFlags,
35
+ # LPVOID lpEnvironment,
36
+ # LPCWSTR lpCurrentDirectory,
37
+ # LPSTARTUPINFOW lpStartupInfo,
38
+ # LPPROCESS_INFORMATION lpProcessInformation
39
+ # );
40
+ ffi_lib :kernel32
41
+ attach_function_private :CreateProcessW,
42
+ [:lpcwstr, :lpwstr, :pointer, :pointer, :win32_bool,
43
+ :dword, :lpvoid, :lpcwstr, :pointer, :pointer], :bool
44
+
45
+ # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
46
+ # HANDLE OpenProcess(
47
+ # DWORD dwDesiredAccess,
48
+ # BOOL bInheritHandle,
49
+ # DWORD dwProcessId
50
+ # );
51
+ ffi_lib :kernel32
52
+ attach_function_private :OpenProcess, [:dword, :win32_bool, :dword], :handle
53
+
54
+ # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setpriorityclass
55
+ # BOOL SetPriorityClass(
56
+ # HANDLE hProcess,
57
+ # DWORD dwPriorityClass
58
+ # );
59
+ ffi_lib :kernel32
60
+ attach_function_private :SetPriorityClass, [:handle, :dword], :win32_bool
61
+
62
+ # https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw
63
+ # BOOL CreateProcessWithLogonW(
64
+ # LPCWSTR lpUsername,
65
+ # LPCWSTR lpDomain,
66
+ # LPCWSTR lpPassword,
67
+ # DWORD dwLogonFlags,
68
+ # LPCWSTR lpApplicationName,
69
+ # LPWSTR lpCommandLine,
70
+ # DWORD dwCreationFlags,
71
+ # LPVOID lpEnvironment,
72
+ # LPCWSTR lpCurrentDirectory,
73
+ # LPSTARTUPINFOW lpStartupInfo,
74
+ # LPPROCESS_INFORMATION lpProcessInformation
75
+ # );
76
+ ffi_lib :advapi32
77
+ attach_function_private :CreateProcessWithLogonW,
78
+ [:lpcwstr, :lpcwstr, :lpcwstr, :dword, :lpcwstr, :lpwstr,
79
+ :dword, :lpvoid, :lpcwstr, :pointer, :pointer], :bool
80
+
81
+ # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle?view=vs-2019
82
+ # intptr_t _get_osfhandle(
83
+ # int fd
84
+ # );
85
+ ffi_lib FFI::Library::LIBC
86
+ attach_function_private :get_osfhandle, :_get_osfhandle, [:int], :intptr_t
87
+
88
+ begin
89
+ # https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-errno?view=vs-2019
90
+ # errno_t _get_errno(
91
+ # int * pValue
92
+ # );
93
+ attach_function_private :get_errno, :_get_errno, [:pointer], :int
94
+ rescue FFI::NotFoundError
95
+ # Do nothing, Windows XP or earlier.
96
+ end
97
+
98
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx
99
+ # DWORD WINAPI WaitForSingleObject(
100
+ # _In_ HANDLE hHandle,
101
+ # _In_ DWORD dwMilliseconds
102
+ # );
103
+ ffi_lib :kernel32
104
+ attach_function_private :WaitForSingleObject,
105
+ [:handle, :dword], :dword, :blocking => true
106
+
107
+ # https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitformultipleobjects
108
+ # DWORD WaitForMultipleObjects(
109
+ # DWORD nCount,
110
+ # const HANDLE *lpHandles,
111
+ # BOOL bWaitAll,
112
+ # DWORD dwMilliseconds
113
+ # );
114
+ ffi_lib :kernel32
115
+ attach_function_private :WaitForMultipleObjects,
116
+ [:dword, :phandle, :win32_bool, :dword], :dword
117
+
118
+ # https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-createeventw
119
+ # HANDLE CreateEventW(
120
+ # LPSECURITY_ATTRIBUTES lpEventAttributes,
121
+ # BOOL bManualReset,
122
+ # BOOL bInitialState,
123
+ # LPCWSTR lpName
124
+ # );
125
+ ffi_lib :kernel32
126
+ attach_function_private :CreateEventW,
127
+ [:pointer, :win32_bool, :win32_bool, :lpcwstr], :handle
128
+
129
+ # https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread
130
+ # HANDLE CreateThread(
131
+ # LPSECURITY_ATTRIBUTES lpThreadAttributes,
132
+ # SIZE_T dwStackSize,
133
+ # LPTHREAD_START_ROUTINE lpStartAddress,
134
+ # __drv_aliasesMem LPVOID lpParameter,
135
+ # DWORD dwCreationFlags,
136
+ # LPDWORD lpThreadId
137
+ # );
138
+ ffi_lib :kernel32
139
+ attach_function_private :CreateThread,
140
+ [:pointer, :size_t, :pointer, :lpvoid, :dword, :lpdword], :handle, :blocking => true
141
+
142
+ # https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-setevent
143
+ # BOOL SetEvent(
144
+ # HANDLE hEvent
145
+ # );
146
+ ffi_lib :kernel32
147
+ attach_function_private :SetEvent,
148
+ [:handle], :win32_bool
149
+
150
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx
151
+ # BOOL WINAPI GetExitCodeProcess(
152
+ # _In_ HANDLE hProcess,
153
+ # _Out_ LPDWORD lpExitCode
154
+ # );
155
+ ffi_lib :kernel32
156
+ attach_function_private :GetExitCodeProcess,
157
+ [:handle, :lpdword], :win32_bool
158
+
159
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683179(v=vs.85).aspx
160
+ # HANDLE WINAPI GetCurrentProcess(void);
161
+ ffi_lib :kernel32
162
+ attach_function_private :GetCurrentProcess, [], :handle
163
+
164
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683187(v=vs.85).aspx
165
+ # LPTCH GetEnvironmentStrings(void);
166
+ ffi_lib :kernel32
167
+ attach_function_private :GetEnvironmentStringsW, [], :pointer
168
+
169
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms683151(v=vs.85).aspx
170
+ # BOOL FreeEnvironmentStrings(
171
+ # _In_ LPTCH lpszEnvironmentBlock
172
+ # );
173
+ ffi_lib :kernel32
174
+ attach_function_private :FreeEnvironmentStringsW,
175
+ [:pointer], :win32_bool
176
+
177
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms686206(v=vs.85).aspx
178
+ # BOOL WINAPI SetEnvironmentVariableW(
179
+ # _In_ LPCTSTR lpName,
180
+ # _In_opt_ LPCTSTR lpValue
181
+ # );
182
+ ffi_lib :kernel32
183
+ attach_function_private :SetEnvironmentVariableW,
184
+ [:lpcwstr, :lpcwstr], :win32_bool
185
+
186
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms684320(v=vs.85).aspx
187
+ # HANDLE WINAPI OpenProcess(
188
+ # _In_ DWORD DesiredAccess,
189
+ # _In_ BOOL InheritHandle,
190
+ # _In_ DWORD ProcessId
191
+ # );
192
+ ffi_lib :kernel32
193
+ attach_function_private :OpenProcess,
194
+ [:dword, :win32_bool, :dword], :handle
195
+
196
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379295(v=vs.85).aspx
197
+ # BOOL WINAPI OpenProcessToken(
198
+ # _In_ HANDLE ProcessHandle,
199
+ # _In_ DWORD DesiredAccess,
200
+ # _Out_ PHANDLE TokenHandle
201
+ # );
202
+ ffi_lib :advapi32
203
+ attach_function_private :OpenProcessToken,
204
+ [:handle, :dword, :phandle], :win32_bool
205
+
206
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-queryfullprocessimagenamew
207
+ # BOOL WINAPI QueryFullProcessImageName(
208
+ # _In_ HANDLE hProcess,
209
+ # _In_ DWORD dwFlags,
210
+ # _Out_ LPWSTR lpExeName,
211
+ # _In_ PDWORD lpdwSize,
212
+ # );
213
+ ffi_lib :kernel32
214
+ attach_function_private :QueryFullProcessImageNameW,
215
+ [:handle, :dword, :lpwstr, :pdword], :win32_bool
216
+
217
+ # https://msdn.microsoft.com/en-us/library/Windows/desktop/aa379180(v=vs.85).aspx
218
+ # BOOL WINAPI LookupPrivilegeValue(
219
+ # _In_opt_ LPCTSTR lpSystemName,
220
+ # _In_ LPCTSTR lpName,
221
+ # _Out_ PLUID lpLuid
222
+ # );
223
+ ffi_lib :advapi32
224
+ attach_function_private :LookupPrivilegeValueW,
225
+ [:lpcwstr, :lpcwstr, :pointer], :win32_bool
226
+
227
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx
228
+ # BOOL WINAPI GetTokenInformation(
229
+ # _In_ HANDLE TokenHandle,
230
+ # _In_ TOKEN_INFORMATION_CLASS TokenInformationClass,
231
+ # _Out_opt_ LPVOID TokenInformation,
232
+ # _In_ DWORD TokenInformationLength,
233
+ # _Out_ PDWORD ReturnLength
234
+ # );
235
+ ffi_lib :advapi32
236
+ attach_function_private :GetTokenInformation,
237
+ [:handle, TOKEN_INFORMATION_CLASS, :lpvoid, :dword, :pdword ], :win32_bool
238
+
239
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx
240
+ # BOOL WINAPI GetVersionEx(
241
+ # _Inout_ LPOSVERSIONINFO lpVersionInfo
242
+ # );
243
+ ffi_lib :kernel32
244
+ attach_function_private :GetVersionExW,
245
+ [:pointer], :win32_bool
246
+
247
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/dd318123(v=vs.85).aspx
248
+ # LANGID GetSystemDefaultUILanguage(void);
249
+ ffi_lib :kernel32
250
+ attach_function_private :GetSystemDefaultUILanguage, [], :word
251
+
252
+ # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-openscmanagerw
253
+ # SC_HANDLE OpenSCManagerW(
254
+ # LPCWSTR lpMachineName,
255
+ # LPCWSTR lpDatabaseName,
256
+ # DWORD dwDesiredAccess
257
+ # );
258
+ ffi_lib :advapi32
259
+ attach_function_private :OpenSCManagerW,
260
+ [:lpcwstr, :lpcwstr, :dword], :handle
261
+
262
+ # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-openservicew
263
+ # SC_HANDLE OpenServiceW(
264
+ # SC_HANDLE hSCManager,
265
+ # LPCWSTR lpServiceName,
266
+ # DWORD dwDesiredAccess
267
+ # );
268
+ ffi_lib :advapi32
269
+ attach_function_private :OpenServiceW,
270
+ [:handle, :lpcwstr, :dword], :handle
271
+
272
+ # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-closeservicehandle
273
+ # BOOL CloseServiceHandle(
274
+ # SC_HANDLE hSCObject
275
+ # );
276
+ ffi_lib :advapi32
277
+ attach_function_private :CloseServiceHandle,
278
+ [:handle], :win32_bool
279
+
280
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-queryservicestatusex
281
+ # BOOL QueryServiceStatusEx(
282
+ # SC_HANDLE hService,
283
+ # SC_STATUS_TYPE InfoLevel,
284
+ # LPBYTE lpBuffer,
285
+ # DWORD cbBufSize,
286
+ # LPDWORD pcbBytesNeeded
287
+ # );
288
+ SC_STATUS_TYPE = enum(
289
+ :SC_STATUS_PROCESS_INFO, 0,
290
+ )
291
+ ffi_lib :advapi32
292
+ attach_function_private :QueryServiceStatusEx,
293
+ [:handle, SC_STATUS_TYPE, :lpbyte, :dword, :lpdword], :win32_bool
294
+
295
+ # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-queryserviceconfigw
296
+ # BOOL QueryServiceConfigW(
297
+ # SC_HANDLE hService,
298
+ # LPQUERY_SERVICE_CONFIGW lpServiceConfig,
299
+ # DWORD cbBufSize,
300
+ # LPDWORD pcbBytesNeeded
301
+ # );
302
+ ffi_lib :advapi32
303
+ attach_function_private :QueryServiceConfigW,
304
+ [:handle, :lpbyte, :dword, :lpdword], :win32_bool
305
+
306
+ # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-queryserviceconfig2w
307
+ # BOOL QueryServiceConfig2W(
308
+ # SC_HANDLE hService,
309
+ # DWORD dwInfoLevel,
310
+ # LPBYTE lpBuffer,
311
+ # DWORD cbBufSize,
312
+ # LPDWORD pcbBytesNeeded
313
+ # );
314
+ ffi_lib :advapi32
315
+ attach_function_private :QueryServiceConfig2W,
316
+ [:handle, :dword, :lpbyte, :dword, :lpdword], :win32_bool
317
+
318
+ # https://docs.microsoft.com/en-us/windows/desktop/api/Winsvc/nf-winsvc-startservicew
319
+ # BOOL StartServiceW(
320
+ # SC_HANDLE hService,
321
+ # DWORD dwNumServiceArgs,
322
+ # LPCWSTR *lpServiceArgVectors
323
+ # );
324
+ ffi_lib :advapi32
325
+ attach_function_private :StartServiceW,
326
+ [:handle, :dword, :pointer], :win32_bool
327
+
328
+ # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-startservicectrldispatcherw
329
+ # BOOL StartServiceCtrlDispatcherW(
330
+ # const SERVICE_TABLE_ENTRYW *lpServiceStartTable
331
+ # );
332
+ ffi_lib :advapi32
333
+ attach_function_private :StartServiceCtrlDispatcherW,
334
+ [:pointer], :win32_bool, :blocking => true
335
+
336
+ # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-setservicestatus
337
+ # BOOL SetServiceStatus(
338
+ # SERVICE_STATUS_HANDLE hServiceStatus,
339
+ # LPSERVICE_STATUS lpServiceStatus
340
+ # );
341
+ ffi_lib :advapi32
342
+ attach_function_private :SetServiceStatus,
343
+ [:handle, :pointer], :win32_bool
344
+
345
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-controlservice
346
+ # BOOL ControlService(
347
+ # SC_HANDLE hService,
348
+ # DWORD dwControl,
349
+ # LPSERVICE_STATUS lpServiceStatus
350
+ # );
351
+ ffi_lib :advapi32
352
+ attach_function_private :ControlService,
353
+ [:handle, :dword, :pointer], :win32_bool
354
+
355
+ # DWORD LphandlerFunctionEx(
356
+ # DWORD dwControl,
357
+ # DWORD dwEventType,
358
+ # LPVOID lpEventData,
359
+ # LPVOID lpContext
360
+ # )
361
+ callback :handler_ex, [:dword, :dword, :lpvoid, :lpvoid], :void
362
+
363
+ # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-registerservicectrlhandlerexw
364
+ # SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerExW(
365
+ # LPCWSTR lpServiceName,
366
+ # LPHANDLER_FUNCTION_EX lpHandlerProc,
367
+ # LPVOID lpContext
368
+ # );
369
+ ffi_lib :advapi32
370
+ attach_function_private :RegisterServiceCtrlHandlerExW,
371
+ [:lpcwstr, :handler_ex, :lpvoid], :handle
372
+
373
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-changeserviceconfigw
374
+ # BOOL ChangeServiceConfigW(
375
+ # SC_HANDLE hService,
376
+ # DWORD dwServiceType,
377
+ # DWORD dwStartType,
378
+ # DWORD dwErrorControl,
379
+ # LPCWSTR lpBinaryPathName,
380
+ # LPCWSTR lpLoadOrderGroup,
381
+ # LPDWORD lpdwTagId,
382
+ # LPCWSTR lpDependencies,
383
+ # LPCWSTR lpServiceStartName,
384
+ # LPCWSTR lpPassword,
385
+ # LPCWSTR lpDisplayName
386
+ # );
387
+ ffi_lib :advapi32
388
+ attach_function_private :ChangeServiceConfigW,
389
+ [
390
+ :handle,
391
+ :dword,
392
+ :dword,
393
+ :dword,
394
+ :lpcwstr,
395
+ :lpcwstr,
396
+ :lpdword,
397
+ :lpcwstr,
398
+ :lpcwstr,
399
+ :lpcwstr,
400
+ :lpcwstr
401
+ ], :win32_bool
402
+
403
+ # https://docs.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-changeserviceconfig2w
404
+ # BOOL ChangeServiceConfig2W(
405
+ # SC_HANDLE hService,
406
+ # DWORD dwInfoLevel,
407
+ # LPVOID lpInfo
408
+ # );
409
+ ffi_lib :advapi32
410
+ attach_function_private :ChangeServiceConfig2W,
411
+ [:handle, :dword, :lpvoid], :win32_bool
412
+
413
+ # https://docs.microsoft.com/en-us/windows/desktop/api/winsvc/nf-winsvc-enumservicesstatusexw
414
+ # BOOL EnumServicesStatusExW(
415
+ # SC_HANDLE hSCManager,
416
+ # SC_ENUM_TYPE InfoLevel,
417
+ # DWORD dwServiceType,
418
+ # DWORD dwServiceState,
419
+ # LPBYTE lpServices,
420
+ # DWORD cbBufSize,
421
+ # LPDWORD pcbBytesNeeded,
422
+ # LPDWORD lpServicesReturned,
423
+ # LPDWORD lpResumeHandle,
424
+ # LPCWSTR pszGroupName
425
+ # );
426
+ SC_ENUM_TYPE = enum(
427
+ :SC_ENUM_PROCESS_INFO, 0,
428
+ )
429
+ ffi_lib :advapi32
430
+ attach_function_private :EnumServicesStatusExW,
431
+ [
432
+ :handle,
433
+ SC_ENUM_TYPE,
434
+ :dword,
435
+ :dword,
436
+ :lpbyte,
437
+ :dword,
438
+ :lpdword,
439
+ :lpdword,
440
+ :lpdword,
441
+ :lpcwstr
442
+ ], :win32_bool
443
+
444
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa365512(v=vs.85).aspx
445
+ # BOOL WINAPI ReplaceFile(
446
+ # _In_ LPCTSTR lpReplacedFileName,
447
+ # _In_ LPCTSTR lpReplacementFileName,
448
+ # _In_opt_ LPCTSTR lpBackupFileName,
449
+ # _In_ DWORD dwReplaceFlags - 0x1 REPLACEFILE_WRITE_THROUGH,
450
+ # 0x2 REPLACEFILE_IGNORE_MERGE_ERRORS,
451
+ # 0x4 REPLACEFILE_IGNORE_ACL_ERRORS
452
+ # _Reserved_ LPVOID lpExclude,
453
+ # _Reserved_ LPVOID lpReserved
454
+ # );
455
+ ffi_lib :kernel32
456
+ attach_function_private :ReplaceFileW,
457
+ [:lpcwstr, :lpcwstr, :lpcwstr, :dword, :lpvoid, :lpvoid], :win32_bool
458
+
459
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa365240(v=vs.85).aspx
460
+ # BOOL WINAPI MoveFileEx(
461
+ # _In_ LPCTSTR lpExistingFileName,
462
+ # _In_opt_ LPCTSTR lpNewFileName,
463
+ # _In_ DWORD dwFlags
464
+ # );
465
+ ffi_lib :kernel32
466
+ attach_function_private :MoveFileExW,
467
+ [:lpcwstr, :lpcwstr, :dword], :win32_bool
468
+
469
+ # BOOLEAN WINAPI CreateSymbolicLink(
470
+ # _In_ LPTSTR lpSymlinkFileName, - symbolic link to be created
471
+ # _In_ LPTSTR lpTargetFileName, - name of target for symbolic link
472
+ # _In_ DWORD dwFlags - 0x0 target is a file, 0x1 target is a directory
473
+ # );
474
+ # rescue on Windows < 6.0 so that code doesn't explode
475
+ begin
476
+ ffi_lib :kernel32
477
+ attach_function_private :CreateSymbolicLinkW,
478
+ [:lpwstr, :lpwstr, :dword], :boolean
479
+ rescue LoadError
480
+ end
481
+
482
+ # https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getcurrentdirectory
483
+ # DWORD GetCurrentDirectory(
484
+ # DWORD nBufferLength,
485
+ # LPTSTR lpBuffer
486
+ # );
487
+ ffi_lib :kernel32
488
+ attach_function_private :GetCurrentDirectoryW,
489
+ [:dword, :lpwstr], :dword
490
+
491
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364944(v=vs.85).aspx
492
+ # DWORD WINAPI GetFileAttributes(
493
+ # _In_ LPCTSTR lpFileName
494
+ # );
495
+ ffi_lib :kernel32
496
+ attach_function_private :GetFileAttributesW,
497
+ [:lpcwstr], :dword
498
+
499
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa365535(v=vs.85).aspx
500
+ # BOOL WINAPI SetFileAttributes(
501
+ # _In_ LPCTSTR lpFileName,
502
+ # _In_ DWORD dwFileAttributes
503
+ # );
504
+ ffi_lib :kernel32
505
+ attach_function_private :SetFileAttributesW,
506
+ [:lpcwstr, :dword], :win32_bool
507
+
508
+ # HANDLE WINAPI CreateFile(
509
+ # _In_ LPCTSTR lpFileName,
510
+ # _In_ DWORD dwDesiredAccess,
511
+ # _In_ DWORD dwShareMode,
512
+ # _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
513
+ # _In_ DWORD dwCreationDisposition,
514
+ # _In_ DWORD dwFlagsAndAttributes,
515
+ # _In_opt_ HANDLE hTemplateFile
516
+ # );
517
+ ffi_lib :kernel32
518
+ attach_function_private :CreateFileW,
519
+ [:lpcwstr, :dword, :dword, :pointer, :dword, :dword, :handle], :handle
520
+
521
+ # https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createdirectoryw
522
+ # BOOL CreateDirectoryW(
523
+ # LPCWSTR lpPathName,
524
+ # LPSECURITY_ATTRIBUTES lpSecurityAttributes
525
+ # );
526
+ ffi_lib :kernel32
527
+ attach_function_private :CreateDirectoryW,
528
+ [:lpcwstr, :pointer], :win32_bool
529
+
530
+ # https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectoryw
531
+ # BOOL RemoveDirectoryW(
532
+ # LPCWSTR lpPathName
533
+ # );
534
+ ffi_lib :kernel32
535
+ attach_function_private :RemoveDirectoryW,
536
+ [:lpcwstr], :win32_bool
537
+
538
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa363216(v=vs.85).aspx
539
+ # BOOL WINAPI DeviceIoControl(
540
+ # _In_ HANDLE hDevice,
541
+ # _In_ DWORD dwIoControlCode,
542
+ # _In_opt_ LPVOID lpInBuffer,
543
+ # _In_ DWORD nInBufferSize,
544
+ # _Out_opt_ LPVOID lpOutBuffer,
545
+ # _In_ DWORD nOutBufferSize,
546
+ # _Out_opt_ LPDWORD lpBytesReturned,
547
+ # _Inout_opt_ LPOVERLAPPED lpOverlapped
548
+ # );
549
+ ffi_lib :kernel32
550
+ attach_function_private :DeviceIoControl,
551
+ [:handle, :dword, :lpvoid, :dword, :lpvoid, :dword, :lpdword, :pointer], :win32_bool
552
+
553
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364980(v=vs.85).aspx
554
+ # DWORD WINAPI GetLongPathName(
555
+ # _In_ LPCTSTR lpszShortPath,
556
+ # _Out_ LPTSTR lpszLongPath,
557
+ # _In_ DWORD cchBuffer
558
+ # );
559
+ ffi_lib :kernel32
560
+ attach_function_private :GetLongPathNameW,
561
+ [:lpcwstr, :lpwstr, :dword], :dword
562
+
563
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364989(v=vs.85).aspx
564
+ # DWORD WINAPI GetShortPathName(
565
+ # _In_ LPCTSTR lpszLongPath,
566
+ # _Out_ LPTSTR lpszShortPath,
567
+ # _In_ DWORD cchBuffer
568
+ # );
569
+ ffi_lib :kernel32
570
+ attach_function_private :GetShortPathNameW,
571
+ [:lpcwstr, :lpwstr, :dword], :dword
572
+
573
+ # https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfullpathnamew
574
+ # DWORD GetFullPathNameW(
575
+ # LPCWSTR lpFileName,
576
+ # DWORD nBufferLength,
577
+ # LPWSTR lpBuffer,
578
+ # LPWSTR *lpFilePart
579
+ # );
580
+ ffi_lib :kernel32
581
+ attach_function_private :GetFullPathNameW,
582
+ [:lpcwstr, :dword, :lpwstr, :pointer], :dword
583
+
584
+ # https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetfolderpathw
585
+ # SHFOLDERAPI SHGetFolderPathW(
586
+ # HWND hwnd,
587
+ # int csidl,
588
+ # HANDLE hToken,
589
+ # DWORD dwFlags,
590
+ # LPWSTR pszPath
591
+ # );
592
+ ffi_lib :shell32
593
+ attach_function_private :SHGetFolderPathW,
594
+ [:hwnd, :int, :handle, :dword, :lpwstr], :dword
595
+
596
+ # https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetfolderlocation
597
+ # SHSTDAPI SHGetFolderLocation(
598
+ # HWND hwnd,
599
+ # int csidl,
600
+ # HANDLE hToken,
601
+ # DWORD dwFlags,
602
+ # PIDLIST_ABSOLUTE *ppidl
603
+ # );
604
+ ffi_lib :shell32
605
+ attach_function_private :SHGetFolderLocation,
606
+ [:hwnd, :int, :handle, :dword, :pointer], :dword
607
+
608
+ # https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shgetfileinfoa
609
+ # DWORD_PTR SHGetFileInfoA(
610
+ # LPCSTR pszPath,
611
+ # DWORD dwFileAttributes,
612
+ # SHFILEINFOA *psfi,
613
+ # UINT cbFileInfo,
614
+ # UINT uFlags
615
+ # );
616
+ ffi_lib :shell32
617
+ attach_function_private :SHGetFileInfo,
618
+ [:dword, :dword, :pointer, :uint, :uint], :dword
619
+
620
+ # https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/nf-shlwapi-pathisdirectoryemptyw
621
+ # BOOL PathIsDirectoryEmptyW(
622
+ # LPCWSTR pszPath
623
+ # );
624
+ ffi_lib :shlwapi
625
+ attach_function_private :PathIsDirectoryEmptyW,
626
+ [:lpcwstr], :win32_bool
627
+ end
628
+ end