2004年02月24日

“我用刀子割开手腕的时候,我看见我的红色的液体。我用赤裸的身躯割开这虚伪的世,为什么我看不见真实?”


--竹影青瞳


就从这点来说,她比MZM高尚。因为她脱掉了衣服,更脱掉了世俗。而木孩子美不能。脱完衣服她已经无能为力

2004年02月23日

故土难离,乡音部改,


今年春节没有回家,在广州和老婆儿子满世界的逛街,竟然感觉不到过年的快乐。所有的快乐都写在了儿子一个1岁小孩的脸上。


偶尔看电视,跟踪采访一个回家过年的湖南人,当看到他们的父母在村口等候的样子时,我热泪盈眶。老婆问我怎么了,我轻轻的说“进了沙子”。


故土难离,明年过年一定回家。


 

2004年02月20日

假设用户的登陆方式为网络登陆,那么我们可以安以下的步骤,来实现保存密码和防止ESC键:


1.在RunService处(HKLM\)填上一个服务程序,可保证在登陆框出现前启动。


2.在Service的程序中用FindWindow,FindWindowEx找到窗口和Edit,Button的Handle,便可控制。


代码如下:


#include “stdafx.h”
#include
#include
#include
#include
#include “UsbEkey.h”


//———————————————————————–
//       G L O B A L S
//———————————————————————–
const LPCSTR DLGTTLE = “请输入网络密码”;
const LPCSTR CHKTTLE = “保存密码”;
const LPSTR CHK_APP_NAME = “ChkBox.exe”;


const UINT RSP_SIMPLE_SERVICE = 1;
const UINT RSP_UNREGISTER_SERVICE = 0;



typedef DWORD (WINAPI * pRegFunction)(
           DWORD dwProcessId, 
           DWORD dwType);


HWND hDlg = NULL;
HWND hUserName = NULL;
HWND hPwd = NULL;
HWND hDomain = NULL;
HWND hBtnOk = NULL;
HWND hBtnCancel = NULL;
HWND hChkBox = NULL;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ACCOUNT g_Account,g_NewAccount;



//———————————————————————–
// Find The Application CreateCheckBox Contrl’s
//———————————————————————–
HWND GetMyChkBox(HWND hDlg)
{
 HWND hTmp = NULL,hChk = NULL;
 bool b1 = false,b2 = false;
 
 hTmp =FindWindowEx(hDlg,NULL,”button”,NULL);
 hChk = hTmp;
 while (!b1 && !b2)
 {  
  hChk = GetNextDlgGroupItem(hDlg,hChk,FALSE);
  
  char buf[255];
  GetWindowText(hChk,buf,255);
  if (strcmp(buf,CHKTTLE) == 0 )
  {
   b1 = true;  
  }
  if (hTmp == hChk)
  {
   b2 = true; 
   OutputDebugString(“Not Find The CheckBox\n”);
  }  
 }


 return hChk;
}
//———————————————————————–
// Get The UserName/Pwd/Domain And Save To The UsbEkey Thread
//———————————————————————–
void GetTextFunProc(PVOID parg)
{
 while (NULL != hDlg )
 { 
  SendMessage(hUserName,WM_GETTEXT,255,(LPARAM)g_NewAccount.UserName);
  SendMessage(hPwd,WM_GETTEXT,255,(LPARAM)g_NewAccount.PassWord);
  SendMessage(hDomain,WM_GETTEXT,255,(LPARAM)g_NewAccount.Domain);  
  
  hChkBox = GetMyChkBox(hDlg);
  if (NULL == hChkBox) {
   break;
  }
  int iRet = SendMessage(hChkBox,BM_GETCHECK ,0,0);
  if (BST_CHECKED == iRet){
   g_NewAccount.Flag = FLAG_SAVE_PWD;  
  }
  
  if (BST_UNCHECKED == iRet){
   g_NewAccount.Flag = FLAG_NOT_SAVE_PWD;
  }  
  
  char buf[255];
  sprintf(buf,”GetText:\t UserName=%s;Pwd=%s;Domain=%s\;Flag=%d\n”,
   g_NewAccount.UserName,g_NewAccount.PassWord,g_NewAccount.Domain,
   g_NewAccount.Flag);
  OutputDebugString(buf);


  hDlg = FindWindow(NULL,DLGTTLE);
  
  Sleep(100);  
 }
 
 //
 // On There Save UserName/Pwd/Domain to UsbEkey
 //
 if (g_NewAccount.Flag != g_Account.Flag
  || g_NewAccount.Flag == FLAG_SAVE_PWD)
 {
  if (0 == WriteAccount(g_NewAccount))
  {
   memcpy(&g_Account,&g_NewAccount,sizeof(ACCOUNT));
  }
  
 } 
 
 //
 // Close CreaeChkBox Application
 // 
 TerminateProcess(pi.hProcess,0); 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
 return;
}


//———————————————————————–
// Set The UserName/Pwd/Domain Thread
//———————————————————————–
void SetTextFunProc(PVOID parg)

 //DWORD dwStartTime;


 //dwStartTime = GetTickCount();
 
 while (true)
 {
  if (strlen(g_Account.PassWord) <= 0
   && strlen(g_Account.UserName) <= 0
   && strlen(g_Account.Domain) <= 0)
  {
   OutputDebugString(“ReadAccount Start….\n”); 
   ReadAccount(g_Account);   
  }  
  


  hDlg = FindWindow(NULL,DLGTTLE);
  if (NULL != hDlg)
  {
   OutputDebugString(“Find The Login Dlg\n”);


   hUserName = FindWindowEx(hDlg,NULL,”edit”,NULL);
   if (hUserName == NULL)
   {
    OutputDebugString(“Can Not Find The Edit_UserName\n”);
    return;
   }


   hPwd = GetNextDlgTabItem(hDlg,hUserName,FALSE);
   if (hPwd == NULL)
   {
    OutputDebugString(“Can Not Find The Edit_PassWord\n”);
    return;
   }


   hDomain = GetNextDlgTabItem(hDlg,hPwd,FALSE);
   if (hDomain == NULL)
   {
    OutputDebugString(“Can Not Find The Edit_Domain\n”);
    return;
   }   


   hBtnOk = GetNextDlgTabItem(hDlg,hDomain,FALSE);
   if (hDomain == NULL)
   {
    OutputDebugString(“Can Not Find The Btn_OK\n”);
    return;
   }   


   hBtnCancel = GetNextDlgTabItem(hDlg,hBtnOk,FALSE);
   if (hDomain == NULL)
   {
    OutputDebugString(“Can Not Find The Btn_Cancel\n”);
    return;
   } 
   
   //
   // Exec CreateChkBox Application
   //    
   OutputDebugString(“CreateProcess CreateCheckBox\n”);
   CreateProcess(NULL,CHK_APP_NAME,NULL,            
     NULL, FALSE,0,NULL,NULL,&si,&pi );   


   Sleep(500);
   hChkBox = GetMyChkBox(hDlg);
   if (g_Account.Flag == FLAG_SAVE_PWD){  
    SendMessage(hChkBox,BM_SETCHECK ,(WPARAM)BST_CHECKED,0);
   }


   //
   // Set Pwd/UserName/Domain
   // 
   if (g_Account.Flag == FLAG_SAVE_PWD) { 
    if (strlen(g_Account.UserName) > 0) {
     SendMessage(hUserName,WM_SETTEXT,255,(LPARAM)g_Account.UserName);
    }
    
    if (strlen(g_Account.PassWord) > 0) {
     SendMessage(hPwd,WM_SETTEXT,255,(LPARAM)g_Account.PassWord);
    }
    
    if (strlen(g_Account.Domain) > 0) {
     SendMessage(hDomain,WM_SETTEXT,255,(LPARAM)g_Account.Domain);
    }
    
    //
    //  Disable The “ESC” and “Cancel” Buttton
    //                 
    char szBuf[255];
    GetWindowText(hBtnCancel,szBuf,255);
    if (strcmp(“取消”,szBuf) == 0)
    {
     EnableWindow(hBtnCancel,FALSE);
    }    
    //keybd_event( VK_RETURN,0×45,KEYEVENTF_EXTENDEDKEY | 0,0 );    
   }   


   GetTextFunProc(NULL);
   OutputDebugString(“Create The GetTextFunProc Thread!\n”);
  }
  
  Sleep(1000*3);
  
  //
  // After Half Hour Application Exit
  //  
  //if ((GetTickCount() – dwStartTime)/(1000*60) >=30) {
  // break;
  //}
  OutputDebugString(“SetText Thread Is Runing…\n”);
 }
 
 return ;
}


//———————————————————————–
// InitlizeFuntions
//———————————————————————–
bool Initlize()
{
 //bool pOld;
 //SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&pOld,SPIF_UPDATEINIFILE);
 
 //
 //  RegisterServiceProcess then TaskMgr Can’t Find It
 // 
 HINSTANCE hKernelLib;
 pRegFunction RegisterServiceProcess; 
 
 hKernelLib = LoadLibrary(“kernel32.dll”);
 if(hKernelLib)
 {
  RegisterServiceProcess =
   (pRegFunction)GetProcAddress(hKernelLib,”RegisterServiceProcess”);
  if(RegisterServiceProcess){
    RegisterServiceProcess(GetCurrentProcessId(),RSP_SIMPLE_SERVICE);
  }
  
 }
 
 memset(&g_Account,0,sizeof(ACCOUNT));
 memset(&g_NewAccount,0,sizeof(ACCOUNT));
 ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );


 
 return true;
}



//———————————————————————–
// UnInitlizeFuntions
//———————————————————————–
bool UnInitlize()
{
 DestoryEKey();
// FreeEKeyFuns();
 return true;
}
//————————————————————————
//  WinMain Entry
//———————————————————————–
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 HANDLE hThead;
 Initlize(); 
 
 hThead = (HANDLE)_beginthread(SetTextFunProc,NULL,NULL);
 OutputDebugString(“Create The SetTextFunProc Thread!\n”);
 
 WaitForSingleObject(hThead,INFINITE);
 CloseHandle(hThead);


 OutputDebugString(“Application End!\n”); 
 UnInitlize();


 return 0;
}


完整的VC工程可来信索取.


borland@163.com


 

2004年02月19日

广州天河体育中心,1:0中国胜科威特。


比赛额过程郁闷。结果还行,3分到手。


刘建宏的解说简直时放屁,


他比较适合直播体育彩票。


解说的事还是交给黄健翔的好。


原来罪恶来自对比,


听多了黄的解说,


直到听了刘建宏的评论,才方显精彩。


 


 

2004年02月12日

   事实上,Windows 2000的引导过程是从安装时候就已经开始的。


   那我们首先从windows 2000的安装说起。
   当windows 2000 setup运行时,它向硬盘上写入MBR(主引导记录),同时在这个磁盘驱动器的第一个可引导分区(就是我们在fdisk后激活的分区)写入引导扇区,引导扇区的内容根据不同的文件系统格式而变化(FAT或者是NTFS)。如果你的机器上曾装有MS操作系统并建立了引导扇区的话,windows 2000 setup将检测它要覆盖的引导扇区是否有效,如果有效的话,windows 2000 setup安装程序将把引导扇区的内容复制到这个分区的根目录中的文件bootsect.dos中。Setup程序在写完引导扇区后,将把windows 2000所用的文件拷贝到硬盘,包括两个引导文件Ntldr和Ntdetect.com。另外,setup还会在引导分区的根目录中建立引导菜单文件boot.ini。
  例:
  [boot loader]
  timeout=3
  default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
  [operating systems]
  multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=”Microsoft Windows “
  multi(0)disk(0)rdisk(0)partition(2)\WINDOWS=”Windows Server   2000″ /fastdetect


  这是我的机器上的boot.ini文件,该内容显示装了两个操作系统,win98和win2000,后面的那个参数/fastdetect最常见,是安装系统时默认的,它的作用是使ntdetect忽略秉性和串行设备的枚举。Boot.ini文件中的相关参数还有很多,各有不同的功能,因为与本文没太大关系,所以不作具体介绍,有兴趣的朋友可以到网上找找有关资料。


  Windows 2000的启动:
  当你按下机器上的power键,计算机就开始启动了,首先是上电自检,通过后bios引导计算机去读取硬盘上的MBR,根据MBR中的信息,找到引导分区,将引导分区内的引导扇区的代码读入内存并把控制权交给该代码。引导扇区代码的作用是向Windows 2000提供磁盘驱动器(硬盘)的结构和格式信息并且从磁盘根目录中读取Ntldr文件,在引导扇区代码将Ntldr加载到内存后,它把控制权交给Ntldr的入口点。如果引导扇区代码在根目录中没有找到Ntldr文件的话,若文件系统为FAT格式,则显示:“Boot:无法找到Ntldr”,若引导文件系统是NTFS格式,则显示:“NTLDR丢失”。然后,Ntldr使用内建的文件系统代码从根目录读取boot.ini文件(Ntldr内建代码与引导扇区文件系统代码不同的是,Ntldr文件系统代码可以读取子目录)。此时,Ntldr清除屏幕,如果boot.ini中存在不止一种引导选项,则显示引导选择菜单,如果在boot.ini制定的超时范围内未有任何动作的话,Ntldr会选择默认的选项。引导选项确定后,Ntldr加载和执行Ntdetect.com(这是一个使用系统bios进行查询计算机基本设备和设置信息的16位实模式程序)。然后,Ntldr开始清除屏幕并显示:“Starting Windows……”进度栏。这个进度栏保持空白,直到Ntldr开始加载引导驱动程序(假如有100个引导驱动程序,则每加载一个文件,进度条增加1%)。在进度条的下面是信息:“For troubleshooting and advanced startup options for windows 2000 , press F8 .”如果此时按下F8键,会出现高级启动菜单,包括:已知的最近正确模式(last known good),安全模式(safe mode),调试模式(debug mode)等等等等。
  此后,Ntldr加载合适的内核和HAL映像文件(缺省为Ntoskrnl.exe和HAL.dll),读入SYSTEM注册表hive文件(hive文件是一种包含注册表子树的文件)以确定该加载哪些引导驱动程序,加载引导驱动程序,为Ntoskrnl.exe的执行准备CPU寄存器。之后,Ntldr调用Ntoskrnl.exe并由它开始初始化执行程序子系统并引导系统-启动(system-start)设备驱动程序,在一系列的初始化工作完成后Ntoskrnl.exe为系统本机应用程序作准备并运行smss.exe。
  smss的主要任务是:初始化注册表,创建系统环境变量,加载Win32子系统(Win32k.sys)的内核模式部分,启动子系统进程Crss,启动登陆进程winlogon。然后,winlogon开始执行其启动步骤,如创建初始的窗口和桌面对象等等。然后它创建服务控制管理器(SCM)进程(Winnt\System32\Services.exe),它加载所有的标记为自动启动(auto-start)的服务程序和设备驱动程序和本机安全验证子系统(Lsass)进程(Winnt\system32\Lsass.exe)。当一切加载成功且用户在控制台成功登陆后,SCM则认为系统引导成功,注册表中 已知最近正确配置(HKLM\SYSTEM\select\LastKnownGood)由\CurrentControlSet替代。反之,如果用户在引导的时候选择高级菜单中的已知最近正确模式(LastKnownGood)或者加载时驱动程序返回一个严重的或者关键的错误,系统会以LastKnownGood的值作为CurrentControlSet 的值。
  之后,我们便看到了熟悉的桌面。至此,windows 2000的引导过程结束。

Donews.net 的速度真不错。


不知道如何在远程更新Log?