自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 Win32 进程创建_句柄表

进程就是一个 4GB的空间,因为32位系统里面的寻址范围是2的32次方。Explorer.exe程序也是被操作系统的内核程序创建的,只不过该程序在创建完毕桌面程序后就退出了。

2023-12-20 21:39:31 925

原创 Win32 互斥量

【代码】Win32 互斥量。

2023-12-19 22:53:38 411

原创 Win32 事件

线程同步是指在多线程编程中,为了保证多个线程按照某种特定的方式正确、有序地执行,需要进行线程间的协作与同步。在多线程编程中,当多个线程共享同一份资源时,由于线程的执行顺序是不确定的,因此会存在一些并发问题,如死锁、竞态条件、资源争用等问题。为了避免这些问题,需要对线程进行同步。线程同步实际上就是通过线程之间的协作,使得线程能够按照一定的顺序来访问共享资源,从而避免并发问题的发生。线程同步。

2023-12-13 19:45:12 66

原创 Win32 互斥体

【代码】Win32 互斥体。

2023-12-12 16:53:22 65

原创 Win32 临界区

现在我们从第一堂课开始思考关于线程的问题。

2023-12-08 19:52:56 44

原创 Win32( 线程控制_CONTEXT结构体)

终止线程。

2023-12-07 22:32:31 177

原创 关于字节转换的总结

前段时间在写PE工具项目的时候,我们创建了EditText控件,当时我们需要将每个节名显示在控件中在PE中存储的块名是以多字节字符串的形式存在的,但是在VS控件中,是以宽字节wchar_t的形式存储的,因此在我在开始直接使用SetWindowText函数时,显示的时候出现了乱码因此我们需要对宽字符和多字节之间的转换wsprintfW函数可以实现将多字节转为宽字节。

2023-12-07 12:26:41 188

原创 Win32创建线程

这里被0加到1000那里的while循环坑惨了,找半天不知道为什么第二个文本框为什么不懂,原来是dwTime作为循环参数,但是它本身是0,因此循环不进行。被调用完毕之后,堆栈被摧毁,我们通过&num传参给线程函数后,参数的位置已经被销毁,所以传参就会失败。向线程函数并不是我们调用的,是我们在创建线程时,把线程函数的指针传参给线程,系统调用的线程函数。线程句柄就是一块令牌,有了令牌就可以进行使用,但是没有令牌也并不能影响线程的生命。线程ID是身份证明,具有唯一性,因此系统进行线程调度的时候需要用到。

2023-12-06 21:56:09 246 1

原创 Win32 通用控件_VM_NOTIFY

例如:Static、Group Box、Button、Check Box、Edit、ComboBox等。

2023-11-29 23:20:16 144

原创 Win32 提取图标 _修改标题

3.使用SendMessage函数我们已经引入图标和创建图标的指针,接下来就是要告诉系统,系统就知道去使用了HWNDhWnd回调函数的句柄UINTMsg消息类型(这里使用WM_SETICON)WPARAMwParam这里传参的是ICON_SMALL,没搞懂,为啥既不是图标名称也不是指针LPARAMlParam这里传参的是图标指针//break;return 0;

2023-11-27 23:02:23 123 1

原创 Win32_资源文件_消息断点

首先我们创建一个Win32 Application项目,让系统为我们创建一个程序入口函数点击new,选择resource script(资源脚本)这时,编辑器就为我们创建了两个文档注意:resource.h要我们对着Source Files鼠标右键点击添加文件才能看见记得昨天我们创建一个自己的对话框需要以下步骤:1.创建WNDCLASS结构体,为wndclass赋值2.注册3.创建窗口4.提供消息函数5.显示窗口6.提供消息循环今天我们实现Dialog函数又需要哪些步骤呢?

2023-11-26 16:09:25 50 1

原创 Win32_子窗口_消息处理函数

前面我们创建了第一个窗口首先定义了WinMain函数,还有四个参数第一个参数是程序的imgebase第二个参数一般都为NULL,所以不用管第三个参数是命令行参数第四个参数是窗口显示的模式其次我们创建了一个WNDCLASS结构体的对象wndclass对其进行初始化然后对成员进行赋值hbrBackground 背景板的颜色lpfnWndProc 消息处理函数的名字lpszClassName 窗口类的名字。

2023-11-24 21:27:55 188 1

原创 Win32 ESP寻址 _ 定位回调函数

第一个参数 :hInstance表示该程序当前运行的实例的句柄,这是一个数值。当程序在 Windows 下运行时,它唯一标识运行中的实例(注意,只有运行中的程序实例,才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通过 hInstance 参数传递给 WinMain 函数。第二个参数:表示当前实例的前一个实例的句柄。通过查看 MSDN 我们可以知道,在 Win32 环境下,这个参数总是 NULL ,即在 Win32 环境下,这个参数不再起作用。

2023-11-24 12:00:55 61 1

原创 Win32 事件_消息_消息处理函数

注意:这里的wndclass对象必须进行初始化,因为在赋值时,我们并没有将所有的成员都进行赋值,因此在我们为进行初始化的时候,其他成员的值就是堆栈的原始状态,并不符合系统对于窗口属性的格式!!这里WNDCLASS是一个结构体类型WNDCLASS结构包含由RegisterClass函数注册的窗口类属性。这个结构已经被与RegisterClassEx函数一起使用的WNDCLASSEX结构所取代。如果不需要设置与窗口类相关联的小图标,仍然可以使用WNDCLASS和RegisterClass。

2023-11-23 23:30:37 87

原创 二叉树实现

总结:所谓二叉树就是根绝以上特性而定义的一个类似树形结构的数据类型,在我们后面实现增删查改等相关功能时,必须遵守此类规则!4.以上情况都不满足是,通过递归函数,再次调用根节点pLeft或pRight地址作为参数递归函数,再次进行以上条件的判断;2.增加节点小于根节点,并且根节点左子树为空,此时可直接添加;3.增加节点大于根节点,并且根节点右子树为空,此时可直接添加;3.若左子树不为空,则左子树上的所有节点均小于根节点的值。4.若右子树不为空,则右子树上的所有节点均大于根节点的值。右子树<根节点<右子树。

2023-11-22 12:05:28 23

原创 数据结构之链表

特点:1.数据分散存储2.查询性能没有Vector好3.新增与删除性能好于Vector。

2023-11-16 20:35:48 30 1

原创 new-delete_Vector

个人认为vector其实更像一个“遥控器”,它具有很多功能,我们根据自己的需求去“按按钮”vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。

2023-11-10 20:13:03 46 1

原创 引用 友元 运算符重载

在平常的操作中,我们需要将一个数据的地址进行传参到函数进行功能的实现,但是如果在比较长的代码过程中,我们容易出现将数据地址错误的赋值更改,就会出现逻辑上的错误,就会非常头疼,因为通过调试来发现逻辑错误是一件很困难痛疼的事,因此我们需要一种语法来实现数据传参的同时能达到安全性---->引用通过引用的方式,我们可以实现在传参到函数中后,编译器设定了&refb不能被修改的条件,就不会出现因地址被修改而出现的逻辑错误了。(&base就叫引用)1.指针传参时传递地址:&base。

2023-11-09 19:48:15 49 1

原创 c++ 模板

在前面的排序和查找代码中,我们的功能函数都是指定接收某一种类型来进行,如果我们需要创建一个可以接受任意数据类型的功能函数呢,应该怎么做?在c++中我们可以通过模板的方式进行,通过模板,编译器可以帮我们枚举所有的类型。在函数上端添加template,可在函数,结构体/类中使用。模板是将代码进行复制,在编译时会编译器会根据我们传参的类型进行代码的复制。1.使用模板实现swap(x,y)函数,功能:交换x,y的值。继承是将父类的数据进行复制。2.实现冒泡排序结构体。

2023-11-08 21:38:10 40 1

原创 动态绑定_多态_上

1.多层继承无函数覆盖结论:多继承无函数覆盖时,首先调用的是“爷类”,然后是“父类”,最后是“子类”2.多层继承有函数覆盖(爷类与父类覆盖)结论:首先调用的是父类虚函数,再调用爷类3.多层继承有函数覆盖(爷类与子类覆盖)结论:首先调用的是子类虚函数,再爷类4.多层继承有函数覆盖(子类与父类覆盖)结论:首先调用的是子类虚函数,再父类5.多层继承有函数覆盖(三类都覆盖覆盖)结论:首先调用的是子类,再调用父类 ,最后爷类6.多重继承无函数覆盖。

2023-11-08 20:03:25 41 1

原创 (虚函数表)

首先我们观察通过base对象来调用正常函数和带有virtual的函数的反汇编此时我们可以看到ebp-4即this指针的地址作为参数传参。带virtual函数和普通函数都是使用E8 call。

2023-11-07 18:01:34 34

原创 C++ 权限控制

为了函数的可读性更强,代码看起来简洁明了,我们可以再创建一个新的class,右键新建,我们可以将函数的声明放在MyClass.h中(注意:在函数的定义时,要在函数名前面加上类名::函数名)将函数的定义放在MyClass.cpp中。

2023-11-06 20:30:28 105

原创 C++ 继承 构造 析构函数

定义:多重继承区别于多层继承在于,多层继承是结构体之间类似于嵌套关系,但是多重继承是属于“一子多父”(从C语言的逻辑理解),一个结构体同时包含两个父类(先写谁,就先继承谁)(实现定义结构体变量的同时,赋值结构体里面的成员)4.可以用父类指针指向子类(但是有时由于父类子类的指针宽度不同,因此父类的指针并不能完全访问所有成员,同理,使用子类访问父类就可以做到完全访问)由于宽度的原因,因此从“高辈”访问“低辈”时会出现宽度不够的问题,同样,“低辈”,访问“高辈”时也要担心宽度过多越界访问的问题。

2023-11-06 13:20:51 141

原创 C++类 this指针

从参数:我们在调用时并没有传递任何参数进去,但是查看反汇编可得知,编译器会自动传递结构体的地址进入。从压栈顺序:其他函数由于有参数的传递,因此需要将参数push进入栈内,但成员函数是首先得到结构体的地址,在编译器传递结构体的首地址中可以的到参数,前者是需要参数从高地址到低地址压栈,后者是通过地址直接获取参数。从堆栈平衡:成员函数有独有的堆栈平衡的方式。

2023-11-06 12:35:18 29

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除