S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

这段代码很有趣:Windows蓝屏代码

Posted on 2010-01-13 21:36 S.l.e!ep.¢% 阅读(957) 评论(0)  编辑 收藏 引用 所属分类: RootKit
【原创】【讨论】这段代码很有趣:Windows蓝屏代码

【讨论】这段代码很有趣:Windows蓝屏代码
这个是在学习windows程序设计时,偶然发现的。程序运行后,在滚动条上右击,在弹出的快捷菜单中选择“滚动至此”,接下来程序会提示3次的"蓝屏死机!请先保存好数据!",依次点3次确定后,windows xp就蓝屏重启了。
程序本身没有用到特殊的api。程序也很容易理解。
蓝屏的原因是在处理滚动条消息时时,MessgeBox函数造成的。但是直接在滚动条的点击并不会蓝屏,具体什么原因我也不知道。估计是系统的bug。
VC 6.0 下编译通过,以下是代码。
复制内容到剪贴板代码:
/////////////////////////////////////////////////////////////////////////// #include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
        static TCHAR szAppName[] = TEXT ("MyWindow") ;
        HWND             hwnd ;
        MSG             msg ;
        WNDCLASS     wndclass ;

        wndclass.style                = CS_HREDRAW | CS_VREDRAW ;
        wndclass.lpfnWndProc        = WndProc ;
        wndclass.cbClsExtra        = 0 ;
        wndclass.cbWndExtra        = 0 ;
        wndclass.hInstance        = hInstance ;
        wndclass.hIcon                = LoadIcon (NULL, IDI_APPLICATION) ;
        wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
        wndclass.hbrBackground        = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        wndclass.lpszMenuName        = NULL ;
        wndclass.lpszClassName        = szAppName ;

        if(!RegisterClass (&wndclass))
        {
             MessageBox (NULL, TEXT ("此程序必须运行在NT下!"), szAppName, MB_ICONERROR) ;
             return 0;
        }

        hwnd = CreateWindow (szAppName,
                     TEXT ("蓝屏死机"),             
                             WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             300,
                             210,
                             NULL,
                             NULL,
                             hInstance,
                             NULL) ;

        ShowWindow (hwnd, iCmdShow) ;
        UpdateWindow (hwnd) ;
        
        while (GetMessage (&msg, NULL, 0, 0))
        {
             TranslateMessage (&msg) ;
             DispatchMessage (&msg) ;
        }
        return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
      HDC           hdc ;
      PAINTSTRUCT  ps ;
      RECT           rect ;
      static HINSTANCE hInstance;
      static HWND hScrollBar;

      switch (message)
      {
        case WM_CREATE:
             hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ; //取得实例句柄
             hScrollBar = CreateWindow (TEXT ("scrollbar"), NULL,
                                              WS_CHILD | WS_VISIBLE | WS_TABSTOP | SBS_VERT,    
                                          30, 30, 100, 100, 
                                          hwnd, (HMENU) 1, hInstance, NULL) ; //创建垂直滚动条
             return 0 ;
             
        case WM_SIZE :
             MoveWindow (hScrollBar, 30, 30, LOWORD (lParam) / 2, HIWORD (lParam)-50, TRUE) ;
             return 0;
             
        case WM_VSCROLL :
             MessageBox(NULL, TEXT("蓝屏死机!请先保存好数据!"),TEXT("请先保存好数据"), MB_OK); //蓝屏的原因就是加上了这句。去掉这句就不会蓝屏了。
             Sleep(500);
             return 0;

        case WM_PAINT:
             hdc = BeginPaint (hwnd, &ps) ;
             GetClientRect (hwnd, &rect) ;
             DrawText (hdc, TEXT ("Windows XP下的蓝屏,死机程序!"), -1, &rect, DT_SINGLELINE | DT_CENTER);
             EndPaint (hwnd, &ps) ;
             return 0 ;

        case WM_DESTROY:
             PostQuitMessage (0) ;
             return 0 ;
        }
        return DefWindowProc (hwnd, message, wParam, lParam) ;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理