移动XP的新情况

我的WINXP移动版,也就是装在移动硬盘上的XP。在应用到我的新电脑(联想LENOVO G455A M320)时,发生了新的情况。

本来,移动的XP应该是,不论在哪里,插到新电脑上,一用USB启动,就自动进入到系统中,这样我不论在什么地方,都可以使用我原来的系统,最熟悉的系统,不用担心要同步文档配置啥的。而且这个绝对不是WINPE能比的,WINPE能在任何电脑上启动XP,但它只是用于维护和简单的使用。而移动版XP的功能是完整的,跟装在机箱内部硬盘的XP一样的功能。

移动的理想是美好的,现实是,在遇到全新的硬件时,它不一定能启动启来,可能发生BSOD 0x000007b错误。在G455A上就遇到了。

由于这个笔记本没有PCI Express Card接口,无法用我高价买的express 1394卡进行kernel debugging。它也没有串口,无法用串口kernel debuging. XP不支持USB kernel debugging, 就算换到vista或win7, 估计ehci的usb debug port也没有导出(有没有导出纯粹看运气,厂商一般不会故意导出)。总而言之,kernel debugging来诊断为什么从USB移动硬盘上启动不了,是没戏了。只能瞎子乱摸了。

说说最后的成果:
1.  HKLM\SYSTEM\MountedDevices下的值 \DosDevice\C: 必须删掉,换了硬件后,后面的二进制可能变了,不删掉此项,可能导致C盘不能挂载,从而发生蓝屏。把此功能加到移动XP的recovery module中。
2. 需要copy安装盘安装时生成的 HKLM\SYSTEM\ControlSet001\Enum\PCI 全目录。由于我在recovery module中copy的是winpe的。跟安装盘的setupldr.bin生成的PCI信息有些差别,导致不能启动。要彻底解决,必须基于安装盘而不是PE重写recovery mode。不过我没有时间搞这玩意儿了。而且接下来可能要研究移动版win7而不是XP了,所以…算了吧。

再说说过程:

由于只能瞎子乱撞的试验,最开始试了很多次都成功不了。后来还是想到,重头再来,在机器上的主硬盘上新装一个全新的XP,先不装驱动,为了省时间,反正能登录进去的XP就行了。然后改注册表重启,使得用winobj看arcnames的时候,可以看到插上电脑的USB移动硬盘的记录。看到后说明,这份COPY的XP已经可以从USB移动硬盘启动。

然后,有了一个成功的版本,也有了一个失败的版本,就让它们不断的逼近吧。这里又出了一个问题:方案上,可以用二分法快速逼近找出问题的关键,也可以用经验为主的方式进行重点排查,我选择了后者,尝试重启若干次,无果。 只好往第一种方法偏,最终发现了1和2这两个结论。少一个也不行。

我以前碰到的电脑,尝试了好多种硬件,都发现只需要COPY WINPE的PCI信息就可以修复成功启动了,但现在这电脑非得要安装时产生的。不知道是不是新硬件搞出的新脾气。

移动版XP以后也没有太大的研究价值了,希望移动版的WIN7会更容易配置。不过VISTA/WIN7的boot配置就够麻烦的了,还是boot.ini来得简洁直观。

我在一些论坛上说移动的操作系统时,总要被人用WIN  PE来拍砖。 其实移动OS是用来替换平时工作学习娱乐所用的OS的,跟WINPE主要用于维护是十分的不同。

你需要背着笔记本从家里到公司,或从宿舍到实验室吗,或者带着它从A地出差到B地吗?如果你在两处都有电脑,用移动的OS肯定好过背一台电脑。现代社会在目标地找或借一台电脑已经不难了,背个硬盘相比于背台笔记本,那肯定是爽了很多。

你需要同步在家里电脑和公司电脑上产生的不同的内容吗?如果用了移动的OS,那所有的文档设置和生产出来的文件都已经在移动硬盘上同步了,根本没有合并和版本选择的烦恼。

LINUX是很容易做成移动的OS的,微软则则不知是有意还是无意制造了一些烦恼,让你的WIN不能在移动硬盘上启动任何一台电脑,只是提供了一个用于维护的WINPE。还好XP和WIN7都是可以做成移动系统的。前者我已经成功了,后者,在网上能找到有些人的成功记录,估计应该不会太难实现。待到有空时,再搞个500G的移动硬盘,试试移动WIN7了。

发表在 boot | 留下评论

Git via socks5 Proxy

1. 安装 connect-proxy

#apt-get install connect-proxy

2. 编辑脚本 /usr/bin/my-git-proxy

[code]#!/bin/sh
SOCKS5_PASSWD=xxxxxx connect-proxy -S username@host:port $@ [/code]

[code]chmod +x /usr/bin/my-git-proxy [/code]

3. 配置Git

[code] $ git config –global core.gitproxy “my-git-proxy” [/code]

发表在 未分类 | 留下评论

Internet连接共享(ICS)命令行设置

因为有些原因要用到ICS。想用命令行启用ICS,GOOGLE了一番,没有结果,有的人信势旦旦的说用netsh可以做到,通过对比开启ICS前和ICS后的netsh dump文件发现,这两个根本就没有本质区别,换句话说,netsh不可能开启ICS。

于是对比注册表,注册表太大,只对比了开启ICS前后的Current Control Set,也没有发现本质区别,换句话说,改注册表可能不能启用ICS,或者很难,不知道信息存在哪里。(我猜是不在注册表里的)

没办法了,使出万能法宝,一定可以成功的调试器。ollydbg威武出场,调试了一下,通过网卡属性设置ICS时,调用了hnetcfg里的COM接口。用oleview一看,嘿,这dll还提供了比较不错的idl信息,还是基于IDispatch接口的,也就是说,可以用脚本调用。于是改换方向,用这个IDL里面的关键字,继续google。这下就找到了。

用起来还挺简单: cscript  /nologo ics.vbs “private interface name” “public interface name”

key word: CONNECTION_PUBLIC  CONNECTION_PRIVATE  EnableSharing

经验教训:

  1. 搜命令行或Command line 之类的关键词找不到结果时,要试一下script, vbs之类的关键字。
  2. 搜这种词的时候,google还是挺垃圾的,我是用google.com/ncr搜的,还是难以找到。
  3. 互联网上的垃圾信息越来越多了,想要的有深度的内容会越来越不好找。
  4. 一边研究一边google的做法,目前还是比较好用的。想当年为了把windows(不是WINPE)装到移动硬盘上,并且可以在任意一台电脑上启动系统并使用系统,就是用研究再加搜索的方法,研究到80%,知道了一堆的keyword,也就容易找到相同的问题和解决方案了,否则找到的都是垃圾。

ics.vbs 下载

发表在 软件使用 | 5条评论

测试上传图片

test

just test.

发表在 日经 | 留下评论

升级wordpress到2.9.1

跟上次不一样,这一次用了自己做的merge工具,有了merge工具,升级不愁了。。。

再也不怕丢失自己的修改了。

发表在 软件使用 | 留下评论

刷了android的ROOT

主要就是参考:
http://www.androidin.net/bbs/thread-48066-1-1.html
title: 图文教程给新手一步一步unlock, root, 和刷机 并添加multitouch

不过软件不是从那里下的,除了recovery image镜像。

我是从这里下的,好像新一点:

 http://android.modaco.com/content/google-nexus-one-nexusone-modaco-com/298782/12-feb-erd79-ere27-ere36b-superboot-rooting-the-nexus-one/

android.modaco.com这地方不错,以后多关注。

联系人中文排序也搞定了,参照androidin.net的,替换了两个文件。不过与说明有所不同的是,这个2.1update1系统居然没有cp命令,晕。看来等到我会写的时候,找时间自己编一个传上去?

发表在 android | 2条评论

下载android电子市场的程序到电脑上

android电子市场还是很不错的,能方便的下载并安装软件。

不过,它下完就帮你安装了,不管是成功还是失败,安装文件都不能被找到。

暂时对ANDROID还很不熟,不清楚有没有简单的办法下载但不安装。然后把文件传回PC。

不过,至少存在这样的一种办法来达到把程序下载到电脑上的效果:

1. 开启支持电子市场的android模拟器。参考 http://tech-droid.blogspot.com/2009/11/android-market-on-emulator.html (好像是要翻墙的)。必须下载作者提供的镜象,否则,模拟器不能访问网络。

2. 启动sniffer软件(如wireshark)。用模拟器下载安装APP。因为是模拟器,随便安装也不怕。此时会监听到一个HTTP下载的请求,形如:

GET /market/download/Download?assetId=-3783207302739264490&userId=573662974701&deviceId=96777546538815391 HTTP/1.1
Cookie: ANDROID=xxxxxxxx
Host: android.clients.google.com
Connection: Keep-Alive
User-Agent: AndroidDownloadManager

 用curl 即可下载:

curl  -o app.apk -v -A “AndroidDownloadManager” http://android.clients.google.com/market/download/Download?assetId=-3783207302739264490&userId=573662974701&deviceId=96777546538815391 -b “ANDROID=xxxxxxxx”

 

当然,这个方法还是复杂了点,有没有简单的办法,还需以后了解了再说。

发表在 android | 4条评论

关于时间转换

1. 在excel里显示time_t类型的时间(1970-1-1到现在的秒数):  设数字在B1格中,先输入工式: =(E1+8*3600)/(24*3600)+25569,然后设置单元格选项为日期类型即可。

2. 得到当前的time_t秒数,这在程序中很容易,在linux命令下,可以用 data +%s 命令得到。

3. 在linux命令行下把数值转化为时间: 设目前秒数是1260796354,则命令为:
data -d @1260796354

当然,这些都是命令行或软件使用中的。在程序中,那是非常方便的转换。

发表在 软件使用 | 留下评论

variant 变量表

老是要查头文件,又排得不整齐,排一份如下:

LONGLONG      llVal;        /* VT_I8                */
LONG          lVal;         /* VT_I4                */
BYTE          bVal;         /* VT_UI1               */
SHORT         iVal;         /* VT_I2                */
FLOAT         fltVal;       /* VT_R4                */
DOUBLE        dblVal;       /* VT_R8                */
VARIANT_BOOL  boolVal;      /* VT_BOOL              */
SCODE         scode;        /* VT_ERROR             */
CY            cyVal;        /* VT_CY                */
DATE          date;         /* VT_DATE              */
wireBSTR      bstrVal;      /* VT_BSTR              */
IUnknown *    punkVal;      /* VT_UNKNOWN           */
IDispatch *   pdispVal;     /* VT_DISPATCH          */
wirePSAFEARRAY parray;      /* VT_ARRAY             */
BYTE *        pbVal;        /* VT_BYREF|VT_UI1      */
SHORT *       piVal;        /* VT_BYREF|VT_I2       */
LONG *        plVal;        /* VT_BYREF|VT_I4       */
LONGLONG *    pllVal;       /* VT_BYREF|VT_I8       */
FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */
DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */
VARIANT_BOOL *pboolVal;     /* VT_BYREF|VT_BOOL     */
SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */
CY *          pcyVal;       /* VT_BYREF|VT_CY       */
DATE *        pdate;        /* VT_BYREF|VT_DATE     */
wireBSTR *    pbstrVal;     /* VT_BYREF|VT_BSTR     */
IUnknown **   ppunkVal;     /* VT_BYREF|VT_UNKNOWN  */
IDispatch **  ppdispVal;    /* VT_BYREF|VT_DISPATCH */
wirePSAFEARRAY *pparray;    /* VT_BYREF|VT_ARRAY    */
wireVARIANT * pvarVal;      /* VT_BYREF|VT_VARIANT  */
CHAR          cVal;         /* VT_I1                */
USHORT        uiVal;        /* VT_UI2               */
ULONG         ulVal;        /* VT_UI4               */
ULONGLONG     ullVal;       /* VT_UI8               */
INT           intVal;       /* VT_INT               */
UINT          uintVal;      /* VT_UINT              */
DECIMAL       decVal;       /* VT_DECIMAL           */
DECIMAL *     pdecVal;      /* VT_BYREF|VT_DECIMAL  */
CHAR *        pcVal;        /* VT_BYREF|VT_I1       */
USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */
ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */
ULONGLONG *   pullVal;      /* VT_BYREF|VT_UI8      */
INT *         pintVal;      /* VT_BYREF|VT_INT      */
UINT *        puintVal;     /* VT_BYREF|VT_UINT     */
typedef enum tagVARENUM
{
    VT_EMPTY           = 0x0000,
    VT_NULL            = 0x0001,
    VT_I2              = 0x0002,
    VT_I4              = 0x0003,
    VT_R4              = 0x0004,
    VT_R8              = 0x0005,
    VT_CY              = 0x0006,
    VT_DATE            = 0x0007,
    VT_BSTR            = 0x0008,
    VT_DISPATCH        = 0x0009,
    VT_ERROR           = 0x000A,
    VT_BOOL            = 0x000B,
    VT_VARIANT         = 0x000C,
    VT_UNKNOWN         = 0x000D,
    VT_DECIMAL         = 0x000E,
    VT_I1              = 0x0010,
    VT_UI1             = 0x0011,
    VT_UI2             = 0x0012,
    VT_UI4             = 0x0013,
    VT_I8              = 0x0014,
    VT_UI8             = 0x0015,
    VT_INT             = 0x0016,
    VT_UINT            = 0x0017,
    VT_VOID            = 0x0018,
    VT_HRESULT         = 0x0019,
    VT_PTR             = 0x001A,
    VT_SAFEARRAY       = 0x001B,
    VT_CARRAY          = 0x001C,
    VT_USERDEFINED     = 0x001D,
    VT_LPSTR           = 0x001E,
    VT_LPWSTR          = 0x001F,
    VT_RECORD          = 0x0024,
    VT_INT_PTR         = 0x0025,
    VT_UINT_PTR        = 0x0026,
    VT_ARRAY           = 0x2000,
    VT_BYREF           = 0x4000
} VARENUM;
发表在 开发 | 留下评论

symantec的smc.exe防杀原理

偶尔打开冰刃就发现了,其原理好简单,用了wpsdrvnt.sys修改了ssdt中的几个函数,主要是关进程和内存修改的相关函数,用来保护smc.exe。所以要想自由的开关smc,只需要禁用wpsdrvnt就行了:

sc config wpsdrvnt start= disabled

重启即可。

这样不会影响他的产品的其它功能。

发表在 软件使用 | 留下评论