
Windows
Windows
Michael_Good
脚踏实地,不负时光!
展开
-
【C/C++】同步锁的选择(基于性能场景)
仅需要在单个进程中进行同步,且锁的竞争不是很激烈,则建议 CriticalSection需要支持多个读者或跨进程同步,则需要考SRW Locks 或者 Mutex锁的竞争特别激烈,则考虑无锁机制或者利用Interlocked进行设计自定义同步就机制。原创 2025-01-09 13:52:07 · 105 阅读 · 0 评论 -
【C/C++】windows平台同步锁机制种类
CriticalSection:Mutex(互斥量):Semaphore(信号量):Slim Reader/Writer (SRW) Locks:Interlocked Functions:Condition Variables:Event Objects:原创 2025-01-09 13:44:45 · 482 阅读 · 0 评论 -
【操作系统】为什么需要架构裁剪?
为什么需要架构裁剪?原因减小核心大小提高架构初始化速度降低内存占用提高系统性能移除不需要的功能,增加安全性裁剪方法初始化配置设置功能模块化移除不需要的驱动底层一般裁剪对象(以操作系统为例)文件系统的支持网络协议栈设备驱动程序调试和追踪程序电源管理功能虚拟化功能原创 2024-12-18 19:58:58 · 251 阅读 · 0 评论 -
【消息中间件】什么是MQTT?优势是什么?
一种针对移动终端设备的基于TCP/IP的发布订阅协议,可以连接大量远程边缘设备(如传感器、控制设备)。特点是,可以保持长连接,具有一定的实时性。2、“至少1次”:发生消息重复,不关注。即,出现消息丢失后,发送者会进行发送多次,直至觉察到接收者接收到了,重复接收几个相同的消息,也不care。1、”至多1次”:发生消息丢失,不关注。即,发送者仅发送1次,接收者能不能收到,不care。3、“只有1次”:确保消息仅仅到达1次。使用发布订阅模式,提供一对多的消息发布,解除应用程序的耦合。发布者、订阅者、代理中心。原创 2024-12-16 09:36:39 · 356 阅读 · 0 评论 -
【架构设计】关于架构设计的一些思考
面向过程->面向对象->函数式编程。原创 2024-12-10 15:23:32 · 900 阅读 · 0 评论 -
【IO】关于DMA、零拷贝技术笔记
DMA(Direct Memory Access,直接内存访问)控制器是一种硬件组件,它允许外部设备直接与系统内存进行数据传输,而无需中央处理器(CPU)的直接干预。DMA 控制器的设计和实现原理旨在提高数据传输的效率和系统的整体性能。零拷贝是一种思想,目标是降低内存拷贝次数。DMA技术仅仅是减少了CPU上下文切换、调用负担。上层系统减少了一次拷贝,但是这次拷贝是交给了DMA控制器进行执行,从整体(DMA+原系统)上来说,并没有减少拷贝次数。原创 2024-11-28 15:36:37 · 895 阅读 · 0 评论 -
【计算机网络】C/C++实现解析Wireshark离线数据包,附源码
是 libpcap 库中的一个重要函数,用于打开一个包含已捕获数据包的文件,以便进行离线分析。这个函数在网络安全分析、协议分析等领域有着广泛的应用。接下来,函数会读取文件头信息,以验证文件格式是否符合 libpcap 的要求。文件头包含了一些重要的元数据,如魔数、版本号等。读取文件头后,函数会进行一系列校验,确保文件格式正确。如果文件不存在或无法打开,函数会返回。指针,以便后续调用其他 libpcap 函数进行数据包处理。如果文件头校验通过,函数会初始化一个。函数打开一个捕获文件并读取数据包。原创 2024-11-26 12:16:11 · 842 阅读 · 0 评论 -
【Windows C/C++】关于Windows平台开发,文件路径名最大长度限制,可防止内存溢出
最近发现个有意思的问题,在Windows平台开发,输入文件名时,需要为此开辟内存,到底开多大?原创 2024-09-12 16:33:50 · 247 阅读 · 0 评论 -
【架构设计】什么是语义分离?有什么优缺点?
语义分离(Semantic Separation)指在软件设计和架构中,将不同的功能、职责或概念明确地划分开来,使得它们在逻辑上和实现上保持独立。这种分离有助于提高代码的可读性、可维护性和可扩展性。语义分离通常涉及将系统分解为更小、更易于管理的部分,每个部分都有明确的职责和接口。原创 2024-08-27 15:23:02 · 315 阅读 · 0 评论 -
如何做好需求分析
最近对于做需求分析的一些思考总结:原创 2024-08-22 09:10:59 · 105 阅读 · 0 评论 -
【异步IO】libevent&&libev&&libuv的相关认识
由于libevent和libev对Windows平台支持性较差(不支持完全端口iocp),所以,libuv出现了。最近在网络底层的开发,对于吞吐有一定要求,借机会,也了解了下业内常用的网络库。继承了libevent的优点,也改善了很多libevent中的问题。所以根据当前的业务是有在win平台的部分,所以选择了libuv。libuv是基于libev,,并在win平台上封装了iocp。在libev中对这些问题,进行了极大的改善。原创 2024-08-21 15:15:10 · 478 阅读 · 0 评论 -
【cmake】关于cmake链接库的顺序要求
命令来指定链接顺序。这个命令接受一个目标(target)和一系列库(库可以是库目标、库文件路径或导入的库目标)作为参数。链接顺序通常很重要,特别是当库之间存在依赖关系时。链接顺序通常遵循依赖关系,即依赖于其他库的库应该在被依赖的库之后列出。如果库之间没有依赖关系,链接顺序可能不那么重要,但最好保持一致的顺序以避免混淆。是指定链接作用域的关键字(可以是。),后面跟着一系列库。,这反映了它们之间的依赖关系。在CMake中,你可以使用。原创 2024-08-15 15:56:42 · 745 阅读 · 0 评论 -
【CMake】Windows平台动态库DLL的使用,需要借助LIB库(该LIB库并不是静态库,而是导入库)
Windows平台动态库DLL的使用,需要借助LIB库(该LIB库并不是静态库,而是导入库)需要在cmake中开启导入库的生成功能。原创 2024-08-15 14:16:05 · 223 阅读 · 0 评论 -
windows socket收发缓冲区大小 - 8K
所以,若收发的数据包大于8K,建议调整socket收发缓冲区大小。Windows默认socket收发缓冲区大小式 – 8K。原创 2024-08-05 10:41:27 · 615 阅读 · 0 评论 -
【python】Windows使用python建立HTTP服务器
【代码】【python】Windows使用python建立HTTP服务器。原创 2024-06-24 10:09:01 · 412 阅读 · 0 评论 -
【C/C++】实现高性能日志轮转功能,已实测
这个程序会检查日志文件的大小,如果超过预设的大小限制,则将当前日志文件重命名,并创建一个新的日志文件。因此,压缩操作通常在日志文件轮转时执行,此时日志文件被关闭,不再有新的写入操作。如果当前日志文件的大小超过了预设的限制,它会将当前日志文件重命名为包含当前时间戳的新文件名,并创建一个新的空日志文件。确保压缩过程中的数据完整性涉及多个方面,包括文件的完整性、压缩过程的正确性以及压缩后文件的可用性。:在压缩之前,确保当前正在写入的日志文件被关闭,以避免在压缩过程中写入数据。:压缩完成后,删除原始的旧日志文件。原创 2024-06-17 23:56:47 · 1323 阅读 · 0 评论 -
【操作系统】Windows平台捕获崩溃现场底层原理,附代码亲测MiniDumpWriteDump
库,用于生成程序崩溃时的内存转储文件(MiniDump)。这个函数是Windows平台下用于捕获程序崩溃时的内存状态的常用方法之一。函数是Windows平台上进行程序崩溃分析的重要工具,它允许开发者在程序崩溃时捕获到程序的完整状态,从而进行深入的调试和问题定位。这个文件就是最终生成的MiniDump文件,它包含了崩溃时的内存快照、寄存器状态、线程信息等。生成的MiniDump文件可以被开发者使用调试工具(如WinDbg)打开和分析,以帮助诊断程序崩溃的原因。参数的设置,决定哪些内存区域需要被转储。原创 2024-06-02 17:04:27 · 602 阅读 · 0 评论 -
【windows】有关windows的EnableFastLoopback优化点
EnableFastLoopback 是一个 Windows 操作系统的注册表项,用于控制网络回环(loopback)接口的行为。当启用 EnableFastLoopback 时,操作系统会优化网络回环接口的性能,以提高本地回环通信的速度和效率。启用 EnableFastLoopback 可以提高本地回环通信的性能,减少网络协议栈的开销,从而加快本地回环通信的速度。需要注意的是,修改注册表项可能会对系统产生影响,因此在修改之前建议先备份注册表或谨慎操作。原创 2023-08-21 16:48:16 · 279 阅读 · 0 评论 -
【Windows】Windows中判断版本号【redis优秀案例】
这些方法可以帮助您在 Windows 上方便地查看操作系统的版本号。原创 2023-08-21 16:44:04 · 830 阅读 · 0 评论 -
【Windows】windows 下载安装SDK
https://developer.microsoft.com/zh-cn/windows/downloads/sdk-archive/原创 2023-08-15 19:58:48 · 1369 阅读 · 0 评论 -
【Windows】_unlink 与 remove 相比,优劣如何?
这意味着,如果使用 _unlink() 函数删除文件失败,可以通过返回值来判断失败原因,而使用 remove() 函数则无法直接获取删除失败的原因。相对于 remove() 函数,_unlink() 函数是 Windows 系统下的特有函数,而 remove() 函数是标准 C 库函数,可以在多个操作系统上使用。总的来说,_unlink() 函数和 remove() 函数都是常用的文件删除函数,使用上都比较简单,选择哪个函数主要取决于具体的需求和使用场景。原创 2023-07-28 15:30:32 · 591 阅读 · 0 评论 -
【windows】GetMessageW 与 PeekMessageW 区别
如果当前消息队列中有消息,PeekMessageW函数将将消息复制到指定的MSG结构体中,并返回TRUE。如果您只需要检查消息,可以使用PeekMessageW函数。GetMessageW函数会将消息从消息队列中删除,而PeekMessageW函数不会删除消息。这意味着,如果您使用GetMessageW函数处理消息,该消息将从消息队列中删除,而如果您使用PeekMessageW函数处理消息,该消息将仍然保留在消息队列中。如果当前消息队列中没有消息,GetMessageW函数将一直等待,直到有消息到达为止。原创 2023-07-17 21:48:14 · 382 阅读 · 0 评论 -
【windows】PeekMessageW 如何使用
在上面的示例中,我们使用PeekMessageW函数检查消息队列中是否有消息。如果消息队列中有消息,我们使用TranslateMessage函数将消息转换为键盘或鼠标事件,并使用DispatchMessageW函数将消息发送到窗口过程中进行处理。如果消息队列中没有消息,PeekMessageW函数将立即返回FALSE,循环将退出。PeekMessageW函数是Windows API中用于检查消息队列中是否有消息的函数。如果消息队列中有消息,PeekMessageW函数将将消息复制到该结构体中。原创 2023-07-17 21:47:38 · 753 阅读 · 0 评论 -
【windows】vs2017 中debug与release调试区别
优化级别:在Debug配置中,编译器和链接器会使用较低的优化级别,以便于调试和排查问题。在开发和调试阶段,通常使用Debug配置进行编译和调试;符号信息:在Debug配置中,编译器和链接器会生成包含符号信息的可执行文件和库文件,以便于调试和排查问题。在Visual Studio 2017中,Debug和Release是两种不同的构建配置,它们之间的主要区别在于编译器和链接器的优化级别不同。安全检查:在Debug配置中,编译器和链接器会执行一些额外的安全检查,以便于发现和修复潜在的安全问题。原创 2023-07-17 21:14:58 · 599 阅读 · 0 评论 -
【C/C++】Windows CRT 运行时库介绍
如果使用 MT(Multi-threaded)版本的 CRT 库,会将 CRT 库的代码和数据直接嵌入到生成的 DLL 文件中,这样会导致 DLL 文件的大小变大,而且每个 DLL 文件都会包含一份 CRT 库的代码和数据,这样会浪费系统资源。一般来说,如果我们需要将程序部署到其他机器上,或者需要将程序作为库提供给其他开发者使用,建议使用 MD 版本的 CRT 库,因为它可以减小可执行文件的大小,并且可以避免 CRT 库的版本冲突问题。COM组件:是一种面向对象的编程模型,用于实现组件化的软件开发。原创 2023-07-17 15:02:37 · 1684 阅读 · 1 评论 -
【Windows】Windows如何进行直接切换目录
但是: 不能直接切换至指定目录下.使用 pushd, 解决上述问题。如果直接使用cd,会报错。可以直接使用盘符进行切换。原创 2023-06-13 15:25:20 · 245 阅读 · 0 评论 -
【Windows】VC++通过应用软件运行路径,获取应用软件版本
在这个示例中,我们首先使用GetFileVersionInfoSize和GetFileVersionInfo函数获取文件版本信息。然后,我们使用VerQueryValue函数获取文件版本号,并将其分解为主版本号、次版本号、修订版本号和构建号。最后,我们输出版本号并释放内存。要在VC++中获取软件版本号,可以使用Win32 API中的GetFileVersionInfo和VerQueryValue函数。请注意,需要将"path/to/your/file.exe"替换为实际的文件路径。原创 2023-05-17 09:45:48 · 757 阅读 · 0 评论 -
【Windows】VC++ 通过PID获取进程运行路径
在VC++中通过进程PID获取进程运行路径,可以使用Win32 API中的OpenProcess、GetModuleFileNameEx和CloseHandle函数。在这个示例中,我们首先使用OpenProcess函数打开进程句柄。然后,我们使用GetModuleFileNameEx函数获取进程运行路径,并将其存储在一个缓冲区中。最后,输出进程运行路径并关闭进程句柄。请注意,需要将pid替换为您实际的进程PID。原创 2023-05-17 09:43:34 · 1046 阅读 · 0 评论 -
【Windows】如何使用Windbg检测Windows程序内存泄漏
需要注意的是,使用Windbg检测内存泄漏需要一定的调试经验和技巧,对程序的性能也会产生一定的影响。该命令会输出程序的堆内存使用情况,包括已分配的内存块数量、已释放的内存块数量、已分配的内存块总大小、已释放的内存块总大小等信息。启动程序:使用Windbg启动需要检测内存泄漏的程序,可以通过在Windbg中选择“文件”->“打开程序”来打开程序。该命令会输出程序中所有未释放的内存块的信息,包括内存块的大小、地址、分配位置等信息。运行程序:在Windbg中,可以通过输入“g”命令来运行程序。原创 2023-05-06 10:45:17 · 2827 阅读 · 0 评论 -
【Windows】如何判断Windows二进制文件是32位或是64位
使用 Notepad 等编辑器打开Windows二进制文件,如果在第二段PE字符之后是d,则二进制文件是32位。使用 Notepad 等编辑器打开Windows二进制文件,如果在第二段PE字符之后是L,则二进制文件是32位。原创 2023-05-05 10:00:33 · 496 阅读 · 0 评论 -
【Windows】Windows 平台运行 bat 脚本
在上面的代码中,我们首先指定要运行的.bat脚本的路径,然后使用ShellExecute函数运行它。如果ShellExecute函数返回一个大于32的值,则表示成功运行脚本。否则,表示运行失败。请注意,如果.bat脚本需要使用特定的参数或选项,可以将它们作为第四个参数传递给ShellExecute函数。在VC++中运行一个.bat脚本,可以使用Windows API中的ShellExecute函数。这将把"input.txt"作为参数传递给脚本,以便它可以读取该文件并执行相应的操作。原创 2023-04-28 00:15:00 · 1111 阅读 · 0 评论 -
【Windows】Windows API - ShellExecute 使用说明
请注意,ShellExecute函数可以用于打开或运行各种类型的文件和程序,例如文本文件、图像文件、音频文件、视频文件、可执行文件等等。只需要将要打开或运行的文件或程序的路径传递给ShellExecute函数即可。在上面的代码中,我们首先指定要打开的文本文件的路径,然后使用ShellExecute函数打开它。如果ShellExecute函数返回一个大于32的值,则表示成功打开文件。ShellExecute是Windows API中的一个函数,用于在Windows操作系统中打开或运行一个文件或程序。原创 2023-04-27 15:13:03 · 1106 阅读 · 0 评论 -
【Windows】Windows 平台常用脚本 bat
在Windows中,批处理文件通常使用扩展名”.bat",这是因为在早期版本的MS-DOS操作系统中,批处理文件使用的扩展名是".bat",而Windows操作系统是基于MS-DOS开发的,因此继承了这个扩展名。“.bat"是"batch"的缩写,意为"批处理”。批处理文件是一种包含一系列命令的文本文件,可以用来自动化执行一些常见的任务,例如备份文件、安装软件、运行程序等等。“.bat"是Windows操作系统中批处理文件的文件扩展名。原创 2023-04-27 15:11:29 · 541 阅读 · 0 评论 -
【Windows 内核】Windows如何实现高性能 AIO
IOCP 是一种基于操作系统内核的异步 I/O 实现方式,它利用操作系统内核提供的异步 I/O 接口来实现异步 I/O 操作。等待异步 I/O 操作完成。当I/O操作完成时,操作系统将完成的I/O请求从内核的I/O请求队列中取出,并将其结果信息(如读取的数据、错误码等)放入到一个称为完成包(Completion Packet)的数据结构中。通过使用GetQueuedCompletionStatus函数,应用程序可以实现高效的异步I/O操作,避免了阻塞等待I/O操作完成的情况,提高了系统的吞吐量和响应速度。原创 2023-04-12 10:57:11 · 1046 阅读 · 0 评论 -
IDA理解:(*(void (__stdcall **)(volatile signed __int32 *))(**(_DWORD **)v16 + 4))(v16);
1. *(_DWORD **)v16:将指针 v16 强制转换为 _DWORD ** 类型,然后取出指针所指向的 _DWORD * 类型的值,再取出该值所指向的 _DWORD 类型的值。*(void (__stdcall **)(volatile signed __int32 *)):将上一步得到的地址强制转换为一个指向函数指针的指针,该函数指针的参数为 volatile signed __int32 * 类型,返回值为 void 类型,调用约定为 __stdcall。原创 2023-03-10 17:12:24 · 643 阅读 · 0 评论 -
Windows注入,混淆加密函数名【已亲测】
混淆 DLL 的函数名可以使用函数名加密或函数名混淆的方法来实现。其中,函数名加密是指对 DLL 中的函数名进行加密或哈希,从而使其难以被识别。函数名混淆是指对 DLL 中的函数名进行修改,使其难以被识别和理解。需要注意的是,函数名混淆是一种增加检测难度的防御措施。在实际应用中,还可以采取其他措施来保护 DLL 的安全性,如数字签名、代码签名、动态加密等。原创 2023-03-04 11:36:29 · 572 阅读 · 0 评论 -
Windows如何进行冷注入?如何冷注入后不被内存检测?如何混淆加密DLL?【已亲测】
混淆 DLL:可以使用混淆技术来隐藏 DLL 的真实内容,从而避免被检测到。在 Windows 中,冷注入本身并不会被内存检测所发现,因为它是一种将 DLL 注入到目标进程中的方法,而不需要启动目标进程。避免使用常见的注入函数:一些杀毒软件和安全软件会监测常见的注入函数,如 CreateRemoteThread、SetWindowsHookEx 等,因此可以尝试使用其他未被广泛使用的注入函数。加密和混淆 DLL:可以使用加密和混淆技术来隐藏 DLL 的真实内容,从而避免被检测到。原创 2023-03-04 11:28:17 · 1024 阅读 · 0 评论 -
Windows冷注入实现详解【已亲测】
该示例代码中,GetProcessIdByName函数用于根据进程名获取进程ID,InjectDll函数用于向指定进程中注入指定的DLL文件。Windows冷注入是指利用某些技术手段向一个已经运行的进程中注入代码,从而实现恶意行为或者获取目标进程的信息。原创 2023-03-04 09:54:53 · 177 阅读 · 0 评论