Windows 系统编程基础
进程;虚拟内存;DLLs;线程;系统架构;windows API
进程
私有地址空间;私有处理表;访问token;线程
虚拟内存
进程只能用虚拟内存
DLLs
映射到进程地址空间中,类似python库,可进程间共享
线程
内核执行代码时,实际用的是线程
CPU寄存器状态
访问模式:用户模式和内核模式
两个stacks:一个用户空间一个内核空间
线程本地存储(TLS)
可选的安全token
可选的线程创建的消息队列和窗口
线程调度优先级
状态:运行,准备,等待
系统架构
用户模式:子系统DLLs(服务进程,用户进程,系统进程),NTDLL.DLLs(子系统DLLs,系统进程,子系统进程)
内核模式:win32k.sys,设备驱动,内核,硬件抽象层
ntdll!NtReadFile: sysenter,syscall
函数调用流程: 用户模式:应用 fread->msvcrt.dll ReadFile ->Kernel32.DLL NtReadFile ->NtDll.DLL sysenter,syscall --> 内核模式:NtOskrnl.exe NtReadFile -> NtOskrnl.exe NtReadFile调用设备 -> driver.sys 设备I/O返回调用
windows API
windows API win32 ,.net,windows runtime
Windows应用程序开发测试调试
Visual Studio 社区版,Desktop development with C++
::
非强制性,C++中表示全局,无法在C中编译,编码习惯,易于识别windows API调用
msdn getnativesysteminfo:https://learn.microsoft.com/zh-tw/windows/win32/api/sysinfoapi/nf-sysinfoapi-getnativesysteminfo
处理错误
- msdn一把梭:全部不需要记,查阅文档一把梭
FALSE(0)表示错误,任何其他值表示成功
GetLastError
@err,FormatMessage
HANDLE
Zero (NULL) and -1(INVALID HANDLE VALUE) indicate failure Call
GetLastError
LRESULT 或 LONG:函数直接返回的错误代码错误,SUCCESS(0)表示成功
HRESULT
COM函数/方法中的典型返回类型S OK(0)表示成功,负值表示错误
msdn openprocess:https://learn.microsoft.com/zh-tw/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
32-bit vs. 64-bit Systems
wow64转换层
windows API 演进向后兼容:指针和处理的数据类型扩展到了64
增加了更多类型:DWORD PTR,INT PTR,SIZE T等
字符串
Windows内核使用UTF-16(Unicode)来表示字符串;Windows APl也使用Unicode;兼容性原因还存在ANSI(ASCII)函数,以“W”(Unicode)和“A”(ANSI)结尾;函数名实际上是一个宏
WCHAR,wchar t(Unicode字符)
PWSTR(Unicode字符串指针),PSTR(ASCII字符串手指针)
PCWSTR,PCSTR(常态变量)
结构
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
Windows数子版本
NT 4 4.0;2000 5.0;XP 5.1;2003 5.2;2008 6.0;win7 2008 R2 6.1;win8 2012 6.2;win8.1 2012 R2 6.3;win10 2016 10
windows version manifest: APIs(#include <versionhelpers.h>)
)
API getversionexa弃用:https://learn.microsoft.com/zh-tw/windows/win32/api/sysinfoapi/nf-sysinfoapi-getversionexa
需要这么一个列表才能判断版本信息:https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests
系统信息
GetSystemInfo,GetNativeSystemInfo,静态信息
GetPerformanceInfo(#include <psapi.h>)
GetComputerName(Ex),GetProductInfo,GetSystemDirectory,GetIntegratedDisplaySize,GetUserName(Ex)..
内核对象
windows系统:一切皆对象,进程,线程,互斥体,信号符,文件...
用户模式无法直接访问这些数据结构
内核模式可直接访问对象
用户模式进程可以获取对象的处理方式
对象 和 Handles
每个进程有一个私有处理表(private handle table)
进程创建或打开一个对象时会接收一个handle(用于对底层对象的不透明的间接指针;允许跨进程共享对象)
查看进程处理器(process handles):Process Explorer,handls.exe(www.sysinternals.com), resource Monitor,System Explorer
Handles
windows API公开的对象
Process(CreateProcess,0penProcess)
Thread (CreateThread, OpenThread)
Job(CreateJobobject,openJobobject)
File (CreateFile,CreateFile2)
File mapping (Section)(CreateFileMapping,openFileMapping)
Token (LogonUser,OpenProcessToken)
Mutex(Mutant)reateMutex(Ex),OpenMutex)
Event(CreateEvent(Ex),OpenEvent)
Semaphore(CreateSemaphore,OpenSemaphore)
Timer(CreateWaitableTimer,OpenWaitableTimer)
I/O Completion Port(CreateIoCompletionPort)
Window Station(CreateWindowStation,OpenWindowstation)
Desktop(CreateDesktop,OpenDesktop)
用户模式进程通过调用适当的reate*函数或Open*函数
检索Handles:成功会返回一个handle;失败时为NULL或INVALID HANDLE VALUE
不需要handle时,应通过调用CloseHandle APl将其关闭:记录从Handle table中删除;对象引用数减1,如果为0,对象将被删除
假Handles
正常有效Handles的值为4倍:第一个Handles为4
假Handles有特殊的值,并且不可拆卸:GetCurrentProcess(-1);GetCurrentThread(-2)
windows 8+:GetCurrentProcessToken(-4);GetCurrentThreadToken(-5);GetCurrentThreadEffectiveToken(-6);所有token只有TOKEN QUERY 和 TOKEN QUERY SOURCE权限
共享对象
进程Handles继承,进程创建一个子进程
以名称打开对象,最简单的共享机制
复制Handles,DuplicateHandle APl
对象名与会话
winObj - Sysinternals
对象名可见:可使用工具或编程进行定位
对象名不可见:windows vista+ 支持私有对象名称空间,可进一步受到SID或完整性级别的限制
APls:CreateBoundaryDescriptor,AddSIDToBoundaryDescriptor,CreatePrivateNamespace,OpenPrivateNamespace,ClosePrivateNamespace
Handle 继承
复制Handle时必须指定为 inheritable,CreateProcess调用必须为继承处理参数指定TRUE,所有可继承的Handle都复制到目标进程,Handle值相同
User 和 GDI 对象
Executive中的对象管理器只负责内核对象
用户和GDI对象由Win32k.sys管理
user32.dll和gdi32.dll中的APl函数不会经过NtDll.dll:直接调用sysenter/syscall指令
用户对象:windows(HWND),菜单(HMENU)和hooks(HHOOK)
用户对象 handles:无引用/handles计数;私有到一个windows station
GDI对象:设备上下文(HDC),pen(HPEN),brush(HBRUSH),bitmap(HBITMAP)等
GDI对象handles:无引用/handles计数;私有到一个进程;无文档化/教程的跨进程共享方式