无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 9350|回复: 23
打印 上一主题 下一主题

讨论:让PE自动识别是否在VMware虚拟机环境,判断是否加载VMware拖放剪贴支持

[复制链接]
跳转到指定楼层
1#
发表于 2010-1-25 11:43:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的这个是笨方法,读取注册表信息判断,朋友们还有什么简单方法没有?

PUSHD %~dp0
for /f "skip=2  tokens=1,3 delims=" %%a in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum /s') do (
    echo %%a>>%temp%\petemp.txt
  )
For /F "tokens=3 delims=^_" %%I In ('Find /I ^"VMware^" %temp%\petemp.txt') DO Set VMwareyn=%%I
del %temp%\petemp.txt
If not "%VMwareyn%"=="" (start %CD%\TOOLS\VMWARE.EXE) else Goto end

:END
EXIT

PS:红色部分是VMware拖放剪贴支持程序的路径。

上面的批处理又是写入%temp%,又是读取又是删除的,,,,哪位高手帮我把他优化一下,谢谢!

__________________________________________________________________________________________________

已改为:

@echo off
PUSHD %~dp0
reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"|find /i /C "VMware">nul && goto vmware
reg query "HKLM\SYSTEM\CurrentControlSet\Enum\SCSI"|find /i /C "VMware">nul && goto vmware
EXIT

:vmware
START TOOLS\VMWARE.EXE
EXIT

[ 本帖最后由 网虫2008 于 2010-3-25 17:11 编辑 ]
2#
发表于 2010-1-25 12:13:03 | 只看该作者
不知道如果虚拟机没硬盘时,那个键值还存在不?能不能把读出的键值放到变量而不是文件

[ 本帖最后由 molingjian 于 2010-1-25 12:16 编辑 ]
回复

使用道具 举报

3#
 楼主| 发表于 2010-1-25 12:27:39 | 只看该作者
原帖由 molingjian 于 2010-1-25 12:13 发表
不知道如果虚拟机没硬盘时,那个键值还存在不?能不能把读出的键值放到变量而不是文件


没有硬盘时也可识别,读取的不光是硬盘信息

我笨的很,写入%temp%方法简单,,,,一会儿试下改成变量,。。。
回复

使用道具 举报

4#
发表于 2010-1-25 13:13:30 | 只看该作者
“讨论:让PE自动识别是否在VMware虚拟机环境,判断是否加载VMware拖放剪贴支持”

0PE里早就自动判断了

for /f "usebackq tokens=1" %%i in (`reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"^|find /i /C "VMware"`) do if %%i GTR 0 %~dp0..\SYSTOOLS\VMware拖放剪贴板支持.exe

假定
VMware拖放剪贴板支持.exe
位于
%~dp0..\SYSTOOLS\
回复

使用道具 举报

5#
 楼主| 发表于 2010-1-25 13:34:36 | 只看该作者
原帖由 pseudo 于 2010-1-25 13:13 发表
“讨论:让PE自动识别是否在VMware虚拟机环境,判断是否加载VMware拖放剪贴支持”

0PE里早就自动判断了

for /f "usebackq tokens=1" %%i in (`reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"^|find ...


收到,这个更简单了,,,,我一年没来,什么都跟不上了
回复

使用道具 举报

6#
 楼主| 发表于 2010-1-25 22:10:07 | 只看该作者
现在 7.0 的虚拟机用到scsi了,只查找IDE项有时候查不到了,要加个scsi查找了:

for /f "usebackq tokens=1" %%a in (`reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"^|find /i /C "VMware"`) do if %%a GTR 0 (
TOOLS\VMWARE.EXE
) else (
for /f "usebackq tokens=1" %%a in (`reg query "HKLM\SYSTEM\CurrentControlSet\Enum\SCSI"^|find /i /C "VMware"`) do if %%a GTR 0 TOOLS\VMWARE.EXE
)
回复

使用道具 举报

7#
发表于 2010-1-26 09:51:07 | 只看该作者

回复 #2 molingjian 的帖子

你的新`PE好久能出来
回复

使用道具 举报

8#
 楼主| 发表于 2010-1-26 19:07:05 | 只看该作者
原帖由 dpxqs 于 2010-1-26 09:51 发表
你的新`PE好久能出来


准备2月14日发布,这阵儿多上上论坛,争取出一个相对较完善的版本,就不用总更新了
回复

使用道具 举报

9#
发表于 2010-1-27 19:09:33 | 只看该作者
用CHKPCI就可以发现VM虚拟机多了几个VEN_0000的设备(估计是虚拟设备),正常系统不会有这种咚咚,可以超越系统进行判断,而且准确率高。
回复

使用道具 举报

10#
发表于 2010-3-25 01:31:40 | 只看该作者
原帖由 网虫2008 于 2010-1-25 22:10 发表
现在 7.0 的虚拟机用到scsi了,只查找IDE项有时候查不到了,要加个scsi查找了:

for /f "usebackq tokens=1" %%a in (`reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"^|find /i /C "VMware"`) do if % ...


这个写法其实是不对的,乱循环...

而且这里其实没必要用for的,效率太低


  1. @echo off
  2. reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"|find /i /C "VMware">nul && goto vmware
  3. reg query "HKLM\SYSTEM\CurrentControlSet\Enum\SCSI"|find /i /C "VMware">nul && goto vmware
  4. exit
  5. :vmware
  6. TOOLS\VMWARE.EXE
复制代码
回复

使用道具 举报

11#
发表于 2010-3-25 04:59:11 | 只看该作者
原帖由 NicTense 于 2010-3-25 01:31 发表


这个写法其实是不对的,乱循环...

而且这里其实没必要用for的,效率太低


@echo off
reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"|find /i /C "VMware">nul && goto vmware
reg query "HK ...


:vmware
CD /D "%~dp0"
START "" VMwareUser.EXE

...

VMWARE.PNG (20.92 KB, 下载次数: 59)

VMWARE.PNG
回复

使用道具 举报

12#
 楼主| 发表于 2010-3-25 10:20:01 | 只看该作者
原帖由 NicTense 于 2010-3-25 01:31 发表


这个写法其实是不对的,乱循环...

而且这里其实没必要用for的,效率太低


@echo off
reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"|find /i /C "VMware">nul && goto vmware
reg query "HK ...


这个方法更快捷了,,

不过,如果 IDE 和 SCSI 如果都有 "VMware",那不是要执行两次了?
回复

使用道具 举报

13#
发表于 2010-3-25 10:23:34 | 只看该作者
...靠,这个测试软件在pe里能否正常运行,很有用,搞定了,虫子兄要给一个解决方案pm我知道,嘿嘿,谢谢先!
回复

使用道具 举报

14#
发表于 2010-3-25 10:41:23 | 只看该作者
原帖由 slore 于 2010-3-25 04:59 发表


:vmware
CD /D "%~dp0"
START "" VMwareUser.EXE

...


是不是非命令行,如果不用start,原来那个cmd界面的进程就不会自动退出了?


@网虫2008

第一个找到的话就跳过第二行了,不会找两次的

[ 本帖最后由 NicTense 于 2010-3-25 10:42 编辑 ]
回复

使用道具 举报

15#
 楼主| 发表于 2010-3-25 11:56:29 | 只看该作者
原帖由 NicTense 于 2010-3-25 10:41 发表


是不是非命令行,如果不用start,原来那个cmd界面的进程就不会自动退出了?



测试过,不加 START 进程可以退出的,这应该主要取决于 .EXE 文件。

比如 极点五笔 就要 REGISTRY.EXE /S
回复

使用道具 举报

16#
发表于 2010-3-25 12:02:28 | 只看该作者

回复 #15 网虫2008 的帖子

有没有人提取出 vpc 的剪贴板支持补丁啊,我都不用vmware很多年了
回复

使用道具 举报

17#
 楼主| 发表于 2010-3-25 12:06:14 | 只看该作者
原帖由 NicTense 于 2010-3-25 12:02 发表
有没有人提取出 vpc 的剪贴板支持补丁啊,我都不用vmware很多年了


目前还没有,,,那你就提一个呗,,,我和你正相反,我是很多年不用 VPC 了
回复

使用道具 举报

18#
 楼主| 发表于 2010-3-25 12:10:58 | 只看该作者
原帖由 alexo 于 2010-3-25 10:23 发表
...靠,这个测试软件在pe里能否正常运行,很有用,搞定了,虫子兄要给一个解决方案pm我知道,嘿嘿,谢谢先!



我从元旦版开始就已经有这个功能了,可能你没注意到吧。
回复

使用道具 举报

19#
发表于 2010-3-25 12:56:46 | 只看该作者
//********************************************************************
//      Filename: Main.cpp
//        Author: Chinafish
//      Modifier: Chinafish
//       Created: 2008-5-15 15:07
//       Updated: 2008-5-15 15:07
//            QQ: 149200849
//           MSN: china_fish@msn.com   
//       Purpose: 判断程序是否在虚拟机中运行
//=====================================================
//  Copyright(C) 2004-2008 by Chinafish. All Rights Reserved.
//********************************************************************
#include "windows.h"
DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep);
bool IsInsideVPC();
bool IsInsideVMWare();
int CheckVPC();
// 发布版本使用MiniPE (3.5KB)
#ifndef _DEBUG
#pragma comment(linker, "/ENTRY:EntryPoint")
#pragma comment(linker, "/SECTION:VPC,")
#pragma comment(linker, "/MERGE:.data=VPC")
int EntryPoint()
{
CheckVPC();
ExitProcess(0);
}
#else
int WINAPI WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd )
{
return CheckVPC();
}
#endif // _DEBUG
int CheckVPC()
{
if(IsInsideVPC())
  MessageBox(NULL, "你在虚拟电脑Microsoft Virtual PC中!", "提示", MB_OK|MB_ICONINFORMATION);
else if(IsInsideVMWare())
  MessageBox(NULL, "你在虚拟电脑VMWare中!", "提示", MB_OK|MB_ICONINFORMATION);
else
  MessageBox(NULL, "你在真实的电脑中!", "提示", MB_OK|MB_ICONINFORMATION);
return 0;
}
DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep)
{
PCONTEXT ctx = ep->ContextRecord;
ctx->Ebx = -1;
ctx->Eip += 4;
return EXCEPTION_CONTINUE_EXECUTION;
}
bool IsInsideVPC()
{
bool rc = false;
__try
{
  _asm push ebx
  _asm mov ebx, 0 // It will stay ZERO if VPC is running
  _asm mov eax, 1 // VPC function number
  _asm __emit 0Fh
  _asm __emit 3Fh
  _asm __emit 07h
  _asm __emit 0Bh
  _asm test ebx, ebx
  _asm setz [rc]
  _asm pop ebx
}
// The except block shouldn't get triggered if VPC is running!!
__except(IsInsideVPC_exceptionFilter(GetExceptionInformation()))
{
}
return rc;
}
bool IsInsideVMWare()
{
bool rc = true;
__try
{
  __asm
  {
   push edx
   push ecx
   push ebx
   mov eax, 'VMXh'
   mov ebx, 0
   mov ecx, 10
   mov edx, 'VX'
   in eax, dx
   cmp ebx, 'VMXh'
   setz [rc]
   pop ebx
   pop ecx
   pop edx
  }
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
  rc = false;
}
return rc;
}
回复

使用道具 举报

20#
发表于 2010-3-25 13:09:51 | 只看该作者
原帖由 网虫2008 于 2010-3-25 12:06 发表


目前还没有,,,那你就提一个呗,,,我和你正相反,我是很多年不用 VPC 了


。。。呃,话说我也一直用着老毛桃精简的小巧的VPC。。。怎么办。。。我需要VPC的拖放支持。。。
回复

使用道具 举报

21#
发表于 2010-3-25 13:25:29 | 只看该作者
原帖由 网虫2008 于 2010-3-25 11:56 发表


测试过,不加 START 进程可以退出的,这应该主要取决于 .EXE 文件。

比如 极点五笔 就要 REGISTRY.EXE /S 了



批处理调用默认是等待方式。。。

你调用的程序不关闭批处理不继续运行的。

@echo off
notepad.exe
echo test
pause


你不关闭记事本是不会执行下面的。

start是调用后就不管它了,继续执行自己下一条命令。
registry.exe /s 后程序会自动退出所以P处理也会结束。

VMAREUSER.EXE你是要一直运行的,所以那个窗口就不关闭了。
回复

使用道具 举报

22#
 楼主| 发表于 2010-3-25 13:53:42 | 只看该作者
原帖由 slore 于 2010-3-25 13:25 发表



批处理调用默认是等待方式。。。

你调用的程序不关闭批处理不继续运行的。

@echo off
notepad.exe
echo test
pause


你不关闭记事本是不会执行下面的。

start是调用后就不管它了,继续执 ...


嗯,,如果单独一个.CMD执行,要根据情况加上 START 参数执行.EXE,

不过,不知道 不加的 START 的等待 与 START /WAIT 有什么区别?

[ 本帖最后由 网虫2008 于 2010-3-25 13:58 编辑 ]
回复

使用道具 举报

23#
发表于 2010-3-25 15:46:13 | 只看该作者

贵在举一反三

看大家深入研究、改进,学到不少。

我08年3月发过组件:[PE区首发]VMware拖放剪贴板支持组件

在08年2月的 XP资源080222_Pseudo.rar里,提供过自动识别是否在VMware虚拟机环境的方法:
  1. for /f "usebackq tokens=1" %%i in (`reg query "HKLM\SYSTEM\CurrentControlSet\Enum\IDE"^|find /i /C "VMware"`) do if %%i GTR 0 goto :skipAutoDisp
复制代码


这个问题上算是处理得早的。

有一点提醒,关于HD声卡驱动须加载两次的问题。

某些PE不加判断(是否是HD声卡),就直接加载两次驱动,这样简单,但可能影响速度。

在两年前的 XP资源080222_Pseudo.rar里,是做了判断是否需要加载第二遍的:
  1. for /f "usebackq tokens=1" %%j in (`reg query "HKLM\SYSTEM\CurrentControlSet\Enum"^|find /i /C "HDAUDIO"`) do if %%j GTR 0 set isHD=true
复制代码

当然了,现在一般都是HD声卡。不判断可能更快:)

贵在举一反三,我发明的把“连接后在通知区域显示图标”打上勾 现在好像不少PE在用,都是类似原理。
回复

使用道具 举报

24#
 楼主| 发表于 2010-3-25 17:09:20 | 只看该作者
原帖由 pseudo 于 2010-3-25 15:46 发表
看大家深入研究、改进,学到不少。

我08年3月发过组件:[PE区首发]VMware拖放剪贴板支持组件

在08年2月的 XP资源080222_Pseudo.rar里,提供过自动识别是否在VMware虚拟机环境的方法:
for /f "usebackq  ...


那P大要是有时间,就再搞个 VPC 虚拟机的拖放剪贴板支持组件吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-29 13:09

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表