Windows核心编程(笔记)
zhang-hui
Have a nice day
展开
-
Chapter02-VC 中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用
一、 在字符串前加一个L作用: 如 L"我的字符串"表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节。 strlen("asd") = 3; strlen(L"asd") = 6;二、 _T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目转载 2012-04-07 09:40:09 · 581 阅读 · 0 评论 -
Chapter10-“I/O设备的同步和异步”之I/O设备同步操作
最常用的两个函数-WriteFile、ReadFileBOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);BOOL WriteFile( HANDLE hFile, LPC翻译 2012-08-09 19:11:34 · 1392 阅读 · 0 评论 -
Chapter07-线程控制
挂起和重启线程 在线程内核对象中有一个标记线程挂起的计数器,当你调用CreateProcess或CreateThread函数时线程内核对象初始化为1,这样就可以在线程完成所有初始化工作之前阻止CPU调度它。 当线程被完全初始化后,CreateProcess或CreateThread函数检查是否传递了CREATE_SUSPENDED标识。如果传递了则函数返回后,线程出翻译 2012-08-02 08:26:24 · 601 阅读 · 0 评论 -
Chapter10-“I/O设备的同步和异步”之异步I/O简介
异步I/O基础 相比于计算机上的其他操作,I/O操作时最慢的最不可预测的操作之一。如果使用同步I/O,虽然方便控制,但是浪费了大量的CPU时间;而异步I/O在一定程度上缓解了这个问题。 异步I/O就是将I/O请求发送给设备驱动器,让设备驱动器负责实际的I/O操作,当设备驱动器在等待I/O设备相应时,应用程序的线程不用被挂起去等待I/O操作的完成,线程可以跳过等待继续翻译 2012-08-21 19:03:57 · 1688 阅读 · 0 评论 -
VS中Debug版本和Release版本的区别
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。Debug 和 Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起 Release 版错误,在此转载 2012-12-21 21:26:20 · 1272 阅读 · 0 评论 -
CloseHandle()函数的使用
CloseHandle()函数的使用很多程序在创建线程都这样写的:............ThreadHandle = CreateThread(NULL,0,.....);CloseHandel(ThreadHandle );。。。。。这不是刚好创建又关闭了吗?线程怎么运行呢? 答:Closing a thread handle does not termin转载 2012-12-21 16:48:30 · 1389 阅读 · 0 评论 -
Chapter09-"内核模式下的线程同步"之事件内核对象
有两种事件内核对象:自动事件和手动事件。当手动事件被触发时,所以该事件的等待线程都编程可调度状态;而自动事件被触发时,只有个一个等待该事件线程变成可调度状态。 下面再逐个讲解Event的相关函数:a) 创建事件函数——CreateEvent函数: HANDLE CreateEvent(翻译 2012-08-05 16:46:51 · 817 阅读 · 0 评论 -
__stdcall、__cdecl 、CALLBACK 几种函数修饰符
CALLBACK == WINAPI ==__stdcall实际上就是一种调用模式,就是约定由调用函数来自行解决压栈参数,同 pascal 调用。回调函数只能是类的静态成员函数或是类外定义的全局函数#define CALLBACK __stdcall#define WINAPI __stdcall#define WINAPIV __cdecl#define转载 2013-01-26 10:19:34 · 2490 阅读 · 2 评论 -
Chapter11-"windows线程池" 之 内核对象触发调用回调函数
众所周知,一般可以调用WaitForSingleObject、WaitForMultiObject来实现线程同步。但是当多个线程等待同一个内核对象变为触发态时,这并不是一种明智的做法,这样会浪费大量的系统资源。而windows线程池很有效提供系统性能。 利用windows线程池实现,当内核对象变为触发态时,自动调用一个回调函数,一如既往的需要四步创建对应的回调函数,回调函数原创 2013-01-26 23:58:52 · 1657 阅读 · 0 评论 -
Chapter11-"windows线程池"之异步调用函数
利用线程池(thread pool)异步调用函数时,不需显式调用 CreateThread 函数,系统会为进程自动创建线程池(thread pool)。线程池的每个线程实际运行你事先定义好的回调函数。 写到这里,也许大多人会想:怎么不直接调用众所周知的 CreateThread 函数去创建线程?这里就有必要讲一下线程池(thread pool)的机制了。 线程池(threa原创 2013-01-26 15:18:24 · 1468 阅读 · 2 评论 -
Chapter11-"windows线程池"之 间隔执行函数
按照一定的时间间隔,周期性调用某个函数,大致需要用到以下五步按照一定的时间间隔,周期性被调用的TimerCallback函数的原型如下VOID CALLBACK TimerCallback( _Inout_ PTP_CALLBACK_INSTANCE Instance, _Inout_opt_ PVOID Context, _Inout_ PTP_TI原创 2013-01-26 19:25:05 · 1880 阅读 · 0 评论 -
Chapter15-重置内存内容(Resetting the Contents of Physical Storage)
在正常的内存页面替换算法中,算法会优先选择将没被修改的页面替换出去,而让已修改的内存页面尽量久地留在内存中。并且,在windows系统下,当替换算法不得已要将一个已修改的页面替换出 RAM 时,系统还会先将替换的已修改页面备份到磁盘的分页文件(Paging file)中去(方便以后再次读取),而这个过程是比较慢的。 重置内存(Resetting storage)的意思就是主动告知系统:原创 2013-01-29 10:24:30 · 753 阅读 · 0 评论 -
Chapter16— A thread's Stack
概述: 当创建一个线程的时候,系统会为它预留一定的地址空间去运行(每个线程都有自己的stack)。在默认情况下,每个线程的 Stack 为 1M。 当然,你还可以在编辑器中进行手动设置。在编译程序时,linker 会将 stack 大小的值嵌入到文件的 PE 头中,这样当程序加载运行时,系统会读取该值并为它设置相应大小的 stack。 除此之外,在调用 Crea原创 2013-01-31 11:38:58 · 775 阅读 · 0 评论 -
Chapter17— Memory-Mapping Files 进程间共享数据进行通信
第十七章的实例有个利用 Memory-Mapped File 来实现进程间共享数据和通信。Step1:调用 CreateFileMapping 函数创建一个 Memory-Mapped File Object。该函数的原型如下:HANDLE WINAPI CreateFileMapping( __in HANDLE hFile, __in L原创 2013-02-27 22:24:43 · 1659 阅读 · 0 评论 -
Chapter10-“I/O设备的同步和异步”之文件操作相关
获取文件的逻辑大小——GetFileSizeEx函数函数原型:BOOL WINAPI GetFileSizeEx( __in HANDLE hFile, __out PLARGE_INTEGER lpFileSize );GetFileSizeEx函数的第一个参数就不多说了,hFile就是CreateFile函数返回的句柄;第二个参数lpFileSize是一翻译 2012-08-09 15:35:13 · 1368 阅读 · 0 评论 -
Chapter10-“I/O设备的同步和异步”之打开和关闭设备
打开设备:CreateFile函数函数原型:HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesire翻译 2012-08-08 19:21:06 · 1446 阅读 · 0 评论 -
Chapter03-验证一个句柄是否是继承的
关键是GetHandleInformation 函数GetHandleInformation 函数原型:BOOL GetHandleInformation(HANDLE hObject, PDWORD pdwFlags); This function returns the current flag settings for the specified handle in th转载 2012-04-07 09:22:39 · 964 阅读 · 0 评论 -
Chapter04-进程终止
一个进程终止的四种方式:基线程(primary thread)的入口函数自动返回.例如通常的main函数返回。在基线程的入口函数退出时必须确保:所有的该线程创建的C++对象都调用了对应的析构函数。操作系统已经释放了所有申请的线程堆栈。系统在入口函数的返回值中甚至了退出代码值(exit code)系统将减少进程内核对象(process kernel object)的引用值(u原创 2012-04-08 23:33:38 · 991 阅读 · 0 评论 -
Chapter04-获取主机版本系统和验证系统是否是Vista
//打印出系统版本信息void PrintOSVersionInfo(){ //系统版本系统结构体:OSVERSIONINFO OSVERSIONINFO osvi; //将其内容置为0,并设置其大小 ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO)翻译 2012-04-08 11:33:58 · 558 阅读 · 0 评论 -
Chapter04-获取系统环境变量值
/*主要是通过GetEnvironmentVariable实现的。其函数原型如下:DWORD GetEnvironmentVariable( PCTSTR pszName, //记录要获取的参数名。 PTSTR pszValue, //标记要获取的参数名对应的参数值 DWORD cchValue);//表示pszValue能容纳最大字符数。Note:如果cchValue为0,翻译 2012-04-08 09:57:25 · 738 阅读 · 0 评论 -
#pragma 指令
参考网页: http://hi.baidu.com/dreamzgj/blog/item/46b99b12812cce24dd5401ee.htmlhttp://jinweijingjing.blog.sohu.com/30362134.htmlhttp://msdn.microsoft.com/zh-cn/subscriptions/downloads/d9x1s805(v=转载 2012-06-19 09:57:48 · 1101 阅读 · 0 评论 -
Chapter06-Thread讲解
与Process进程类似,每个Thread线程也是由两部分组成一个内核对象(Kernel Object);操作系统用之来管理线程,同时内核对象中还记录了该线程的各种统计信息。一个线程堆栈(Thread Stack);该堆栈用来记录函数参数和运行过程中的各变量。何时创建线程: 线程(Thread)描述了进程内部的执行路线;每次进程(Process)初始化时翻译 2012-06-20 15:59:03 · 1294 阅读 · 0 评论 -
Chapter04-CreateProcess函数详解
CreateProcess函数原型如下:BOOL CreateProcess( PCTSTR pszApplicationName, PTSTR pszCommandLine, PSECURITY_ATTRIBUTES psaProcess, PSECURITY_ATTRIBUTES psaThread, BOOL bInheritHandles, DWORD fdwCre翻译 2012-04-08 14:59:08 · 1420 阅读 · 0 评论 -
Chapter06-C/C++运行库
在上一篇关于线程的讲解中,有提到一般我们都不应该直接调用CreateThread函数去创建新线程,而是调用_beginthreadex函数创建新线程。以下是_beginthreadex函数的伪代码:uintptr_t __cdecl _beginthreadex ( void *psa, unsigned cbStackSize, unsigned (__stdcall *翻译 2012-06-28 14:37:04 · 1034 阅读 · 0 评论 -
Chapter09-"内核模式下的线程同步"之等待函数
概述: 用户模式下的线程同步(user-mode thread synchronization)一个明显的优点是速度快;如果你非常在意程序的性能,则最好使用用户模式下的线程同步。但是用户模式下也有一定的缺点限制:interlocked lock APIs只能对一个值进行操控,而不能使得一个线程处于等待状态;你可以用Critical Section系列函数使某个线程处于等待状态,但是翻译 2012-08-05 11:37:03 · 629 阅读 · 0 评论 -
Chapter08-用户模式下的线程同步
Cache Lines 如果想编写一个能够在多核上高效率的程序,你就有必要理解Cache Lines.学过《操作系统》应该都知道,CPU从物理内存中读取内容的时候不是每次读取一个字节,而是读取多个字节的数据放入Cache Line之中。一个Cache Line可能是32、64或128个字节(总之是2的指数),并且它们一般都是按照32、64或128字节数对齐的。 值得翻译 2012-08-03 21:15:46 · 1022 阅读 · 0 评论 -
Chapter09-“内核模式下的线程同步”之信号量内核对象
信号量规则如下:1. 如果当前资源计数大于0,信号量处于触发状态。2. 如果当前资源计数等于0,信号量处于非触发状态。3. 系统不允许当前资源计数为负数。4. 当前资源计数不会比资源最大值还大。 一个线程通过调用一个等待函数(传递信号量对应的句柄作为参数)获取访问资源的权限。等待函数内部会检测信号量当前的资源计数翻译 2012-08-07 15:05:18 · 832 阅读 · 0 评论 -
Chapter09-“内核模式下的线程同步”之互斥量内核对象
互斥量内核对象确保线程对某一个单一资源拥有一个互斥排外的访问权限.互斥量内核对象和临界区域有点相似,不过一个处于用户态(速度快),一个处于内核态(速度慢).由于互斥量是内核对象,所以不同进程的线程也可以访问同一个互斥量;而临界区域就不行,只有同一个进程内的线程才能访问得到。 一个互斥量内核对象包括:一个使用计数(usage count), 一个线程ID(thread ID),一个递翻译 2012-08-07 16:24:29 · 1228 阅读 · 0 评论 -
Chapter09-“内核模式下的线程同步”之可等待的计时器内核对象
可等待的计时器是在某个时间点或一个时间周期内自动触发它们本身的内核对象。与之对应的几个函数:1) 创建可等待计时器函数——CreateWaitableTimer函数HANDLE WINAPI CreateWaitableTimer( __in_optLPSECURITY_ATTRIBUTES lpTimer翻译 2012-08-07 15:02:27 · 625 阅读 · 0 评论 -
C++ 定时器使用
用WM_TIMER来设置定时器 先请看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器 UINT uElapse, // 时间间隔,单位为毫秒 TIMERPROC lpTimer转载 2013-01-26 19:45:17 · 2895 阅读 · 0 评论