2014-12-28 2 views
2

Итак, я уверен, что это было задано раньше, но я не могу правильно сформулировать проблему правильно, чтобы получить какой-либо ответ.Redirect Filesystem

Что я пытаюсь сделать, это запустить приложение через C#, а затем все его вызовы на SHGetFolderPath или Environment.GetFolder (int .net) вернуть обратно альтернативные пути, которые я указываю.

Я попытался уже установить USERPROFILE в качестве примера, используя ProcessStartInfo.EnvironmentalVariables для некоторых произвольных каталогов, но это не сработало. Он установил переменную окружения USERPROFILE на правильное значение, но вызов SHGetFolderPath или Environment.GetFolder по-прежнему возвращает предыдущее значение.

Любые идеи о том, как я могу получить весь путь туда?

Вот тест приложение, которое я написал для этого

class Program 
{ 
    static void Main(string[] args) 
    { 
     if (args.Any(x => x.Contains("x"))) 
     { 
      // Read vars 
      Console.WriteLine("a=" + Environment.GetEnvironmentVariable("a"));// a=tacos 
      Console.WriteLine("USERPROFILE=" + Environment.GetEnvironmentVariable("USERPROFILE")); //USERPROFILE=F:\UP 
      Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)); // C:\Users\Username 
      Console.WriteLine(); 
      var allvars = Environment.GetEnvironmentVariables(); 
      foreach (var key in allvars.Keys) 
      { 
       Console.WriteLine("{0} - {1}", key, allvars[key]); 
      } 
      Console.WriteLine("Done Second Process"); 
     } 
     else 
     { 
      // Start new process 
      var proc = new System.Diagnostics.ProcessStartInfo(Assembly.GetEntryAssembly().Location); 
      proc.Arguments = "x"; 
      proc.EnvironmentVariables["a"] = "tacos"; 
      proc.EnvironmentVariables["USERPROFILE"] = @"F:\UP"; 
      proc.UseShellExecute = false; 
      proc.RedirectStandardInput = true; 
      proc.RedirectStandardOutput = true; 
      proc.RedirectStandardError = true; 
      var p = Process.Start(proc); 
      do 
      { 
       Thread.Sleep(10); 
       Console.Out.Write(p.StandardOutput.ReadToEnd()); 
      } 
      while (!p.HasExited); 
      //catch any leftovers in redirected stdout 
      Console.Out.Write(p.StandardOutput.ReadToEnd()); 
      Console.WriteLine("Any Key"); 
      Console.ReadKey(); 
      Console.WriteLine("Exiting..."); 
     } 
    } 
} 
+0

Это может быть полезно: http://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer – zaitsman

+0

Я вижу, как это работает для исполняемых файлов .net, но все остальное все равно потерпит неудачу, так что это не совсем то, что я искал. –

ответ

2

Windows, нет, насколько я знаю, предназначенный для поведения корневого стиле. Ближе всего вы получаете виртуализацию файловой системы, но то, что a) не имеет ничего общего с SHGetFolderPath и b) реализовано без учета общности. Поэтому я не думаю, что то, что вы ищете, действительно возможно.