2006年05月21日

    朋友电脑中了病毒,才发现,有了病毒是一件多么令人期待的事情。于是有了一小翻研究,于是有了侍养病毒的想法。当然不是在自己的机器上。

    朋友的问题主要是不能打开控制面板和资源管理器,连IE也打不开。虽然到现在我也不知道问题是怎么解决的,但是通过一番“跑题”式的研究,还是有一点收获。

   首先,贴几个考过来的小知识:

控制面板

模块: control.exe

命令: rundll32.exe shell32.dll,Control_RunDLL

结果: 显示控制面板窗口。

辅助选项

模块: access.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5

结果: 显示辅助选项/常规。

命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1

结果: 显示辅助选项/键盘。

命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2

结果: 显示辅助选项/声音。

命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3

结果: 显示辅助选项/显示。

命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4

结果: 显示辅助选项/鼠标。

添加新硬件

模块: sysdm.cpl

命令:rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1

增加新的打印机

模块:shell32.dll

命令:rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter

添加/删除程序

模块:appwiz.cpl

命令:rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1

结果:显示安装/卸载。

命令:rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1

结果:显示安装/卸载。

命令:rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2

结果:显示Windows 安装。

命令:rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3

结果:显示启动盘。

复制磁盘

模块:diskcopy.dll

命令:rundll32.exe diskcopy.dll,DiskCopyRunDll

时间/日期

模块: timedate.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0

结果: 显示设置日期/时间。

命令: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1

结果: 显示设置时间区域。

拨号连接(DUN)

模块: rnaui.dll

命令: rundll32.exe rnaui.dll,RnaDial 连接_名称

结果: 打开指定的拨号连接。

例子:

x= Shell("rundll32.exe rnaui.dll,RnaDial " & "连接_名称", 1)

显示器

模块: desk.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0

结果: 背景设置。

命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1

结果: 屏幕保护设置。

命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2

结果: 外观设置。

命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3

结果: 设置窗口。

操纵杆

模块: joy.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL joy.cpl

邮件/传真

模块: mlcfg32.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl

结果: 出现 MS Exchange 属性设置。

邮局设置

模块: wgpocpl.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL wgpocpl.cpl

结果: 显示 MS Postoffice Workgroup Admin 设置。

主设置

模块: main.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @0

结果: 显示鼠标属性。

命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1

结果: 显示键盘/速度属性。

命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1

结果: 显示键盘/语言属性。

命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,2

结果: 显示键盘/常规属性。

命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @2

结果: 显示打印机属性。

命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3

结果: 显示字体属性。

命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @4

结果: 显示电源管理属性。

增加 Modem

模块:modem.cpl

命令:rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add

多媒体

模块: mmsys.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0

结果:声音。

命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1

结果:视频。

命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2

结果:声音 MIDI。

命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3

结果:CD/音乐。

命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4

结果:高级。

命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1

结果:声音。

网络

模块:netcpl.cpl

命令:rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl

打开方式窗口(Open With)

模块: shell32.dll

命令:rundll32.exe shell32.dll,OpenAs_RunDLL path\filename

口令

模块: password.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL password.cpl

区域设置

模块: intl.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0

结果: 区域设置。

命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1

结果: 数字格式设置。

命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2

结果: 金额格式设置。

命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3

结果:时间格式设置。

命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4

结果: 日期格式设置。

屏幕保护

模块: appwiz.cpl

命令: rundll32.exe desk.cpl,InstallScreenSaver c:\winnt\system\Flying Windows.scr

结果: 安装屏幕保护并显示预览属性页。

系统设置

模块: sysdm.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0

结果: 显示常规设置。

命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1

结果: 显示设备管理设置。

命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2

结果: 显示硬件设置。

命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3

结果: 显示性能设置。

IE 设置

模块: inetcpl.cpl

命令: rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,0

结果: 常规设置。

命令: rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,1

结果: 安全设置。

命令: rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,2

结果: 隐私设置。

命令: rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,3

结果: 内容设置。

命令: rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,4

结果: 连接设置。

命令: rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,5

结果: 程序设置。

命令: rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,6

结果: 高级设置

看了一遍,虽然内容本身可能没什么用。但是对于shell32.dll的理解,还是加深了一步。用processinfo看了一下系统中的进程所调用的模块,很多都包括shell32.dll,而这个文件本身所完成的工作,应该会比较复杂,有时间可以研究一下。今天先不写了,懒了,累了,睡了。

2006年05月12日

    关于xml,多说无益,的确是一个好东西。它是一种可扩展的置标语言,关于xml和sgml以及html的区别和联系,相关的书籍太多了,我在这里也没啥资格废话。想说说自己在wince下做xml parser的一点想法。

    wince 5.0目前支持到微软的msxml 3.0(据说pc上有7.0的版本,我的电脑上只有6.0)。关于各个版本的区别差异,也不是一句话两句话的问题。只谈谈xml解析方法。

    xml解析有两个接口,DOM和SAX,DOM(Document Object Model),SAX(Simple Application interface for XML)。前者是最基本应用编程接口,后者提供了比较底层的接口,编程比较灵活。初学咋练,只研究DOM。据说DOM接口使用了COM的技术,是把一个xml文档,解释成一棵节点树。然后对这个树进行访问来处理节点上的信息,如属性和元素等等。

    为了解析一个xml文档,首先要创建一个document对象,也就是一个IXMLDOMDocument接口的实例。首先,为了使用COM对象,需要使用CoInitialize函数来初始化COM环境。需要注意的事,wince下,并不支持CoInitialize,而是CoInitializeEx,这个函数提供了一个额外的参数让用户选择多线程模式还是单线程模式。关于这两者的区别,目前我说不清楚,不过不是简单的字面的解释,编程中会有一点小问题。这里我选择了多线程模式。

CoInitializeEx(NULL,COINIT_MULTITHREADED)

建立document对象,使用CoCreateInstance函数,参数使用网上经典的几个参数,第一个是CLSID值,CLSID_DOMDocument,包含在objsafe.h中。接口类型选择IID_IXMLDOMDocument。关于这个函数的使用,往上有很多不同版本的文章,有的是用名字空间什么的,我这里没有用。

CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(void**)&pDoc)

建立了实例以后,调用这个接口的一个方法,load,(loadxml方法也可以加载一个xml文件,但是loadxml也可以加载文件的一个部分,更灵活一点),第一个参数是VARIANT,第二个参数是VARIANT_BOOL。这两个参数曾经弄得我很头痛,后者其实就是一个short,前者是一个无类型的变量,可以用任何类型赋值,究其根本,就是一个结构体,里面用union做的多种类型。在msdn中可以找到。想要说明的是,如果VARIANT表示一个字符串,字符串的类型是BSTR。网上有很多文章介绍到这里关于字符串的处理,有的用到MFC的CString,有的用到了ATL的CComVariant,为了不用这些乱七八糟的东西(主要是重新配置wince image来支持这些东西有点麻烦,一个DocList的DLL找不到,如果有人可以告诉这个dll怎么搞定,不圣感谢),我用了下面的比较简单的方法。

   VARIANT vFile ;
   vFile.vt = VT_BSTR ;
   vFile.bstrVal = SysAllocString(L"\\release\\a.xml");
   VARIANT_BOOL vBool;
   pDoc->load(vFile,&vBool);

    这样,就得到了这个XML文件的根节点,接下来处理节点信息就简单了。

    除了IXMLDOMDocument接口,比较常用的还有IXMLDOMNodeList,IXMLDOMNode,IXMLDOMElement这几个接口,今天不想写太多关于这些接口的方法和属性了,列出一个简单的小程序,里面用一个小堆栈,实现了对XML树结点的遍历。

#include "stdafx.h"
#include "objsafe.h"
#include "Msxml2.h"
#include "Objbase.h"
#include "comutil.h"

typedef struct _node{
 IXMLDOMNode *Node;
 int level;
}nodes;

nodes NodeStack[100];
int top=0;

void pushStack(nodes node)
{
 NodeStack[top].Node = node.Node;
    NodeStack[top].level = node.level;
 top++;
}

void popStack(nodes * node)
{
 top–;
 (*node).Node = NodeStack[top].Node;
    (*node).level = NodeStack[top].level;
}

int isStackEmpty()
{
 if(top==0) return 1;
 else return 0;
}
int WINAPI WinMain( HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     LPTSTR    lpCmdLine,
     int       nCmdShow)
{
  IXMLDOMDocument *pDoc = NULL;
 IXMLDOMNodeList *pNodelist = NULL;
 IXMLDOMNode *pNode = NULL;
 IXMLDOMElement *pRootElement = NULL;
 nodes curNode;
 if(SUCCEEDED(CoInitializeEx(NULL,COINIT_MULTITHREADED)))
 {
  if(SUCCEEDED(CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument,(void**)&pDoc)))
  {
   VARIANT vFile ;
   vFile.vt = VT_BSTR ;
   vFile.bstrVal = SysAllocString(L"\\release\\a.xml");
   VARIANT_BOOL vBool;
   pDoc->load(vFile,&vBool);
   if(vBool != VARIANT_TRUE)
   {
    printf("not load");
    return 1;
   }
   else printf("load");
   /////////////////////////
   HRESULT hr;  
   hr = pDoc->get_documentElement(&pRootElement);
   if(SUCCEEDED(hr))
   {
    hr = pRootElement->QueryInterface(IID_IXMLDOMNode,(void**)&pNode);
    if(SUCCEEDED(hr))
    {
     BSTR bsxml;
     curNode.Node = pNode;
     curNode.level = 1;
     pushStack(curNode);
     int curLevel;
     while(1)
     {
      if(isStackEmpty()) break;
      popStack(&curNode);
      pNode = curNode.Node;
      curLevel = curNode.level;
      pNode->hasChildNodes(&vBool);
      if(vBool == VARIANT_TRUE)
      {
       hr = pNode->get_nodeName(&bsxml);
       if(SUCCEEDED(hr))
       {
        wprintf(L"%d,%s",curLevel,bsxml);
       }
       long value;
       pNode->get_childNodes(&pNodelist);
       pNode->Release();
       pNodelist->get_length(&value);
       for(int i=value-1;i>=0;i–)
       {
        pNodelist->get_item(i,&pNode);
        curNode.Node = pNode;
        curNode.level = curLevel+1;
        pushStack(curNode);
        //printf("top:%d",top);
       }
       pNodelist->Release();
      }
      else pNode->Release();
     }
    }
   }
   //////////////////////////
   pDoc->Release();
    
  }
  else printf("not cocreatinstance");
  CoUninitialize(); 
  
 } 
 else printf("not CoInitializeEx");
 return 0;
}

   

    其实这也是一个长期困扰我的问题,要不是最近在研究DOM,需要使用COM支持的一些字符类型,实在懒得研究这些东西。不过,收获始终是收获。本文引述《C++字符串完全指南 – Win32字符编码》中的部分内容。感谢作者。

    1,三种编码方式。SBCS,MBCS,Unicode。SBCS就是单字节编码,ASCII码就是SBCS;MBCS十多字节编码,在windows系统中一般只有单字节和双字节,所以这里的MBCS也可以成为DBCS,它可以由单字节和双字节构成,有固定的前缀码,以单字节0结束;unicode编码固定双字节,以双字节0结束。unicode的数据类型wchar_t。

    2,Win32的API和消息中的字符串处理函数有二种,一种为MCBS字符串,另一种为Unicode字符串。例如,Win32中没有SetWindowText()这样的接口,而是用SetWindowTextA()和 SetWindowTextW()函数。后缀A (表示ANSI)指明是MBCS函数,后缀W(表示宽字符)指明是Unicode函数。为了使用两种类型的函数,定义了TCHAR。

#ifdef UNICODE

 typedef wchar_t TCHAR;
#else
 typedef char TCHAR;
#endif
    同时,由于wchar_t处理字符串常量的时候需要使用L"",于是又定义了_T(x):
#ifdef UNICODE
 #define _T(x) L##x
#else
 #define _T(x) x
#endif

   宏_T有几种形式,功能都相同。如: -- TEXT, _TEXT, __TEXT, 和 __T这四种宏的功能相同。
   还有很多宏定义用来处理这样的问题,比如_tprintf来代替printf和wprintf等等。MSDN的全部宏定义在
"Generic-Text Routine Mappings"栏目下。

类型

MBCS 编码中的意义

Unicode 编码中的意义

WCHAR wchar_t wchar_t
LPSTR zero-terminated string of char (char*) zero-terminated string of char (char*)
LPCSTR constant zero-terminated string of char (constchar*) constant zero-terminated string of char (constchar*)
LPWSTR zero-terminated Unicode string (wchar_t*) zero-terminated Unicode string (wchar_t*)
LPCWSTR constant zero-terminated Unicode string (const wchar_t*) constant zero-terminated Unicode string (const wchar_t*)
TCHAR char wchar_t
LPTSTR zero-terminated string of TCHAR (TCHAR*) zero-terminated string of TCHAR (TCHAR*)
LPCTSTR constant zero-terminated string of TCHAR (const TCHAR*) constant zero-terminated string of TCHAR (const TCHAR*)

    3,BSTR

    许多COM接口使用BSTR声明字符串。BSTR是Pascal类型字符串(字符串长度值显式地与数据存放在一起)和C类型字符串(字符串长度必须通过寻找到结尾零字符来计算)的混合型字符串。BSTR属于Unicode字符串,字符串中预置了字符串长度值,并且用一个零字符来结尾。下面是一个"Bob"的BSTR字符串:

    字符串长度值是一个DWORD类型值,给出字符串的字节长度,但不包括结尾零。在上例,"Bob"含有3个Unicode字符(不计结尾零),6个字节长。因为明确给出了字符串长度,所以当BSTR数据在不同的处理器和计算机之间传送时,COM库能够知道应该传送的数据量。BSTR可以包含任何数据块,不单是字符。它甚至可以包容内嵌零字符数据。

    事实上BSTR与Unicode字符串不一样,因为BSTR包括了头部的长度值。

    许多应用接口都使用BSTR,但都用到二个最重要的函数来构造和析构BSTR。就是SysAllocString()和SysFreeString()函数。SysAllocString()将Unicode字符串拷贝到BSTR,SysFreeString()释放BSTR。示例如下:

BSTR bstr = NULL;

 bstr = SysAllocString ( L"Hi Bob!" );

if ( NULL == bstr )   

// 这里使用bstr


SysFreeString ( bstr );

   

     BSTR有很多包装类,如CRT的_bstr_t等等。还有STL,ATL,MFC,WTL等,这里就不多说了,实在对这些东西感到很头疼。

    就这么多,关于DOM中的具体应用,一会再写出来。

2006年05月10日

1、extern "C"

    用C++编写的程序中使用C语言编写的库函数的时候,在C++引用的头文件中,应该把库函数的声明写在extern "C" { }中。原因是,C和C++编译器对函数名称的处理方式不同,主要是C++中支持函数的重载,这样在编译器处理过的函数名中需要对参数和返回类型的体现。如果声明写在extern "C" { }中,那么编译器将会按照C的编译方式为这个函数命名,这样才可能在库中找到正确的函数。否则会出现错误:unresolved external …….

    需要注意的是,不同的编译器对同一语言的函数名称处理也不相同,这一点在交叉编译的时候我感觉得比较明显。

2、_cdecl和_stdcall

    其实两者是一个函数的调用约定,决定了函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。

    _cdecl 。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所不同。这是C/C++缺省调用约定。由于是调用者负责把参数弹出栈,所以可以给函数定义个数不定的参数,如printf函数。

    _stdcall。按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。对于“C”函数或者变量,修饰名以下划线为前缀,然后是函数名,然后是符号“@”及参数的字节数,如函数int func(int a, double b)的修饰名是_func@12。对于“C++”函数,则有所不同。所有的Win32 API函数都遵循该约定。

3、__declspec

    “__declspec”是Microsoft c++中专用的关键字,它配合着一些属性可以对标准C++进行扩充。这些属性有:align、allocate、deprecated、dllexport、dllimport、 naked、noinline、noreturn、nothrow、novtable、selectany、thread、property和uuid。其中__declspec(dllexport)在_cdecl、C编译情况(extern "C")下可以去掉输出函数名的下划线前缀。


2006年03月05日

局域网内共享资源,一直都不是很懂。今天为了解决VSS的权限设置问题,简单研究了一下,仍然不是特别懂,如果下面有地方写的不对,日后一定改正。

    首先是文件的共享。

    主要是权限的设置。对于NTFS文件系统上的文件或文件夹,如果在文件夹选项中取消简单文件共享的选项,就可以对文件夹进行比较复杂的权限控制管理。在共享的权限上,取消everyone的权限,添加需要的用户或者是组。然后在安全TAB中添加用户的权限。

    在本地安全策略中,修改本地策略-〉安全选项,修改“网络访问:本地帐户的共享和安全模式”为“经典:本地用户以自己的身份验证”

    远程访问。

    访问方式有三种:网上邻居,unc,和磁盘映射。

    网上邻居可以通过工作组找到共享的资源,UNC是指在 地址栏中键入\\server\\share,磁盘映射可以在“我的电脑”上单击右键,键入共享目录的UNC,还可以选择以“其他用户名”登陆。

    如果远程资源不能够被everyone访问,就像上面的设置,那么当用前两种方法的时候会有提示对话框要求输入用户名和密码,但是不知道为什么我这里看不到对话框。有一个解决的办法是在控制面板-〉用户帐户,单击自己当前的用户,如果有管理员的权限,那么可以在左上角相关任务中看到“管理我的网络密码”,在里面添加一个server,并且设置访问该server的用户名和密码,这样以后访问这个server的资源的时候,默认的帐户就改成了刚刚输入的帐户。

    net use命令和net view命令。

    如果通过net use连接到服务器,或者通过资源管理器的窗口正确的访问过远程服务器的某一个文件夹,那么就可以用net view命令查看远程服务器的所有的共享文件。但是我不能确定这个第一次访问的帐户是不是必须有很高的权限。

    如果在共享文件夹的时候,在文件名后面加一个$,那么远端将无法看到这个文件夹出于共享状态,从而起到隐藏的目的。

   

2006年03月04日

    一个周六,难得有觉睡。

    睁开眼睛看表,想起了任贤齐的老歌——睡到十二点。

    打开电脑,发现火箭赢了比赛。对于它是不是能进季后赛,也没了太多的兴趣。 不过,一个心无牵挂的男人,关注一下篮球,应该不是一件坏事。  

    午饭在食堂,寝室楼下。 遇到老鸟和小田。不,是遭遇。早已习惯了自己味觉上的麻木,买了一份咖喱炒饭,被老鸟形容成鸟粪,这想象力!幸好刚刚起床,我的思维比较迟钝,没有对鸟粪加以形象的思维,否则。。。

    饭后理发!

    剪掉了长的有点离谱的头发,在理发店的大镜子里看了看自己,发觉自己还不是自己想象的那么猥琐。

    下午,打算装个VSS,谁知道遇到了点远程资源访问的问题,花了点时间,终于研究明白了。在笔记本上看到自己台式机的共享文件夹里面,还有新电影没看,于是。。。。

    其实看的是电视剧,24,第五季。每周一集。从第一季看到现在,喜欢的不得了。这一集里Audrey Ranes和Curtis Manning篡夺了精神失控的Lynn在CTU的权利。这个在指环王里扮演Sam的胖胖还是挺可爱的。

    晚饭和小田和小雨啦啦一起吃。

    小田很有女孩子缘,不过大都只是普通的普通的朋友,不过,这种能力也够我学好多年了。

    小雨啦啦考研很不错。等她请客了。

    晚上在图书馆被了被交规,题目多得一塌糊涂。死背。不过这种考试有个特点,即便是傻叉,也有通过的可能。我比傻叉强一点点。

    回到寝室开始头疼。因为被人逼着学C#。shit,不用指针的怪物。

   

2006年03月02日

胜,不妄喜;败,不惶馁! 胸有激雷而面如平湖者,可拜上将军!

2006年02月25日

  在没有任何希望和自由的情况下,人应该怎么办。剧中的主人公,没有想象般的柔弱,他之所以感动人,就在于他自己救赎自己……
  接近电影,解读电影,有朋友向我推荐《肖申克的救赎》,很偶然的机会看了一晚,想到了很多……
故事的开始其实很老套,年轻有为的银行家–安迪,蒙冤入狱,被判终身监禁。无望的岁月里,面对的不仅仅是恶劣的环境,凶恶奸诈的典狱长,更多的是内心的痛楚和体制对人性的控制和左右。"These walls are kind of funny like that. First you hate them, then you get used to them. Enough time passed, get so you depend on them. That’s institutionalizing."这就是体制和规则,日渐被同化的人类还有勇气去怀疑吗?像那可怜的老图书管理员,在监狱里度过了大半辈子,一旦获得了假释,离开了熟悉的环境、熟悉的人,他感觉不到自己的价值,找不到自己的位置,给他身体的自由,可他的灵魂呢?只能选择从这个不属于自己的世界消失……
  可安迪是智者,看似柔弱的外表下,他有一颗非常清醒的头脑。他做的事,在常人看来–不可理解,然而他做到了:他不懈地写信为监狱的图书馆迎来的扩建的资金,他教那些"无希望的人"文化,他用十几年的时间挖开了在朋友一瑞的眼中要挖600年的隧道,在一个风雨交加的夜里, 他通过这条生命的通道,在500尺的污水管道里匍匐前进,在地狱和天堂的一线之隔间匍匐前进,终于,在对那一片湛蓝的天空和大海的向往下,安迪重获自由,并且惩罚了有罪的典狱长等人。
  当他爬出管道,滚到小溪里,镜头从仰角给了他一个全景,此时雷电交加,大雨滂沱,安迪张开双臂,与其说他在拥抱风雨,不如说他在拥抱靠着无比的毅力与信念。他获得了自由,不,不如说他自己已经成了自由精神的象征,希望的象征。
  还记得那段我们共同经历的阴霾日子吗?空气里似乎飘荡着如纷飞的杨絮般的病毒,我们在学校里关了整整两个月,有多少人受得了那种压抑封闭的气氛?安迪让人钦佩,在于他十几年的平静和坚定,在那种气氛里,怎能一直保持这种平和的心态?他创造了一个基督山伯爵似的神话。
  在绝望的谷底,上帝在哪里?每个人都是自己的上帝。如果你自己都放弃自己了,还有谁会救你?每个人都在忙,有的忙着生,有的忙着死。忙着追名逐利的你,忙着柴米油盐的你,停下来想一秒:你的大脑,是不是已经被体制化了?你的上帝在哪里?
  入夜了,累了,就此搁笔吧。

    没想到真的会trace到这个blog来,如果不是真的很关心我的话。呵呵。

    说起导演,也许是我大学里面的遗憾,应该不会是一生的遗憾吧。因为我没有选择它成为我的职业,也没有选择在自己的大学生活里面,为自己做一点喜欢做的事请。

    我喜欢短剧和小品。这也是我在高中里自编自导自演短剧的原因和动力,即便那时的学习生活比现在要忙。自编,把自己的生活和看到的别人的融合在一起,在自以为了不起的灵感和激情碰撞的火花中自我陶醉;自导,享受身边支持你信任你的朋友的友谊,任意的发挥自己的想象力,用沟通和表达让每个演员了解自己的构思和想法,用他人的天赋弥补自己能力的不足,无限的延伸自己的power,完成独自一个人不可能完成的事情;自演,自我表现欲望的完美释放,即便有很多人不是很欣赏我的表演,也包括我自己。

    然而,喜欢做一件事并不代表可以做好它。就像有些人说过的,只有我的朋友们才会为我表演。的确,没有充分的文化素养和知识底蕴,没有好的导演;没有足够的交际手段和活动能力,没有好的导演;没有无限的容忍挫折的勇气,没有好的导演。这些素质我都不具备,于是我成不了一个导演,于是在大学里面我没有继续自己的爱好,于是有了我现在的遗憾和内心的不安。

    写了这些,应该算是对朋友,对自己的一个交代。

    话题稍转,刚刚看过电影《肖申克的救赎》,(其实早就想看一直很舍不得)。没有心灵的震撼,没有过多的言语的表达的欲望。联系到刚刚思考的做导演的话题,发挥一下,发现其实最好的导演和剧作家,不是扬名在外日进斗金的名家名流,而是为自己的人生剧本,演绎出最精彩的片断的人们。从这个角度来说,每个人都是自己的大导演,每个人都是电影里的主角,反过来,是不是只有自己才是自己主演的电影的最忠实的观众呢。

    以为几天以前来这里写过东西了,原来是做梦。大概是白天因为懒惰而不来更新blog,夜里愧疚难捱,于是发梦以便心安理得。

    刚和师兄聊了一会,也是他提醒我还有个blog,惭愧啊。这里面太杂太乱,倒是有些不好意思示人了。

    快一个月没有写过技术上的东西,倒不是应为这一个月里一点程序都没有写,保守点,几千行的代码总是有的,不过编程序真的是一件很垃圾的事情,如果没有什么技术上的新收获的话。

    总结一下,假期里为了补回丢失的软件设计大作业,把dentry的结构又作了深入一点的研究,基本明白了几个双向链表的关系,不过说实话,对于文件系统的理解,如果仅限于此,那就太坐井观天了。

    wince下的perfomence测试暂告一段落,完成代码是重要的,应该在一周多一点可以全部搞定。不过同时,应该好好研究一下wince下的嵌入式系统编程,毕竟dimanche里面我负责这一部分。

    汇编的学习,优先级被调节到最低,没办法,一是不感兴趣,二是没有各种老板催。不感兴趣的事情不能不干,因为这的确还是挺有帮助的。

    摆在面前的事情还挺多,毕业设计的题目是应该好好看看的,资料太多,但是一旦入手,应该是挺有意思的事情。

    dimanche的事情,我还是应该focus在wince和ad hoc或infrastructure和gprs的通信网建立,有点麻烦,不过这件事情的优先级不可以太低。

    今天是星期六,向前看,忙碌的一周,向后看,不能休息的星期天。