windows 14 钩子和服务
钩子和服务钩子-windows hook
SetWindowsHookEx
参数说明:
参数 idHook:指示欲被安装的挂钩处理过程之类型,类型如下。WH_MSGFILTER(-1):安装一个挂钩处理过程,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.详情参见MessageProc挂钩处理过程.
WH_JOURNALRECORD(0):安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRecordProc挂钩处理过程.
WH_JOURNALPLAYBACK(1):安装一个挂钩处理过程,对此前由WH_JOURNALRECORD 挂钩处理过程纪录的消息进行寄送.详情参见 JournalPlaybackProc挂钩处理过程.
WH_KEYBOARD(2):安装一个挂钩处理过程对击键消息进行监视. 详情参见KeyboardProc挂钩处理过程.
WH_GETMESSAGE(3):安装一个挂钩处理过程对寄送至消息队列的消息进行监视,详情参见 GetMsgProc 挂钩处理过程.
WH_CALLWNDPROC(4): 安装一个挂钩处理过程,在 ...
windows 13 复习
这节课主要是复习之前的内容,查缺补漏
TLS线程局部存储(Thread Local Storage,TLS),是一种变量的存储方法,这个变量在它所在的线程内是全局可访问的,但是不能被其他线程访问到,这样就保持了数据的线程独立性。而熟知的全局变量,是所有线程都可以访问的,这样就不可避免需要锁来控制,增加了控制成本和代码复杂度。
新建控制台应用
12345678910111213141516171819202122232425262728293031// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <windows.h>#include <iostream>using namespace std;DWORD WINAPI ThreadFunc(LPVOID lpParam){ DWORD dw = (DWORD)TlsGetValue(0); TlsSetValue(0, (LPVOID)0x44557788); return 0;}int mai ...
windows 12 C线程和mfc线程
C线程和mfc线程C多线程tls-thread local storage
1234TlsAllocTlsFreeTlsSetValueTlsGetValue
TlsAlloc
12345函数原型:DWORD TlsAlloc();作用:为调用该函数的线程分配一个线程局部存储序号,供其它三个函数使用注意:一个进程最多分配TLS_MINIMUM_AVAILABLE个索引,目前定义为64,一个进程中所有线程分配的索引不会重复使用:int index=TlsAlloc()
DWORD TlsAlloc(void); // 返回一个TLS索引
每个线程创建时系统给它分配一个LPVOID指针的数组(叫做TLS数组,长度为TLS_MINIMUM_AVAILABLE),TlsAlloc()函数的作用是返回访问当前线程的TLS数组的一个下标(索引),不同线程得到不同的索引变量值。
当调用TlsAlloc的时候,系统会挨个检查这个数组中成员的值,直到找到一个值为FREE的成员。把找到的成员的值由FREE改为INUSE后,TlsAlloc函数返回该成员的索引。如果不能找到一个值 ...
windows 11 远程线程注入
远程线程注入信号12CreateSemaphoreReleaseSemaphore
CreateSemaphore
创建或打开命名或未命名的信号量对象。
要指定对象的访问掩码,请使用CreateSemaphoreEx函数。
参数lpSemaphoreAttributes指向SECURITY_ATTRIBUTES结构的指针。如果此参数为NULL,则子进程无法继承句柄。
结构的lpSecurityDescriptor成员为新信号量指定安全描述符。如果此参数为NULL,则信号量将获取默认安全描述符。信号量的默认安全描述符中的ACL来自创建者的主要或模拟令牌。
*lInitialCount信号量对象的初始计数。该值必须大于或等于零且小于或等于lMaximumCount。信号量的状态在其计数大于零时发出信号,在信号为零时发出信号。只要wait函数释放等待信号量的线程,计数就会减1。通过调用ReleaseSemaphore函数将计数增加指定的量。
*lMaximumCount信号量对象的最大计数。该值必须大于零。
*lpName信号量对象的名称。名称仅限于MAX_PATH个字符。名称比较区分大 ...
windows 9-10 同步
同步多线程共享资源同步原因 新建控制台项目
Counter1.cpp
123456789101112131415161718192021222324252627282930313233343536373839404142// Counter1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <windows.h>#include <iostream>using namespace std;int g_nCounter = 0;DWORD WINAPI ThreadFunc(LPVOID lpParam){ for (int i = 0; i < 0x10000; ++i) { ++g_nCounter; } printf("tid:%08X counter:%08X \r\n", GetCurrentThreadId(), g_nCounter); return 0;}int main( ...
windows 8 线程的创建和退出
线程的创建和退出概念区分
程序-磁盘上的可执行文件
进程-程序执行代码所需资源的集合,不活泼的,懒惰的
线程-程序执行代码的最小单位,活泼的,勤奋的
线程的运行(调度)原理cpu时间切片
线程的创建UI线程(主线程)-一般不做繁重的任务
非UI线程(工作线程)-一般做较繁重的任务
新建Windows桌面应用程序
设计Dialog
示例编辑框的ID为EDT_COUNTER
四个按钮的ID分别为BTN_START、BTN_PAUSE、BTN_STOP、BTN_CONTINUE
Sleep函数可以在暂停的时候减少线程对CPU的占用
暂停线程SuspendThread
恢复线程ResumeThread
一个线程无法自己恢复自己,但是可以自己把自己挂起
Counter.cpp
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737 ...
windows 7 文件加密
文件加密新建MFC应用程序
选择MFC EditBrowse Control
修改ID
添加新建项目
Encrypt.cpp
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417 ...
windows 6 管道、进程遍历
管道命名管道
匿名管道-父子进程之间的数据传输
创建:CreatePipe
读:ReadFile
写:WriteFile
获取句柄:GetStdHandle
查看管道是否有数据可读:PeekNamedPipe
新建两个MFC应用程序
ParentDlg.h
123456789101112131415161718192021222324252627282930313233343536373839// ParentDlg.h: 头文件//#pragma once// CParentDlg 对话框class CParentDlg : public CDialogEx{// 构造public: CParentDlg(CWnd* pParent = nullptr); // 标准构造函数// 对话框数据#ifdef AFX_DESIGN_TIME enum { IDD = IDD_PARENT_DIALOG };#endif protected: virtual void DoDataExchange(CDataExchange* ...
windows 5 进程间通信
进程间通信发送消息一般是自定义消息,使用SendMessage发送
新建项目
123456#define MS_TEST WM_USER+1 //自定义消息void CA1Dlg::OnBnClickedButton1(){ HWND hWndB = ::FindWindow(NULL, "B1"); ::SendMessage(hWndB, MS_TEST, 0x12456789, 0x98745612);}
添加自定义消息,确定后点击编辑代码
1234567afx_msg LRESULT CB1Dlg::OnMsTest(WPARAM wParam, LPARAM lParam){ CString strFmt; strFmt.Format("w:%08x,l:%08x", wParam, lParam); AfxMessageBox(strFmt); return 0;}
在头文件处要添加定义
在B1初始化处要给窗口添加名字
123456789101112 ...
windows 4 跨进程使用句柄、操作内存
跨进程使用句柄
A进程拿到句柄,把值给B进程,B进程能不能直接使用?
继承方式创建MFC应用
新建按钮
使用多字节字符集
新建编辑框,修改ID
1234567891011121314151617181920212223242526272829303132333435void CADlg::OnBnClickedButton1(){ // TODO: 在此添加控件通知处理程序代码 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); SECURITY_ATTRIBUTES sa = {}; sa.nLength = sizeof(sa); sa.bInheritHandle = TRUE;//进程句柄允许被继承 //Start the child process. if (!CreateProcess(NULL, "B. ...