云计算百科
云计算领域专业知识百科平台

第3章 Windows运行机理-3.1 内核分析(12)

我们可从CpuCool.c程序中看到VxD的装入内存、安装功能和设置VxD功能号3的全过程。在代码中都有详细的注释。其实,VxD的装入方法与一个通常的文件一样,也是通过Win API的函数CreateFile来完成,大家一定不要被Create这个词误解了,其实,CreateFile可以用来打开和创建新文件。

int APIENTRY WinMain( HANDLE hInstance,

HANDLE hPrevInstance,

      LPSTR lpszCmdLine,int nCmdShow)

{

 static char szAppName[]="CoolCPU";

 char Buffer[64];

 HMENU hPopupMenu;

 WNDCLASS wndclass;

 HWND hwnd;

 MSG msg;

int Ret;

 

 hResInstance=hInstance;

 

 //是否是中文

LoadString(hResInstance,IDS_CODEPAGE,Text,sizeof(Text));

 Ret=StrToInt(Text);

 

if(GetSystemMetrics(SM_DBCSENABLED) && GetACP()==(DWORD)Ret) 

China=1;

else 

China=0;

 

//取得操作系统的版本

WinNT=GetVersion();

WinNT=(WinNT&0x80000000)==0 ? 1:0;

 

//如果不是WinNT就打开VxD,因为VxD只能在WIN9X下工作

if(WinNT==0)

{//打开VxD

 lstrcpy(SthVxDName,"\\\\\\\\.\\\\");

 GetStartPath(Buffer,sizeof(Buffer));

 //VxD只认短路径

 

GetShortPathName(Buffer,&SthVxDName[4],

sizeof(SthVxDName));

lstrcat(SthVxDName,"SthVxD.VxD");

 

//尝试打开默认的VxD

hCVxD = CreateFile("\\\\\\\\.\\\\SthVxD", 0,0,0, CREATE_NEW, 

FILE_FLAG_DELETE_ON_CLOSE, 0);

if(hCVxD==INVALID_HANDLE_VALUE)

{

//直接打开全路径的VxD

  hCVxD = CreateFile(SthVxDName, 0,0,0, CREATE_NEW, 

FILE_FLAG_DELETE_ON_CLOSE, 0);

}

if(hCVxD==INVALID_HANDLE_VALUE)

{//直接打开默认的.VxD

  hCVxD = CreateFile("\\\\\\\\.\\\\SthVxD.VxD", 0,0,0, CREATE_NEW, 

FILE_FLAG_DELETE_ON_CLOSE, 0);

  }

 

//成功否

if(hCVxD!=INVALID_HANDLE_VALUE)

{

  EnableHlt=TRUE;

  //设置VxD功能号3

  DeviceIoControl(hCVxD,3,(LPVOID)NULL,0,

(LPVOID)&EnableHlt,sizeof(EnableHlt),

&cbBytesReturned,NULL);

  }

else {

  if(China)

{    

LoadString(hResInstance,IDS_MAYBEERROR,

Cap,sizeof(Cap));

   LoadString(hResInstance,IDS_NOTLOADVxD,

Text,sizeof(Text));

   MessageBox(NULL,Text,Cap,MB_OK);

}

else MessageBox(NULL,"Can't load STHVxD.VxD,STHVCD maybe failure !",

"Maybe Error",MB_OK);

}

 }

 

hIcon=LoadIcon(hResInstance,MAKEINTRESOURCE(IDI_ICON));

 

if(China) hPopupMenu=LoadMenu(hResInstance,MAKEINTRESOURCE(IDR_CMENU));

else hPopupMenu=LoadMenu(hResInstance,MAKEINTRESOURCE(IDR_MENU));

 

hPopMenu=GetSubMenu(hPopupMenu,0);

 

if(!hPrevInstance)

{

wndclass.style =CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc =(WNDPROC)WndProc;

wndclass.cbClsExtra =0;

wndclass.cbWndExtra =0;

wndclass.hInstance =hInstance;

wndclass.hIcon =hIcon;

wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);

wndclass.hbrBackground =(HBRUSH)COLOR_WINDOW;

wndclass.lpszMenuName =NULL;

wndclass.lpszClassName =szAppName;

 

RegisterClass(&wndclass);

}

 

MainWin=hwnd=CreateWindow( szAppName,"CoolCPU",  

WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|

WS_MINIMIZEBOX,

    0,0,

    240,160,

    NULL,NULL,hResInstance,NULL);

 

ShowWindow(hwnd,SW_HIDE);

UpdateWindow(hwnd);

 

AddShellIcon();

 

while(GetMessage(&msg,NULL,0,0)) 

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

 

DelShellIcon();

 

DestroyIcon(hIcon);

DestroyMenu(hPopupMenu);

 

//关闭降温

 if(WinNT==0) 

{

  if(hCVxD!=INVALID_HANDLE_VALUE)

{

   EnableHlt=0;

   //设置VxD功能号3

   DeviceIoControl(hCVxD,3,(LPVOID)NULL,0,

          (LPVOID)&EnableHlt, sizeof(EnableHlt),

    &cbBytesReturned,NULL);

   }

  }

 //关闭VxD

 if( hCVxD != INVALID_HANDLE_VALUE )

  CloseHandle(hCVxD);

 

 return msg.wParam;

}

 

赞(0)
未经允许不得转载:网硕互联帮助中心 » 第3章 Windows运行机理-3.1 内核分析(12)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!