Autorun on USB drives

Page 4 of 4 FirstFirst ... 234

  1. Posts : 19
    Windows 7
       #31

    No rush, thanks for checking this.
      My Computer


  2. Posts : 19
    Windows 7
       #32

    Fakeasdf, I'm wondering if you've had you a chance to check the Autorunner.exe program with an external hard drive. Thanks.
      My Computer


  3. Posts : 488
    Win 7 Pro x64 x 3, Win 7 Pro x86, Ubuntu 9.04
       #33

    Sorry, the holidays came and I was busy entertaining guests... I'll check it sometime tonight and let ya know..
      My Computer


  4. Posts : 488
    Win 7 Pro x64 x 3, Win 7 Pro x86, Ubuntu 9.04
       #34

    fakeasdf said:
    Sorry, the holidays came and I was busy entertaining guests... I'll check it sometime tonight and let ya know..

    Yeah, it turns out that the removable usb drives show up as fixed devices and not removable drives. I'll have it just check any attached drive that isn't a cd rom... Since someone might not want that, I'll leave the other exe...

    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
    using System.IO;
    using Microsoft.Win32;
    
    
    
    namespace Autorunner
    {
        public class RegKeysAndDrives
        {
            public RegistryKey basekey;
            public String subkey;
            public String driveLetter;
            public RegKeysAndDrives(RegistryKey _basekey, String _subkey, String _driveLetter)
            {
                basekey = _basekey;
                subkey = _subkey;
                driveLetter = _driveLetter;
            }
        }
    
        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            /// 
            public static List<RegKeysAndDrives> toDelete;
    
            [STAThread]
            static void Main()
            {
    
                //keep track of drives we've already ran, Must compare strings, DriveInfo only compares using the Object
                List<String> haveRun = new List<String>();
                toDelete = new List<RegKeysAndDrives>();
                while (true)
                {
                    //let's check every 2 seconds...  We don't want to slow down the machine!
                    System.Threading.Thread.Sleep(2000);
    
                    try
                    {
                        //Get current drives
                        DriveInfo[] drives = DriveInfo.GetDrives();
                        List<DriveInfo> curDrives = new List<DriveInfo>(drives);
    
                        //remove any drives from haverun that don't exist anymore
                        for (int i = 0; i < haveRun.Count; i++)
                        {
                            if (DriveInfoContains(curDrives, haveRun[i]) == false)
                            {
                                for (int j = 0; j < toDelete.Count; j++)
                                {
                                    if (toDelete[j].driveLetter == haveRun[i])
                                    {
                                        try
                                        {
                                            toDelete[j].basekey.DeleteSubKeyTree(toDelete[j].subkey);
                                        }
                                        catch (Exception ex)
                                        {
                                            //subkey doesn't exist anymore :P
                                        }
    
                                        toDelete.RemoveAt(j);
                                        j--;
                                    }
                                }
                                haveRun.RemoveAt(i);
                                i--;
                            }
                        }
    
                        //let's remove our haveRuns from drives, no point in checking them again...
                        for (int i = 0; i < curDrives.Count; i++)
                        {
                            if (haveRun.Contains(curDrives[i].RootDirectory.Name) == true)
                            {
                                curDrives.RemoveAt(i);
                                i--;
                            }
                        }
    
    
                        //Check any new Removable type drives, and run them...
                        foreach (DriveInfo drive in curDrives)
                        {
                            if (drive.DriveType != DriveType.CDRom)
                            {
                                if (drive.IsReady)
                                {
                                    try
                                    {
                                        AutoRunDrive(drive);
                                    }
                                    catch (Exception ex)
                                    {
                                        //I don't care if it crashes trying to launch it, let's just let it go...
                                    }
                                    haveRun.Add(drive.RootDirectory.Name);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        //Let's not crash if something gets unplugged while we're accessing it...
                    }
                }
    
            }
    
            private static bool DriveInfoContains(List<DriveInfo> curDrives, string haveRunDriveName)
            {
                foreach (DriveInfo di in curDrives)
                {
                    if (di.RootDirectory.Name == haveRunDriveName)
                        return true;
                }
                return false;
            }
    
            private static void AutoRunDrive(DriveInfo drive)
            {
                bool doAutoRun = false;
                String root = drive.RootDirectory.Name;
                String autorun = root + "autorun.inf";
                if (File.Exists(autorun))
                {
                    StreamReader sr = new StreamReader(autorun);
                    while (!sr.EndOfStream)
                    {
                        String line = sr.ReadLine();
                        if (line.ToLower().StartsWith("open"))
                        {
                            int idxEquals = line.IndexOf('=');
                            String toRun = root + line.Substring(idxEquals + 1);
    
                            //This isn't a good guess of where the args should be, but I don't care
                            int spaceArgs = toRun.IndexOf(' ');
                            String args = toRun.Substring(spaceArgs + 1);
                            args = FixArgs(args, root, toRun.ToLower().Contains("truecrypt"));
                            toRun = toRun.Substring(0, spaceArgs);
                            if (MessageBox.Show("Would you like to Autorun '" + toRun + " " + args + "'?", "Autorunner", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            {
                                System.Diagnostics.Process.Start(toRun, args);
                                doAutoRun = true;
                            }
                        }
                        else if (doAutoRun && line.ToLower().StartsWith("shell"))
                        {
                            int equalidx = line.IndexOf("=");
                            String keyName;
                            String subkey;
                            String value;
    
                            if (equalidx == -1)
                                continue;
    
                            keyName = line.Substring(5, equalidx - 5);
                            value = line.Substring(equalidx + 1);
    
                            if (keyName.Contains("command"))
                            {
                                value = root + value;
                            }
    
                            RegistryKey baseKey = Registry.CurrentUser;
                            subkey = "Software\\Classes\\Drive\\shell" + keyName;
                            RegistryKey key = baseKey.CreateSubKey(subkey);
                            key.SetValue("", value);
                            toDelete.Add(new RegKeysAndDrives(baseKey, subkey, root));
    
                        }
                    }
                    sr.Close();
                }
            }
    
            private static string FixArgs(string args, string root, bool isTrueCrypt)
            {
                if (isTrueCrypt)
                {
                    int idxv = args.IndexOf("/v");
                    int idxfile = args.IndexOf("\"", idxv);
                    return args.Substring(0, idxfile + 1) + root + args.Substring(idxfile + 1);
                }
                return args;
    
            }
        }
    }
      My Computer


  5. Posts : 19
    Windows 7
       #35

    Works great! Thanks so much.
      My Computer


  6. Posts : 4
    Windows 7 Ultimate x64
       #36

    Dismount


    Hi,

    There is any way to autodismount the volume previous to remove the USB, because it says the volume is in use.

    Thanks, Ariel
      My Computer


 
Page 4 of 4 FirstFirst ... 234

  Related Discussions
Our Sites
Site Links
About Us
Windows 7 Forums is an independent web site and has not been authorized, sponsored, or otherwise approved by Microsoft Corporation. "Windows 7" and related materials are trademarks of Microsoft Corp.

© Designer Media Ltd
All times are GMT -5. The time now is 06:32.
Find Us