Profilo di William撒旦的天堂FotoBlogElenchi Strumenti Guida
Elenchi

撒旦的天堂

09/07/2007

windows xp文件系统过滤驱动入门

时间过得飞快,07年也已经过了一大半了。 更新一下这个space:)。 写了个关于文件系统过滤驱动程序的入门教程。对一个新手来说,如何入门,才是最重要的。 希望这篇教程能帮到一些人。 文档在google上: http://docs.google.com/Doc?id=acbdkvhw9w8s_23fqn983 因为这里不能上传文档,所以暂不提供代码。需要的可发mail或留言索取。
31/10/2006

NTEmacs中文设置

终于为emacs找到了一个比较好的中文设置,中文使用雅黑字体,英文使用Courier New字体。

 

(setq w32-charset-info-alist
(cons '("gbk" w32-charset-gb2312 . 936) w32-charset-info-alist))

(create-fontset-from-fontset-spec
(concat
"-*-Courier New-normal-r-normal-*-14-*-*-*-*-*-fontset-williamx,"
"chinese-gb2312:-*-Microsoft YaHei-normal-r-*-*-14-*-*-*-c-*-iso10646-1,"
"mule-unicode-0100-24ff:-*-Microsoft YaHei-normal-r-*-*-14-*-*-*-c-*-iso10646-1"
))

(set-default-font "fontset-williamx")

(setq default-frame-alist
(append
'((font . "fontset-williamx")) default-frame-alist))

 

这是一个简单的设置,还有一些字体没有列出,需要注意的是,gb2312需要设置为iso10646-1,而

不是gb2312。

25/10/2006

SVN 快速起步

万事开头难,因为拿到一个新的东西,不知道从何入手,一旦入门就会发现,其实事情并非如想象中的那么复杂。

http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91下载svn安装程序。安装完成之后,svn会自动添加到环境变量之中,你可以在任何CMD中运行svn的程序。

首先,创建一个仓库。

svnadmin create d:/svnrepos

执行上面的命令,会在D盘创建一个svnrepos的目录,用来作为svn的仓库。

然后,导入一个工程到这个仓库中。作为简单的起点,这里不考虑工程在仓库中的结构,比如trunk、branch等等的存储位置。这方面的深入了解,可以参考帮助文件。

svn import . file:///d:/svnrepos --message 'initial'

执行上面的命令,会把当前目录中的文件导入到仓库中。需要注意的是,如果message中有空格的话,需要使用" "。

最后,可以启动snv服务,来支持svn://协议。

svnserve -d -r d:\

在TortoiseSVN中,可以使用svn://svn_server_name_or_ip/svnrepos来访问仓库。

29/09/2006

Remote Debug Native Codes With Visual Studio 2003.net

Visual Studio 2003.net提供了三种方法来进行远程调试:DCOM,TCPIP,和PIPE。后两种只能调试Native Codes——我一般也只处理Native Code,虽然我还是有点怀疑,我是否已经正确理解了"Native"在这里的含义。

我一般使用PIPE模式,因为简单:PIPE是MSVCMON.exe启动后默认的模式,无需指定任何的参数,在桌面上创建快捷方式之后,我只需要双击就可以了。但是简单的往往不强大——我遇到问题了。

在另一台所谓target电脑上,我只是把Visual Studio 2003中的Debugger目录复制了过去,没有使用Visual Studio 2003的安装盘来安装Debug Tools。在Debugger目录中有两个可执行文件,ManagedDbgCA.exe,就名字来看,是受控代码的调试工具,需要.Net Framework v1.1.4322、v1.1.3705才可以运行,bypass。另一个就是msvcmon.exe。

结果msvcmon.exe不行,host上的visual studio 2003无法连接上。一开始怀疑是网络的问题,但检查下来都是好的,也不是防火墙的问题。

几经研究,猜想可能是权限的问题。在微软的网站上果然发现msvcmon.exe的使用需要有调试权限,即用户需要加入到"Debug Group"组中才可以。但是因为我是直接复制Debugger目录,没有安装,没有"Debug Group"。

最后研究msvcmon.exe /?的显示信息发现,-anyuser可以让任何能够连接上的用户进行调试。但是微软网站上说这个设置只针对tcpip模式,经过测试,也确实如此。

至此,这个问题算是有了一个确定的结果。

msvcmon.bat:

msvcmon.exe -tcpip -timeout -1 -anyuser

01/09/2006

异常处理和调试

很简单,我已经要求我组里的工程师尽量少用异常处理。虽然异常可以减少crash的次数,但是,它会大大的增加调试的难度,并且会掩盖错误的真相。

有空再补上例子!:D

27/08/2006

windbg on 1394

Softice是一个非常fantastic的调试工具,但是在windows xp上面,我受够了。我不知道在其他的操作系统上怎么样,但是在windows xp上面,非常不稳定——我是说调试驱动。大概也只有在做crack的时候我才想用它——在试过ida和ollydbg还搞不定的时候。

很早以前我就想试试微软出品的、免费的调试器:kb和windbg,因为自己的本本没有1394和com接口,一直没有机会。这次机会来了了——我的驱动遇到一个让人抓狂的问题:'(。而一旦把softice启动之后,自动测试程序就工作不正常了。

网上很多人都说有遇到过1394无法稳定工作的问题、各式各样的问题;还好,可能是看我初学的缘故,买来的一个不知道什么牌子的carbus的1394卡和其自带的cable,工作以来还没有什么特别的状况。整个过程,除了反应有一点点慢,下断点的时候常常下错状态和位置之外,其他一切正常。特别是加载了symbols之后,整个过程变得非常清晰友好。以后就真的可以把softice供起来了。:)

双击通过1394互连的时候,可以看到网络的带宽有400M。虽然感觉实际调试的时候绝对没有那么快,但是看宣传,比COM口不知道要快多少。一份ppt文档上说,通过COM口dump 128M的内存,需要2-3个小时,1394只需要10秒钟。

通过1394的调试功能还在逐渐加强中,这个和USB应该是以后的双机调试协议的重点了。虽然花费了一个双休日,但是还是“物有所值”的!:D

Writer beta

之前的两篇是用opera写的,还是有点遗憾:没有换行。

下了一个Windows Live Writer,虽然还是beta版本,先试一下下。:)

23/08/2006

程序、用户和安全

http://blogs.msdn.com/oldnewthing/archive/2006/08/18/705957.aspx 在争论一些程序和用户的问题。 现在的操作系统,安全授权都是对于用户而非程序,这就是问题所在。对于绝大多数的用户,甚至是一些专业的用户,无法知道系统中到底运行了哪些程序和各自的作用。 系统设计成用户有权启动和停止程序的运行,但是程序的启动和运行却并不都需要取得用户的授权。现在大多数的防火墙已经都具有“程序权限”的概念了,用户可以很明确的授权程序访问网络,或者拒绝。但是操作系统还没有这样的功能。 如果操作系统从对用户授权转变到对程序授权,整个计算机世界的安全会有很大的改善。用户从被授权者转变为授权者,可以很明确的了解系统中运行了多少用户程序以及各自的作用。 现代的操作系统,对运行在内存中的代码已经有了严格的区分。用户的代码无法越界破坏系统代码,而且,各个程序都有自己的独立的地址空间,理论上各不影响,这很好。但是,对于存储在硬盘上的二进制文件,系统却没有提供这样的保护。所以当用户运行了病毒程序,系统就会被破坏。 而事实上,用户程序根本没有非要写入或删除系统分区中的任何文件的必要。如果把删除系统文件的权利授予用户,该用户的任何程序都可以删除系统文件;而如果让系统或用户把权利授予某个程序,则可以有效地阻止有意或无意的破坏。 这样做的同时,也可以提高对软件破解的门槛。
10/08/2006

Subversion

今天想试一下subversion,先下载了TortoiseSVN,再想下载svn server的时候,它的官方网站http://subversion.tigris.org怎么也连不上。不过发现本地使用的时候,没有svn server,也工作得挺好的。除了svn://xxx这样的地址TortoiseSVN无法认识和密码没有用处之外,其他看起来一切正常。 还没有深入研究,也许过几天可以在我的本本上装一个,取代vss。 P.S.:对我,它们的区别主要是集成了TortoiseSVN之后的文件夹图标比较漂亮!:P
26/05/2006

Render引起filters无法进入running状态

 

如果一个render没有接收到数据,将无法进入running。由于graph中,filter的状态改变的顺序是从下游往上游进行,所以会导致所有的filter都无法进入running

 

如果filterdeliver函数和running状态做了同步(其实两个同步应该是分开的),就会进入死锁。此时也无法正常停止整个graph,除非自上而下传递EndOfStream event,这时FilterStop函数将会被直接调用,而Pause函数则会被跳过。

 

但一个问题是,filter/graphstream time只有在running之后才会被初始化,这会导致任何在running之前对CBaseFilter::StreamTime的调用都没有意义。

25/05/2006

Windows Live Message and Look 'n' Stop in LAN

Since I switched to lns from skynet firewall, wlm could not login in.
 
 At beginning, I created a rule to enable all packets passed when wlm started.
 For I thought this rule is only for wlm, but I realized that's wrong---- It works
 for all after wlm started.
 
 So, I started to trace the logs. The only blocked packets are on this rule:
 [CODE]ICMP : All ICMP types (nukes, ...)[/CODE]
 A ICMP from gateway with Type 3, code 4.
 
 Though I did not know exactly what the packet do, but should pass it for wlm.
 The rule could just above the rule : ICMP : All ICMP types (nukes, ...).
25/04/2006

The first step for developing driver

驱动程序包含两方面的含义:
  • sys文件
  • inf文件或安装程序

一个驱动首先要把它安装到系统中,但是wdm是分层的,那么首先就需要考虑如何安装到正确的层级。

如果inf文件不对,也就无从验证sys正确与否。

 

明白我的意思?

18/03/2006

sscanf函数

keywords: %[a-z] sscanf delimit
 
很久以前,我以为c没有自己的split string函数,后来我发现了sscanf;一直以来,我以为sscanf只能以空格来界定字符串,现在我发现我错了。
 
sscanf是一个运行时函数,原形很简单:
int sscanf(
const char *buffer,
   const char *format [,
   argument ] ...
);
它强大的功能体现在对format的支持上。
 
我以前用它来分隔类似这样的字符串2006:03:18:
int a, b, c;
sscanf("2006:03:18", "%d:%d:%d", a, b, c);
以及2006:03:18 - 2006:04:18:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);
 
但是后来,我需要处理2006:03:18-2006:04:18
仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。
 
我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。
 
format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。
%[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。
 
所以那个问题也就迎刃而解了:
sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);
 
16/03/2006

微软的无奈?

我知道程序设计有时候是很复杂、很痛苦的一项工作,但是也不需要这样做吧?微软一时的无奈,多少人无尽的痛苦?
 
 
 
01/03/2006

BDA驱动filter无法和network provider连接的问题

网友写了个BDA的驱动,看似什么都没有问题,但就是连不起来
 
其实,有时候问题很简单,微软提供的那些network provider,都需要首先submit一个tune request,然后才可以和tuner连接。
 
特别是在graphedit中。
28/02/2006

一些软件的office插件

Dr.eye 6.0的word工具条
注册:
regsvr32 F:\Inventec\Dreye\DreyeMT\DreyeWdAddin.dll
反注册:
regsvr32 -U F:\Inventec\Dreye\DreyeMT\DreyeWdAddin.dll
 
 
Acrobat7.0的office插件
注册:
regsvr32 F:\Inventec\Dreye\DreyeMT\DreyeWdAddin.dll
反注册:
regsvr32 -U F:\Inventec\Dreye\DreyeMT\DreyeWdAddin.dll
 
 
08/02/2006

在纯英文系统下打开包含中文路径的文件

纯英文系统下很多软件无法打开路径中包含non-ascii字符的文件,需要更改控制面板中的"Language for non-Unicode programs"设置才可以。
 
但是,解决这一问题,其实只需要一个很简单的技巧,但是不知道为什么还是有很多知名的软件不支持这个功能。比如Adobe Acrobat,我相信Adobe的其他软件也存在这个问题。
 
当一个软件使用UNICODE编译的时候,这个问题就迎刃而解。但是由于历史问题,很多软件如果完全的按照UNICODE来编译,成本太大。一些软件,可以很完美的显示中文,但是却无法直接打开文件名中包含中文的文件。
 
下面的代码可以很好的运行在ANSI版本的程序中,结合MultiBytetoWideChar等函数,可以很快地解决这个功能。
 
VOID OpenFileName(HWND hwnd)
{
        OPENFILENAMEW ofn;       // common dialog box structure
        WCHAR szFile[260];       // buffer for file name
        HANDLE hf;              // file handle
        // Initialize OPENFILENAME
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = hwnd;
        ofn.lpstrFile = szFile;
        //
        // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
        // use the contents of szFile to initialize itself.
        //
        ofn.lpstrFile[0] = '\0';
        ofn.nMaxFile = sizeof(szFile);
        ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
        ofn.nFilterIndex = 1;
        ofn.lpstrFileTitle = NULL;
        ofn.nMaxFileTitle = 0;
        ofn.lpstrInitialDir = NULL;
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
        // Display the Open dialog box.
        if (GetOpenFileNameW(&ofn)==TRUE)
                hf = CreateFileW(ofn.lpstrFile,
         GENERIC_READ,
                                 0,
         (LPSECURITY_ATTRIBUTES) NULL,
                                 OPEN_EXISTING,
         FILE_ATTRIBUTE_NORMAL,
                                 (HANDLE) NULL);

}
24/01/2006

软件的国际化

中国的软件商,在国际化这一块是比较失败的。
 
在IM的战场上,腾讯QQ一直处在防守的状态:防守中国大陆市场。之所以这么说,是因为,虽然QQ有一个英文的版本,但是在纯英文的系统下,无法正常的显示中文消息和中文昵称。反观微软,MSN Messenger的中文版一本与英文版同时出现,并且,哪怕是英文版,亦可以正常的显示中文。客户,就在不知不觉中流失。
 
另一个让人惋惜的软件,是“天网防火墙”。在英文系统下,有一半的中文可以正常显示,却一直没有推出一个国际化的版本,甚至一直没有推出一个可以在英文系统中正常显示的中文版本。这种现状,不能不叫人扼腕。
 
除了这两个软件,还有Dr.eye,一个来自台湾的非常优秀的翻译软件,也许是出于某种商业控制的策略,国际化做得也是比较失败的。
 
从ANSI转到UNICODE,会有这么麻烦吗?是技术上的不敢动,还是商业上的不能动?或者仅仅只是思想上的不想动?
 
无论是哪一种,失败是必然的!
 
虽然说,只有是民族的,才是世界的。但是这句话不能孤立地看。在当今,如果无法成为世界的,恐怕在民族中,亦无立足之地。
10/01/2006

tuning space和graphedit

 

graphedit中使用DVB-T BDAgraph时,有时会出现保存的graph再打开时DVBT network provider是断开的,必须submit request一下才可以连接上。而且,这种情况下,有时还无法tune台,driver收不到任何的命令。

 

经过测试,发现network providertuning spaces中必须要有一个的UniqueName叫做“DVB-T”的,否则就会出现上述的情况。

 

这个问题只在graphedit中会出现。

 

这应该是微软的问题了。

09/01/2006

winxp x64和winxp x86双启动

 

只需要使用CD引导到恢复控制台,然后复制i386下的

ntldrntdetect.com,无需运行FIXBOOTFIXMBR命令,否则

反而无法解决故障。

winxp x64的文件可以引导winxp x86

08/12/2005

emacs模拟VC的页面滚动

VC下有两种滚动模式,一种叫做up up/down,使移动光标,当光标到达页面顶端的时候,滚动页面;一种是Scroll line up/down,光标所在的绝对行和列不变,滚动页面。
Emacs下有第一种滚动方式,但是第二种滚动方式一直没有找到。于是自己写了两个函数,来实现这个功能,以方便边浏览边编辑代码的操作。
 
(defun hold-line-scroll-up()
  "Scroll the page with the cursor in the same line"
  (interactive)
  (let ((next-screen-context-lines
        (count-lines
         (window-start) (window-end)
         )
        ))
    (scroll-up)
    ))
 
(defun hold-line-scroll-down()
  "Scroll the page with the cursor in the same line"
  (interactive)
  (let ((next-screen-context-lines
        (count-lines
         (window-start) (window-end)
         )
        ))
    (scroll-down)
    ))
 
; define the key binding
(global-set-key (kbd "M-n") 'hold-line-scroll-up)
(global-set-key (kbd "M-p") 'hold-line-scroll-down)
14/11/2005

Recent Projects in Visua Studio

几天前开始,我的visual studio c++ 2003启动的时候变得非常的慢,这是以前都没有出现过的问题。我disable了所有的plugins还是一样,眼见已经启动完了,整个程序却hung在那里不动了。虽然过个几十秒,也可以正常启动,但是非常不方便,不敢随便的启动新的工程。
 
今天发誓一定要找出这个原因。filemon, regmon都用上了,发现没有什么异常的,既没有读写大量的文件,也没有访问注册表,只是停在那里。没准是访问了网络?
 
打开防火墙的log,发现有一个程序在访问192.168.0.33,是公司电脑的ip。难道是在查找其上的工程?打开regedit,定位到HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.1\ProjectMRUList和HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.1\FileMRUList,发现其中果然有几个工程和文件实在33的电脑上的。删除之后一切OK。
10/11/2005

汇编、C及其他

C,C++和java合作完成了一个程序,交给机器语言测试。
这日,汇编和C在一起喝酒,席间汇编接到机器语言打来电话说程序宕机,汇编瞥了一眼传过来的代码,对C说:靠,你们写的程序,都是垃圾。C涨红了脸,默不作声,把喝得醉醺醺的汇编扶回了办公室。
 
从汇编办公室出来的C遇上了正赶去吃饭的C++,于是哼了一声,挥着手中打印出来的代码说:丫的,你们写的什么代码?全都是垃圾。C++赔着笑容,结果代码,让过打着饱嗝的C,下楼吃饭。
 
极度不爽的C++边吃边看代码,吃了一半,扔下筷子,掏出手机,拨了个电话到java的办公桌,把java训了一顿,最后撂下一句:看看你写的,尽是些垃圾。
 
java扔下电话,又羞又怒,胸中一口恶气涌出,一不小心喷了一显示屏面包渣。但见他略作镇定,扯下键盘,闯进机器语言的办公室。只听一阵&*$%^@#之后,java提了半个键盘从办公室里出来,嘴里嘟哝着:叫你丫宕机。
03/11/2005

DWORD and BYTES(strings)

在C/C++中,有一些转换是隐式发生的。类型之间的转换各个地方都已经有过很多的讨论,现在来看看一个晦涩的转换。

int main(int argc, char* argv[])

{

        DWORD test

= (DWORD)"\x00\x00\x01\xBA";

        return 0;

}

现在来看看test的值。
 
我们知道,编译器会为DWORD test;在栈上分配一个地址,比如0x0012FDE4,根据其类型,拥有4个BYTE的地址空间,内容可能是cc cc cc cc。
 
当我们对test变量赋一个整数值得时候,比如:
        test = 0x000001BA;
0x0012FDE4的内容变为 BA 01 00 00 (PC字节序)。这是我们一般意义上的复制,也是我们需要的结果。但是如果:
        test = "\x00\x00\x01\xBA";
这样的赋值,只能说不太符合C的传统。
此时,0x0012FFE4的内容并不是该字符串30 30 30 30 30 31 42 41(溢出,不是吗?不过这不是现在的重点)。而是如d4 40 42 00这样的数字。这个0x004240D4是怎么来的呢?
 
我们猜测一下,字节串"\x00\x00\x01\xBA"在编译的时候,需要分配地址,其地址就是0x004240D4。是不是呢?其实很好验证。如果你有IDA,很容易就能看到该字符串的地址正是0x004240D4;或是查看汇编代码:

17: DWORD test = (DWORD)"\x00\x00\x01\xBA";

00411A6E mov dword ptr [test],offset string "\0\0\x01\xba" (4240D4h)

 
所以,把一个字符串赋给一个整型变量,传递的是该字符串的指针,而非字符串本身。其实,这在编译的时候,是会有warning的,只要注意一下,就会明白。
 
这虽然不是一种好的编程方式,但也不是一无是处,主要是可以用来消除字节序的问题。
 
01/11/2005

让其他程序拥有emacs的快捷键

自从使用了emacs之后,对他的快捷键(键绑定)非常的认同,但是windows下的很多程序都无法自定义快捷键,即使可以,要把快捷键改成和emacs的一样的功能,更多时候也是impossiable mission。
 
现在我使用xkeymacs http://www.cam.hi-ho.ne.jp/oishi/indexen.html,一款来自日本的小工具。通过它,可以让大部分的windows程序拥有部分的emacs的键绑定。特别是Visual Studio。
 
Visual Studio的自定义快捷键很强大,但是很多功能还是无法实现,比如C-space定义块的开始点这样的功能,使用xkeymacs可以轻松搞定。
 
不过,并不是所有的设置都是有效的,有些设置之后,会出一些莫名其妙的问题。
 
Foto 1 di 2