CarotDav_decompile/CarotDAV/NetDriveManager.cs

374 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)
{
int num = NetDriveManager.WNetAddConnection2(ref new NetDriveManager.NETRESOURCE()
{
dwType = NetDriveManager.ResourceType.Disk,
lpLocalName = Conversions.ToString(letter) + ":",
lpRemoteName = unc,
lpProvider = (string) null
}, "", "", 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;
int iIcon2;
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;
int iIcon2;
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,
}
}
}