Forum: Ruby Win32API struct member help

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Aee77dba395ece0a04c688b05b07cd63?d=identicon&s=25 Daniel Berger (Guest)
on 2006-03-18 07:14
(Received via mailing list)
Hi all,

I'm trying to figure out how to get the acl attributes of a simple text
file, and I need a little help getting data out of a struct.
Specifically, I need to get the AceCount from an access control list
(ACL struct) after a call to GetSecurityDescriptorDacl().  Here's what
I've got so far:

require 'Win32API'

GetFileSecurity =
   Win32API.new('advapi32', 'GetFileSecurity', 'PLPLP', 'I')

GetSecurityDescriptorControl =
   Win32API.new('advapi32', 'GetSecurityDescriptorControl', 'PPP', 'I')

GetSecurityDescriptorDacl =
   Win32API.new('advapi32', 'GetSecurityDescriptorDacl', 'PPPP', 'I')

file = 'test.txt' # nothing special about this file

current_length = 0
length_needed  = [1].pack('L')
sec_buf = '' # 0 length string

loop do
   bool = GetFileSecurity.call(
      file,
      DACL_SECURITY_INFORMATION,
      sec_buf,
      sec_buf.length,
      length_needed
   )

   if bool == 0 && GetLastError.call != 122
      raise ArgumentError, 'GetFileSecurity failed'
   end

   break if sec_buf.length >= length_needed.unpack('L').first
   sec_buf += ' ' * length_needed.unpack("L").first
end

control  = [0].pack('L')
revision = [0].pack('L')

if GetSecurityDescriptorControl.call(sec_buf, control, revision) == 0
   raise ArgumentError, 'GetSecurityDescriptorControl failed'
end

# No DACL exists
if (control.unpack('L').first & 4) == 0
   raise ArgumentError, 'No DACL present: explicit deny all'
end

dacl_present   = [0].pack('L')
dacl_defaulted = [0].pack('L')

acl_ptr = [0].pack('L') # what should this be?

val = GetSecurityDescriptorDacl.call(
   sec_buf,
   dacl_present,
   acl_ptr,
   dacl_defaulted
)

if val == 0
   raise ArgumentError, 'GetSecurityDescriptorDacl failed'
end

p acl_ptr.unpack('CCSSS') # [228, 50, 632, nil, nil]

I was expecting 4 for the 4th attribute (AceCount).  I tried changing
the initial value of acl_ptr to [0,0,0,0,0].pack('CCSSS') but that
didn't help.  What did I do wrong?

For more on ACL structures:

http://msdn.microsoft.com/library/default.asp?url=...

Thanks,

Dan
This topic is locked and can not be replied to.