![](https://img-blog.csdnimg.cn/20190527112200785.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Windows编程
记录windows编程知识点
半雨微凉丶
这个作者很懒,什么都没留下…
展开
-
windows编程中超长路径的处理
对于超过一定字符的路径,WindowsAPI默认是不识别的,所以这时候需要对路径进行转换,通过以下测试代码一看便知//可以自行通过改变路径长度来测试结果std::wstring longPath = L"D:\\testlongpath\\testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest\\testtesttesttesttesttestte原创 2020-07-15 15:10:06 · 556 阅读 · 0 评论 -
根据用户名判断是否是管理员
BOOL IsUserAdminPrivilege(const CString& strUserName, BOOL& bAdminPrivilege) { DWORD rc; USER_INFO_1 *info; rc = NetUserGetInfo( NULL, strUserName, 1, (byte **) &info ); if (...原创 2019-10-24 10:18:38 · 2264 阅读 · 0 评论 -
【Windows编程】通过全路径结束进程
说明:全路径只是一种方式,其他的比如通过PID等都是一个道理~示例代码:BOOLTerminateExe(const CString& strPath ){ PROCESSENTRY32 pe32 = {0}; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = CreateToolhelp32Snapshot(...原创 2019-08-17 10:18:35 · 564 阅读 · 0 评论 -
模拟token访问网络共享路径下的文件
情景描述:访问网络共享路径下的文件时,对齐进行的GetFileAttributesEx、PathFileExists等一系列操作均会失败,返回错误码1326(用户名或密码不正确)问题原因:因为磁盘映射是和当前账户关联的,当账户登录之后才会存在这个盘符。当用一个没有权限token的线程去访问,就需要模拟token(模拟能正常访问者的进程token)操作步骤:1.获...原创 2019-06-05 19:04:09 · 491 阅读 · 0 评论 -
【Windows核心编程笔记】第二十六章 错误报告与应用程序修复
Windows 错误报告控制台Problem Reports And Solutions (system32\wercon.exe)查看错误报告可编程的Windows错误报告WerSetFlags 设置WerGetFlags 获取WerAddExcludeApplication 禁用报告生成和发送WerRemoveExcludeApplication 启用...原创 2019-06-17 09:27:41 · 348 阅读 · 0 评论 -
【Windows核心编程笔记】第二十五章 未处理异常、向量化异常处理与C++异常
SetUnhandledExceptionFilter 处理异常的最后机会,一般在进程初始化时调用此函数异常过滤函数原型:LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS pEx)UnhandledExceptionFilter函数详解允许对资源进行写入操作并继续执行将未处理异常...原创 2019-06-17 09:26:53 · 328 阅读 · 0 评论 -
【Windows核心编程笔记】第二十四章 异常处理程序与软件异常
__try{…}__except(exception filter){…}EXCEPTION_EXECUTE_HANDLEEXCEPTION_CONTINUE_EXECUTIONEXCEPTION_CONTINUE_SEARCHGetExceptionCode内在函数,返回值表明刚刚发生的异常的类型此函数只能在异常过滤程序或者异常...原创 2019-06-16 16:45:45 · 294 阅读 · 0 评论 -
【Windows核心编程笔记】第二十三章 终止处理程序
结构化异常(SEH),不同于C++异常处理__try{…}__finally{…}原创 2019-06-16 16:44:28 · 232 阅读 · 0 评论 -
【Windows核心编程笔记】第二十二章 DLL注入和API拦截
Dll注入的一个例子从其他进程创建的窗口派生子类窗口SetWindowSubclassGetWindowSubclassRemoveWindowSubclassDefSubclassProc使用注册表来注入dll整个系统的配置在注册表中HLM\SoftWare\Microsoft\Windows NT\CurrentVersion\Windows\A...原创 2019-06-16 16:43:38 · 611 阅读 · 0 评论 -
【Windows核心编程笔记】第二十一章 线程局部存储区(TLS)
动态TLSTlsAlloc 在进程的位标志列表中找到一个FREE标志预订,将其改为INUSE,返回索引TlsSetValue 把一个值放到线程的数组中TlsGetValue 从数组中获取一个值TlsFree 释放,INUSER改为FREEDll中使用动态TLS,DllMain函数DLL_PROCESS_ATTACH时调用TlsAlloc,DLL_PRO...原创 2019-06-16 10:40:07 · 271 阅读 · 0 评论 -
【Windows核心编程笔记】第二十章 DLL高级技术
DLL模块的显示载入和符号链接LoadLibrary/Ex 显示加载dll,映射到进程的地址空间FreeLibrary 显示卸载dllFreeLibraryAndExitThread 适用dll中创建线程的情况同一进程中多次加载一个dll会递增使用计数不同进程之间维护各自的dll使用计数可以使用GetModuleHanle检测dll是否被映射...原创 2019-06-15 12:48:59 · 376 阅读 · 0 评论 -
【Windows核心编程笔记】第十九章 DLL基础
Kernel32.dll 管理内存、进程以及线程相关的API函数User32.dll 执行与用户界面相关任务的API函数GDI32.dll 绘制图像和显示文字相关的API函数为什么要用DLL?扩展了应用程序的特性简化了项目管理有助于节省内存促进了资源共享促进本地化有助于解决平台差异用于特殊目的DLL和进程的地址...原创 2019-06-12 09:07:58 · 229 阅读 · 0 评论 -
【Windows核心编程笔记】第十八章 堆
进程的默认堆进程初始化时创建,默认大小为1M许多Windows函数用到了进程的默认堆,默认堆的访问必须依次进行默认堆由系统自动创建并在进程终止后自动销毁,我们无法控制GetProcessHeap 获取默认堆的句柄为什么要创建额外的堆对组件进行保护更有效的内存管理局部访问避免线程同步开销快速释放如何创建额外的堆HeapCreate 进程中创...原创 2019-06-10 21:12:18 · 196 阅读 · 0 评论 -
【Windows核心编程笔记】第十七章 内存映射文件
适用情况:加载exe或者dll,大量节省页交换文件的空间和程序启动时间避免缓存,直接访问磁盘上的数据文件最高效的进程间共享数据方法映射到内存的可执行文件和dll同一个exe或dll的多个实例不会共享静态数据(默认情况)在同一个exe或dll的多个实例间共享静态数据(创建共享段) Dumpbin工具查看段内容 #pragma dat...原创 2019-06-06 17:18:11 · 248 阅读 · 0 评论 -
【Windows核心编程笔记】第十六章 线程栈
每个线程都有自己的栈(一块地址空间区域),默认是1MB并调拨两个页面的存储器,这个值可以通过编译器配置修改,也可以在创建线程的时候通过参数指定(0为默认)系统永远不会给区域底部的那个页面调拨存储器(保护进程使用的其他数据)如果线程在栈溢出后继续使用栈,系统会抛出访问违规异常。如果访问违规异常是线程试图访问栈时引发的,此时系统会弹框提示并退出整个进程应该使用SetThreadSta...原创 2019-05-26 18:55:03 · 197 阅读 · 0 评论 -
【Windows核心编程笔记】第十五章 在应用程序中使用虚拟内存
预订地址空间区域VirtualAlloc 预订进程中的地址空间区域,第二个参数类型是MEM_RESERVEVirtualAllocExNuma 同上,区别在于应用程序在NUMA机器上运行给区域调拨物理存储器VirtualAlloc 调拨物理存储器,第二个参数是MEM_COMMIT同时预订和调拨物理存储器只调用VirtualAlloc一次,而...原创 2019-05-26 17:07:50 · 304 阅读 · 0 评论 -
【Windows核心编程笔记】第十四章 探索虚拟内存
系统消息GetSystemInfo 获取主机相关的值,比如页面大小、分配粒度等32位程序在64位系统上运行,涉及到模拟层(WOW64),32位程序通过WOW64运行和64位程序运行这两种情况,GetSystemInfo获取的信息可能会不同IsWow64Process 进程是否在WOW64运行只有返回值为TRUE的时候,第二个参数FALSE表示32在324,6在6...原创 2019-05-26 13:41:11 · 367 阅读 · 0 评论 -
【Windows核心编程笔记】第十三章 Windows的内存结构
每个进程都有它自己的私有地址空间(虚拟的)虚拟地址空间的分区:空指针赋值分区 用于帮助程序员捕获空指针的赋值,此分区禁止读写,你也没办法分配到此分区的虚拟内存用户模式分区 这里是进程地址空间的驻地,具体大小取决于CPU类型,进程间独立各自的分区,一般不能互相访问64KB禁入分区 位于用户方式分区上面,保留此分区是微软...原创 2019-05-25 21:48:53 · 283 阅读 · 0 评论 -
【Windows核心编程笔记】第十二章 纤程
知识点概述:用于Unix程序移植到Windows,应该尽量避免使用纤程是以用户模式来实现的线程转换为纤程(单线程创建多纤程的情况下才需要转换)并开始运行(纤程)CoverThreadToFiber创建纤程,但不执行(因为此时线程正在执行)CreateFiber在线程中使纤程运行SwitchToFiber撤销纤程DeleteFiber...原创 2019-05-24 09:53:53 · 183 阅读 · 0 评论 -
【Windows核心编程笔记】第十一章 线程池的使用
线程池开销并不小,所以使用之前先想好你是否真的需要它以异步方式调用函数定义函数:VOID NTAPI SimpleCallback(…….)TrySubmitThreadpoolCallback 让线程池中的线程执行该函数考虑到性能和内存使用,如果大量提交,建议创建工作项一次,分多次提交CreateThreadpoolWork 创建一个工作项SubmitThre...原创 2019-05-25 20:22:54 · 927 阅读 · 0 评论 -
【Windows核心编程笔记】第十章 同步设备I/O与异步设备I/O
知识点概述:打开或关闭设备CreateFile 创建和打开文件,当然也可以打开许多其他设备打开文件的时候,传入的路径名不能超过MAX_PATH,但是加上”\\?\”之后可以不受此限制,注意这是针对绝对路径而言的失败时返回值是INVALID_HANDLE_VALUE,而不是通常的NULL使用文件设备比如100kb文件压缩为10kbGetFileSizeEx 获取文件...原创 2019-05-25 17:44:00 · 261 阅读 · 0 评论 -
【Windows核心编程笔记】第九章 线程与内核对象的同步
知识点概述:此方式的同步机制远远优于用户模式机制,唯一缺点是速度慢(用户模式转入内核模式)进程或线程内核对象总是在未通知的状态下(FALSE)创建,在停止运行时操作系统将状态改为已通知状态(TRUE)内核对象在未通知的状态下,不可调度,已通知状态可调度等待函数WaitForSingleObject(HANDLE hObject,DWORD dwMillSec);...原创 2019-05-24 09:53:07 · 304 阅读 · 0 评论 -
【Windows核心编程笔记】第八章 用户模式中的线程同步
知识点概述:互锁函数的原子访问:(单个值)InterlockedExchangeAdd(&g_num,1) 递增1InterlockedExchange(PLONG,LONG) 参数2的值取代参数1(循环锁中很有用)InterlockedExchangePointer(PVOID*,PVOID) 参数2的值取代参数1InterlockedCompareExchangeP...原创 2019-05-24 09:52:09 · 203 阅读 · 0 评论 -
【Windows核心编程笔记】第七章 线程的调度、优先级和亲缘性
知识点概述:Windows不是实时操作系统,而是抢占式多线程操作系统创建线程的内核对象之后,线程的暂停计数为1,此时不能被CPU调度,因为线程要初始化初始化完成之后,会检查是否有挂起标志,有的话线程就暂停状态,没有则递减暂停计数为0,此时如果线程没有等待其他事情,就处于可调度的状态除了CREATE_SUSPENDED标志外,还可以使用SuspendThread 暂停线程...原创 2019-05-24 09:50:47 · 297 阅读 · 0 评论 -
【Windows核心编程笔记】第六章 线程的基础知识
知识点概述:进程从来不执行任何东西,他只是线程的容器。每个进程至少拥有一个线程慎用多线程,不要想用就用每个线程必须拥有一个进入点函数,主线程的main、wmain、WinMain、wWinMain,线程函数可以使用任何名字,但是多个线程的名字不能相同线程函数的参数由你定义线程必须返回一个值线程函数应尽可能使用局部局部变量和函数参数,因为静态变量和全局变量容易被改变...原创 2019-05-24 09:49:37 · 232 阅读 · 0 评论 -
孙鑫VC++笔记(八)
一、逃跑按钮1、产生一个CButton类,而不能在对话框类中实现CMyButton *pBtn;2、在对话框类中交换两个按钮地址CMyButton m_btn1;// 关联到按钮CMyButton m_btn2;m_btn1.pBtn = &m_btn2;m_btn2.pBtn = &m_btn1;3、在新类中添加鼠标移动消息,实现功能ShowWindow(SW原创 2013-06-28 15:09:41 · 629 阅读 · 0 评论 -
孙鑫VC++视频笔记(七)
一、模式对话框(mode)和非模式对话框(modeless)mode介绍:此对话框运行时只能对当前的对话框进行操作,因为程序会停留在此。创建:CDialog dlg;dlg.DoModal;关闭:int nRet = dlg.DoModal();EndDialog(nRet);modeless介绍:此对话框运行时可以和其他程序之间切换运行。创建:原创 2013-06-25 10:23:08 · 697 阅读 · 0 评论 -
孙鑫VC++笔记(六)
一、菜单1.菜单响应添加菜单IDM_TEST---类试图中选中该ID的COMMAND---添加函数即可2.菜单命令CMenuApp和CMenuDoc类不是由CWnd派生而来,所以没有MessageBox函数,可以用::MessageBox或者AfxMessageBox。响应菜单命令顺序:视图类---文档类---框架类---应用程序类删除函数在classview中直接删除比较原创 2013-06-17 16:01:22 · 667 阅读 · 0 评论 -
孙鑫VC++笔记(五)
使用的函数:CreateSolidCaret 创建插入符CreatePointFont 简单创建字体GetSystemMetrics 取得宽度和高度GetTextMetrics 取得当前字体信息GetTextExtent 取得特定字体的宽度和高度CreateCaret 创建图形插入符SetCaretPos设置插入符位置GetBkColor 取得背景色SetT原创 2013-06-17 15:30:48 · 544 阅读 · 0 评论 -
孙鑫VC++笔记(四)
一、静态成员的使用,如下例所示:class Point{public: void output() { x = 0; y = 0; //静态成员变量 init(); //静态成员函数因为已经有内存空间所以可以调用 } static void init() { // x = 0; // y = 0; 静态成员函数只能访问静态成员变量 }private:原创 2013-06-14 14:25:44 · 529 阅读 · 0 评论 -
孙鑫VC++笔记(三)
知识点摘要:1、在main或者WinMain之前,全局变量已经被分配内存并被初始化了2、在MFC中,WinMain之前全局变量theApp先被分配内存和初始化。子类构造函数执行前,父类的构造函数先执行,所以CTestApp子类的父类CWinApp的构造函数先执行。3、大致流程: CTestApp theApp;// 创建全局变量 WinMai原创 2013-06-11 19:09:04 · 594 阅读 · 0 评论 -
孙鑫VC++笔记(二)
知识点摘要:1、c++中结构体内可以有函数,c不可以2、protected 应用于子类和父类之间3、构造函数在创建对象后自动执行,可以进行一些变量的初始化 析构函数在程序结束后执行,用于资源释放4、构造函数可以有多个,根据参数类别、参数个数进行重载 析构函数只能有一个5、下面情况不能进行重载class Point{public:void F原创 2013-06-11 19:03:50 · 744 阅读 · 0 评论 -
孙鑫VC++笔记(一)
知识点概要总结:1、handle句柄即资源的标识,类似于指针2、定义类型 type int WIDTH; WIDTH x; 易于理解3、POINT 结构体,两个元素表示坐标4、Project--Seeting--Debug--Program arguments 添加命令行参数5、WinMain函数int WINAPI WinMain(HINSTANCE hInstan原创 2013-06-07 15:56:14 · 633 阅读 · 0 评论 -
【Windows核心编程】之内核对象
简介内核对象是一个内存块,由操作系统内核分配,并只能由操作系统内核访问。这个内存块是一个数据结构,其成员有些事所有内核对象都有的,比如安全描述符和使用计数,有些是独有的。利用Windows提供的一组函数可以进行对应的操作。类型 核心对象 产生方法 事件对象 HANDLE CreateEvent(); ...原创 2019-05-09 20:20:00 · 228 阅读 · 0 评论 -
为什么Windows编程都用UNICODE
对于C++编程来说,无非ANSI和UNICODE,他们之间的区别这里就不赘述了,今天我们要说的士我为什么建议你用UNICODE进行编程。1、有些基础的都应该知道,一般来说Windows函数都有两个版本,比如最常见的MessageBox有MessageBoxW和MessageBoxA,分别适用于两种字符集。可能你要说,你一直用的是MessageBox,那是因为你调用的知识一个宏#ifdef _UNI...原创 2018-07-14 18:06:57 · 1470 阅读 · 0 评论