376 lines
15 KiB
C#
376 lines
15 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: CarotDAV.NetDriveManager
|
|
// Assembly: CarotDAV, Version=1.13.2.18337, Culture=neutral, PublicKeyToken=null
|
|
// MVID: C31F2651-A4A8-4D09-916A-8C6106F5E7C8
|
|
// Assembly location: F:\Eigene Dateien\Dropbox\portable Collection\Progs\CarotDAV\CarotDAV.exe
|
|
|
|
using Microsoft.VisualBasic;
|
|
using Microsoft.VisualBasic.CompilerServices;
|
|
using Microsoft.Win32;
|
|
using System;
|
|
using System.ComponentModel;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace CarotDAV
|
|
{
|
|
public class NetDriveManager
|
|
{
|
|
private const uint SHGFI_ICON = 256;
|
|
private const uint SHGFI_LARGEICON = 0;
|
|
private const uint SHGFI_SMALLICON = 1;
|
|
private const uint SHGFI_ICONLOCATION = 4096;
|
|
public const string WebClientParameterRegPath = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters";
|
|
public const string WebClientFileSizeLimitRegKey = "FileSizeLimitInBytes";
|
|
public const int CONNECT_UPDATE_PROFILE = 1;
|
|
public const int NO_ERROR = 0;
|
|
public const int ERROR_ACCESS_DENIED = 5;
|
|
public const int ERROR_ALREADY_ASSIGNED = 85;
|
|
public const int ERROR_BAD_DEV_TYPE = 66;
|
|
public const int ERROR_BAD_DEVICE = 1200;
|
|
public const int ERROR_BAD_NET_NAME = 67;
|
|
public const int ERROR_BAD_NETPATH = 53;
|
|
public const int ERROR_BAD_PROFILE = 1206;
|
|
public const int ERROR_BAD_PROVIDER = 1204;
|
|
public const int ERROR_BUSY = 170;
|
|
public const int ERROR_CANCELLED = 1223;
|
|
public const int ERROR_CANNOT_OPEN_PROFILE = 1205;
|
|
public const int ERROR_DEVICE_ALREADY_REMEMBERED = 1202;
|
|
public const int ERROR_EXTENDED_ERROR = 1208;
|
|
public const int ERROR_INVALID_PASSWORD = 86;
|
|
public const int ERROR_NO_NET_OR_BAD_PATH = 1203;
|
|
public const int ERROR_NOT_CONNECTED = 2250;
|
|
private const int ssfNETHOOD = 19;
|
|
|
|
[DllImport("shell32.dll")]
|
|
private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref NetDriveManager.SHFILEINFO psfi, int cbSizeFileInfo, uint uFlags);
|
|
|
|
[DllImport("Shell32.dll")]
|
|
private static extern void SHUpdateImage(string pszHashItem, int iIndex, int uFlags, int iImageIndex);
|
|
|
|
[DllImport("user32.dll", SetLastError = true)]
|
|
private static extern bool DestroyIcon(IntPtr hIcon);
|
|
|
|
[DllImport("mpr.dll")]
|
|
private static extern int WNetAddConnection2(ref NetDriveManager.NETRESOURCE netResource, string password, string Username, int Flag);
|
|
|
|
[DllImport("mpr.dll")]
|
|
private static extern int WNetAddConnection3(IntPtr hwnd, ref NetDriveManager.NETRESOURCE netResource, string password, string Username, int Flag);
|
|
|
|
[DllImport("mpr.dll")]
|
|
private static extern int WNetGetConnection(string localName, StringBuilder remoteName, ref int length);
|
|
|
|
[DllImport("mpr.dll")]
|
|
private static extern int WNetCancelConnection2(string lpName, int dwFlags, bool fForce);
|
|
|
|
public static void MountDrive(char letter, string unc, string name, string iconpath, int index)
|
|
{
|
|
var v0 = new NetDriveManager.NETRESOURCE()
|
|
{
|
|
dwType = NetDriveManager.ResourceType.Disk,
|
|
lpLocalName = Conversions.ToString(letter) + ":",
|
|
lpRemoteName = unc,
|
|
lpProvider = (string) null
|
|
};
|
|
|
|
int num = NetDriveManager.WNetAddConnection2(ref v0, "", "", 0);
|
|
if (num != 0)
|
|
throw new Exception(num.ToString());
|
|
Registry.SetValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MountPoints2\\" + unc.Replace("\\", "#"), "_LabelFromReg", (object) name);
|
|
NetDriveManager.SHFILEINFO psfi = new NetDriveManager.SHFILEINFO();
|
|
IntPtr fileInfo = NetDriveManager.SHGetFileInfo(Conversions.ToString(letter) + ":", 0U, ref psfi, Marshal.SizeOf((object) psfi), 4096U);
|
|
string str = "";
|
|
int iIcon1=0;
|
|
int iIcon2=0;
|
|
if (fileInfo != IntPtr.Zero)
|
|
{
|
|
str = psfi.szDisplayName;
|
|
iIcon1 = psfi.iIcon;
|
|
if (NetDriveManager.SHGetFileInfo(Conversions.ToString(letter) + ":", 0U, ref psfi, Marshal.SizeOf((object) psfi), 256U) != IntPtr.Zero)
|
|
{
|
|
iIcon2 = psfi.iIcon;
|
|
NetDriveManager.DestroyIcon(psfi.hIcon);
|
|
}
|
|
}
|
|
Registry.SetValue("HKEY_CURRENT_USER\\Software\\Classes\\Applications\\Explorer.exe\\Drives\\" + Conversions.ToString(letter) + "\\DefaultIcon", (string) null, (object) (iconpath + "," + index.ToString()));
|
|
if (Operators.CompareString(str, "", false) == 0)
|
|
return;
|
|
NetDriveManager.SHUpdateImage(str, iIcon1, 0, iIcon2);
|
|
}
|
|
|
|
public static void UnmountDrive(char letter)
|
|
{
|
|
string str = "";
|
|
int iIcon1=0;
|
|
int iIcon2=0;
|
|
try
|
|
{
|
|
NetDriveManager.SHFILEINFO psfi = new NetDriveManager.SHFILEINFO();
|
|
if (NetDriveManager.SHGetFileInfo(Conversions.ToString(letter) + ":", 0U, ref psfi, Marshal.SizeOf((object) psfi), 4096U) != IntPtr.Zero)
|
|
{
|
|
str = psfi.szDisplayName;
|
|
iIcon1 = psfi.iIcon;
|
|
if (NetDriveManager.SHGetFileInfo(Conversions.ToString(letter) + ":", 0U, ref psfi, Marshal.SizeOf((object) psfi), 256U) != IntPtr.Zero)
|
|
{
|
|
iIcon2 = psfi.iIcon;
|
|
NetDriveManager.DestroyIcon(psfi.hIcon);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ProjectData.SetProjectError(ex);
|
|
ProjectData.ClearProjectError();
|
|
}
|
|
NetDriveManager.WNetCancelConnection2(Conversions.ToString(letter) + ":", 0, true);
|
|
try
|
|
{
|
|
Registry.CurrentUser.DeleteSubKeyTree("Software\\Classes\\Applications\\Explorer.exe\\Drives\\" + Conversions.ToString(letter));
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ProjectData.SetProjectError(ex);
|
|
ProjectData.ClearProjectError();
|
|
}
|
|
try
|
|
{
|
|
if (Operators.CompareString(str, "", false) == 0)
|
|
return;
|
|
NetDriveManager.SHUpdateImage(str, iIcon1, 0, iIcon2);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ProjectData.SetProjectError(ex);
|
|
ProjectData.ClearProjectError();
|
|
}
|
|
}
|
|
|
|
public static void MapFolder(string unc, string name, string iconpath, int iconindex)
|
|
{
|
|
try
|
|
{
|
|
object objectValue1 = RuntimeHelpers.GetObjectValue(Interaction.CreateObject("WScript.Shell", ""));
|
|
System.Type typeFromProgId = System.Type.GetTypeFromProgID("Shell.Application");
|
|
object objectValue2 = RuntimeHelpers.GetObjectValue(Activator.CreateInstance(typeFromProgId));
|
|
object objectValue3 = RuntimeHelpers.GetObjectValue(typeFromProgId.InvokeMember("Namespace", BindingFlags.InvokeMethod, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue2), new object[1]
|
|
{
|
|
(object) 19
|
|
}));
|
|
object objectValue4 = RuntimeHelpers.GetObjectValue(objectValue3.GetType().InvokeMember("Self", BindingFlags.GetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue3), (object[]) null));
|
|
string str = objectValue4.GetType().InvokeMember("Path", BindingFlags.GetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue4), new object[0]).ToString();
|
|
DirectoryInfo directoryInfo = new DirectoryInfo(str + "\\" + name);
|
|
if (directoryInfo.Exists)
|
|
{
|
|
directoryInfo.Attributes = FileAttributes.Directory;
|
|
directoryInfo.Delete(true);
|
|
}
|
|
directoryInfo.Create();
|
|
object objectValue5 = RuntimeHelpers.GetObjectValue(objectValue1.GetType().InvokeMember("CreateShortcut", BindingFlags.InvokeMethod, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue1), new object[1]
|
|
{
|
|
(object) (str + "\\" + name + "\\target.lnk")
|
|
}));
|
|
objectValue5.GetType().InvokeMember("TargetPath", BindingFlags.SetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue5), new object[1]
|
|
{
|
|
(object) unc
|
|
});
|
|
objectValue5.GetType().InvokeMember("IconLocation", BindingFlags.SetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue5), new object[1]
|
|
{
|
|
(object) (iconpath + "," + iconindex.ToString())
|
|
});
|
|
objectValue5.GetType().InvokeMember("Save", BindingFlags.InvokeMethod, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue5), new object[0]);
|
|
FileInfo fileInfo = new FileInfo(str + "\\" + name + "\\desktop.ini");
|
|
using (StreamWriter streamWriter = new StreamWriter((Stream) fileInfo.Create()))
|
|
{
|
|
streamWriter.WriteLine("[.ShellClassInfo]");
|
|
streamWriter.WriteLine("CLSID2={0AFACED1-E828-11D1-9187-B532F1E9575D}");
|
|
streamWriter.WriteLine("Flags=2");
|
|
streamWriter.WriteLine("IconFile=" + iconpath);
|
|
streamWriter.WriteLine("IconIndex=" + Conversions.ToString(iconindex));
|
|
streamWriter.WriteLine("IconResource=" + iconpath + "," + Conversions.ToString(iconindex));
|
|
}
|
|
fileInfo.Attributes = FileAttributes.Hidden | FileAttributes.System;
|
|
directoryInfo.Attributes = FileAttributes.ReadOnly | FileAttributes.NotContentIndexed;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ProjectData.SetProjectError(ex);
|
|
int num = (int) MessageBox.Show(ex.ToString());
|
|
ProjectData.ClearProjectError();
|
|
}
|
|
}
|
|
|
|
public static void UnmapFolder(string name)
|
|
{
|
|
try
|
|
{
|
|
RuntimeHelpers.GetObjectValue(Interaction.CreateObject("WScript.Shell", ""));
|
|
System.Type typeFromProgId = System.Type.GetTypeFromProgID("Shell.Application");
|
|
object objectValue1 = RuntimeHelpers.GetObjectValue(Activator.CreateInstance(typeFromProgId));
|
|
object objectValue2 = RuntimeHelpers.GetObjectValue(typeFromProgId.InvokeMember("Namespace", BindingFlags.InvokeMethod, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue1), new object[1]
|
|
{
|
|
(object) 19
|
|
}));
|
|
object objectValue3 = RuntimeHelpers.GetObjectValue(objectValue2.GetType().InvokeMember("Self", BindingFlags.GetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue2), (object[]) null));
|
|
DirectoryInfo directoryInfo = new DirectoryInfo(objectValue3.GetType().InvokeMember("Path", BindingFlags.GetProperty, (Binder) null, RuntimeHelpers.GetObjectValue(objectValue3), new object[0]).ToString() + "\\" + name);
|
|
if (!directoryInfo.Exists)
|
|
return;
|
|
directoryInfo.Attributes = FileAttributes.Directory;
|
|
directoryInfo.Delete(true);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ProjectData.SetProjectError(ex);
|
|
ProjectData.ClearProjectError();
|
|
}
|
|
}
|
|
|
|
public static char FindMountedDriveLetter(string unc)
|
|
{
|
|
DriveInfo[] drives = DriveInfo.GetDrives();
|
|
int index = 0;
|
|
while (index < drives.Length)
|
|
{
|
|
DriveInfo driveInfo = drives[index];
|
|
if (driveInfo.DriveType == DriveType.Network)
|
|
{
|
|
StringBuilder stringBuilder1 = new StringBuilder(4096);
|
|
string localName = Conversions.ToString(driveInfo.Name[0]) + ":";
|
|
StringBuilder remoteName = stringBuilder1;
|
|
StringBuilder stringBuilder2 = stringBuilder1;
|
|
int capacity = stringBuilder2.Capacity;
|
|
int connection = NetDriveManager.WNetGetConnection(localName, remoteName, ref capacity);
|
|
stringBuilder2.Capacity = capacity;
|
|
if (connection == 0 && Operators.CompareString(stringBuilder1.ToString(), unc, false) == 0)
|
|
return driveInfo.Name[0];
|
|
}
|
|
checked { ++index; }
|
|
}
|
|
return char.MinValue;
|
|
}
|
|
|
|
public static long ReadMaxFileSize()
|
|
{
|
|
int integer = Conversions.ToInteger(Registry.GetValue("HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters", "FileSizeLimitInBytes", (object) 50000000));
|
|
if (integer < 0)
|
|
return checked (4294967296L + (long) integer);
|
|
return (long) integer;
|
|
}
|
|
|
|
public static void WriteMaxFileSize(long size, IntPtr hwnd)
|
|
{
|
|
ProcessStartInfo startInfo = new ProcessStartInfo();
|
|
startInfo.UseShellExecute = true;
|
|
startInfo.FileName = "reg.exe";
|
|
startInfo.Verb = "runas";
|
|
startInfo.Arguments = "add HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters /v FileSizeLimitInBytes /t REG_DWORD /d " + size.ToString() + " /f";
|
|
startInfo.ErrorDialog = true;
|
|
startInfo.ErrorDialogParentHandle = hwnd;
|
|
startInfo.CreateNoWindow = true;
|
|
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
try
|
|
{
|
|
Process.Start(startInfo).WaitForExit();
|
|
}
|
|
catch (Win32Exception ex)
|
|
{
|
|
ProjectData.SetProjectError((Exception) ex);
|
|
ProjectData.ClearProjectError();
|
|
}
|
|
}
|
|
|
|
public static void RebootWebClient(IntPtr hwnd)
|
|
{
|
|
ProcessStartInfo startInfo = new ProcessStartInfo();
|
|
startInfo.UseShellExecute = true;
|
|
startInfo.FileName = Environment.GetEnvironmentVariable("ComSpec");
|
|
startInfo.Verb = "runas";
|
|
startInfo.ErrorDialog = true;
|
|
startInfo.ErrorDialogParentHandle = hwnd;
|
|
startInfo.CreateNoWindow = true;
|
|
startInfo.Arguments = "/c net stop webclient & net stop mrxdav & net start mrxdav & net start webclient & pause";
|
|
try
|
|
{
|
|
Process.Start(startInfo).WaitForExit();
|
|
}
|
|
catch (Win32Exception ex)
|
|
{
|
|
ProjectData.SetProjectError((Exception) ex);
|
|
ProjectData.ClearProjectError();
|
|
}
|
|
}
|
|
|
|
private struct SHFILEINFO
|
|
{
|
|
public IntPtr hIcon;
|
|
public int iIcon;
|
|
public uint dwAttributes;
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
|
|
public string szDisplayName;
|
|
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
|
|
public string szTypeName;
|
|
}
|
|
|
|
public struct NETRESOURCE
|
|
{
|
|
public NetDriveManager.ResourceScope dwScope;
|
|
public NetDriveManager.ResourceType dwType;
|
|
public NetDriveManager.ResourceDisplayType dwDisplayType;
|
|
public NetDriveManager.ResourceUsage dwUsage;
|
|
public string lpLocalName;
|
|
public string lpRemoteName;
|
|
public string lpComment;
|
|
public string lpProvider;
|
|
}
|
|
|
|
public enum ResourceScope : uint
|
|
{
|
|
Connected = 1,
|
|
GlobalNet = 2,
|
|
Remembered = 3,
|
|
Recent = 4,
|
|
Context = 5,
|
|
}
|
|
|
|
public enum ResourceType : uint
|
|
{
|
|
Any = 0,
|
|
Disk = 1,
|
|
Print = 2,
|
|
Reserved = 8,
|
|
Unknown = 4294967295,
|
|
}
|
|
|
|
public enum ResourceDisplayType : uint
|
|
{
|
|
Generic,
|
|
Domaim,
|
|
Server,
|
|
Share,
|
|
File,
|
|
Group,
|
|
Network,
|
|
Root,
|
|
ShareAdmin,
|
|
Directory,
|
|
Tree,
|
|
NDSContainer,
|
|
}
|
|
|
|
public enum ResourceUsage : uint
|
|
{
|
|
Connectable = 1,
|
|
Container = 2,
|
|
NoLocalDevice = 4,
|
|
Sibling = 8,
|
|
Attached = 16,
|
|
All = 19,
|
|
Reserved = 2147483648,
|
|
}
|
|
}
|
|
}
|