(PUP-839) Add read_word alias to FFI::Pointer
(PUP-839) Add missing &block params to Security
(PUP-839) Remove windows/handle from Security

 - Use shared Use FFI::WIN32.CloseHandle method
 - Make explicit that open_file returns nil, where it was previously
   returning the exit code from CloseHandle
(PUP-839) FFI with_process_token to Process class

 - Refactor with_process_token, moving it into Process class and
   using FFI in the process.  Additionally return nil since there is
   nothing else to return
 - Add deprecation warning for existing with_process_token
(PUP-839) FFI Puppet::Util::Windows::Security vol

 - Remove windows-pr volume class mixin, and implement
   GetVolumeInformaitonW with FFI.  Use closure to capture supported
   value inside of a MemoryPointer release block. Fix minor bug where
   the bitwise check was not comparing against test value, but 0.
 - Requires wide_string from Puppet::Util::Windows::String and
   a constant from Windows::File
(PUP-839) FFI Util::Windows::Security / ::File

 - Remove windows-pr file class mixin for Windows::File and implement
   CreateFileW in Security.
 - Note that open_file overlaps with create_file in file.rb
 - Add FFI GetFileAttributes and SetFileAttributes to File module
 - Move all file attribute related calls out of the Security module and
   into the File module, including get_attributes, add_attributes,
   remove_attributes and set_attributes.  Add corresponding deprecation
   notices.
 - Add a top level FILE alias for Puppet::Util::Windows::File and
   use that to make calls to the APIs / constants in File.
 - File must be included prior to Security to use these constants.
(PUP-839) FFI Windows::Util::Security.set_privilege

 - Don't call LookupPrivilegeValue directly anymore, instead call
   Puppet::Util::Windows::Process.lookup_privilege_value which has
   already been FFI'd.  Use FFI structs for LUID_AND_ATTRIBUTES and
   TOKEN_PRIVILEGES
 - Ensure that set_privilege has a well-defined return value of true
   when it succeeds, or raises otherwise.
 - Remove TOKEN_QUERY privilege since AdjustTokenPrivileges is not
   filling in a buffer with existing LUID information.
(PUP-839) FFI AddAccessAllowedAceEx

 - FFI calls made to AddAccessAllowedAceEx and AddAccessDeniedAceEx and
   properly verify their return codes against FFI::WIN32_FALSE.
   Further, return nil explicitly when not raising.
 - Update call site in set_security_descriptor accordingly, using and
   freeing a FFI::MemoryPointer for the ACL.
(PUP-839) FFI Util::Windows::Security.IsValidAcl

 - Replace existing calls to IsValidAcl with FFI'd versions, and
   properly handle exit codes
(PUP-839) FFI Util::Windows::Security.InitializeAcl
(PUP-839) Remove windows/memory reference

 - Puppet::Util::Windows::Security was only referring to the LocalFree
   Win32 function, so use FFI::Pointer helper read_win32_local_pointer
   to automatically perform memory management on the data returned by
   the GetSecurityInfo API.
(PUP-839) FFI Util::Windows::Security::parse_dacl

 - Previously parse_dacl did some byte manipulation that would have
   likely caused errors in x64.  It also used a GetAce API definition
   that was not FFI'd and therefore would have had incorrect pointer
   lengths on x64.  parse_dacl now accepts an FFI::Pointer as a param
   rather than an address.
 - New FFI structs have been created for ACE, ACE_HEADER and ACL
   that make casting memory addresses much simpler to reason about.
 - An extraneous call to IsValidSid was removed and the code flow was
   refactored to return sooner in unsupported / failure cases.
(PUP-839) Share AccessControlEntry constants

 - Don't rely on the mixin constants from Windows::Security, share
   Puppet::Util::Windows::AccessControlEntry constants
(PUP-839) Windows::Security Constants

 - Move Windows::Security constants directly into
   Puppet::Util::Windows::Security, in preparation for removing
   the gem dependency
(PUP-839) FFI Security.set_security_descriptor

 - Previously SetSecurityDescriptor was using a reference to the API
   definition in windows/security, but has now been replaced with FFI.
 - Define the SE_OBJECT_TYPE enum to be passed to SetSecurityInfo
 - Rather than hardcoding the buffer size for the DACL to 1024, provide
   a calculation to determine the maximum size up-front based on the
   number of ACEs in the security descriptor.  This will at least
   guarantee that the memory buffer is never too small, which could have
   been an issue with the existing code.  Note that a more correct
   method would be to translate each SID in the DACL up-front to a
   sid_ptr, and to tally up the size of the SIDs.
 - Since only ACCESS_DENIED_ACE and ACCESS_ALLOWED_ACE are added to the
   DACL, use that struct size in the calculation by referring to number
   of bytes leading up to the :SidStart member of the GENERIC_ACCESS_ACE
   struct.
(PUP-839) FFI Security.get_security_descriptor

 - Previously GetSecurityDescriptor was using a reference to the API
   definition in windows/security, but has now been replaced with FFI.
 - Properly use block form for FFI::MemoryPointer to release any
   unmanaged memory immediately after use
(PUP-839) Remove Windows::Security

 - Sayonara gem and all the cruft that its mixing in
(PUP-839) Remove SID mixin from Security

 - SID methods can really standalone on their own, and
   should for the sake of sanity / code maintenance.  Adjust all
   callsites (including specs) accordingly.
 - Make SID methods into static module_functions since they're
   already stateless
(PUP-839) Deprecations for Security SID methods

 - Make sure any consumers relying on these methods have warnings,
   so that we can rip these out in Puppet 4
Merge pull request #2776 from Iristyle/ticket/master/PUP-839-FFI-Windows-Security

(PUP-839) FFI Puppet::Util::Windows::Security