Windows系统编程
文章平均质量分 55
Kiopler
这个作者很懒,什么都没留下…
展开
-
[Windows核心编程读书笔记2] 字符和字符串处理
字符串处理函数推荐使用中的函数。代表可以容纳的字符数(不是字节数), 字符数可以用的宏来求, 如果缓冲区容量不够会在pszDest首地址置0代替strcpy代替strcat代替sprintf其返回值为类型(())(())(())成功会返回。原创 2022-10-05 21:55:25 · 435 阅读 · 0 评论 -
Windows下进程间通信
1. WM_COPYDATA这种方法仅适合于Windows的GUI程序。利用WM_COPYDATA消息来进行进程间通信。其原理是如下:在x86下,由于保护模式下进程都具有虚拟内存。所以每个进程都拥有4GB的虚存空间,并通过分页机制进行寻址管理。其中2GB的内核空间是进程共享的而2GB的用户空间则是每个进程独立拥有。WM_COPYDATA消息会在内核空间开辟一段缓冲区。然后把要输入的内容传递进去。由于内核空间是共享的,所以其他进程可以直接获取。这种方法比较消耗资源,不推荐携带大量数据。原创 2022-03-19 21:37:15 · 3042 阅读 · 0 评论 -
跨进程使用进程句柄
1. 父子进程间实现跨进程使用进程句柄首先来查看一个创建进程的关键API,有关于跨进程使用进程句柄中最关键的2个参数已经用红框框出首先知道一个概念,每个进程被创建后内部都有一张句柄表。来看第一个参数bInheritHandles, 这个参数决定了创建的子进程能否继承父进程的句柄表。如果是TRUE则创建的子进程会继承父进程句柄表否则不会。 BOOL bInheritHandles,也就是说假设有2个进程A和B。A进程通过CreateProcess创建了B进程。如果A进程创建B时Cre原创 2022-03-18 14:05:35 · 1811 阅读 · 0 评论 -
2种利用Win32 API遍历窗口句柄的方法
两种遍历窗口句柄的方法:#include <windows.h>#include <cstdio>BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) { char szBuf[MAX_PATH] = { 0 }; char szOutput[MAX_PATH] = { 0 }; GetWindowText(hwnd, szBuf, MAX_PATH); if (strlen(szBuf))原创 2022-03-17 11:51:50 · 1699 阅读 · 0 评论 -
如何利用VS调试dll
VS不可以调试dll,但是可以利用载入该dll的exe文件来调试对应的dll。假设现在有一个dll文件名称为MFCLib.dll,对应加载的exe文件名为WinTest.exe只要在dll工程的属性, 调试中命令选项内加上exe文件的路径,然后在dll内加上断点后调试exe即可断在dll内部, 这样就可以调试dll了。(完)...原创 2022-03-16 10:26:54 · 6229 阅读 · 0 评论 -
关于Dll
Dll(动态链接库)的加载分为2种:静态加载 动态加载首先来看一个Dll的例子:上面3张图分别是main.cpp, Test.h以及Test.cpp。其编译连接后生成了一个名为Sample.dll以及对应的Sample.lib导入库。静态加载是通过如下几种方式使用:首先可以通过#pragma comment语句来静态使用dll或者可以通过在项目属性中的附加依赖项添加对应的导入库来静态使用这种情况下就无需#pragma comment语句了...原创 2022-03-15 11:37:57 · 2162 阅读 · 0 评论 -
3. 资源与对话框笔记与作业*
1. 菜单与快捷键的使用#include <windows.h>#include "resource.h"LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg) { case WM_CLOSE: { DestroyWindow(hWnd); PostQuitMessage(0); return(0); } case W原创 2021-12-07 12:37:56 · 672 阅读 · 0 评论 -
4. 控件*
1. 按钮(Button)N - Notify 通告, 按钮发送给我们的消息M - Message 消息, 发送给按钮的, 用来操作或设置按钮的2. 文本框(Edit)获取控件内容的5种方法:#include <windows.h>#include "resource.h"VOID OnBtnClicked(WORD wCtrlId, HWND hWndCtrl){ switch (wCtrlId) { case IDC_BTN_TEST0: {原创 2021-12-07 12:37:21 · 209 阅读 · 0 评论 -
2. SDK中的绘图, 键盘消息以及定时器笔记和作业
1. 绘图消息WM_PAINT消息绘图时机最大化, 最小化, 还原时 窗口移出或者移入屏幕 窗口尺寸改变BeginPaint和GetDC的区别BeginPaint会清除无效区, GetDC不会清除无效区 BeginPaint只能在WM_PAINT内使用, GetDC只能在除了WM_PAINT消息外其他消息内使用 一旦有无效区出现会往队列内放入WM_PAINT消息非WM_PAINT消息绘图时机使用GetDC获取设备上下文时 使用InvalidateRect手动设置无效区当Inv原创 2021-12-06 00:16:15 · 343 阅读 · 0 评论 -
1. SDK作业
1. 编写一个程序, 当鼠标左键按下创建一个新窗口,当点击关闭按钮的时候,关闭窗口,当只剩一个窗口的时候,退出程序#include <windows.h>int iNumOfWindows = 0;BOOL CreateNewWindow(HINSTANCE hInst){ HWND hWnd = NULL; hWnd = CreateWindowA("First window", "第一个窗口", WS_OVERLAPPEDWINDOW, 200, 100, 4原创 2021-12-05 05:21:46 · 364 阅读 · 0 评论 -
线程局部存储TLS技术之动态TLS
这里说的内容是基于X86的机器上,X64也所差无几。动态TLS是在程序运行时进行操作的TLS技术。其利用了4个Win32 API来实现。解释一下什么是动态线程存储:1. 进程的每个线程都有一张双字的TLS存储槽。实际上是一个数组2. 在X86的计算机上,该存储槽有64个元素。每个元素都是一个双字3. 每个线程的同一个索引下的元素可以使用不同的值4. 该技术可用于解决多线程问题由于每个线程的TLS存储槽的同一个索引都可以存储不同的内容。那么就可以将其视为一个同步的全局变量来使用原创 2021-07-10 22:34:24 · 503 阅读 · 1 评论 -
[内核安全7]内核级的进程的监控
0. 导言进程的监控可以通过挂钩SSDT表中的NtOpenProcess来实现,但是现在这种方式已经不怎么用了,因为不稳定在者可能会被认为是恶意软件。微软知道这个问题所以为我们提供了专门的内核接口来实现这种功能。1. PsSetCreateProcessNotifyRoutine通过PsSetCreateProcessNotifyRoutine来监控进程, 该内核函数有个升级版PsSetCreateProcessNotifyRoutineEx。这个升级版功能更强大但只能在Vista版本以后使用,原创 2021-02-17 22:42:43 · 811 阅读 · 0 评论 -
宏解析以及字符编码与预编译头
导言这一次主要讲了一下几点:宏 字符编码问题 多文件编程中预编译头宏宏的分类:数值型宏 算数表达式宏 代码段宏 兼容性宏 编译选项宏 编译器内置宏(非标准)数值型宏比如上面的例子,这种类型的宏非常简单,只是为了可读性以及方便替换使用算数表达式宏在正式开始之前来看一个编译器选项/P。该选项的作用是使得编译器生成预处理完成解析后的以*.i后缀的文件。可以在命令行中直接使用CL.EXE进行预处理,比如:这就会生成main.i文件。里面全是预处理完后生成的源原创 2020-11-30 16:47:11 · 399 阅读 · 0 评论 -
不懂汇编也可以从底层理解C/C++中各种变量(上篇)
内存中的结构分布:块变量块变量声明周期为块内,一旦出块声明周期将立马停止,所以第11行直接报错,因为块内的i已经被销毁。接下来在块外面也添加一个i变量。在块内时,如下图所示可以看到块外的i首先在栈帧内被赋值进入块后进入块后也是在main的栈帧内存储块内变量i。并且在块内时i的值是在块内的i值10当出块后, 块内的i已经不复存在了,虽然该值在栈帧内还有,但实际上栈帧压栈和弹栈会把该值覆盖掉。第二次打印的实际上是5。所以块变量的生命周期仅仅是在块内局.原创 2020-11-29 23:05:57 · 299 阅读 · 0 评论 -
安全登录加密框架编写[思想与基础实现]
可以把该思想用于任何需要密码账号登录的情况,站在一个攻击方角度来思考防御, 确保黑客和软件破解者更难攻破。感谢钱老师功能是验证登录时密码账号是否正确。在开始之前需要如下几个准备:正确的密码和账号, 分别为Pwd和Id 登录成功的提示信息,记为: LOGIN SUCCESS 一个校验算法记为: CHK,可通过一串字符串算出定长的HASH串记为: HASH128 一个对称加密算法, 记作: CRYPTO 一个密匙计算算法,用于两串非定长字符串合成一个KEY值,记作: R下面是具体步骤的执行流程原创 2020-11-27 21:49:57 · 2184 阅读 · 3 评论 -
C运行时库CRT(C Run-time Library)详解
转载: (https://blog.csdn.net/so_geili/article/details/53009655)一、什么是C运行时库1)C运行时库就是 C run-time library,是 C 而非 C++ 语言世界的概念:取这个名字就是因为你的 C 程序运行时需要这些库中的函数.2)C 语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);所...转载 2018-12-16 04:35:44 · 824 阅读 · 0 评论 -
Windows核心编程读书笔记-2
第二章: 第二章主要是作者对Unicode编码的吹捧和提倡,我说吹捧是因为他真的极力在推崇使用Unicode,感觉吃奶的力气都用了。大牛就是不一样,然而我还是对ANSI抱有热衷,原因是很简单而且占用的空间小,从安全性来说来说还是有strncat, strncpy之类的函数,感觉不比_tcscpy_s这种让新手看上去毛虎耸然的函数差。 该章节主要是介绍的内容如下,首先是推崇UNC...原创 2018-12-17 15:31:25 · 428 阅读 · 1 评论 -
Windows核心编程读书笔记-3
第三章: 第三章主要讲了内核对象的基本概念,创建,判别内核对象以及如何通过继承,命名,复制来在不同进程中分享内核对象。什么是内核对象: 内核对象即那些通过有SECURITY_ATTRIBUTES类型形参的API创造出来的对象。前面那句话本质上只是给出了内核对象的判断方法,但是因为内核对象的确就是这样的。 书中给出了一些内核对象的例子,最常见的比如事件对象(Crea...原创 2018-12-18 15:56:06 · 456 阅读 · 0 评论 -
关于__declspec(dllimport)和__declspec(dllexport)的问题
1. __declspec(dllimport)意思是被修饰函数要从其他dll中导入2. __declspec(dllexport)意思是被修饰函数是要导出//dllexample.h#pragma once#ifndef __DIPSLIB_H_#define __DIPSLIB_H_#include <windows.h>#include <window...原创 2019-04-23 00:06:48 · 331 阅读 · 0 评论 -
Windows核心编程读书笔记-1
Windows核心编程这本书目前为止看了4章不到我觉得升华了我对Windows系统的认识,有种茅塞顿开的感觉,本读书笔记系列是我详细阅读《Windows核心编程》第五版并为了更好理解而准备的,本篇是第一章。第一章:第一章内容非常短,主要是讲述了如何在未来的阅读中解决异常和编译错误而写的,主要是如下两个API: GetLastError这个函数是返回上一个错误的数字代码,Wind...原创 2018-12-16 02:26:45 · 1406 阅读 · 0 评论