C++ 如何停止应用程序的执行

C++ 如何停止应用程序的执行,c++,windows,security,removable-storage,C++,Windows,Security,Removable Storage,我正在进行一个项目,以防止应用程序从可移动设备启动。 有人知道我怎么做吗?最好在Windows平台上使用C++。 我的目标是防止执行exe文件,即使用户双击它,或者即使他试图从命令行启动它。如果当前磁盘类型是可移动设备,您可以编写从Main方法返回的代码段。 调用split disk name and use(可以帮助)或更好的(这里可以帮助)方法来了解它是否在可移动磁盘上如果当前磁盘类型是可移动设备,您可以编写从Main方法返回的代码段。 调用split disk name and use(可

我正在进行一个项目,以防止应用程序从可移动设备启动。 有人知道我怎么做吗?最好在Windows平台上使用C++。
我的目标是防止执行exe文件,即使用户双击它,或者即使他试图从命令行启动它。

如果当前磁盘类型是可移动设备,您可以编写从Main方法返回的代码段。

调用split disk name and use(可以帮助)或更好的(这里可以帮助)方法来了解它是否在可移动磁盘上

如果当前磁盘类型是可移动设备,您可以编写从Main方法返回的代码段。

调用split disk name and use(可以帮助)或更好的(这里可以帮助)方法来了解它是否在可移动磁盘上

在我看来,您正在寻找一种通用方法来停止从已运行的应用程序从设备上启动的任何应用程序。 因此,基本上有三个问题: 1.检测新应用程序已启动 2.检查正在运行的设备类型 3.如果你不想应用程序死掉,就强制它死掉

第1部分:这是一个困难的环节,我认为您需要定期使用EnumProcess进行投票,这不是很好,或者只检查生成WM_ACTIVATEAPP的应用程序

第2部分:ArsenMkrt的解决方案似乎适用于此


第3部分:TerminateProcess应该为您做到这一点

在我看来,您正在寻找一种通用的方法来阻止从设备上启动的任何应用程序从已经运行的应用程序。 因此,基本上有三个问题: 1.检测新应用程序已启动 2.检查正在运行的设备类型 3.如果你不想应用程序死掉,就强制它死掉

第1部分:这是一个困难的环节,我认为您需要定期使用EnumProcess进行投票,这不是很好,或者只检查生成WM_ACTIVATEAPP的应用程序

第2部分:ArsenMkrt的解决方案似乎适用于此


第3部分:TerminateProcess应该为您做这件事

假设您希望停止从可移动驱动器启动的任何进程,这似乎是一个shell钩子的应用程序。我在过去的半个小时里编写了以下代码,它似乎测试正常。请记住,编写钩子是一个非常重要的过程,全局钩子需要编写DLL。这是钩子DLL的相关部分:

BOOL __declspec(dllexport) __stdcall InstallShellHook ()
{
   lpfnHookProc = (HOOKPROC) ShellFunc ;
   BOOL bRetVal = FALSE;

   if (hShellHook == NULL)
   {
      hShellHook = SetWindowsHookEx (WH_SHELL, 
                                     lpfnHookProc, 
                                     hInstance, 
                                     NULL);
      return TRUE;
   }
   return FALSE;
}

LRESULT CALLBACK ShellFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
   HWND hWndNew;
   char szBuff  [_MAX_PATH];
   char szDrive [_MAX_DRIVE];

   switch (nCode)
   {
      case HSHELL_WINDOWCREATED:
         hWndNew = (HWND)wParam;
         GetWindowModuleFileName (hWndNew, szBuff, _MAX_PATH);
         _splitpath (szBuff, szDrive, NULL, NULL, NULL);
         if (GetDriveType (szDrive) ==  DRIVE_REMOVABLE)
         {
            PostMessage (hWndNew, WM_CLOSE, 0, 0);
         }
         break;

      default:
         break;
   }
   return 0;
}
我已经测试了这段代码,它是从一个简单的对话框测试台安装的,它允许我从硬盘启动任何窗口应用程序,但会立即关闭我从USB盘启动的任何应用程序

请注意,此解决方案适用于所有GUI进程(即非控制台),但要求它们在顶级窗口上响应WM_CLOSE。一个更积极的通用解决方案可能需要您将hwnd解析为HPProcess并调用TerminateProcess:我提供的解决方案是“kinder”(链接DLL将被卸载等),但不太通用


如果您想了解编写系统范围钩子的基础知识,可以在我的网站上找到。请注意,上面的代码不是生产质量代码,我将其侵入了一个旧的ANSI dll,因此缺少对Unicode的支持,或者任何接近体面的调试功能的东西。不过,它展示了基本思想。

假设您希望停止从可移动驱动器启动的任何进程,这似乎是一个shell挂钩的应用程序。我在过去的半个小时里编写了以下代码,它似乎测试正常。请记住,编写钩子是一个非常重要的过程,全局钩子需要编写DLL。这是钩子DLL的相关部分:

BOOL __declspec(dllexport) __stdcall InstallShellHook ()
{
   lpfnHookProc = (HOOKPROC) ShellFunc ;
   BOOL bRetVal = FALSE;

   if (hShellHook == NULL)
   {
      hShellHook = SetWindowsHookEx (WH_SHELL, 
                                     lpfnHookProc, 
                                     hInstance, 
                                     NULL);
      return TRUE;
   }
   return FALSE;
}

LRESULT CALLBACK ShellFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
   HWND hWndNew;
   char szBuff  [_MAX_PATH];
   char szDrive [_MAX_DRIVE];

   switch (nCode)
   {
      case HSHELL_WINDOWCREATED:
         hWndNew = (HWND)wParam;
         GetWindowModuleFileName (hWndNew, szBuff, _MAX_PATH);
         _splitpath (szBuff, szDrive, NULL, NULL, NULL);
         if (GetDriveType (szDrive) ==  DRIVE_REMOVABLE)
         {
            PostMessage (hWndNew, WM_CLOSE, 0, 0);
         }
         break;

      default:
         break;
   }
   return 0;
}
我已经测试了这段代码,它是从一个简单的对话框测试台安装的,它允许我从硬盘启动任何窗口应用程序,但会立即关闭我从USB盘启动的任何应用程序

请注意,此解决方案适用于所有GUI进程(即非控制台),但要求它们在顶级窗口上响应WM_CLOSE。一个更积极的通用解决方案可能需要您将hwnd解析为HPProcess并调用TerminateProcess:我提供的解决方案是“kinder”(链接DLL将被卸载等),但不太通用


如果您想了解编写系统范围钩子的基础知识,可以在我的网站上找到。请注意,上面的代码不是生产质量代码,我将其侵入了一个旧的ANSI dll,因此缺少对Unicode的支持,或者任何接近体面的调试功能的东西。不过,它展示了基本思想。

您的网络管理员可以处理这些问题,而无需编写任何代码。我们在这里实现了完全相同的功能,以防止员工将客户的私人信息复制到可移动设备,而网络管理员自己实现了这一功能,而开发部门不需要我们做任何事情。我不知道这在您的情况下是否有效,但值得考虑。

您的网络管理员可以处理这一问题,而无需编写任何代码。我们在这里实现了完全相同的功能,以防止员工将客户的私人信息复制到可移动设备,而网络管理员自己实现了这一功能,而开发部门不需要我们做任何事情。我不知道这是否适用于您的情况,但值得考虑。

一个简单的解决方案。你只需在启动时测试它,如果它不在硬盘上就退出。这是一个简单的解决方案。您只需在启动时测试它,如果它不是从硬盘上退出,则退出。您使用复数“应用程序”似乎表明您希望停止从可移动驱动器运行的任何应用程序。是这种情况,还是您试图阻止应用程序从可移动驱动器上运行?我下面的回答假设是前者,而不是后者。瞧,如果你的应用程序驻留在可移动存储上,你想让它拒绝运行吗?不是真的,我只是想阻止可能尝试运行的新可执行文件