Windows14 --钩子和服务
Windows钩子 - Windows hook编程技术的钩子就是在等待捕获系统中的某个消息或者动作
应用程序可以通过设置Hook对某个进程或窗口进行监视,即:对特定事件“挂钩”;一旦预定义特定事件发生,Windows操作系统即会向钩子hook发送通知消息,这时,应用程序可进行响应。
钩子类型
12345678910111213WH_CALLWNDPROC :系统将消息发送到指定窗口之前的“钩子”WH_CALLWNDPROCRET Hooks :消息已经在窗口中处理的“钩子” WH_CBT Hook :基于计算机培训的“钩子”WH_DEBUG Hook :差错“钩子”WH_FOREGROUNDIDLE Hook :前台空闲窗口“钩子”WH_GETMESSAGE Hook :接收消息投递的“钩子”WH_JOURNALPLAYBACK Hook :回放以前通过WH_JOURNALRECORD“钩子”记录的输入消息WH_JOURNALRECORD Hook :输入消息记录“钩子”WH_KEYBOARD Hook :键盘消息“钩子”WH_MOUSE Hook :鼠标消息“钩子”WH_MSGFI ...
Windows13 --补充 复习
WindowsTLS允许多线程程序中的每个线程拥有自己单独的变量实例,每个线程都可以访问和修改自己的变量,而不会干扰其他线程。
运行过ThreadFunc函数后dw的值仍为0x123456
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 main(){ TlsSetValue(0, (LPVOID)0x123456); DWORD dw = (DWORD)TlsGetVa ...
Windows12 --C线程和MFC线程
WindowsC线程和MFC线程C多线程创建一个多线程的项目
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748// CThread.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include<stdio.h>#include <windows.h>#include <conio.h>DWORD WINAPI ThreadFunc(LPVOID lpParam){ for (int i = 0; i < 0x100000; ++i) { Sleep(10); char szMsg[80]; wsprintf(szMsg, "Parameter = %d\r\n.", GetCurrentThreadId()); printf(szMsg); } ...
Windows11 --远程线程注入
Windows远程线程注入信号信号量为n,最多就只有n个线程执行 其他线程等待
12CreateSemaphore;ReleaseSemaphore;
创建信号:
参数2: 开始放出的信号个数
参数3: 最大的信号个数
释放信号:
1234567891011121314151617181920212223242526272829303132333435#include <iostream>#include<Windows.h>using namespace std;HANDLE g_hSem = NULL;DWORD WINAPI WorkThreadProc( LPVOID ipThreadParameter){ while (true) { WaitForSingleObject(g_hSem, INFINITE); printf("%d\t:洗剪吹...\r\n", GetCurrentThreadId()); Sleep(2000); R ...
Windows9~10 --同步问题
Windows同步多线程共享资源同步原因以一个双线程计数为例:
建立一个控制台应用:
线程回调:
创建两个线程
123456789101112131415161718192021222324252627282930313233343536373839404142434445// Counter.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); ...
Windows8 --线程的创建和退出
Windows线程的创建和退出概念区分程序:磁盘上的可执行文件(如.exe)
进程:程序执行代码所需资源的集合,不活泼的(状态)
线程:程序执行代码的最小单位,活泼的(状态)
进程为代码执行提供各种各样的资源 本身并不执行代码,由线程进行代码的执行
线程的运行(调度)原理CPU时间切片:系统将 CPU 的运行时间划分为固定长度的时间片,每个时间片结束时,当前运行的线程会被暂停,然后调度器会选择下一个就绪的线程继续执行
基于CPU时间片方式进行线程调度,就是当只有线程得到CPU的时间片才能执行指令,当线程处于执行的状态,但是却没有分配到时间片,那么就会处于就绪状态,等待系统分配下一个时间片。
保存环境和恢复环境:当线程被切走时,系统会把当前线程的环境保存,当线程再切回来时,恢复环境。
多线程效率与cpu的内核数量和逻辑处理器数量有关 当线程数与逻辑处理器的数量相同时效率最佳 并非线程越多效率越高
线程的创建线程:
UI线程(主线程):单线程的执行环境,所有的UI控件都必须在主线程上创建和更新,否则会引发跨线程访问的异常(不运行耗时长的任务)
非UI线程(工作线程):处理一些非UI相关的 ...
Windows7 --文件加密
Windows文件加密创建进程
添加进行加密的进程
WORK:
1234567891011int main(int argc,char** argv){ getchar(); //判断 if (argc < 2) { return 0; } char* pFilePath = argv[1];//文件路径}
用命令行参数传入文件路径
12345678910111213141516171819202122232425262728293031void CEncriyptUIDlg::OnBnClickedEncrypt(){ // TODO: 在此添加控件通知处理程序代码 //获取文件路径 CString strFilePath; GetDlgItemText(EDT_FILEPATH, strFilePath); if (strFilePath.IsEmpty()) { AfxMessageBox("路径不能为空"); return; } ...
Windows6 --管道及进程遍历
Windows管道管道分为命名管道、匿名管道
命名管道
命名管道是一个命名的管道服务器和一个或多个管道客户端之间的通信。命名管道的所有实例共享相同的管道名称,但每个实例都有自己的缓冲区和句柄,并为客户端/服务器通信提供单独的管道。一个命名管道链接多个管道客户端
匿名管道-父子进程之间的数据传输(单向传输)
创建: createpipe
读: readfile
写: writefile
获取句柄:GetStdHandle
查看管道是否有数据可读: PeekNamedPipe
于上述结构体中的句柄一一对应
父进程:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748void CParentDlg::OnBnClickedButton1(){ // TODO: 在此添加控件通知处理程序代码 //创建管道 BOOL bRet=CreatePipe(&m_hRead,&m_hWrite,NULL,0); if (!bRet) & ...
Windows5 --进程间通信
Windows进程间通信发送消息一般是自定义消息,使用SendMessage(需要有两个窗口)
同样的先创建一个进程A 用来发送消息 再创建一个进程B 接收消息
将二者放在同一个解决方案下
可以先创建A再添加B
A:发送消息
1234567#define MS_TEST WM_USER+1void CADlg::OnBnClickedButton1(){ HWND hWndB = ::FindWindow(NULL,"B");//获取句柄 ::SendMessage(hWndB,MS_TEST,0x12456789,0x98745612);//发送消息 有两个API这里使用的是sendmessage //sendmessage直到消息被处理后才会返回 会阻塞}
B:接收消息
现在B这添加一个类导向
1234567afx_msg LRESULT CBDlg::OnMsTest(WPARAM wParam, LPARAM lParam){ CString strFmt; strFmt.Format("w:% ...
Windows4 --跨进程使用句柄及内存
Windows1.跨进程使用句柄先创建两个MFC的进程分别为A,B
A:
B:
使用方式
(1)继承方式
父进程打开的句柄继承给子进程使用
父进程的句柄是否继承给子进程使用
判断句柄是否可以被继承(安全属性) 第一个为进程句柄 第二个为线程句柄
若安全属性为true 那么当createprocess为true时句柄会传给子进程 为FALSE时句柄不会传给子进程
但若安全属性为false时 无论createprocess为true还是false都不会传给子进程
A:
12345678910111213141516171819202122232425262728293031ZeroMemory(&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. ...