Windows操作系统
文章平均质量分 73
Sagittarius_Warrior
这个作者很懒,什么都没留下…
展开
-
Windows Service编程
Abstract 本文主要介绍 Windows service 的编程模式和 SCM 的相关功能。Content基础知识What is Windows ServiceSCMService ProgramsEvent Trace for Windows关键函数Service Entry PointServiceMainService Control Handler...原创 2019-02-26 19:38:16 · 3326 阅读 · 0 评论 -
《Windows核心编程》之“线程池”
本文主要结合四个应用场景介绍Windows内置的几种线程池机制,并配了一张思维导图。事实上,Jeffrey在该书中,并没有过深的去探讨“线程池”的机制,Windows所提供的这四种线程池机制也并非所有场景都合适,后续我将会单独开一篇博客来自己实现一个线程池。 如上图,本文主要介绍这四个线程池应用场景。一、异步函数调用 它的流程大致分为三步,参考batch.exe示例原创 2016-09-05 14:15:01 · 955 阅读 · 0 评论 -
《Windows核心编程》之“用户模式同步”
本文我将用一张思维导图来总结“用户模式下线程同步”的各个知识点,然后再分析书中给出的“Queue”示例代码。Queue示例代码分析:一、功能简介 该示例实现了一个简单的“client/server”模式的“producer .vs consumer”案例。待保护资源是 一个全局queue,client端有四个writer线程向该queue发送入队request,并原创 2016-08-24 11:19:52 · 538 阅读 · 0 评论 -
《Windows核心编程》之“内存映射文件”
一般来说,应用程序对文件的操作分为两类:第一类是操作文件本身,包括new、delete、cut、copy、paste以及获取或修改文件属性等操作;第二类就是操作文件的内容,包括:read、write以及文件指针,事实上,cut、copy和paste从实现上来说,也是文件内容操作。对于第二类操作,通行的做法是设计一个buffer(它对应进程地址空间的一个区域),先把待操作的内容读入到buffer,然原创 2016-08-01 10:59:35 · 1545 阅读 · 0 评论 -
《Windows核心编程》之“完成端口”
《Windows核心编程》第10章开头部分一再强调:“IO Completion Port”是“构建高性能、可升缩的应用程序”的最佳设施之一,它不仅适用于处理设备IO,也适用于其它越来越多的应用场景,比如:Job内核对象、Socket编程等。故此,我单独用一篇博客来讲述“IO Completion Port”的应用场景、原理、用法和示例。一、缘起1,线程通信 对于一...原创 2016-09-02 14:53:42 · 1457 阅读 · 0 评论 -
《Windows核心编程》之“Windows挂钩”(一)
《Windows核心编程》一书中介绍了一种针对带窗口的Windows应用程序的“DLL注入”的方法——Windows Hook(窗口挂钩)。本系列文章将探讨这种技术的原理和分享我的实验心得。原创 2016-08-11 15:27:27 · 2524 阅读 · 0 评论 -
《Windows核心编程》之“线程调度和优先级”
“线程调度和优先级”这一章主要讲解 Windows 的线程调度的机制,特别是线程上下文切换(context switch)。由于 Windows 并非“实时操作系统”,在线程调度方面留给程序员操作的空间很少,因此,这一章对实际编程的帮助并不大,如果仅仅是想了解一些基本原理,建议通读一遍即可,或者仅阅读前面 4 个小节。 本章最重要的一个概念就是“线程上下文切换”(context sw...原创 2016-08-23 11:04:14 · 827 阅读 · 0 评论 -
《Windows核心编程》之“进程”
本文我尝试用一张思维导图来总结我对《Windows核心编程》CH4“进程”这一章内容的理解,然后针对一些感兴趣的内容展开来谈谈我的理解。建议大家在阅读这一章时,认真阅读示例程序“ProcessInfo.exe”,它是一个迷你版的“procexp.exe”,通过对“ProcessInfo.exe”的学习,可以加深对 procexp.exe 的认识和掌握高级用法。 一、知识图谱...原创 2016-08-22 14:08:59 · 1159 阅读 · 0 评论 -
《Windows核心编程》之“线程基础”
本文主要介绍线程的一些基础知识,包括:线程内核对象、线程的创建和退出、线程的初始化和线程上下文等,可以用下面这张思维导图来总结。一、线程VS进程 内核对象 地址空间 进程 进程内核对象 进程地址空间 线程 线程内核对象 线程栈 进程是线程的容器,线程依赖于进程的上下文。 线程要在某个进程的地址空间内执行代码和处理数据。...原创 2016-08-22 16:43:59 · 447 阅读 · 0 评论 -
《Windows核心编程》之“内核对象同步”
本文主要总结如何使用“kernel object”来实现线程间的同步。与用户模式下的同步方法相比,内核对象同步的效率会相对要低一些(需要切换到内核模式下),但是,它可以跨进程使用,而且在编程上也更简单。 除了总结知识点,我还分析了内核对象同步实现的Queue.exe的示例代码,并与上一篇的Queue.exe进行了简单对比。最后,我将介绍微软提供的一种诊断死锁问题的手段:Wait Chai原创 2016-08-26 11:01:59 · 698 阅读 · 0 评论 -
《Windows核心编程》之“堆”
本文我将用一张思维导图来总结“堆”相关的知识点。原创 2016-08-26 15:50:42 · 630 阅读 · 0 评论 -
《Windows核心编程》之“Windows挂钩”(三)
本文主要结合之前两篇介绍的“Windows挂钩”知识,讲解《Windows核心编程》一书中的“DIPS"示例程序和我的调试经验。一、程序功能介绍1,功能需求 DIPS.exe应用程序使用了Windows Hook来将一个DLL注入到Explorer.exe的地址空间中,并在内部给桌面的ListView控件发送LVM_GETITEM和LVM_GETITEMPOSITON消息原创 2016-08-12 14:56:21 · 1407 阅读 · 0 评论 -
在Windows上编译、应用glog
glog是google提供的一个开源的C++日志库。由于最新的glog源码工程中,已经移除了“.sln”文件,代之以“a CMake build system”,在Windows平台下应用最新的glog库,需要自行使用CMake来生成适用不同版本VS的“.sln”文件。这个过程相对来说,有点小繁琐,特以此文记录并分享给大家。注:glog下载链接:https://github.com/goo原创 2017-08-22 17:31:21 · 13256 阅读 · 0 评论 -
VC++程序脱机运行DLL库缺失问题总结
是用VS开发软件的同学们经常会遇到“程序在本机运行正常,拷贝到其他电脑上运行会报***.DLL缺失”的问题,本人也是深受该问题折磨,在此对该类问题做一个总结。为了方便问题的藐视,我将开发程序的电脑称为“developer",运行程序的电脑称为”runner“。一、追根索源 表面上看,此类问题一般由两种原因引起:一是runner没有安装VS开发环境;二是runner的VS版本与原创 2016-06-07 14:41:28 · 6923 阅读 · 0 评论 -
Windows注册表的操作
本文介绍Windows注册表的结构、注册表读、写和查询等操作的Win32 API和内核函数。一、注册表原理1,《Windows Internals》 该书的中文版叫《深入解析Windows操作系统》,它的第4章第一节,详细讲解了Windows注册表,包括注册表的结果和各个项的含义。2,“注册表操作(VC_Win32)”(来自博客园的博客) http://www.c转载 2017-04-12 14:13:33 · 655 阅读 · 0 评论 -
Windows CMD命令行编程总结
众所周知,Windows操作系统是图形化的操作系统,对于普通用户来说,它极大地降低了操作难度。但是,对于程序员来说,你有时候会发现,Windows 下的IDE不如Linux的bash来的高效和便利。事实上,这是一个误区,Windows也支持命令行编程。CMD就是Windows自带的shell。我在之前的几篇博客里都用到过Windows CMD和bat(批处理),但都是零散的介绍,本文主要将以前的知原创 2017-01-20 09:52:15 · 18457 阅读 · 2 评论 -
VS中DLL的导出宏的定义和头文件的位置导致的两类编译错误总结
一般地,我们在新建一个win32的动态链接库(DLL)时,会采取如下的方式的来编写导出接口文件(.h)。#pragma once#ifndef API_EXPORT#define DECL_API extern "C" __declspec(dllimport)#else#define DECL_API extern "C" __declspec(dllexport)#endif原创 2016-12-29 14:59:13 · 2593 阅读 · 0 评论 -
Windows虚拟机
1,Windows虚拟机https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/下载win7-102,讲解http://www.iplaysoft.com/windows-test-vms.html3,win10使用版本https://developer.microsoft原创 2016-09-19 17:26:51 · 540 阅读 · 0 评论 -
《Windows核心编程》之“Windows挂钩”(二)
本文接上篇,继续探讨“Windows挂钩”,包括:跨进程的“窗口子类化”,使用Windows Hook注入DLL,跨进程窗口通讯,进程间共享内存和示例程序调试总结。原创 2016-08-11 16:54:18 · 1053 阅读 · 0 评论 -
《Windows核心编程》之“DLL注入”(一)
一、背景知识1,Private Address Space 在Windows操作系统中,每个进程都有自己私有的地址空间(private address space)。各个进程的地址空间(user partition)是相互独立的,尽管它们的地址编码范围相同(0x00010000 ~ 0x7FFEFFFF),但是它们对应虚拟地址的后备物理存储器一般都不相同(只读模式下的Imag原创 2016-08-09 16:29:26 · 7561 阅读 · 0 评论 -
《Windows核心编程》之”DLL注入“(二)
本文接上一篇,开始介绍"DLL注入"的实现。一、DLL注入的方法 DLL注入的方法有很多,《Windows核心编程》中介绍了如下几种:1)使用注册表来注入DLL;2)使用Windows挂钩来注入DLL;3)使用远程线程来注入DLL;4)使用木马DLL来注入DLL;5)把DLL作为调试器来注入DLL;6)使用CreateProcess来注入DLL;原创 2016-08-09 16:55:22 · 3581 阅读 · 0 评论 -
实现单实例应用程序的三种方法
本文介绍三种“实现单实例应用程序”的方法,保障每次只能运行一个该类型的应用程序。一、共享内存 在main函数中添加如下代码: // 使用共享内存的方式来保证只运行一个实例 QString strKey = "MyApplication"; QSharedMemory sharedMemory; sharedMemory.setKey(strK原创 2016-06-17 17:13:56 · 1397 阅读 · 0 评论 -
Win10下应用程序默认管理员权限运行
系统升级到win10后,普通应用程序不再默认以管理员权限运行了。当应用程序需要访问系统盘或调CreateFile函数进行IO驱动操作时,往往会失败,同时,通过GetLastError函数获取错误码为5——拒绝访问,权限不够。一般的解决办法是,右键***.exe,选择”以管理身份运行“,或者在“右键属性->兼容性”对话框中勾选“以管理员身份运行此程序”。(快捷方式也可以) 有没有更原创 2016-07-22 17:09:22 · 26143 阅读 · 2 评论 -
《Windows核心编程》之”ErrorShow“
《Windows核心编程》CH1 “错误处理”主要介绍如何获取和分析 Win32 API 调用的错误。它的内容比较简单,但需要注意的是,我们在平常编程的时候,需要在每次调用 Win32 API 的时候都要检查返回值,如果出错,需要打印 GetLastError 的错误码。 通过 GetLastError 的错误码,我们可以 google,也可以通过 VS -> 工...原创 2016-07-22 14:59:30 · 1306 阅读 · 0 评论 -
探索cmd调编译器的方式实现数组转二进制文件
本文主要介绍一个综合运用各种编程工具“将数组转换为二进制文件”的探索案例。事实上,通过纯C/C++编程的方式,也能解决这个问题,但是,本文想强调的是,在实际工作中,需要发散思维和探索精神,能够想出一些新鲜的idea,权当一个coder的自娱自乐。一、需求介绍 某日,DSP工程师提出一个需求:应用程序(上位机)根据用户的选择,通过驱动实时加载对应版本的DSP程序到DS原创 2016-06-09 16:35:15 · 2490 阅读 · 0 评论 -
VS中的路径宏——VC++目录
说明$(RemoteMachine)设置为“调试”属性页上“远程计算机”属性的值。有关更多信息,请参见更改用于 C/C++ 调试配置的项目设置。$(References)以分号分隔的引用列表被添加到项目中。$(ConfigurationName)当前项目配置的名称(例如“Debug”)。$(PlatformName)当前项目平台的名称转载 2016-06-08 10:38:55 · 1852 阅读 · 0 评论 -
Windows CMD和bat中特殊符号的作用
Windows 批处理中特殊符号的作用@ 隐藏命令的回显。~ 在for中表示使用增强的变量扩展; 在set中表示使用扩展环境变量指定位置的字符串; 在set/a中表示按位取反。% 使用两个%包含一个字符串表示引用环境变量。比如一个%time%可以扩展到当前的系统时间; 单个%紧跟0-9的一个数字表示引用命令行参数; 用于for中表示引用循环变量;转载 2016-06-08 10:28:19 · 9630 阅读 · 0 评论 -
介绍VS的各种命令行的意义
Windows下命令行直接编译程序转载 2016-05-04 14:10:51 · 870 阅读 · 0 评论 -
DLL/EXE查看工具Dumpbin
对于DLL的导出函数和依赖性,我们一般使用微软的depends.exe工具,VS2015之后,它现在已经打包了“C:\Program Files (x86)\Windows Kits\10\Tools\x64”中。事实上,除了depends.exe,我们还有一个工具——dumpbin,也可以查看dll的导入和导出函数,依赖项等。它继承在VS中,通过菜单栏“工具->Visual Studio命令提示转载 2016-07-27 14:07:02 · 1794 阅读 · 0 评论 -
《Windows核心编程》之”Unicode vs ANSI“
《Windows核心编程》第二章专门介绍编程中的字符和字符串编码以及相关库函数,主要涉及”Unicode“和”ANSI“。书上描述的非常透彻,在此,我将它的主要思想精简并概括如下:一、字符(串)类型 ANSI和Unicode是两种不同的字符编码方式。ANSI一般以一个字节(8bits)来编码所有的字符,理论上可以表示256种字符;Unicode,一般指UTF-...原创 2016-07-27 17:19:26 · 615 阅读 · 0 评论 -
《Windows核心编程》之“线程栈”
本文主要记录我学习《Windows核心编程》第16章——“线程栈”的心得。该章篇幅较小,但较深奥,需要细细体会各个概念,在此特记录我细思后对各知识点的领悟。一、进程与线程 进程与线程(Process and Thread),是操作系统课程中的一对“纠缠不清”的冤家。通俗来讲,进程是系统进行资源分配和调度的一个独立单元,线程是CPU调度和分派的基本单元,线程是进程内的一原创 2016-07-26 17:02:50 · 2792 阅读 · 1 评论 -
《Windows核心编程》之“内核对象”
内核对象(Kernel Object)是Winodws操作系统中最核心的一个概念,本章主要介绍“内核对象”整个抽象概念的共性,而不针对具体的某个内核对象。 这一章介绍了“内核对象”的公共属性:usage count(使用计数) 和 Security Descriptor (SD,安全描述符)、进程的内核对象句柄、内核对象的命名空间和跨进程共享内核对象。 要理解本章...原创 2016-08-19 11:17:38 · 3053 阅读 · 0 评论 -
《Windows核心编程》之“同步IO和异步IO”
本文主要通过一张思维导图来总结Windows编程中关于设备IO的相关知识,其中,“IO Completion Port”后面会单独用一个系列文章进行介绍,在此不再展开。原创 2016-08-29 14:33:34 · 619 阅读 · 0 评论 -
《Windows核心编程》之“SEH”
SEH,Structured Exception Handling(结构化异常处理),包括两种类型:一是Termination Handling,即终止处理;另一个是Exception Handling。本文主要介绍Termination Handling。一、Advantages of Termination原创 2016-08-18 11:14:41 · 1165 阅读 · 0 评论 -
《Windows核心编程》之“ASLR .vs Rebasing dlls”
《Windows核心编程》第14章最后部分提到了“ASLR - Address Sppace Layout Randomization,地址空间分布随机化”特性。该特性允许Windows在第一载入一个DLL时,为它选择一个不同的地址,而不是它的PE文件中指定的“prefered address”,默认为“0x10000000”。在载入DLL时,系统内核会执行ASLR基地址重定位(ASLR reba原创 2016-08-03 13:35:56 · 1704 阅读 · 1 评论 -
《Windows核心编程》之“API Hooking”(二)
前一篇主要讲“API Hooking”的原理——修改IAT,这一篇主要讲代码实现和调试。一、修改IAT 我们要修改IAT,首先要了解导入段的数据结构和操作API。1,IMAGE_IMPORT_DESCRIPTOR 在winnt.h文件中,定义了这么一个数据结构来描述导入段中的信息单元typedef struct _IMAGE_IMPORT_DESCRIPTOR {原创 2016-08-17 16:19:34 · 1136 阅读 · 0 评论 -
《Windows核心编程》之“API Hooking”(一)
《Windows核心编程》中介绍了两种API Hooking的方法 —— “Overwritting Code”(代码覆盖)和“API Hooking by Manipulating a Module's Import Section”(修改导入段)。本文在以学习这两种API Hooking为目的,介绍相关的内容,包括:API Hooking的作用、导入段的获取和修改、detours库、使用WM_原创 2016-08-17 11:11:33 · 2239 阅读 · 0 评论 -
《Windows核心编程》之”内存体系结构“
本文是我在学习完《Windows核心编程》一书”内存管理“相关的几个章节后,结合网络资料(主要是微软的文档),经过思考提炼后,阐述我对”Windows内存体系结构“的认识,并与大家分享。可能有不正确的地方,我会不断学习理解,并更正错误。一、参考资料(除《Windows核心编程》外):1,RAM,virtual memory, pagefile, and memory management原创 2016-07-29 11:17:40 · 1556 阅读 · 0 评论 -
《Windows via C/C++》 学习笔记
本文主要记载《Windows 核心编程》第5版的学习笔记,不断更新中。1,源码下载www.wintellect.com原创 2016-06-16 16:50:15 · 1694 阅读 · 0 评论 -
CMD获取当前目录的绝对路径
新建Path.bat文件,内容如下:@echo offecho 当前盘符:%~d0echo 当前盘符和路径:%~dp0echo 当前批处理全路径:%~f0echo 当前盘符和路径的短文件名格式:%~sdp0echo 当前CMD默认目录:%cd%echo 目录中有空格也可以加入""避免找不到路径echo 当前盘符:"%~d0"echo 当前盘符和路径:"%~dp0"echo 当转载 2016-05-27 13:58:16 · 29641 阅读 · 1 评论