Windows核心编程
文章平均质量分 86
cncoderwang
这个作者很懒,什么都没留下…
展开
-
Windows核心编程--线程同步--读写锁
SRWLOCK的目的和关键段相同,对一个资源进行保护,不让其他线程进行访问。与关键段不同的是,SRWLOCK允许我们区分那些想要读取资源的值的线程和想要更新资源的值的线程。 和关键段一样,想用读写锁首先需要分配一个SRWLOCK结构并用InitializeSRWLock函数对它进行初始化,VOID InitializeSRWLock( PSRWLOCK SRWLock );原创 2018-01-30 19:48:05 · 878 阅读 · 0 评论 -
DLL显式载入
之前在文章中提到 过DLL的隐式链接,现在介绍以下DLL的显式载入。DLL显式载入与隐式链接不同的是,我们不需要包含包含DLL导出函数和变量的头文件,不需要显式指定lib文件,比如以下两行代码就可以去掉了。#include "userdefine.h"#pragma comment(lib,"userdefine.lib")上代码://userdefine.h#ifdef ...原创 2018-02-12 21:28:12 · 659 阅读 · 0 评论 -
Windows Dll动态库隐式链接
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2018-02-12 16:54:21 · 305 阅读 · 0 评论 -
Windows核心编程--线程同步--关键段
InterLocked系列函数对变量进行原子操作,执行得几块,通常只占用几个CPU周期(小于50),不需要再用户模式和内核模式之间切换,这个切换通常需要占用1000个周期以上。InterLockedExchangeAdd既可以做加法也可以做减法。LONG InerLockedExchange( PLONG volatile plTarget, LONG lValue )该函数会把第一个原创 2018-01-29 13:25:05 · 211 阅读 · 0 评论 -
Windows核心编程--线程调度1
每个线程内核对象都有一个CONTEXT上下文结构体,该结构体用来记住线程的运行状态,这样在下一次获得CPU的时间片时,就可以从上次停止处继续运行。CONTEXT分别是以下几部分:1、CONTEXT_CONTROL CPU的控制寄存器,比如指令指针、栈指针、标志以及函数返回地址。2、CONTEXT_INTEGER 标识CPU的整数寄存器;3、CONTEXT_FLOATING_POI原创 2018-01-28 17:14:58 · 176 阅读 · 0 评论 -
Windows核心编程-线程基础
Windows创建的线程的函数是:HANDLE CreateThread(PSECURITY_ATTRIBUTES psa,DOWRD cbStackSize,PTHREAD_START_ROUTINE pfnStartAddr,PVOID pvParam,DWORD dwCreateFlag,PDWORD pdwThreadID);psa是指向结构体SE原创 2018-01-28 15:41:16 · 155 阅读 · 0 评论 -
Windows核心编程-作业
Windows提供了作业内核对象,允许我们将进程组合在一起并创建一个“沙箱”来限制进程能够做什么,最好将作业对象想象成一个进程容器。作业的创建过程如下:VOID StartRestrictedProcess(VOID){BOOL bInJob = FALSE;IsProcessInJob(GetCurrentProcess(), NULL, &bInJob);//判断当前的进程是否原创 2018-01-28 14:41:48 · 977 阅读 · 0 评论 -
Windows核心编程--线程池内核对象触发调用函数
如果想注册一个工作项,等待一个内核对象被触发的时候去执行,与之前说过的步骤很相似,首先编写如下原型的函数:VOID CALLBACK KernelObjCallback(PTP_CALLBACK_INSTANCE pInstance,PVOID pvContext,PTP_WAIT pWait,TP_WAIT_RESULT WaitResult );pWait是Crea原创 2018-02-03 20:54:11 · 288 阅读 · 0 评论 -
Windows核心编程--线程池定时器
Windows提供了可等待的计时器内核对象,它使我们非常容易的得到一个基于时间的通知。创建一个可等待计时器内核对象会浪费系统资源。利用线程池来处理定时任务再合适不过了。PTP_TIMER CreateThreadpoolTimer(PTP_TIMER_CALLBACK pfnTimerCallback,PVOID pvContext,PTP_CALLBACK_ENVIRON pcb原创 2018-02-03 19:46:49 · 1151 阅读 · 0 评论 -
Windows核心编程--进程创建与进程退出
CreateProcess函数的原型如下:BOOL CreateProcess ( PCTSTR pszApplicationName,PTSTR pszCommandLine,PSECURITY_ATTRIBUTES psaProcess,PSECURITY_ATTRIBUTES psaThread,BOOL bInheritHandles,DWORD fdwCrea原创 2018-01-27 19:33:40 · 1889 阅读 · 0 评论 -
Windows核心编程 --进程环境变量
进程一般可定义为:一个内核对象,操作系统用它来管理进程;一个地址空间,包含dll、exe以及动态分配的内存。GetModuleHandle(PCTSTR pszModule)函数可以知道一个可执行文件或者DLL被加载到进程地址空间的什么位置,pszModule字符串需要以0为终止符,该参数指定了已在主调进程的地址空间中加载的一个可执行文件或DLL文件的名称,如果找到,返回基地址,没有找到的话返原创 2018-01-27 17:28:14 · 616 阅读 · 0 评论 -
Windows核心编程--线程池异步调用
Windows线程池函数允许我们做以下事情:1、以异步方式来调用一个函数;2、每隔一段时间调用一个函数;3、当内核对象触发的时候调用一个函数;4、当异步I/O请求完成的时候调用一个函数。对于线程池,我们从来不需要调用CreateThead函数,系统会为我们自动创建一个默认的线程池,并让线程池中的一个线程来调用我们的回调函数。此外线程处理完一个客户请求之后,它不会被立刻销原创 2018-02-03 16:58:08 · 434 阅读 · 0 评论 -
Windows核心编程--内核对象
1、安全描述符的结构体,创建内核对象的函数通常都需要初始化该结构体。typedef struct _SECURITY_ATTRIBUTES{DWORD dwLength;LPVOID lpSecurityDescriptor;BOOL bInheritHandle;}SECURITY_ATTRIBUTES;2、创建内核对象的函数不是全部都返回NULL或者I原创 2018-01-26 17:14:26 · 167 阅读 · 0 评论 -
Windows核心编程--字符编码
1、UTF-16将每个字符编码为2个字节,UTF-16能改进性能和减少内存消耗,Windows默认采用UTF-16编码;2、UTF-8 值在0x0080以下的字符压缩为1个字节,0x0080和0x07FF之间的字符转换为2个字节,0x0800以上的都转换为3个字节,对0x0800以上的字符编码时,不如UTF-16高效;3、UTF-32将每个字符都编码为4个字节。4、typedef原创 2018-01-26 16:02:38 · 242 阅读 · 0 评论 -
Windows核心编程 -- 错误处理
DWORD GetLastError( )函数是用来返回由上一个函数调用设置的线程32位错误代码,WinError.h头文件里包含了Microsoft定义的错误代码,如下所示:#define ERROR_SUCCESS 0L#define NO_ERROR 0L原创 2018-01-26 14:49:19 · 405 阅读 · 0 评论 -
Windows核心编程--事件内核对象
事件的触发表示一个操作已经完成,有两种不同类型的事件对象,手动重置事件和自动重置事件。当一个手动重置事件被触发的时候,正在等待该事件的所有线程都将变成可调度的。当一个自动重置事件触发的时候,只有一个正在等待该事件的线程会变成可调度状态。下面是事件内核对象的简单应用。//事件内核对象 HANDLE g_hEvent;UINT WINAPI WordCount(PVOID pvParam)原创 2018-01-30 19:59:28 · 204 阅读 · 0 评论 -
DLL延迟加载技术
一个延迟载入的DLL是隐式链接的,系统一开始不会将该DLL载入,只有当我们的的代码试图去引用DLL包含的一个符号时,系统才会实际载入该DLL。延迟载入DLL在下列情况下非常有用。如果应用程序使用了多个DLL,那么它的初始化可能会比较慢,因为加载程序要将所有必须的DLL映射到进程的地址空间中。 如果我们在代码中调用一个新的函数,然后又试图在一个不提供该函数的老版本的操作系统中运行该应用程序,那么加原创 2018-02-13 11:16:48 · 754 阅读 · 0 评论