![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
windows核心编程
文章平均质量分 73
poppy飞翔
这个作者很懒,什么都没留下…
展开
-
windows核心编程-创建线程CreateThread
什么是线程1、在Windows平台上,最终可以利用CPU执行代码的最小尸体就是线程2、首先从内核角度看,线程是一个内核对象,系统用它来村塾一些关于线程统计信息(比如时间)3、从编程角度来看,线程是一堆寄存器状态以及线程栈的一个结构体对象,本质上可以理解为一个函数调用其(寄存器状态用与控制CPU执行,栈用于存储局部变量和函数调用参数及函数返回地址)4、最后需要知道的就是线原创 2016-11-30 19:21:28 · 3988 阅读 · 0 评论 -
windows核心编程-C/C++标准库与多线程
1、由于历史原因,标准C/C++库在开始时并没有正对多线程做考虑(比如使用了一些全局变量),在VC++中对标准库做了多线程安全扩展2、要利用这些扩展就需要使用VC++扩展库提供的创建线程函数_beginthread,_beginthradEx等函数来替代Windows的原始API--CreateThread3、因为这些创建函数在内部考虑了多线程安全初始化C/C++标准库,使用这些替原创 2016-12-02 09:45:10 · 1882 阅读 · 0 评论 -
windows核心编程-线程消息队列
/*该程序演示了通过PeekMessage强制创建消息队列,然后Sleep等待执行创建的线程*/#include#include#include#define GRS_USEPRINTF() TCHAR pBuf[1024]={}#define GRS_PRINTF(...)\ StringCchPrintf(pBuf, 1024, __VA_ARGS__); \ WriteC原创 2016-12-01 21:06:39 · 584 阅读 · 0 评论 -
windows核心编程-线程可警告状态以及APC队列
一、线程可警告状态的真实含义1、通过另一些方法让线程"暂停"(非SuspendThread方法,比如SleepEx,wait函数族等),并可以进入一种称之为Alterable的状态(可警告状态)2、这种状态本质上其实是高速系统调度程序:当前现成的函数调用栈以及对应的寄存器状态可以直接被用来调用别的一些函数,一般这种函数都被称为异步函数3、通常系统会用此线程环境(理解为函数调用器原创 2016-12-01 19:48:06 · 1272 阅读 · 0 评论 -
windows核心编程-线程的亲缘性
1、类似于进程的亲缘性只在多CPU(多核)系统中哪几/1个CPU上执行的行为2、相对于进程的亲缘性,不能指定线程执行在超过进程亲缘性范围外的CPU上执行3、线程只能执行在进程亲缘性CPU集合的子集上4、通过调用SetThreadAffinityMask方法,可以为线程指定可以运行在其上的CPU的位掩码(原理同进程亲缘性方法)5、通常利用这个方法,将线程和CPU一一绑定,放置调度原创 2016-12-01 18:49:26 · 1576 阅读 · 0 评论 -
windows核心编程-线程挂起和Context
一、线程挂起(暂停)1、SuspendThread用来暂停一个线程的执行,线程暂停时,不会被调度执行2、ResumeThread用来恢复一个暂停线程的执行(一个暂停的线程无法调用这个方法来恢复自己,3、因为暂停的线程不可能被执行)暂停县城总是立即被暂停,而不管被暂停的线程执行到了哪个指令线程内核对象内部,存储了一个暂停计数的值,每调用一次,SuspendThread方法该值就加1,原创 2016-12-01 13:42:03 · 2066 阅读 · 0 评论 -
windows核心编程-线程的TLS
TLS:Thread Local Storage 线程本地存储本质:对于一些全局变量,为每一个线程分配一个实例,各线程只使用自己的实例,而不用去争抢那一个全局变量的实例TLS的真实一亿在于不用为每个线程去定义一个全局匾蛉,而使用特殊关键字或者API自动为每个线程实例分配私有的全局变量,这对一些特殊算法非常有意义,尤其是在预先不知道到底又多少线程要运行的情况下关键字法:_原创 2016-12-01 13:39:24 · 563 阅读 · 0 评论 -
windows核心编程-线程退出
参考视频链接:点击打开链接转载 2016-11-30 21:03:53 · 253 阅读 · 0 评论 -
windows核心编程-将进程放入Job
作业对象的基本方法1、调用CreateJobObject创建一个作业2、调用AssignProcessToObject方法可以将进程添加到作业对象中3、调用TerminateJobObject方法可以将作业对象中所有的进程全部关闭4、在需要时还可以通过OpenJobObject方法打开一个特定名称的作业对象的句柄1、通过SetInformationJobObject向作业中施加原创 2016-11-30 14:18:02 · 687 阅读 · 0 评论 -
windows核心编程-获得作业对象的属性和统计信息
1、调用QueryInformationJobObject方法,不但可以得到关于Job对象的信息,还可以得到关于Job对象的统计信息~ JobObjectBasicAccountingInformation统计基本信息~ JobObjectBasicAndIoAccountingInformation基本统计信息和IO统计信息~JobObjectBasicLimitInform原创 2016-11-30 14:06:58 · 421 阅读 · 0 评论 -
windows核心编程-DLL是否被装入在合适的地址空间
windows里面所有的exe程序,dll程序,lib程序,sys....都遵循PE结构即数据和指令按照一定顺序存放在文件中,这种格式叫做PE格式1、DLL文件装入进程地址空间后,是否是装入到dll文件规定的最合适的地址#include#include#include#define ID 2520typedef BOOL(WINAPI *LPFN_ISWOW64PR原创 2016-11-28 18:47:04 · 273 阅读 · 0 评论 -
windows核心编程-获取进程中堆的分配情况
将第二个程序的进程号写入第一个的ID中,同时将&i地址写在WriteProcessMemory中,调试可以发现,改变了第二个程序的i的值#include#include#include#define ID 4368int _tmain(){ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,ID);原创 2016-11-28 16:03:21 · 621 阅读 · 1 评论 -
windows核心编程-如何获取进程命令行信息
如何获取其他进程命令行信息每一个进程都有一个PEB数据块(PEB:Process Environment Block),这个进程环境块信息(如下结构体),每个PEB中有_RTL_USER_PROCESS_PARAMETERS 结构体,是一个指针,指向一个结构体,这个结构体里面有一个CommandLine命令行参数。所以要获得其他进程的命令行参数CommandLine,首先要获得其他原创 2016-11-28 08:45:13 · 4505 阅读 · 0 评论 -
windows核心编程-列举出当前系统中的所有进程和线程
DLL--动态链接库LIB--静态链接库原创 2016-11-27 18:55:36 · 844 阅读 · 0 评论 -
windows核心编程-windows完整性机制
进程的内核对象是等着别人拿着令牌访问我们的令牌是我们拿着令牌区访问别人的内核对象的,与别的安全描述符权限比较windows完整性机制:是对windows安全授权的一个补充安全模块在拿token和安全描述符SECURITY_DESCRIPTOR比照之前,还会做一个完整性检查的工作完整性等级低的不能访问完整性等级高的,如果没有设置,内核对象会设置默认的完整性等级medium。让进程原创 2016-11-27 16:35:09 · 1324 阅读 · 0 评论 -
Windows核心编程-如何以管理员的身份启动一个程序
怎样以管理员的身份,来启动一个程序可以将下面这段代码写在_tmain()函数中,起始相当于开了两个进程,第一个进程起过渡作用,用来启动第二个管理员权限的进程,但是用户看不见的。类似于上一章代码,将上面的代码粘贴在主函数中,就ok了#include#include#include/*这个函数将进程权限提升成具有调试权限的进程,这个权限应该是进程所能具有的最大权原创 2016-11-27 15:24:17 · 405 阅读 · 0 评论 -
windows核心编程-如何提升进程的权限
提高进程的权限(调试权限)#include#include#include/*这个函数将进程权限提升成具有调试权限的进程,这个权限应该是进程所能具有的最大权限(调试权限是最大权限)这个函数成功的前提是,启动这个进程的账号必须是管理员账号当fEnable=TRUE的时候,授予当前进程调试权限当fEnable=FALSE的时候,取消当前进程的调试权限当函数返回TRUE的时候,说明原创 2016-11-27 15:16:28 · 466 阅读 · 0 评论 -
完成端口(I/O completion)原理
异步过程调用(apcs)问题:只有发overlapped请求的线程才可以提供callback函数(需要一个特定的线程为一个特定的I/O请求服务)。完成端口(I/O completion)的优点:不会限制handle个数,可处理成千上万个连接。I/O completion port允许一个线程将一个请求暂时保存下来,由另一个线程为它做实际服务。并发模型与线程池:转载 2016-12-27 15:17:51 · 259 阅读 · 0 评论 -
windows核心编程-用户模式下的线程同步1
一、原子访问原子访问就是,一个线程在访问某个资源的同时保证没有其他线程会在同一时刻访问同一资源。"原子性"就是在原子访问中途不能被打断。windows提供Interlocked系列函数实现这一功能。LONG InterlockedExchangeAdd( PLONG volatile *plAddend, //要计算的长整形变量的地址 LONG原创 2016-12-05 13:53:22 · 264 阅读 · 0 评论 -
windows核心编程-关键段与SRWLock
线程同步的方式主要有:临界区、互斥区、事件、信号量四种方式。临界区线程同步也叫关键段线程同步一、关键段关键段(Critical Section)是一小段代码,它在执行之前需要独占一些共享资源的访问权。这里的原子方式是代码除了当前线程之外,没有其他任何线程会同时访问该资源。当然系统仍然可以暂停当前线程去调度其他线程。但是在当前线程离开关键段之前,系统是不会去调度任何想要访问统原创 2016-12-05 15:03:11 · 580 阅读 · 0 评论 -
windows核心编程-进程的句柄和如何获得
进程句柄不同于进程内核对象的句柄进程内核对象句柄:代表整个进程的进程句柄:exe或者dll装入某个进程的地址空间,有唯一的实例句柄,也可以叫做模块句柄进程句柄的本质是进程模块在进程地址空间中的首地址!一:GetModuleFileNameDWORD WINAPI GetModuleFileName( _In_opt_ HMODULE hModule, //进程句柄原创 2016-11-25 19:34:43 · 1296 阅读 · 0 评论 -
windows核心编程-进程
进程定义成一个正在运行的程序的实例,包含两个部分:1、一个内核对象,操作系统用它来管理进程。内核对象也是系统保存进程统计信息的地方。2、一个地址空间,其中包含所有可执行(exe文件)或DLL模块的代码和数据。此外,还包括动态内存分配,比如线程堆栈和堆的分配。Windows支持两种类型的应用程序:GUI(图形用户界面)和CUI(控制台用户界面)当使用CUI却不小心创建原创 2016-11-25 19:17:39 · 201 阅读 · 0 评论 -
windows核心编程-CreateProcess创建进程
一、CreateProcessBOOL WINAPI CreateProcess( _In_opt_ LPCTSTR lpApplicationName, //可执行文件的文件名 _Inout_opt_ LPTSTR lpCommandLine, //命令行字符串,长度最大可以达到32768个字符 _I原创 2016-11-25 16:02:09 · 1098 阅读 · 0 评论 -
windows核心编程-获得系统版本信息
一:获得版本GetVersionExBOOL WINAPI GetVersionEx( _Inout_ LPOSVERSIONINFO lpVersionInfo);LpVersionInfo:这个参数执行这个结构体 OSVERSIONINFO or OSVERSIONINFOEX 这个结构体。OSVERISIONINFOEX结构体是OSVERSIONINFO结构体的扩展原创 2016-11-25 10:32:37 · 406 阅读 · 0 评论 -
windows核心编程-获取进程当前目录
一:代码#include#includeint _tmain(){ TCHAR szPath[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szPath);//获取进程当前路径 _tprintf(L"%s\n", szPath); TCHAR *str = L"H:\\win_pro";//设置的当前路径 SetCurrentDirectory(原创 2016-11-25 09:25:07 · 949 阅读 · 0 评论 -
windows核心编程-获得环境变量的方法
一:使用_environ获得环境变量#include#includeint main(){ char** p = _environ;//这是一个指向字符串数组的指针 while (*p != NULL) { printf("%s\n", *p); p++; } getchar(); return 0;}二:在控制台中使用宽字节的方式#include#in原创 2016-11-24 21:40:07 · 440 阅读 · 0 评论 -
windows核心编程-获得命令行参数的两种方式
#include#includeint _tmain(int argc, TCHAR *argv[]){ ///////////////////////////// /*获得命令行参数的一种办法*/ LPTSTR pCommandLine;//LPTSTR是一个字符串 for (int i = 0; i < argc; i++) { _tprintf(L"%s\n", argv原创 2016-11-24 20:29:23 · 1438 阅读 · 0 评论 -
windows核心编程-句柄的获取与复制
#include#includeint _tmain(){ HANDLE hProcess = GetCurrentProcess(); //获取当前进程的句柄 _tprintf(L"hProcess=%d\n", hProcess); DWORD sessionid = 0; DWORD processid = 0; processid = GetProcessId((HAN原创 2016-11-25 21:26:30 · 858 阅读 · 0 评论 -
windows核心编程-CreateProcess详解
BOOL WINAPI CreateProcess( _In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, //是一个字符串,系统有可能改写,所以不能为常量 _In_opt_ LPSECURITY_ATTRIBUTES lpPro原创 2016-11-26 09:24:36 · 541 阅读 · 0 评论 -
windows核心编程-如何关闭进程
结束一个进程进程结束的方式1、进程的主线程返回(最好的方式)什么时进程的主线程?主线程就是Main,WinMain代表的线程。也是进程中的第一个线程无论这个进程还有多少其他线程,只要这个主线程一退出,那么这个进程就结束了,其他线程自然就被系统杀死,也就是其他线程自然终止!2、进程中的一个线程调用ExitProcess函数(不推荐)这个函数只能结束本进程,也就是这原创 2016-11-26 19:15:09 · 1363 阅读 · 0 评论 -
windows核心编程-用户权限
UAC(User Account Control,用户账户控制)是微软为提高系统安全而在Windows Vista中引入的新技术。要关闭它,进行以下操作1、win+R,输入Gpedit.msc打开“组策略”。2、以此定位“计算机配置”--“windows设置”--“安全设置”--“安全选项”3、在"安全选项"中找到"用户账户控制:管理审批模式下管理员提升提示行为"选项。双击,修原创 2016-11-27 10:29:03 · 1026 阅读 · 0 评论 -
windows核心编程-用内核对象进行线程同步
前言: 在用户模式下进行线程同步的最大好处就是速度非常快。与用户模式下的同步机制相比,内核对象的用途要广泛的多,内核对象唯一的缺点就是它们的性能。调用本章介绍的任何一个新函数时,调用线程必须从用户模式切换到内核模式。对于线程同步来说,这些内核对象中的每一种要么处于触发状态,要么处于未触发状态。比如进程创建时,进程内核对象为未触发状态;进程结束时,进程内核对象为触发状态,当进程内核对象原创 2016-12-08 13:53:50 · 386 阅读 · 0 评论 -
windows核心编程-互斥量的内核对象
互斥量(mutex)内核对象用来确保一个线程独占对一个资源的访问。互斥量对象包含一个使用计数、线程ID以及一个递归计数。互斥量与关键段的行为完全相同。但是,互斥量是内核对象,而关键段是用户模式下的同步对象。HANDLE WINAPI CreateMutex( _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, _In_原创 2016-12-07 16:24:34 · 565 阅读 · 0 评论 -
windows核心编程-可等待的计时器内核对象
要创建可等待的计时器,我们需要调用CreateWaitableTimer函数HANDLE WINAPI CreateWaitableTimer( _In_opt_ LPSECURITY_ATTRIBUTES lpTimerAttributes, _In_ BOOL bManualReset, //TRUE手动,FALSE自动 _In原创 2016-12-07 14:57:44 · 446 阅读 · 0 评论 -
windows核心编程-事件内核对象
在所有的内核对象中,事件内核对象是个最基本的对象。事件能够通知一个操作已经完成。事件内核对象的组成一个使用计数(与所有内核对象一样),一个用于指明该事件是个自动重置的事件还是一个人工重置的事件的布尔值,一个用于指明该事件处于已通知状态还是未通知状态的布尔值。 有两种不同类型的事件对象一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时原创 2016-12-06 19:47:11 · 660 阅读 · 0 评论 -
windows核心编程-WaitForMultipleObjects
内核对象有:进程、作业、线程...。这些内核对象都可以用来进行同步。对线程来说,这些内核对象要么处于触发状态,要么处于非触发状态。例如:进程内核对象在创建的时候总是处于未触发状态。当进程终止的时候,操作系统自动使进程内核对象变成触发状态。当进程内核对象被触发后,它将永远保持这种状态,再也不会变回到未触发状态。DWORD WINAPI WaitForMultipleObj原创 2016-12-06 12:50:28 · 294 阅读 · 0 评论 -
windows核心编程-条件变量
当想让写入者线程和都去这线程以独占的方式或共享的方式访问一个资源的时候,可以使用SRWLock。在这些情况下,如果都去这没有数据可以读取,那么它应该将锁释放并等待,直到写入者线程产生了新的数据为止。如果用来接收写入者线程的数据结构已满,那么写入者同样应该释放SRWLock并进入睡眠状态,直到读取这线程把数据结构清空为止。 我们希望线程以原子的方式把锁释放并将自己阻塞,直到某一原创 2016-12-05 19:08:35 · 750 阅读 · 1 评论 -
NetUserGetLocalGroups提取特定用户的本地组
The NetUserGetLocalGroups function retrieves a list of local groups to which a specified user belongs.也就是获取一组特定用户所属的本地组NET_API_STATUS NetUserGetLocalGroups( _In_ LPCWSTR servername, //指向DN原创 2016-12-29 10:11:48 · 1551 阅读 · 0 评论