    # File lib/chef/win32/security.rb, line 345
          def self.make_absolute_sd(security_descriptor)
            security_descriptor = security_descriptor.pointer if security_descriptor.respond_to?(:pointer)

            # Figure out buffer sizes
            absolute_sd_size = FFI::Buffer.new(:long).write_long(0)
            dacl_size = FFI::Buffer.new(:long).write_long(0)
            sacl_size = FFI::Buffer.new(:long).write_long(0)
            owner_size = FFI::Buffer.new(:long).write_long(0)
            group_size = FFI::Buffer.new(:long).write_long(0)
            if MakeAbsoluteSD(security_descriptor, nil, absolute_sd_size, nil, dacl_size, nil, sacl_size, nil, owner_size, nil, group_size)
              raise "Expected ERROR_INSUFFICIENT_BUFFER from MakeAbsoluteSD, and got no error!"
            elsif Chef::ReservedNames::Win32::Error.get_last_error != ERROR_INSUFFICIENT_BUFFER
              Chef::ReservedNames::Win32::Error.raise!
            end

            absolute_sd = FFI::MemoryPointer.new absolute_sd_size.read_long
            owner = FFI::MemoryPointer.new owner_size.read_long
            group = FFI::MemoryPointer.new group_size.read_long
            dacl = FFI::MemoryPointer.new dacl_size.read_long
            sacl = FFI::MemoryPointer.new sacl_size.read_long
            unless MakeAbsoluteSD(security_descriptor, absolute_sd, absolute_sd_size, dacl, dacl_size, sacl, sacl_size, owner, owner_size, group, group_size)
              Chef::ReservedNames::Win32::Error.raise!
            end

            [ SecurityDescriptor.new(absolute_sd), SID.new(owner), SID.new(group), ACL.new(dacl), ACL.new(sacl) ]
          end