Occasionally I'm getting a nasty error here saying that I've been doing something naughty with the API calls. The error comes after I get the SID length and Marshal.Copy the scruct into managed memory. The error is actually on the Marshal.Copy line. Am I missing the closing of a handle here? What's going on?! It's also randomly giving error 87(commented in the bottom) when the SID copy does bad things and doesn't crash. These issues are definitely related. Any help?
public static Shares GetRemoteShares(string ip_address, string username, string password)
{
var shares = new Shares();
var entriesread = 0;
var totalentries = 0;
var resume_handle = 0;
var n_struct_size = Marshal.SizeOf(typeof(SHARE_INFO_502));
var share_buf_ptr = IntPtr.Zero;
var server = new StringBuilder(ip_address);
Int32 share_enum_ret;
do
{
share_enum_ret =
PInvoke.NetShareEnum(server, 502, ref share_buf_ptr, 0xFFFFFFFF,
ref entriesread, ref totalentries, ref resume_handle);
for (var i = 0; i < entriesread; ++i)
{
var share_info =
(SHARE_INFO_502)Marshal.PtrToStructure(share_buf_ptr + n_struct_size * i,
typeof(SHARE_INFO_502));
if (share_info.shi502_type != SHARE_TYPE.STYPE_DISKTREE &&
share_info.shi502_type != SHARE_TYPE.STYPE_SPECIAL) continue;
var share_permissions = GetSharePermissions(share_info, ip_address);
var ntfs_permissions = GetNTFSPermissions(share_info, ip_address, username, password);
shares.Add(new Share(share_info.shi502_netname,
share_info.shi502_path, ntfs_permissions, share_permissions));
}
} while (share_enum_ret == PInvoke.ERROR_MORE_DATA);
PInvoke.NetApiBufferFree(share_buf_ptr);
return shares;
}
[EDIT]
[DllImport("Netapi32.dll", CharSet = CharSet.Unicode)]
public static extern int NetShareEnum(
StringBuilder server_name,
int level,
ref IntPtr buf_ptr,
uint prefmaxlen,
ref int entriesread,
ref int totalentries,
ref int resume_handle
);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SHARE_INFO_502
{
public string shi502_netname;
[MarshalAs(UnmanagedType.U4)]
public SHARE_TYPE shi502_type;
public string shi502_remark;
[MarshalAs(UnmanagedType.U4)]
public int shi502_permissions;
[MarshalAs(UnmanagedType.U4)]
public int shi502_max_uses;
[MarshalAs(UnmanagedType.U4)]
public int shi502_current_uses;
public string shi502_path;
public string shi502_passwd;
[MarshalAs(UnmanagedType.U4)]
public int shi502_reserved;
public IntPtr shi502_security_descriptor;
}
public static Shares GetRemoteShares(string ip_address, string username, string password)
{
var shares = new Shares();
var entriesread = 0;
var totalentries = 0;
var resume_handle = 0;
var n_struct_size = Marshal.SizeOf(typeof(SHARE_INFO_502));
var share_buf_ptr = IntPtr.Zero;
var server = new StringBuilder(ip_address);
Int32 share_enum_ret;
do
{
share_enum_ret =
PInvoke.NetShareEnum(server, 502, ref share_buf_ptr,
0xFFFFFFFF, ref entriesread, ref totalentries, ref resume_handle);
for (var i = 0; i < entriesread; ++i)
{
var share_info =
(SHARE_INFO_502)Marshal.PtrToStructure(share_buf_ptr +
n_struct_size * i, typeof(SHARE_INFO_502));
if (share_info.shi502_type != SHARE_TYPE.STYPE_DISKTREE &&
share_info.shi502_type != SHARE_TYPE.STYPE_SPECIAL) continue;
var share_permissions = GetSharePermissions(share_info, ip_address);
var ntfs_permissions = GetNTFSPermissions(share_info, ip_address, username, password);
shares.Add(new Share(share_info.shi502_netname,
share_info.shi502_path, ntfs_permissions, share_permissions));
}
} while (share_enum_ret == PInvoke.ERROR_MORE_DATA);
PInvoke.NetApiBufferFree(share_buf_ptr);
return shares;
}