private static unsafe Win32Native.SECURITY_ATTRIBUTES GetSecAttrs(FileShare share, FileSecurity fileSecurity, out object pinningHandle) { pinningHandle = null; Win32Native.SECURITY_ATTRIBUTES structure = null; if (((share & FileShare.Inheritable) != FileShare.None) || (fileSecurity != null)) { structure = new Win32Native.SECURITY_ATTRIBUTES { nLength = Marshal.SizeOf(structure) }; if ((share & FileShare.Inheritable) != FileShare.None) { structure.bInheritHandle = 1; } if (fileSecurity == null) { return structure; } byte[] securityDescriptorBinaryForm = fileSecurity.GetSecurityDescriptorBinaryForm(); pinningHandle = GCHandle.Alloc(securityDescriptorBinaryForm, GCHandleType.Pinned); fixed (byte* numRef = securityDescriptorBinaryForm) { structure.pSecurityDescriptor = numRef; } } return structure; }
// If pinningHandle is not null, caller must free it AFTER the call to // CreateFile has returned. // // [....]: Copied this from System.IO.FileStream // private static unsafe SECURITY_ATTRIBUTES GetSecAttrs( FileShare share, FileSecurity fileSecurity, out object pinningHandle) { pinningHandle = null; SECURITY_ATTRIBUTES secAttrs = null; if ((share & FileShare.Inheritable) != 0 || fileSecurity != null) { secAttrs = new SECURITY_ATTRIBUTES(); secAttrs.nLength = (int)Marshal.SizeOf(secAttrs); if ((share & FileShare.Inheritable) != 0) { secAttrs.bInheritHandle = 1; } // For ACLs, get the security descriptor from the FileSecurity. if (fileSecurity != null) { byte[] sd = fileSecurity.GetSecurityDescriptorBinaryForm(); pinningHandle = GCHandle.Alloc(sd, GCHandleType.Pinned); fixed (byte* pSecDescriptor = sd) secAttrs.pSecurityDescriptor = pSecDescriptor; } } return secAttrs; }