Wondows
文章平均质量分 64
suhuaiqiang_janlay
这个作者很懒,什么都没留下…
展开
-
WTL 窗口创建消息队列
ATLAPP.H包含了消息循环类、接口类、和产生应用程序所必需的一些基础类定义。类定义如下: CmessageFilter类---用于消息过滤的 CidleHandler类---用于空闲消息处理的 CmessageLoop类---用于消息循环的 CappModul翻译 2015-03-29 11:09:10 · 2408 阅读 · 2 评论 -
API Hook基本原理和实现[图文]
注:本文主要为解决论坛上http://www.ccrun.com/forum/forum_posts.asp?TID=7281的提问而写的。我搜索了一下互联网,将网络上几篇有代表性的api hook文章的精华进行了浓缩和适当简化,写成这篇介绍性文章。另外也希望初学者能够认真思考本文采用的循序渐进的分析思路,如何解决了一个未知的问题。文中借鉴的文献资料列于文末附录一节。hook是什么?转载 2013-01-20 19:09:42 · 910 阅读 · 0 评论 -
windows消息机制(MFC)
消息分类与消息队列Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型,而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据的含义也不一样。time表示产生消息的时间,pt表示产生消息时鼠标的位置。按照类型,Windows将消息分为:(0) 消息ID范围系统定转载 2015-09-20 12:58:10 · 556 阅读 · 2 评论 -
【Windows】线程漫谈——线程基础(一)
本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必然在某个进程的上下文中运行。进程拥有惰性,如果进程中所有的线程都已结束,那么进程也就没有存在的必要了。一个进程由如下两部分组成:1、一个进程地址空间;2、一个进程内核对象转载 2015-04-23 17:58:10 · 858 阅读 · 0 评论 -
【Windows】线程漫谈——线程栈(二)
本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。预备知识众所周知,线程在初始化时,系统会为其分配线程栈,用于局部变量、函数调用时的参数等。在开始讨论前,先交代一些背景知识。栈:一种先入后出的数据结构,push和pop是它典型的操作,对应“入栈”和“出栈”的术语。系统内存的分配机制:简单的说包括“预订”和“调拨”两个过程。转载 2015-04-23 19:06:59 · 1527 阅读 · 0 评论 -
内存映射文件
内存映射文件内存映射文件的概念:内存映射文件提供了一组独立的函数,使应用程序能够通过内存指针像访问内存一样访问磁盘上的文件。通过内存映射文件函数可以将磁盘上的文件全部或者部分映射到进程的虚拟地址空间的某个位置。一旦完成映射,对磁盘文件的访问就可以像访问内存文件一样便捷。(看样子内存CPU操作内存映射文件并不需要经过物理内存RAM啊,CPU指令能支持这样的访问吗?看到有人说是转载 2015-05-08 16:21:04 · 696 阅读 · 1 评论 -
Windows进程间各种通信方式浅谈
1 Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。 多进程/多线程是Windows操作系统的一个基本特征。Microsoft Win32应用编程接口(Application Programming Interface, API) 提供了大量支持应用程序间数据共享转载 2015-08-09 08:05:05 · 3239 阅读 · 0 评论 -
一则简单的Windows共享内存IPC代码
Windows共享内存可以让两个进程对同一块内存进行读写。以下有2个进程,a.cpp生成A进程,b.cpp生成b进程。那么a进程将不停地读名为"Global\\MyFileMappingObject"的共享内存块,而b进程不停地写名为"Global\\MyFileMappingObject"的共享内存块。从而实现IPC。//a.cpp#include #include #inc转载 2015-08-12 20:04:20 · 492 阅读 · 1 评论 -
Windows进程间通信
因为Windows中每个进程都有自己的虚拟地址空间,所以一个进程无法访问到别一个进程的地址空间,因此相对来说进程间的通信要复杂一些。Windows操作系统为应用程序之间的进程间通信,数据共享提供了很多机制,称为interprocess communications (IPC)。其中一些机制可以用来在同一台计算机内不同进程之间通信,一些可以在网络中不同计算机上运行的进程之间进行通信。 典转载 2015-08-13 17:58:58 · 1503 阅读 · 2 评论 -
《Windows核心编程》读书心得——线程(线程同步)(4)
l 用户模式下的线程同步:Volatile类型:告诉编译器必须到内存取变量值,而不使用寄存器中的值。因为每个线程都有各自的寄存器,它们的寄存器中同一变量的值可能不一致。原子访问:指的是一个线程在访问某个资源的时候,能够保证没有其他线程访问该资源。相关函数:InterlockedExchangeAdd(…):原子加减法(传负值表示做减法);InterlockedIncrement(…):原子加法;InterlockedExchange(…):原子替换;InterlockedCompareExchange(…原创 2011-03-17 01:19:00 · 1115 阅读 · 0 评论 -
《Windows核心编程》读书心得——进程(3)
进程的组成:进程内核对象和地址空间。借用这个图来说明一下,虽然是linux的,但基本一样。进程的4G空间,2G是给操作系统使用的,2G是给进程本身使用。操作系统的2G内存在所有进程中是共享的,它们映射到同样的地址。主线程:系统创建一个进程时候,会自动为进程创建第一个线程,该线程称为主线程。进程的生命过程:(几个重要的函数)启动...原创 2010-12-19 15:37:00 · 999 阅读 · 1 评论 -
《深入解析Windows操作系统》要点整理
关于操作系统中为什么要使用句柄:个人理解是,因为虚拟内存的机制,导致同一个对象的物理地址是经常变化的,所以操作系统不能通过物理地址直接操作对象,而采用句柄这样的索引来查找物理地址。在同一个进程中,其实是可以通过虚拟地址去查找对象的。但句柄相对于用虚拟地址的方式还有个好处,就是他只是一个索引,操作他并不会有更改对象内容的风险。 关于LSP:应用程序调用Ws2_32.dll的API原创 2015-08-16 16:29:16 · 2532 阅读 · 0 评论 -
Windows的同步I/O和异步I/O
同步I/O操作执行步骤1. 程序通过FileStream对象来打开磁盘文件,然后调用Read方法(内部调用Win32 ReadFile函数),从文件中读取数据。这时,线程从托管代码转变为本机/用户模式代码。2. Win32 ReadFile函数生成一个I/O请求包(IRP),并传递给Windows内核。3. Windows内转载 2017-09-03 20:30:45 · 326 阅读 · 1 评论 -
异步过程调用(APC)——操作系统实现异步的原理
apc可以看成就是内核里的定时器,为了给自己一个在本函数返回后还能执行的一次机会,有很多操作是需要在函数返回后才能执行.类似于析构函数但不完全是。apc的最大特点就是在本函数返回后才执行,而且是在本线程中。而内核提供的原生的定时器,执行的环境可能就不是原始的线程了。windows天生就是个异步框架,里面大量的设计都是为异步而设计,比如IRP,就是贯穿整个windows的异步框架转载 2015-08-15 10:18:19 · 4153 阅读 · 2 评论 -
C/C++函数调用过程--函数栈(二)
上一篇比较简单的理解函数调用时的参数进出栈,这里转载一篇别人的文章,通过汇编比较完整的讲解进出栈的过程。看是看觉得略难理解,但仔细看完很有收获。函数调用--函数栈函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果,还有大家比较熟悉的一句话,就是函数调用是在栈上发生的,那么在计算机内部到底是如何实现的呢? 对于程序翻译 2015-04-23 17:18:24 · 5626 阅读 · 0 评论 -
《Windows核心编程》读书心得——线程(线程基础)(4)
线程的组成:线程内核对象和线程堆栈(系统从进程的地址空间中分配内存给线程栈使用,因为线程没有自己的地址空间)。线程还有自己的一组CPU寄存器。线程的创建:CreateThread()的参数如下:psa:内核对象的安全属性(传入NULL,表示使用默认安全属性)。cbStackSize:指定线程栈可使用多少地址空间。(线程栈的空间大小,除了通过cbStackSize来设置,也可以通过链接器的/STACK开关来设置。格式如下:/STACK: [reserve] [,commit]:reserve:线程栈的内存原创 2010-12-27 23:48:00 · 756 阅读 · 0 评论 -
C/C++函数调用过程--函数栈(一)
函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果。 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写数据段:保存初始化的全局变量和静态变量,可读可写不可执行BSS:未初始化的全局变量和静态变量堆(Hea翻译 2015-03-20 11:22:16 · 4537 阅读 · 0 评论 -
超线程
<br /> 超线程是英特尔所研发的一种技术,于2002年发布。超线程的英文是HT技术,全名为Hyper-Threading,中文又名超线程。<br /> 采用超线程技术可在同一时间里,应用程序可以使用芯片的不同部分。虽然单线程芯片每秒钟能够处理成千上万条指令,但是在任一时刻只能够对一条指令进行操作。而超线程技术可以使芯片同时进行多线程处理,使芯片性能得到提升。<br /> 超线程技术是在一颗CPU同时执行多个程序而共同分享一颗CPU内的资源,理论上要像两颗CPU一样在同一时间执行转载 2010-12-15 11:37:00 · 1248 阅读 · 0 评论 -
《Windows核心编程》读书心得——内核对象(2)
内核对象:定义:内核对象是一个内存块(以数据结构的方式存在),由操作系统内核分配,并只能由操作系统内核访问。使用计数:用来表征当前有多少个进程正在使用该内核对象,当计数为0时,操作系统会自动释放该内核对象。安全描述符:描述了用户对该内核对象的访问权限(如继承性等), 是一个SECURITY_ATTRIBUTES结构。句柄:定义:应用程序不能直接修改内核对象,只能通过句柄来访问内核对象,句柄是一个无符号长整型数(在32位进程中为32位,64位进程中为64位)。句柄是与进程相关的。因此,内核对象在一个进程中的句原创 2010-12-19 13:23:00 · 785 阅读 · 0 评论 -
Windows NT
Windows NT是基于OS/2 NT的基础编制的。OS/2是由微软和IBM联合研制,分为微软的Microsoft OS/2 NT与IBM的IBM OS/2。协作后来不欢而散,IBM继续向市场提供先前的OS/2版本,而微软则把自己的OS/2 NT的名称改为Windows NT,即第一代的Windows NT 3.1。Windows NT是纯32位操作系统,采用先进的NT核心技术。NT即新技术 (New Technology) Windows NT的两个版本分别是Windows NT Work转载 2010-11-09 13:40:00 · 816 阅读 · 0 评论 -
注册表
<br /> 注册表是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。在系统中注册表是一个记录32位驱动的设置和位置的数据库。当操作系统需要存取硬件设备,它使用驱动程序,甚至设备是一个BIOS支持的设备。无BIOS支持设备安装时必须需要驱动,这个驱动是独立于操作系统的,但是操作系统需要知道从哪里找到它们,文件名、版本号、其他设置和信息,没有注册表对设备的记录,它们就不能被使用。<br /> 当一个用户准备运行一个应用程序,注册表提供应用程序信息转载 2010-11-09 13:43:00 · 575 阅读 · 0 评论 -
托管代码
什么是托管代码? 托管代码是一microsoft的中间语言,他主要的作用是在.NET FRAMEWORK的CLR执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段: 1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#) 2.托管代码编译为microsoft的平台专用语言。 编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的转载 2010-11-12 14:18:00 · 4764 阅读 · 4 评论 -
《Windows核心编程》读书心得——线程(线程调度)(4)
l CPU切换调度线程:每个线程都有一个上下文(CONTEXT),保存在线程的内核对象中。它记录了线程上一次执行时CPU寄存器的状态。大约每隔20ms,CPU会查看当前所有的线程,然后在可调度的线程中选择一个进行调度。CPU切换调度线程时,先将CPU寄存器写回线程上下文(这样,原创 2011-02-13 21:25:00 · 2488 阅读 · 2 评论 -
《Windows核心编程》读书心得——内存(内存体系结构)(5)
虚拟内存:每个进程有自己的虚拟内存,进程内的线程只能访问该进程的虚拟内存,而无法访问其他进程的虚拟内存,也无法访问系统的内存。进程地址空间的划分如下:原创 2011-08-03 23:34:26 · 2123 阅读 · 2 评论 -
《Windows核心编程》读书心得——内存(内存映射文件)(5)
内存映射文件:前面提到,硬盘上的物理存储器大部分是以页交换页面的形式存在。除此之外,其实硬盘上的内存还可以通过内存映射文件的方式来分配。 它的物理存储器来自磁盘上已有的文件,而不是系统的页交换文件。优点:(1)直接使用磁盘上的文件本身作为物理存储器(例如:exe、dl原创 2011-08-23 05:55:03 · 1095 阅读 · 0 评论 -
《Windows核心编程》读书心得——内存(堆和栈)(5)
线程栈:系统在线程创建的时候,会为线程栈顶预订一块地址空间,并调拨一些物理存储器,这块地址空间称为线程栈。大小:线程栈的默认大小为1MB(该值可以通过编译器的/F选项,或连接器/STACK来设置),连接器会把栈的大小写入exe或dll的PE头文件中。保护属性:默认都是原创 2011-08-24 01:45:22 · 1443 阅读 · 0 评论 -
《Windows核心编程》读书心得——DLL(6)
DLL中的内存空间:DLL中的函数创建的任何对象,都为调用线程或调用进程所拥有,DLL绝不会拥有任何对象。(例如,DLL中的一个函数调用了VirtuallAlloc(),系统会从调用进程的地址空间中预订地址空间区域)。导出:编译器看到_declspec(dllexport)修原创 2011-08-24 02:00:07 · 949 阅读 · 0 评论 -
Hosts文件
Hosts文件是一个用于存储计算机网络中节点信息的文件,它可以将主机名映射到相应的IP地址,实现DNS的功能,它可以由计算机的用户进行控制。 Hosts文件的存储位置在不同的操作系统中并不相同,甚至不同Windows版本的位置也不大一样: Windows NT/2000/XP/2003/Vista:默认位置为%SystemRoot%\system32\drivers\etc\,但也转载 2012-11-08 17:13:50 · 675 阅读 · 0 评论 -
信号量、互斥体和自旋锁
一、信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作: (1) 测试控制该资源的信号量。 (2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。 (3) 若此转载 2015-03-21 09:57:01 · 480 阅读 · 0 评论 -
互斥量使用实例
4种排序公用一个数组~~~使用互斥量防止访问冲突~~[cpp] view plaincopy#include #include #include using namespace std; const int N=12; static int arr[12]={12,50,60,87,98,50,15,31,转载 2015-04-12 12:03:26 · 629 阅读 · 0 评论 -
《Windows核心编程》读书心得——字符和字符串处理(1)
l ANSI和UNICODE编码:ANSI编码中,1个字符可能占一个字节、两个字节甚至多个字节,且不同国家的文字有不同的规定,存在字符库的冲突。UNICODE编码(包括UTF-8、UTF-16、UTF-32,最常用的是UTF-16),以UTF-16为例,每个字符占用固定大小的字节数(2个字节),当然,少数无法用2字节表示的字符除外(这些字符可用代理,4字节表示)。UNICODE编码中,不同国家的文字分在不同的码段,不存在字符库的冲突,更有利于计算机的全球化需要。因此,微软提倡使用UNICODE编码,在WI原创 2010-12-15 23:54:00 · 855 阅读 · 0 评论