/// <summary> /// Enumerates the shares on Windows 9x /// </summary> /// <param name="server">The server name</param> /// <param name="shares">The ShareCollection</param> protected static void EnumerateShares9X(string server, ShareCollection shares) { var level = 50; var t = typeof(ShareInfo50); var size = Marshal.SizeOf(t); var cbBuffer = (ushort)(MaxSi50Entries * size); //On Win9x, must allocate buffer before calling API var pBuffer = Marshal.AllocHGlobal(cbBuffer); try { ushort entriesRead; ushort totalEntries; var nRet = NetShareEnum(server, level, pBuffer, cbBuffer, out entriesRead, out totalEntries); if (ErrorWrongLevel == nRet) { level = 1; t = typeof(ShareInfo1_9X); size = Marshal.SizeOf(t); nRet = NetShareEnum(server, level, pBuffer, cbBuffer, out entriesRead, out totalEntries); } if (NoError == nRet || ErrorMoreData == nRet) { for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += size) { var pItem = new IntPtr(lpItem); if (1 == level) { var si = (ShareInfo1_9X)Marshal.PtrToStructure(pItem, t); shares.Add(si.NetName, string.Empty, si.ShareType, si.Remark); } else { var si = (ShareInfo50)Marshal.PtrToStructure(pItem, t); shares.Add(si.NetName, si.Path, si.ShareType, si.Remark); } } } else { Console.WriteLine(nRet); } } finally { //Clean up buffer Marshal.FreeHGlobal(pBuffer); } }
/// <summary> /// Enumerates the shares on Windows NT /// </summary> /// <param name="server">The server name</param> /// <param name="shares">The ShareCollection</param> protected static void EnumerateSharesNt(string server, ShareCollection shares) { var level = 2; var hResume = 0; var pBuffer = IntPtr.Zero; try { int entriesRead; int totalEntries; var nRet = NetShareEnum(server, level, out pBuffer, -1, out entriesRead, out totalEntries, ref hResume); if (ErrorAccessDenied == nRet) { //Need admin for level 2, drop to level 1 level = 1; nRet = NetShareEnum(server, level, out pBuffer, -1, out entriesRead, out totalEntries, ref hResume); } if (NoError == nRet && entriesRead > 0) { var t = 2 == level ? typeof(ShareInfo2) : typeof(ShareInfo1); var offset = Marshal.SizeOf(t); for (int i = 0, lpItem = pBuffer.ToInt32(); i < entriesRead; i++, lpItem += offset) { var pItem = new IntPtr(lpItem); if (1 == level) { var si = (ShareInfo1)Marshal.PtrToStructure(pItem, t); shares.Add(si.NetName, string.Empty, si.ShareType, si.Remark); } else { var si = (ShareInfo2)Marshal.PtrToStructure(pItem, t); shares.Add(si.NetName, si.Path, si.ShareType, si.Remark); } } } } finally { // Clean up buffer allocated by system if (IntPtr.Zero != pBuffer) { NetApiBufferFree(pBuffer); } } }