|
Windows via C/C++, Fifth Edition
Windows programming knowledge
|
-
Windows核心编程(第五版)笔记 第二十四章 异常处理和软件异常 (Exception Handlers and Software Exceptions)
摘要:第二十四章 异常处理和软件异常1.理解异常过虑器表达式 __try{//some code} __except(过虑器表达式){//code for exception handling}2.过虑器表达式的值 值只能为以下三种的一个(1) EXCEPTION_EXECUTE_HANDLER 程序中遇到异常后,会立刻__except中的代码,然后接着__except块后的代码继续执行。 (2) EX...
阅读全文
-
Windows核心编程(第五版)笔记 第二十三章 结束处理程序 (Termination Handlers)
摘要:第二十三章 结束处理程序1.结构化异常处理SEH是由编译器实现的,不同编译器在实现SEH时会有些区别。它是Winodws特有的技术。SEH和C++异常是两种不同的异常机制。在VC中C++异常是基于SEH实现的。2.结构化异常处理用法(1)__try __try后必须接__finally和__except中的一个,且只能有一个。 若__try中有return,break,continue等语句,在执...
阅读全文
-
Windows核心编程(第五版)笔记 第二十二章 DLL 注入和API钩 (DLL Injection and API Hooking)
摘要:第二十二章 DLL 注入和API钩(DLL Injection and API Hooking)1.概览 每个进程都有自已独立的地址空间,一个进程不可能创建一个指向其它进程地址空间的指针。 然而如果我们把自已的DLL注射到另一个进程的地址空间去,我们就可以在那个被注入的进程里为所欲为了。 Subclass同一进程中的窗体:http://msdn2.microsoft.com/en-us/libra...
阅读全文
-
Windows核心编程(第五版)笔记 第二十一章 线程本地存储(Thread-Local Storage)
摘要:第二十一章 线程本地存储(Thread-Local Storage)1.动态TLS 图中TlsGetValue(gdwTlsIndex2)在线程1和线程2中返回的值是不同的。在创建线程时,进程会为当前创建的线程分配一个void *的数组作为TLS用。它用于存储只限当前线程可见的全局变量。从而使进程中的每个线程都可以有自已的(不能其它线程访问的)全局变量。TlsAlloc在返回时会先把槽中的值置为0...
阅读全文
-
Windows核心编程(第五版)笔记 第二十章 DLL高级技巧 (DLL Advanced Techniques)
摘要:第二十章 DLL高级技巧1.概览1.1动态加载DLL文件 LoadLibraryEx HMODULE LoadLibraryEx(PCTSTR pszDLLPathName,HANDLE hFile,DWORD dwFlags); 返回DLL加载到进程空间原首地址。 dwFlags 可以有以下几个值 (1) DONT_RESOLVE_DLL_REFERENCES 建议永远不要使有这个值,它的存在仅...
阅读全文
-
Windows核心编程(第五版)笔记 第十九章 DLL的一些基本概念 (DLL Basics)
摘要:第十九章 DLL的一些基本概念1.DLL的两种链接方式: 在使用DLL前,程序必先加载DLL程序(将DLL映射到进程的地址空间)。有如下两种方式加载DLL程序: (1)隐式链接 (2)显示链接 2.静态与动态CRT库 一个进程的地址空间是由一个可执行程序模块和多个DLL模块组成的。 这些模块有的链接的是CRT静态库,有的链接的是CRT动态库(DLL),有的没有链接CRT. 这将导致在进程地址空间...
阅读全文
-
Windows核心编程(第五版)笔记 第十八章 堆 (Heap)
摘要:第十八章 堆1.堆 虚拟内存主要用于分配连续的内存,如给大数组分配内存。 堆主要用于分配小块内存, 如链表,树等就适合用堆来分配内存。 优点在于:在堆中分配内存时不像虚拟内存要求那么多,如分配粒度、页边界等。它没有这些要求,可分配任意大小的内存。 缺点在于:相对于其它内存分配机制,它分配和释放内存的速度较慢,而且失去了对内存commit和decommit的控制。 一个进程中可以有多个堆。除默认堆外...
阅读全文
-
Windows核心编程(第五版)笔记 第十七章 内存映射文件 (Memory-Mapped Files)
摘要:第十七章 内存映射文件1.概览 (1)什么是内存映射文件 内存映射文件是由一个文件到一块内存的映射,使进程虚拟地址空间的某个区域与磁盘上某个文件的部分或全部内容的建立映射。 建立映射后,通过该区域可以直接对被映射的磁盘文件进行访问.而不必执行文件I/O操作也无需对文件内容进行缓冲处理。 就好像整个被映射的文件都加载到了内存一样,因此内存文件映射非常适合于用来管理大文件。 注:与虚拟内存使用的是Pa...
阅读全文
-
HANDLE HMODULE HINSTANCE HWND有什么区别
摘要:http://hi.baidu.com/zhaojiang/blog/item/a9b2b7fd39813a1508244d30.htmlTESTHANDLE HMODULE HINSTANCE HWND有什么区别?之间哪个可以转换?都是什么意思呢? --------------------------------------------------------------- Handle 是代表...
阅读全文
-
Windows核心编程(第五版)笔记 第十五章 应用虚拟内存(Using Virtual Memory in Your Own Applications)
摘要:第十五章 应用虚拟内存1.在地址空间内保留一块区域(地址空间) LPVOID WINAPI VirtualAlloc( __in LPVOID lpAddress,//指定区域的首地址 (地址值为64KB的整数倍) __in SIZE_T dwSize, //区域的大小(字节数) 4KB的整数倍 __in DWORD flAllocationType,//分配方式:Reserve|Commit|R...
阅读全文
-
Windows核心编程(第五版)笔记 第十三章 Windows内存架构(Windows Memory Architecture)
摘要:第十三章 Windows内存构架1.进程虚拟地址空间 每个进程都有自已的私有的虚拟地址空间,在32位机器上是4G,在64位机器上是16EB。 进程内的线程只能访问其所属进程所占的内存,其它进程的内存对其而言是不可见的,无法访问到。2.虚拟地址空间是如何划分的 以32位 x86进程的虚拟地址被分成四个区域(Partition) (1)空指针区域 范围:0x00000000 ~ 0x0000FFFF ...
阅读全文
-
Windows核心编程(第五版)笔记 第十一章 线程池(The Windows Thread Pool)
摘要:第十一章 线程池线程池的目的就是为了减少创建和销毁线程的额外开销,利用已经存在的线程多次循环执行多个任务从而提高系统的处理能力.线程池会自动地根据内制的算法增加或减少线程池中的线程或为程序增加新的线程池。 1.异步方法调用 异步方法调用有以下两种方法: (1)线程函数原型(回调函数) VOID NTAPI SimpleCallback ( PTP_CALLBACK_INSTANCE pIns...
阅读全文
-
Windows核心编程(第五版)笔记 第十章 同步和异步设备I/O(Synchronous and Asynchronous Device I/O)
摘要:第十章 同步和异步设备I/O1.打开和关闭设备对象 打开设备 CreateFileCreateMailslotCreateNamedPipeCreatePipe 关闭设备 CloseHandleCloseSocket 查看设备类型 GetFileType2.文件设备Code example: HANDLE hFile = CreateFile(...); BYTE pb[10];DWORD dwN...
阅读全文
-
Windows核心编程(第五版)笔记 第九章 利用内核对象同步线程(Thread Synchronization with Kernel Objects)
摘要:第九章 利用内核对象同步线程内核对象可用于不同进程间线程的同步。1.Wait系列函数WaitForSingleObject 挂起当前线程,直到该函数返回。(被等待的对象处于Signal状态或等待超时) 若有多个线程调用该函数等待同一个内核对象,那么当这个内核对象处于Signal状态时只有一个线程会被唤醒。 若线程中有创建Windows的代码,需要用MsgWaitForMultipleObject...
阅读全文
-
Windows核心编程(第五版)笔记 第八章 用户模式下的线程同步(Thread Synchronization with Kernel Objects)
摘要:第八章 用户模式下线程同步 以下线程同步方法仅限于同一进程内的不同线程。不适用于不同进程的不线程。1.原子访问 Atomic Access InterlockedExchange系列函数是针对于某个单一变量进行的原子操作 Volatile关键字告诉编译器不要对变量的访问做任何优化,每次读访变量的值都要去内存中读而不是在寄存器中读。 2.临界区 使一组操作原子化。 临界区对象用法:Initial...
阅读全文
-
Windows核心编程(第五版)笔记 第七章 线程调度、优先级 (Thread Scheduling,Priorities and Affinity)
摘要:第七章 线程调度、优先级、亲和力1.挂起和恢复线程 (1)ResumeThread 被挂起的线程不会被调度,只有线程调用ResumeThread()的次数等于SuspendThread()时,线程才会被调度。 线程可以Suspend自已但是不能Resume自已。因为被挂起后不会被调度,从而不会执行线程函数内的代码. (2)SuspendThread 挂起线程时一定要小心 必须明确知道线程在干什么才...
阅读全文
-
Windows核心编程(第五版)笔记 第六章 线程基本概念(Thread Basics)
摘要:第六章 线程基本概念1.线程的组成 (1)线程内核对象:用于管理线程及存储线程的统计信息 (2)线程栈:维护线程执行时需要的函数参数和局部变量。 线程栈所需的内存是从进程中分配而得的,其大小默认是1M. 每个线程都有自已独立的线程栈。 进程不执行任何代码,所有的代码都是由线程执行的。进程相当于一个装载线程的容器。 线程共享进程的地址空间和数据,如内核对象句柄(内核对象句柄只能依附于某个进程而不是...
阅读全文
-
CreateThread 使用不当引起内在泄露? CreateThread 和 _beginthreadex 区别。
摘要:在 Win32 API 中,创建线程的基本函数是 CreateThread,而 _beginthread(ex) 是C++ 运行库的函数。为什么要有两个呢?因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立的“全局...
阅读全文
-
Windows核心编程(第五版)笔记 第五章 作业(Jobs)
摘要:第五章 作业1.什么是作业可以把作业看作是进程的容器,一个作业由一个或多个进程组成。作业可以对在其内的进程进行控制或限制进程的某些行为。 如果一个进程被加载到作业中,那么该进程的子进程也会自动被加载到该作业中。 用CloseHandle()关闭作业对象,只会把作业对象标记为Deletion,并不会终结作业内的所有进程。 只有当作业中的所进程都结束后系统才会释放作业对象所占用的资源。2.作...
阅读全文
-
Windows核心编程(第五版)笔记 第四章 进程(Processes)
摘要:第四章 进程(Processes)1.进程的组成和启动过程进程的组成: 一个进程由两部分组成:1.进程内核对象 2.地址空间进程的启动:一个进程启动时系统会根据程序的类型调用相应的CRT Main函数 。如下表: Application Type Entry Point Startup Function Embedded in Your Executable GUI application tha...
阅读全文
|