“我用刀子割开手腕的时候,我看见我的红色的液体。我用赤裸的身躯割开这虚伪的世,为什么我看不见真实?”
--竹影青瞳
就从这点来说,她比MZM高尚。因为她脱掉了衣服,更脱掉了世俗。而木孩子美不能。脱完衣服她已经无能为力
生活乱弹,文字激扬--键盘记录生活,代码写就人生 http://www.gsafe.info
“我用刀子割开手腕的时候,我看见我的红色的液体。我用赤裸的身躯割开这虚伪的世,为什么我看不见真实?”
--竹影青瞳
就从这点来说,她比MZM高尚。因为她脱掉了衣服,更脱掉了世俗。而木孩子美不能。脱完衣服她已经无能为力
故土难离,乡音部改,
今年春节没有回家,在广州和老婆儿子满世界的逛街,竟然感觉不到过年的快乐。所有的快乐都写在了儿子一个1岁小孩的脸上。
偶尔看电视,跟踪采访一个回家过年的湖南人,当看到他们的父母在村口等候的样子时,我热泪盈眶。老婆问我怎么了,我轻轻的说“进了沙子”。
故土难离,明年过年一定回家。
假设用户的登陆方式为网络登陆,那么我们可以安以下的步骤,来实现保存密码和防止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
广州天河体育中心,1:0中国胜科威特。
比赛额过程郁闷。结果还行,3分到手。
刘建宏的解说简直时放屁,
他比较适合直播体育彩票。
解说的事还是交给黄健翔的好。
原来罪恶来自对比,
听多了黄的解说,
直到听了刘建宏的评论,才方显精彩。
事实上,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的引导过程结束。