Chinaunix首页 | 论坛 | 博客
  • 博客访问: 223372
  • 博文数量: 46
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 482
  • 用 户 组: 普通用户
  • 注册时间: 2014-07-18 14:14
个人简介

小菜鸟

文章分类

全部博文(46)

文章存档

2020年(2)

2017年(7)

2016年(36)

2014年(1)

我的朋友

分类: C/C++

2014-07-18 16:03:32

1 首先判断是不是NT家族操作系统系统的版本信息保存在OSVERSIONINFO结构中

点击(此处)折叠或打开

  1. BOOL isWinNTFamily()
  2. {
  3.     OSVERSIONINFO versionInfo;
  4.     versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  5.     if(!GetVersionEx(&versionInfo))
  6.     {
  7.         return FALSE;
  8.     }
  9.     if(VER_PLATFORM_WIN32_NT != versionInfo.dwPlatformId)
  10.     {
  11.         return FALSE;
  12.     }
  13.     return TRUE;
  14. }

点击(此处)折叠或打开

  1. BOOL isVistaOrLater()
  2. {
  3.     OSVERSIONINFO versionInfo;
  4.     versionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  5.     if(!GetVersionEx(&versionInfo))
  6.     {
  7.         return FALSE;
  8.     }
  9.     if (6 > versionInfo.dwMajorVersion)
  10.     {
  11.         return FALSE;
  12.     }
  13.     return TRUE;
  14. }

项目使用的是select desktop方法

点击(此处)折叠或打开

  1. BOOL selectDesktop(char *name)
  2. {
  3.     HDESK desktop;
  4.     if (name)
  5.     {
  6.         desktop = getDesktop(name);
  7.     }
  8.     else
  9.     {
  10.         desktop = getInputDesktop();
  11.     }
  12.     if (NULL == desktop)
  13.     {
  14.         WriteErrorToLog("selectDesktop:selectDesktop: get desktop failed!");
  15.         return FALSE;
  16.     }

  17.     BOOL ret = setDesktopToCurrentThread(desktop);
  18.     closeDesktop(desktop);
  19.     return ret;
  20. }
其中,getDesktop如下

点击(此处)折叠或打开

  1. static HDESK getDesktop(char *name)
  2. {
  3.     return OpenDesktopA(name,0,FALSE,DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW |

  4. DESKTOP_ENUMERATE
  5.         | DESKTOP_HOOKCONTROL | DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS |

  6. DESKTOP_SWITCHDESKTOP
  7.         | GENERIC_WRITE);
  8. }

点击(此处)折叠或打开

  1. static BOOL setDesktopToCurrentThread(HDESK newDesktop)
  2. {
  3.     return SetThreadDesktop(newDesktop);
  4. }
2 VISTA版本之前

点击(此处)折叠或打开

  1. HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)

  2. SimulateCtrlAltDelThreadFn,NULL,0,NULL)

点击(此处)折叠或打开

  1. static void WINAPI SimulateCtrlAltDelThreadFn()
  2. {
  3.     if(!selectDesktop("Winlogon"))
  4.     {
  5.         return;
  6.     }

  7.     HWND hWnd = FindWindow(_T("SAS window class"), _T("SAS window"));
  8.     if(NULL == hWnd)
  9.     {
  10.         hWnd = HWND_BROADCAST;
  11.     }

  12.     PostMessage(hWnd, WM_HOTKEY, 0, MAKELONG(MOD_ALT | MOD_CONTROL, VK_DELETE));
  13. }
3 VISTA版本之后
思路:
从system32文件加下的sas.dll厘面得到SendSAS接口
调用此接口sendSas(FALSE)

其中SendAS函数原形如下

点击(此处)折叠或打开

  1. VOID WINAPI SendSAS(
  2.   _In_ BOOL AsUser
  3. )
cihanshu

点击(此处)折叠或打开

  1. VOID WINAPI SendSAS(
  2.   _In_ BOOL AsUser
  3. )
为了调用SendSAS成功,此函数必然以服务方式运行或有uiAccess属性如果不是以服务方式运行,那么得把User Account Control打开
 调用

点击(此处)折叠或打开

  1. void runUnderVistaOrLater()
  2. {
  3.     HMODULE hModule = LoadLibrary(_T("Sas.dll"));
  4.     if(NULL == hModule)
  5.     {
  6.         WriteErrorToLog("runUnderVistaOrLater:LoadLibrary failed!");
  7.         return;
  8.     }
  9.     SendSas simSas = (SendSas)GetProcAddress(hModule,"SendSAS");
  10.     if(0 == simSas)
  11.     {
  12.         WriteErrorToLog("runUnderVistaOrLater:SimulateSAS failed!");
  13.         FreeLibrary(hModule);
  14.         return;
  15.     }
  16.     simSas(FALSE);

  17.     FreeLibrary(hModule);
  18. }






阅读(2710) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Debian 7(Linux) 安装SSH使用SecureCRT连接配置

给主人留下些什么吧!~~