Windows核心编程
文章平均质量分 75
介绍基于Windows下的编程一些基础知识
灬Sunnnnn
承接各种定制开发,Qt、音视频、流媒体、客户端、服务端,需要的私聊。
展开
-
Windows使用内存映射文件
内存映射文件主要用于以下三种情况:系统使用内存映射文件,以便加载和执行. exe和DLL文件。这可以大大节省页文件空间和应用程序启动运行所需的时间。可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据。原创 2022-10-19 21:06:35 · 2959 阅读 · 0 评论 -
多线程同步-条件变量
当想入写入者线程和读取者线程以独占模式或共享模式访问同一个资源的时候,可以使用SRWLOCK读写锁。如果读取者线程没有数据可读取,那么它应该将锁释放并等待,直到写入者线程产生了新的数据为止。如果写入者线程产生的数据写满,那么写入者线程同样应该释放SRWLOCK并进入睡眠状态,直到读取者线程把数据清空为止。windows通过SleepConditionVariableCS或SleepConditionVariableSRW函数,提供了一种条件变量。););原创 2022-10-18 22:54:51 · 1575 阅读 · 0 评论 -
多线程同步-Slim读/写锁
SRWLOCK的目的和关键段相同:对一个资源进行保护,不让其他线程访问它。但是,与关键段不同的是,SRWLOCK允许我们区分那些想要读取资源的值的线程和想要更新资源的值的线程。让所有的读取者线程在同一时刻访问共享资源应该是可行的,因为仅仅读取资源的值并不存在破坏数据的风险。首先需要分配一个SRWLOCK结构,并用InitializeSRWLock初始化。);一旦初始化完成之后,写入者线程可以调用(&lock),以尝试获得对 被保护的资源的独占访问权。);完成对资源的更新之后,应该调用。原创 2022-10-18 22:12:06 · 736 阅读 · 0 评论 -
多线程同步-关键段(临界区)
关键段是一小段代码,它在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。使用的函数:等待指定临界区对象的所有权。当调用线程被授予所有权时,函数返回。);释放指定临界区对象的所有权。);初始化临界区对象。在调用EnterCriticalSection之前必须调用初始化函数。);释放资源。);原创 2022-10-18 21:48:05 · 658 阅读 · 0 评论 -
多线程同步-Interlocked系列函数(原子访问)
原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。以下列举了部分函数。.....原创 2022-10-18 21:07:08 · 902 阅读 · 0 评论 -
多线程同步-互斥量内核对象
互斥量内核对象用来确保一个线程独占对一个资源的访问。一个使用数量。一个线程ID(用于标识系统中的哪个线程当前拥有互斥对象)。一个递归计数器(用于指明该线程拥有互斥对象的次数)。如果线程ID是0(这是个无效ID),互斥对象不被任何线程所拥有,它处于触发状态。如果ID是个非0数字,那么一个线程就拥有互斥对象,它处于未触发状态。与所有其他内核对象不同, 操作系统对互斥量进行了特殊处理,允许它们违反一些常规的规则。创建互斥量。);psa:指向SECURITY_ATTRIBUTES结构的指针。原创 2022-10-13 21:02:33 · 640 阅读 · 0 评论 -
多线程同步-信号量内核对象
信号量内核对象用来对资源进行计数。与其他所有内核对象相同,它们也包含一个使用计数,但它们还包含另外两个32位值:一个最大资源计数和一个当前资源计数。最大资源计数:表示信号量可以控制的最大资源数量。当前资源计数:表示信号量当前可用资源的数量。如果当前资源计数大于0,那么信号量处于触发状态。如果当前资源计数等于0,那么信号量处于未触发状态。系统绝对不会让当前资源计数变为负数。当前资源计数绝对不会大于最大资源计数。使用下面的函数用于创建信号量内核对象。);原创 2022-10-13 20:36:27 · 657 阅读 · 0 评论 -
多线程同步-可等待的计时器内核对象
它们会在某个指定的时间触发,或每隔一段时间触发一次。它们通常用来在某个时间执行一些操作。();psa:指向SECURITY_ATTRIBUTES结构的指针。fManualReset:告诉系统是创建一个人工重置的计时器(TRUE)还是创建一个自动重置的事计时器(FALSE)。pszName:对象的名称。人工重置的定时器信号通知时,等待该定时器的所有线程均变为可调度线程。自动重置的定时器信号通知时,只有一个等待的线程变为可调度线程。原创 2022-10-11 21:27:06 · 816 阅读 · 0 评论 -
多线程同步-事件内核对象
事件最通常的用途是,让一个线程执行初始化工作,然后再触发另一个线程,让它执行剩下的工作。一开始我们将事件初始化为未触发的状态,然后当线程完成初始化工作的时候,触发事件。此时,另一个线程一直在等待该事件,它发现事件被触发,于是变成可调度状态。第二个线程知道第一个线程已经完成了它的工作。一个使用计数一个用于指明该事件是个自动重置的事件还是一个人工重置的事件的布尔值一个用来表示事件有没有被触发的布尔值当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。原创 2022-10-11 20:51:51 · 755 阅读 · 0 评论 -
WaitForSingleObject等待函数
等待函数使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。如果线程在调用一个等待函数的时候,相应的内核对象已经处于触发状态,那么线程是不会进入等待状态的。最常用是WaitForSingleObject。);参数1:用来标识要等待的内核对象,这个内核对象可以处于触发状态或未触发状态。参数2:用来指定线程最多愿意花多长的时间来等待对象被触发(超时时间,单位为毫秒)如果指定了一个非0值,则该函数将等待,直到该对象被触发或时间间隔过去。如果为0,如果对象没有触发,函数不会进入等待状态,它总是立即返回。...原创 2022-08-30 21:23:36 · 4951 阅读 · 0 评论 -
DLL注入——使用远程线程
从根本上来说,DLL注入技术要求目标进程中的一个线程调用LoadLibrary来载入我们想要的DLL。由于我们不能轻易地控制别人进程中的线程,因此这种方法要求我们在目标进程中创建一个新的线程,Windows提供了创建远程线程的函数。);hProcess:用于创建线程的进程的句柄。lpThreadAttributes:指向SECURITY_ATTRIBUTES结构的指针,该结构确定返回的句柄是否可以被子进程继承。dwStackSize:堆栈的初始大小,以字节为单位。......原创 2022-08-30 20:27:19 · 1993 阅读 · 0 评论 -
DLL注入——使用全局钩子
因为进程的地址空间是独立的,发生对应事件的进程不能调用其他进程地址空间的钩子函数。如果钩子函数的实现代码在DLL中,则在对应事件发生时,系统会把这个DLL加载到发生事件的进程地址空间中,使它可以调用钩子函数进行处理。所以只要在系统中安装了全局钩子,那么只要进程接收到可以发出钩子的消息,全局钩子的DLL就会被系统自动或者强行加载到进程空间中,这就可以实现DLL注入。);参数1:表示要安装的挂钩类型。参数2:表示的是钩子的回调函数。参数3:包含由lpfn参数执行的钩子过程的DLL句柄。原创 2022-08-24 22:56:15 · 2451 阅读 · 0 评论 -
DLL注入——使用注册表
整个系统的配置都保存在注册表中,我们可以通过调整其中的设置来改变系统的行为。该方式依赖User32.dll,也就是说,需要可执行程序调用到这个系统动态库,我们注入的dll才会被执行到。基本上所有基于GUI的应用程序都使用了User32.dll。// AppInit_Dlls(64位程序读取)//AppInit_Dlls(32位程序读取)//32位系统查看注册表:windows+R键,输入regedit。原创 2022-08-24 20:38:43 · 4247 阅读 · 2 评论 -
Windows线程简介
线程由以下两部分构成。一个线程的内核对象,操作系统用它来管理线程。系统还用内核对象来存放线程统计信息的地方。一个线程栈,用于维护线程执行时所需的所有函数参数和局部变量。进程是惰性的。从来不执行任何东西,它只是一个线程的容器。线程必然是某个进程的上下文中创建的,而且会在这个进程内部“终其一生”。这意味着线程要在其进程的地址空间内执行代码和处理数据。假如一个进程上下文中有两个以上的线程运行,这些线程将共享同一个地址空间。这些线程可以执行同样的代码,可以处理相同的数据。原创 2022-08-22 20:25:44 · 1643 阅读 · 0 评论 -
Windows进程简介
一般将进程定义为一个正在运行的程序的一个实例,由以下两部分构成。一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据。此外,它还包含动态内存分配,比如线程堆栈和堆的分配。进程是惰性的,进程要做任何事,都必须让一个线程在它的上下文中运行,该线程负责执行进程地址空间包含的代码,一个进程可以有多个线程,所有的线程都在进程的地址空间中“同时”执行代码。每个线程都有它自己的一组CPU寄存器和它自己的堆栈。...原创 2022-08-11 23:00:43 · 2273 阅读 · 0 评论 -
Windows提取环境变量
每个进程都有一个与它关联的环境块,这是在进程地址空间内分配的一块内存。每个字符串的第一部分是一个环境变量的名称,后跟一个等号,等号之后是希望赋给此变量的值,注意:除了第一个=::=::\字符串,块中可能还有其他字符串是以(=)开头的。这种字符串不能作为环境变量的使用。调用GetEnvironmentStrings函数来获取完整的环境块。...原创 2022-08-10 21:39:50 · 1464 阅读 · 0 评论 -
Windows入口点函数
Windows支持两种类型的应用程序:GUI程序和CUI程序,即图形用户界面和控制台用户界面。Windows应有程序必须有一个入口点函数,应用程序开始运行时,这个函数会被调用。应用程序类型入口点函数(入口)嵌入可执行文件的启动函数处理ANSI字符和字符串的GUI应用程序处理Unicode字符和字符串的GUI应用程序处理ANSI字符和字符串的CUI应用程序处理Unicode字符和字符串的CUI应用程序操作系统实际并不调用我们所写的入口点函数。它会调用由C/C++运行库实现并在链接时使用。...原创 2022-08-10 20:23:26 · 1084 阅读 · 0 评论 -
Windows内核对象
系统会创建和处理几种类型的内核对象,比如事件对象、文件对象、互斥量对象等,每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问。这个内存块是一个数据结构,其成员维护着与对象相关的信息。应用程序如何操纵这些内核对象呢?Windows提供了一组函数可以访问这些内核对象。调用一个会创建内核对象的函数后,函数会返回一个句柄,它标识了所创建的对象。为了增加操作系统的可靠性,这些句柄值是与进程相关的。所以将句柄值传给另一个进程中的线程时,可能会调用失败。...原创 2022-08-09 21:06:10 · 923 阅读 · 0 评论 -
Windows字符和字符串处理
一直以来,我们将文本字符串编码成一组以0结尾的单字节字符,调用strlen,它就会返回“以0结尾的一个ANSI单字节字符数组”的字符数。但是,某些语言文字系统(如韩文)的字符集有非常多的符号,一个字节最多能表示256个符号,这是远远不够的;为了支持这些语言文字系统,双字节字符集出现了。双字节字符集中,一个字符串中的每个字符都由1个或2个字节组成。...原创 2022-08-08 22:08:36 · 1020 阅读 · 0 评论 -
Windows错误处理
调用Windows函数时,它会先验证我们传给它的参数,然后再开始执行任务,如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将指出函数的失败原因。以下为大多数Windows函数使用的返回值的数据类型。常见的返回值类型数据类型指出函数调用失败的值VOID这个函数不可能失败BOOL如果失败,返回0;否则,返回非0HANDLE如果失败,返回NULL;否则,HANDLE将标识一个可操纵的对象。注意:某些函数会返回INVALID_HANDLE_VALUE的一个句柄,它被定义为-1。...原创 2022-08-08 20:33:56 · 600 阅读 · 0 评论