【问题标题】:C++ Rename File @ C:\Windows\System32\DriversC++ 重命名文件@C:\Windows\System32\Drivers
【发布时间】:2013-01-25 04:31:48
【问题描述】:

已解决:看看后面的帖子

任务:重命名一个名为 TabletFilter.sys 的文件(它是我的图形输入板驱动程序),因为 Windows 8(我的操作系统)应用程序需要一个其他驱动程序,然后是 photoshop 的引脚压力。我想编写一个 c++ 程序,将所有驱动程序文件重命名为 .old

基于 cplusplus.com 的重命名示例的代码

#include <stdio.h>

int main ()
{
  int result;
  char oldname[] ="TabletFilter.sys";
  char newname[] ="TabletFilter.sys.old";
  result= rename( oldname , newname );
  if ( result == 0 )
    puts ( "File successfully renamed" );
  else{
    result= rename( newname , oldname );
    if( result == 0)
      puts ( "File successfully renamed" );
    else
      perror( "Error renaming file" );
  }
  return 0;
}

我也尝试过“以管理员身份运行”,但还是得到了

Error renaming file: No such file or directory

我能做什么?


编辑:

该文件肯定在同一个文件夹中...我将它们都复制到那里...即使在 c:\windows\ 我也尝试过...并且我使用了清单

Executable: TabletRenameDriver.exe 
Manifest: TabletRenameDriver.exe.manifest
Sample application manifest file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
  <assemblyIdentity version="1.0.0.0"
     processorArchitecture="X86"
     name="TabletRenameDriver"
     type="win32"/> 
  <description>Description of your application</description> 
  <!-- Identify the application security requirements. -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
       </security>
  </trustInfo>
</assembly>

我试过uiAccess真假。

是的,我的权利有问题 驱动程序已加载,但我仍然能够更改他的名字......不知道为什么,但它是可能的。我试过了。我想用 C++ 解决这个问题,所以请不要告诉我有很多脚本语言可以很好地处理这个问题;-) 我知道这个

【问题讨论】:

  • 你在哪里运行这个?文件名不完全符合文件夹名称,所以我想它正在寻找当前工作目录中的文件。在这种情况下,在代码中使用文件的完整路径名可能更安全。
  • 在我开始询问之前,我尝试了两个版本。我将 exe 放入与 TabletFilter.sys 相同的文件夹中。
  • 您不需要 C++ 程序来重命名文件。脚本将完成这项工作。
  • 我想用快捷键+plugout/in设备换驱动
  • 有很多方法是行不通的。从要求 Wow64DisableWow64FsRedirection() 开始,此尝试提前失败的可能原因。接下来是 UAC,它会阻止您访问此目录。您的反恶意软件可以阻止您弄乱驱动程序。需要卸载原始驱动程序,这可能会导致此代码的用户模式部分崩溃。并且需要以某种方式启动新驱动程序。成功的几率很低。

标签: c++ windows rename


【解决方案1】:

感谢大家的帮助

我完成了我的程序,现在可以完美运行

注意:通过 VS2012 设置添加“requireAdministrator”uiAccess="false"

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

void main ()
{
    bool success = false;
    bool somethingWentWrong = false;
    PVOID OldValue = NULL;
    if( Wow64DisableWow64FsRedirection(&OldValue) ) 
    {
        success = MoveFile("C:\\Windows\\System32\\Drivers\\TabletFilter.sys", "C:\\Windows\\System32\\Drivers\\TabletFilter.sys.old");
        if(success){
          puts("from .sys to .sys.old");
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys.old");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys not found"); somethingWentWrong = true;}
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf.old");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf not found"); somethingWentWrong = true;}
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat.old");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat not found"); somethingWentWrong = true;}
        }else{
          puts("from .sys.old to .sys");
          success = MoveFile("C:\\Windows\\System32\\Drivers\\TabletFilter.sys.old", "C:\\Windows\\System32\\Drivers\\TabletFilter.sys");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\Drivers\\TabletFilter.sys.old not found"); somethingWentWrong = true;}
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys.old", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys.old not found"); somethingWentWrong = true;}
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf.old", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf.old not found"); somethingWentWrong = true;}
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat.old", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat.old not found"); somethingWentWrong = true;}
        }
        if(somethingWentWrong){
          puts ( "ERROR: File were set to standart!" );
          success = MoveFile("C:\\Windows\\System32\\Drivers\\TabletFilter.sys.old", "C:\\Windows\\System32\\Drivers\\TabletFilter.sys");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\Drivers\\TabletFilter.sys.old not found"); somethingWentWrong = true;}
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys.old", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.sys.old not found"); somethingWentWrong = true;}
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf.old", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.inf.old not found"); somethingWentWrong = true;}
          success = MoveFile("C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat.old", "C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat");
          if(!success){ puts("ERROR: C:\\Windows\\System32\\DriverStore\\FileRepository\\tabletfilter.inf_amd64_e7d03235d8288d3b\\TabletFilter.cat.old not found"); somethingWentWrong = true;}
        }else
          puts ( "File successfully renamed" );
        Wow64RevertWow64FsRedirection(OldValue);
    }
    for(unsigned long tick = GetTickCount() / 1000;  tick + 2 > GetTickCount() / 1000;){
    }
}

只有 48 行代码......脚本可以更短吗?

PS:一段时间后重温这篇文章,我认为有很多方法可以不同地处理这个问题。然而,要点仍然存在:如果你想做这样的事情,你必须以管理员权限运行......并且可能使用循环、列表/向量和一些适当的字符串操作:-P

【讨论】:

    【解决方案2】:

    Windows 需要其中许多驱动程序才能启动。如果您确实成功地重命名了它们,那么当您重新启动时,您的机器将会发生坏事——即您的机器无法启动。

    作为一般规则,将所有内容留在 C:\Windows 中,但这个建议对于 C:\Windows\drivers 目录来说要重要十倍。触摸此文件夹及其中的任何内容,后果自负。

    【讨论】:

    • 当 Medion 或 Genius 开始编写适用于 win8 的驱动程序时,我将保持一切原样!我只为其他有同样问题的人发布代码......直到现在我对这段代码没有任何问题,即使用这个小助手重新启动我只需要拔掉我的图形输入板启动我的程序 - 插入并更新驱动程序,然后有一个用于 OneNote 和 windowsApps 的压力敏感 Pencile,另一种方法更容易,然后 Photoshop 就可以工作了……另一种选择是每次我想使用其他程序时都取消/重新安装驱动程序
    【解决方案3】:

    错误信息

    No such file or directory
    

    表示当前目录不包含文件名"TabletFilter.sys""TabletFilter.sys.old"

    你可以做的是:

    1. 指定文件的完整路径。
    2. 确保在执行代码时,当前目录是包含文件的目录。

    但是,即使您这样做,您的程序也很可能会失败。您可能没有足够的权限来修改该文件夹的内容。如果操作系统已加载驱动程序,您尝试重命名的文件可能会被锁定。

    正如@Hans 指出的那样,file system redirector 很可能会让您感到困惑。避免这种情况的最好方法是使用 64 位进程。

    我认为没有理由在这里使用 C++ 程序。重命名文件是最适合脚本语言的任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多