﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-twzheng's cppblog-文章分类-windows 编程</title><link>http://www.cppblog.com/twzheng/category/5932.html</link><description>『站在风口浪尖紧握住鼠标旋转！』  人在台北心在汉</description><language>zh-cn</language><lastBuildDate>Mon, 15 Mar 2010 04:03:28 GMT</lastBuildDate><pubDate>Mon, 15 Mar 2010 04:03:28 GMT</pubDate><ttl>60</ttl><item><title>求windows xp 繁体版</title><link>http://www.cppblog.com/twzheng/articles/109710.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sun, 14 Mar 2010 16:05:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/109710.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/109710.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/109710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/109710.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/109710.html</trackback:ping><description><![CDATA[求windows xp 繁体版，最好是台湾版的，要能一步步的手动安装(想装双系统)<br><br>找了好几天了，很多资源都下不动<br><br>今天好不容易下了一个，但是香港版的，且安装到选择盘符时，键盘所有键都不能使用，所以还是无法安装<br><br>谢谢各位大哥大姐帮帮忙，小弟感激不尽！<img src ="http://www.cppblog.com/twzheng/aggbug/109710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">谭文政</a> 2010-03-15 00:05 <a href="http://www.cppblog.com/twzheng/articles/109710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>托盘编程</title><link>http://www.cppblog.com/twzheng/articles/40552.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sun, 06 Jan 2008 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/40552.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/40552.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/40552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/40552.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/40552.html</trackback:ping><description><![CDATA[<strong style="FONT-SIZE: 18pt">托盘编程</strong><br>摘自 好易教程网<br><br>一、&nbsp;托盘简介<br><br>所谓的&#8220;托盘&#8221;，在Windows系统界面中，指的就是下面任务条右侧，有系统时间等等的标志的那一部分。在程序最小化或挂起时，但有不希望占据任务栏的时候，就可以把程序放到托盘区。其实，托盘区的编程很简单，下面简要阐述一下子喽^_^<br><br>二、托盘编程相关函数<br><br>其实呢，把程序放到托盘上的本质就是先在托盘区绘制一个图标，然后把程序隐藏不见，再对托盘的图标进行消息处理，就可以了。<br><br>绘制图标以及确定图标所传送消息的函数只有一个，那就是——————<br><br>WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(<br>&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwMessage, <br>&nbsp;&nbsp;&nbsp;&nbsp;PNOTIFYICONDATA pnid<br>); <br>这个函数呢，负责向系统传递消息，以添加、修改或删除托盘区的图标。<br><br>她的返回值呢，是个布尔类型的。就是说，如果返回0，那就是成仁啦，非0才成功。<br><br>参数dwMessage 是表示这个函数的应用功能是哪一方面，是添加、删除，还是修改图标。如果是添加，则它的值为NIM_ADD；删除则是NIM_DELETE；而修改是NIM_MODIFY。<br><br>参数pnid就是具体的和程序在托盘区的图标有关系的结构了。它的定义如下：<br><br>typedef struct _NOTIFYICONDATA { <br>&nbsp;&nbsp;&nbsp;&nbsp;DWORD cbSize; <br>&nbsp;&nbsp;&nbsp;&nbsp;HWND hWnd; <br>&nbsp;&nbsp;&nbsp;&nbsp;UINT uID; <br>&nbsp;&nbsp;&nbsp;&nbsp;UINT uFlags; <br>&nbsp;&nbsp;&nbsp;&nbsp;UINT uCallbackMessage; <br>&nbsp;&nbsp;&nbsp;&nbsp;HICON hIcon; <br>&nbsp;&nbsp;&nbsp;&nbsp;char szTip[64]; <br>} NOTIFYICONDATA, *PNOTIFYICONDATA; <br><br>下面就对该结构各个参数进行刨析：<br><br>cbSize : 结构的长度，用&#8220;位&#8221;来做单位。一般在程序中，我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。<br><br>HWnd : 一个句柄，如果对托盘中的图标进行操作，相应的消息就传给这个句柄所代表的窗口。自然了，大多数情况下是this-&gt;m_hWnd喽。<br><br>uID : 在工程中定义的图标ID<br><br>uFlags : 这个成员标志着其他哪些成员的数据是有效的，分别为NIF_ICON, NIF_MESSAGE, NIF_TIP，分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然，三个值可以用&#8220;|&#8221;联系到一起。下面分别对涉及到的成员进行阐述<br><br>hIcon : 要增加，删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。<br><br>uCallbackMessage : 这在对托盘区的操作中，是比较重要的数据成员。这是个消息标志，当用鼠标对托盘区相应图标进行操作的时候，就会传递消息给Hwnd所代表的窗口。所以说，在uFlags中，一般都得标志它有效。这里一般都是自定义的消息。<br><br>szTip : 鼠标移动到托盘图标上时的提示文字。<br><br>三、托盘编程例子<br><br>有关托盘编程的基础知识呢，也就上面这些了。下面呢，我们就进入具体的实战演练阶段，举几个托盘编程的例子瞧瞧，加深理解。<br><br>1、&nbsp;&nbsp;将程序最小化到系统托盘区的函数toTray()。<br><br>void CTimeWakeDlg::toTray()<br><br>{<br><br>NOTIFYICONDATA nid;<br><br>nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);<br><br>nid.hWnd=this-&gt;m_hWnd;<br><br>nid.uID=IDR_MAINFRAME;<br><br>nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;<br><br>nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称<br><br>nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));<br><br>strcpy(nid.szTip,"计划任务提醒");//信息提示条为&#8220;计划任务提醒&#8221;<br><br><br><br>Shell_NotifyIcon(NIM_ADD,&amp;nid);//在托盘区添加图标<br><br>ShowWindow(SW_HIDE);//隐藏主窗口<br><br>}<br><br>这是个很简单的函数，里面首先给NOTIFYICONDATA赋值，然后调用shell_NotifyIcon, 头一个参数是NIM_ADD，表示添加。然后用函数ShowWindow 隐藏主窗口，这样，就实现了将程序最小化到系统托盘区的任务了。<br><br>2、&nbsp;&nbsp;程序已经最小化到托盘区了，但是呢，对托盘图标的操作如何进行呢？这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用了。它所提供的作用就是，当用户用鼠标点击托盘区的图标的时候（无论是左键还是右键），会向hWnd所代表的窗口传送消息，如果是上例，消息的名称就是WM_SHOWTASK。根据VC的消息机制，对自定义消息增加消息响应函数。<br><br>在头文件的//{{AFX_MSG和//}}AFX_MSG之间声明消息响应函数：<br><br>afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);<br><br>然后在CPP文件中添加消息映射。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之间加入：<br><br>ON_MESSAGE(WM_SHOWTASK,onShowTask)将消息和消息响应函数映射起来。<br><br>然后就是在CPP文件中加入函数onShowTask的实现了：<br><br>LRESULT CTimeWakeDlg::onShowTask(WPARAM wParam,LPARAM lParam)<br><br>//wParam接收的是图标的ID，而lParam接收的是鼠标的行为<br><br>{<br><br>if(wParam!=IDR_MAINFRAME)<br><br>return 1;<br><br>switch(lParam)<br><br>{<br><br>case WM_RBUTTONUP://右键起来时弹出快捷菜单，这里只有一个&#8220;关闭&#8221;<br><br>{<br><br>LPPOINT lpoint=new tagPOINT;<br><br>::GetCursorPos(lpoint);//得到鼠标位置<br><br>CMenu menu;<br><br>menu.CreatePopupMenu();//声明一个弹出式菜单<br><br>//增加菜单项&#8220;关闭&#8221;，点击则发送消息WM_DESTROY给主窗口（已<br><br>//隐藏），将程序结束。<br><br>menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭"); <br><br>//确定弹出式菜单的位置<br><br>menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint-&gt;x,lpoint-&gt;y,this);<br><br>//资源回收<br><br>HMENU hmenu=menu.Detach();<br><br>menu.DestroyMenu();<br><br>delete lpoint;<br><br>}<br><br>break;<br><br>case WM_LBUTTONDBLCLK://双击左键的处理<br><br>{<br><br>this-&gt;ShowWindow(SW_SHOW);//简单的显示主窗口完事儿<br><br>}<br><br>break;<br><br>}<br><br>return 0;<br><br>}<br><br><br><br>完了，就完了，没什么可再说的啦。
<img src ="http://www.cppblog.com/twzheng/aggbug/40552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">谭文政</a> 2008-01-06 14:58 <a href="http://www.cppblog.com/twzheng/articles/40552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows任务管理器开发原理与实现</title><link>http://www.cppblog.com/twzheng/articles/40551.html</link><dc:creator>谭文政</dc:creator><author>谭文政</author><pubDate>Sun, 06 Jan 2008 06:52:00 GMT</pubDate><guid>http://www.cppblog.com/twzheng/articles/40551.html</guid><wfw:comment>http://www.cppblog.com/twzheng/comments/40551.html</wfw:comment><comments>http://www.cppblog.com/twzheng/articles/40551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/twzheng/comments/commentRss/40551.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/twzheng/services/trackbacks/40551.html</trackback:ping><description><![CDATA[<strong style="FONT-SIZE: 18pt">Windows任务管理器开发原理与实现</strong><br><span style="FONT-SIZE: 12pt">摘自 好易教程网<br></span><br>　　Windows2000/XP内含的任务管理器（Taskmgr）相信大家都熟悉吧，相比之下XP里的要比2000功能更加强大，返回的信息也更加的详细，不过您是否觉得还有很多希望获得的消息没有包含在里面吗？您是否觉得 Windows的系统管理工具箱里的东西太分散了吗？下面就让我们看看它们的开发原理，并动手实现一个真正的任务管理器。现在我们是调用Win32API来实现这些功能的，但是大家都说MS隐藏了太多的细节，以后我们将讨论更多关于Windows内核的东东。 <br>　　可能大家对任务管理器里最熟悉的功能要数进程管理了，常常我们在怀疑中了病毒/木马的时候都会看看任务管理器里有没有什么特别的进程在运行，所以进程查看器应该是一个非常重要的功能。我们除了需要获得进程的名称外，还有什么呢？当然包括它的进程标识符（ProcessID），用户信息（UserName），CPU使用时间（CPUTime）和存储器的使用情况（MemoryUsage），还有它的优先权（BasePriority）。CPU和Memory信息可以帮助我们分析进程的运行情况，而优先权可以表示进程在CPU分配处理器使用时的优先情况。这些都是通用的进程信息，让我们再看看其他的信息吧。进程的父进程标识符（Parent Process ID），创建时间（Create Time），程序名称等在很多情况下也是我们关心的信息。我们再看看进程相关的性能信息。在Windows下通常有两种模式：内核模式（Kernel: Level 0）和用户模式（User: Level 3），进程往往在两种模式中来回切换，所以可以获得进程在内核模式和用户模式各自的使用时间。同时还包括进程相关的工作集（WorkingSet），分页池（PagedPool），非分页池（NonePagedPool）和页面文件（PageFile）信息。进程相关的I/O操作包括读/写/其他等动作，我们可以获得这些操作的次数和传送数据的数量。<br><br>　　如果您怀疑某个进程是木马，那您还想获得哪些信息呢？简单的进程名称应该是不够的吧！我们希望获得进程的实际程序的路径，这样可以帮助我们判断究竟是那个程序在运行。前段时间不是在讨论什么进程隐藏的，其中一种就是&#8220;创建远程线程&#8221;，而注体往往又是以动态链接库（DLL）的形式存在的，我们就希望看到某个具体进程所包含的所有模块（Module），常常是DLL也。&#8220;线程&#8221;是一个大家熟悉的名字，它是Windows系统中的实现体，而进程则是线程运行的环境。一个进程到底创建了多少线程了？我们同样可以枚举进程内部的所有线程信息。如果您发现一个木马进程，下面的动作就应该是分析它的运行机制（如果您对它感兴趣），不过最终您还是要将它结束吧。在Windows2k下，很多系统关键进程在TaskMgr里是不能被结束的，不过现在您不用担心了。好的，对进程的操作当然就包括结束进程。如果您用过中文的XP，您是否常常遇到任务栏&#8220;假死&#8221;的情况，虽然您的电脑没有挂掉，但却动弹不得，那好我们也同样可以将任意的进程挂起来，不管您对它做什么动作（除了结束），它都不会有任何的反应。有了挂起进程，同样我们也可以将进程从&#8220;挂起&#8221;状态激活。<br><br>　　桌面窗口是大家接触得最多的交互界面了，您是否想获得每个窗口的标题信息呢？当然我们还可以获得与窗口关联的进程，线程与窗口句柄属性。如果大家对VC比较熟悉，就应该知道其中的一个SPY++工具吧，它就可以获得桌面窗口，进程和线程的详细信息，不过现在就不用打开这个，打开那个了，通通搞定了！ <br><br>　　系统性能是每个用户关心的话题。它包括整个系统当前创建的句柄，进程以及线程的数目。还有物理存储器（Physical Memory）的总量和使用情况，系统高速缓存（System Cache）的大小，存储器保留与提交（Commit Charge）状况，当然还有核心分页/非分页池（Kernel Memory）的使用情况。几乎包括了Windows系统下存储器管理的大部分信息。<br><br>　　虽然现在硬盘的价格已经很低了，不过我还是在用6.4G的小东东，所以常常遇到&#8220;Low Disk&#8221;！我们常常要看看硬盘的使用情况，不过每次都要进入我的电脑，太麻烦了。而我们现在可以一次了解所有磁盘的容量和当前使用情况，同时还有它们的格式类型（如FAT,NTFS,CDFS等）和磁盘标签。<br><br>　　说到环境块，或许不是那么熟悉吧，它包含一些环境变量，而每个环境变量对应一个/多个字符串，您可以在控制面板的SYSTEM/Advanced（系统/高级）里对它们进行设置，包括添加新的环境变量，删除和编辑系统环境变量。<br><br>　　事件记录对我们分析系统的使用情况有很大的帮助。事件记录分为三种：应用程序，系统和安全。而对应的每种事件又可以分为几种类型，它们分别是常规信息，警告和错误。其中包括记录序号（Record Number），事件类型（Type），标识符（Event ID），来源（Source），产生时间（Time Generated），用户名（User）和相关描述信息（Description）。有时间大家可以多看看事件信息，当然每个网络管理员对它们应该是很熟悉的，不过还包括其他的事件日志信息。<br><br>　　Windows系统下的ipconfig /all这个命令我是常常用，因为我们使用的是DHCP，没事看看自己的IP地址变了没有。其中包括详细的网络适配器的信息，包括适配器名称，描述，硬件地址和类型，IP地址及相应的子网掩码，网关与DHCP服务器地址等。不过您是否对网络流量也感兴趣呢？我们当然可以获得主机接受/发送了多少（非）广播数据报，出现了多少错误，一共接受/发送了多少信息，这些对每个网友都是有用的信息哟。<br><br>　　网络共享往往是大家注意的地方，您究竟共享了多少信息，它们的文件路径是什么，还有它们的共享类型信息。我们在不需要某些共享资料时，当然不要忘了将其删除，以免泄露自己的机密信息。<br><br>　　Windows的NT是一个多用户的系统，允许多种类型用户的存在。我们希望获得用户账号的使用期限（Password Expired），记住要不定时的修改用户的密码哟，以及用户标识符（User ID），组标识符（Group ID），还有用户账号的类型（Type），不同的类型有不同的权限，我们当然希望有最High的权力哟！看看系统对某个账号的磁盘空间使用情况是否有限制（Max Storage），账号登录的次数（Number Of Logon）和登录时间信息（Logon Hours）等，对我们分析用户的使用情况也有帮助的。<br><br>　　系统的Win32服务和设备驱动信息也是很重要的，我们希望探测每个服务/设备启动程序的具体路径，状态，类型，启动方式等等信息。我们还希望对服务进行控制，比如停止，启动和删除操作。<br><br>　　关机也不是那么的单调的，您可以注销自己的系统，如果您要离开当然就需要锁定了。最近大家都不喜欢关机，太麻烦了，所以都习惯使用冬眠，系统将会为我们保留当前信息，不过还有支持电源管理的关机和休眠。Windows2000的用户注意了，我们同样可以使用XP系统下的带有到记时与消息提示的关机和重启功能了。<br><br>　　系统的版本信息是比较固定的，主要包括操作系统的指纹，注册组织/用户，主机名和系统相关目录等信息。&nbsp;&nbsp;&nbsp;<br><br><br>　　说了这么多，我们也该谈谈如何实现了。<br><br>　　1.窗口信息<br><br>　　MS为我们提供了打开特定桌面和枚举桌面窗口的函数。<br>　　hDesk=OpenDesktop（lpszDesktop,0,FALSE,DESKTOP_ENUMERATE）；<br>　　//打开我们默认的Default桌面；<br>　　EnumDesktopWindows（hDesk,（WNDENUMPROC）EnumWindowProc,0）；<br>　　//枚举打开桌面上的所有窗口，由回调函数实现。<br>　　BOOL __stdcall EnumWindowProc（HWND, LPARAM）；<br>　　//在回调函数中，我们可以获得窗口的标题和相关进程，线程信息；<br>　　GetWindowText（hWnd,szWindowText,dwMaxCount）；<br>　　GetWindowThreadProcessId（hWnd,&amp;dwPID）；<br><br>　　2.设备驱动器信息（服务和设备驱动器差不多，在此不做重复）<br><br>　　设备驱动信息有服务控制管理器（SCM）来管理的，我要打开服务控制管理器，并枚举所有的设备驱动器。<br>　　OpenSCManager（NULL,NULL,SC_MANAGER_ALL_ACCESS）；<br>　　//以所有权限打开服务控制管理器；<br>　　EnumServicesStatus（schManager,dwDeviceType,dwDeviceState,<br>　　　　　　　　EnumStatus,dwBufSize,&amp;dwBytesNeeded,<br>　　　　　　 &amp;dwDevicesReturned,&amp;dwResumeHandle））<br>　　//枚举所有设备的当前状态；<br>　　CloseServiceHandle（schManager）；<br>　　//记住，在结束访问后要关闭服务句柄；<br>　　OpenService（schManager,szDeviceName,SERVICE_ALL_ACCESS）；<br>　　//打开特定的设备驱动器；<br>　　QueryServiceConfig（schDevice,lpDeviceConfig,<br>　　　　　　　　　　&nbsp;&nbsp;&nbsp;1024*8,&amp;dwBytesNeeded）；<br>　　//查询驱动器的服务配置信息；<br>　　QueryServiceStatus（schDevice,&amp;DeviceStatus）；<br>　　//查询设备驱动器的当前状态；<br>　　QueryServiceConfig2（schDevice,SERVICE_CONFIG_DESCRIPTION,<br>　　（LPBYTE）lpDeviceDescription,8*1024,&amp;dwBytesNeeded）<br>　　//查询设备的描述信息；<br>　　StartService（schDevice,0,NULL）；<br>　　//启动设备；<br>　　ControlService（schDevice,SERVICE_CONTROL_STOP,&amp;DeviceStatus）；<br>　　//停止设备；<br>　　DeleteService（schDevice）；<br>　　//删除设备；<br><br>　　3.磁盘信息<br><br>　　我们希望获得系统所有磁盘的信息，包括软盘，硬盘，光盘等等；<br>　　GetLogicalDriveStrings（dwBufferLength,lpBuffer）；<br>　　//获得逻辑设备的信息；<br>　　GetVolumeInformation（lpRootPathName,lpVolumeNameBuffer,<br>　　 dwVolumeNameSize,&amp;dwVolumeSerialNumber,<br>　　 &amp;dwMaximumComponentLength,&amp;dwFileSystemFlags,<br>　　　　　　lpFileSystemNameBuffer,dwFileSystemNameSize）；<br>　　//获得磁盘卷信息，包括卷名称和格式类型；<br>　　GetDiskFreeSpaceEx（lpRootPathName,&amp;FreeBytesAvailable,<br>　　　　　　　　&nbsp;&nbsp;&amp;TotalNumberOfBytes,&amp;TotalNumberOfFreeBytes）；<br>　　//探测磁盘的空间使用情况；<br><br>　　4.环境变量<br><br>　　我们可以从注册表中获得环境块的信息：HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment，当然要使用注册表的函数。<br>　　RegOpenKeyEx（HKEY_LOCAL_MACHINE,RegKey,0,KEY_QUERY_VALUE,&amp;hKey）；<br>　　//打开注册表的键；<br>　　RegEnumValue（hKey,dwIndex,EnvironVariable,<br>　　　　　　　　 &amp;dwVariableLength,NULL,NULL,NULL,NULL）；<br>　　//查询我们需要的信息值；<br>　　GetEnvironmentVariable（EnvironVariable,EnvironString,1024）；<br>　　//获得环境变量的字符串信息；<br><br>　　5.事件记录信息<br><br>　　OpenEventLog（NULL,szLog）；<br>　　//打开时间日志记录；<br>　　GetOldestEventLogRecord（hEvent,&amp;dwThisRecord）；<br>　　//获得最新的日志信息，以便继续查找；<br>　　ReadEventLog（hEvent,EVENTLOG_FORWARDS_READ │ EVENTLOG_SEQUENTIAL_READ,<br>&nbsp;&nbsp;&nbsp;0,pEventLogRecord,1024*32,&amp;dwRead,&amp;dwNeeded）<br>　　//读去日志信息；<br>　　LookupAccountSid（NULL,pSid,szName,&amp;dwName,szDomain,&amp;dwDomain,&amp;SNU）；<br>　　//获取账户的SID，以便获得账户的用户名称；<br>　　GetNumberOfEventLogRecords（hEvent,&amp;dwTotal）；<br>　　//获得事件日志的总数；<br>　　CloseEventLog（hEvent）；<br>　　//不要忘记关闭事件句柄；<br>　　<br>　　6.网络共享<br><br>　　我们使用第二等级的网络共享搜索；<br>　　NetShareEnum（NULL,dwLevel,（PBYTE *）&amp;pBuf,MAX_PREFERRED_LENGTH,&amp;entriesread,&amp;totalentries,&amp;resume）；<br>　　//列举所有的共享目录及相关信息；<br>　　NetApiBufferFree（pBuf）；<br>　　//释放缓冲区；<br>　　NetShareDel（NULL,（char *）lpShareNameW,0）；<br>　　//删除网络共享目录；<br>　　<br>　　7.网络适配器信息<br><br>　　我们要探测NIC的信息和网络流量；<br>　　GetAdaptersInfo（&amp;AdapterInfo,&amp;OutBufLen）；<br>　　//获取适配器信息；<br>　　<br>　　8.系统性能<br><br>　　获取系统的存储器使用情况；<br>　　GetPerformanceInfo（&amp;PerfInfo,sizeof（PERFORMACE_INFORMATION））<br>　　//获取系统性能信息； <br><br><br>　　9.进程/线程/模块信息<br><br>　　在此我们使用工具帮助函数（ToolHelp32）和系统<br>　　OpenProcessToken（GetCurrentProcess（）,TOKEN_QUERY │ TOKEN_ADJUST_PRIVILEGES,&amp;hToken）；<br>　　//打开进程的令牌，提升权限；<br>　　AdjustTokenPrivileges（hToken,FALSE,&amp;TokenPrivileges,sizeof（TOKEN_PRIVILEGES）,NULL,NULL）；<br>　　//将进程的权限提升到支持调试（Debug）；<br>　　CreateToolhelp32Snapshot（TH32CS_SNAPPROCESS,0）；<br>　　//创建进程的快照；<br>　　Process32First（hProcessSnap,&amp;ProcessEntry32）；<br>　　Process32First（hProcessSnap,&amp;ProcessEntry32）；<br>　　//枚举所有进程；<br>　　OpenProcess（PROCESS_QUERY_INFORMATION,FALSE,ProcessEntry32.th32ProcessID）；<br>　　//打开特定进程，以查询进程相关信息；<br>　　GetProcessTimes（hProcess,&amp;CreateTime,&amp;ExitTime,&amp;KernelTime,&amp;UserTime）；<br>　　//获取进程的时间信息； <br>　　GetProcessMemoryInfo（hProcess,&amp;PMCounter,sizeof（PMCounter））；<br>　　//获取进程的存储区信息；<br>　　GetPriorityClass（hProcess）；<br>　　//获取进程的优先权；<br>　　GetProcessIoCounters（hProcess,&amp;IoCounters）；<br>　　//获取进程的IO使用情况；<br>　　CreateToolhelp32Snapshot（TH32CS_SNAPMODULE, dwProcessID）；<br>　　//创建模块快照；<br>　　Module32First（hModuleSnap, &amp;ModuleEntry32）；<br>　　Module32Next（hModuleSnap, &amp;ModuleEntry32）；<br>　　//枚举进程模块信息；<br>　　CreateToolhelp32Snapshot（TH32CS_SNAPTHREAD, 0）；<br>　　//创建线程快照；<br>　　Thread32First（hThreadSnap, &amp;ThreadEntry32）；<br>　　Thread32Next（hThreadSnap, &amp;ThreadEntry32）；<br>　　//枚举线程信息；<br>　　OpenThread（THREAD_ALL_ACCESS,FALSE,ThreadEntry32.th32ThreadID）；<br>　　//打开线程，须自己获得此函数地址；<br>　　TerminateProcess（hProcess,0）；<br>　　//终止进程；<br>　　SuspendThread（hThread）；<br>　　//悬挂线程；<br>　　ResumeThread（hThread）；<br>　　//激活线程；<br><br>　　10.关机<br><br>　　AdjustTokenPrivileges（hToken,FALSE,&amp;TokenPrivileges,sizeof（TOKEN_PRIVILEGES）,NULL,NULL）；<br>　　//调整进程令牌，使其支持关机；<br>　　ExitWindowsEx（EWX_LOGOFF,0）；<br>　　//注销系统；<br>　　LockWorkStation（）；<br>　　//锁定系统；<br>　　InitiateSystemShutdown（NULL,szMessage,dwTimeout,FALSE,bSig）；<br>　　//支持到记时和消息显示的关机/重启；<br>　　SetSystemPowerState（bSig,FALSE）；<br>　　//系统休眠/冬眠； <br><br><br>　　11.用户信息<br><br>　　NetUserEnum（NULL,dwLevel,FILTER_NORMAL_ACCOUNT,（LPBYTE*）&amp;pBuf,　　　　　　　dwPrefMaxLen,&amp;dwEntriesRead,&amp;dwTotalEntries,&amp;dwResumeHandle）；<br>　　//枚举系统用户信息；<br>　　NetUserDel（NULL,lpUserNameW）； <br>　　//删除指定用户；<br>&nbsp;&nbsp;<br>　　12.系统版本信息<br><br>　　GetVersionEx（（LPOSVERSIONINFO）&amp;osviex）；<br>　　//获取操作系统的版本信息；<br>　　我们也可以通过注册表（HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion）获取相关信息：<br>　　GetTickCount（）；<br>　　//获取开机时间；<br>　　GetComputerName（szInfo,&amp;dwInfo）；<br>　　//获取计算机名称；<br>　　GetUserName（szInfo,&amp;dwInfo）；<br>　　//获取计算机用户名；<br>　　GetWindowsDirectory（szInfo,MAX_PATH+1）；<br>　　//获取Windows目录；<br>　　GetSystemDirectory（szInfo,MAX_PATH+1）；<br>　　//获取系统目录；<br><br>　　小结：<br><br>　　虽然我们现在已经实现了任务管理器的各项功能，甚至比Windows自带的功能还要强大，不过却没有什么兴奋的感觉。因为看看我们的代码，您就会发现那些都是直接调用的Win32API函数，但是我们清楚系统底层究竟是怎么实现的吗？不管我们是否只是为了实现一个功能，还是对操作系统感兴趣，我们都应该更多的对系统底层进行研究，而不仅仅是只会使用高层函数的程序员。虽然微软为我们隐藏了很多的内部细节，但正是这种底层的秘密激发了我们对其进行深入研究的兴趣和动力。 
<img src ="http://www.cppblog.com/twzheng/aggbug/40551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/twzheng/" target="_blank">谭文政</a> 2008-01-06 14:52 <a href="http://www.cppblog.com/twzheng/articles/40551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>