![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Win32API(系统调用)
文章平均质量分 69
骑在木马上的黑客
纵有疾风起,人生不言弃!
展开
-
StringCbCopy和StringCchCopy的用法及区别
StringCbCopy函数用于拷贝string,且提供了目标缓冲区的大小作为参数,防止缓冲区溢出等安全问题。这个函数可用于替换以下函数的使用:strcpy, wcscpy, _tcscpy,lstrcpy,StrCpyStringCbCopy函数原型如下:HRESULT StringCbCop...原创 2018-04-17 12:18:14 · 1495 阅读 · 0 评论 -
生产者消费者问题(Producer:1、Consumer:1、Buffer:1)
生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。...原创 2018-04-25 12:42:23 · 722 阅读 · 0 评论 -
生产者消费者问题(Producer:1、Consumer:2、Buffer:4)
现在将消费者改成2个,缓冲池改成拥有4个缓冲区的大缓冲池。 如何来思考了这个问题了?首先根据上面分析的二点,可以知道生产者和消费者由一个变成多个的影响不大,唯一要注意的是缓冲池变大了,回顾一下之前提到的信号量,不难得出用二个信号量就可以解决这种缓冲池有多个缓冲区的情况——用一个信号量A来记录为空的缓冲区个数,另一个信号量B记录非空的缓冲区个数,然后生产者等待信号量A,消费者等待信号量B就可以...原创 2018-04-25 12:48:21 · 884 阅读 · 0 评论 -
字符和字符串处理
安全字符串函数不安全的字符串函数Strsafe函数Safe CRT函数(C运行库)strcpy, wcscpy, _tcscpy, _mbscpy, strcpy , lstrcpy, _tccpy, _mbccpyStringCchCopy StringCbCopyStringCchCopyEx StringCbCopyExstrcpy_sstrcat, wcscat , _mbscat, ...原创 2018-05-10 09:31:57 · 414 阅读 · 0 评论 -
StringCchCopy与StringCchCat的配合使用
实现的功能:获取当前可执行文件的当前工作目录,拼接文件名,生成可读写文本文件的完整路径。判断该文件是否存在,如果存在则进行删除操作。示例代码如下: TCHAR szExe[MAX_PATH]; memset(szExe, 0, sizeof(TCHAR)*MAX_PATH); GetModuleFileName(NULL, szExe, MAX_PATH); MessageBox(NULL, ...原创 2018-05-10 09:49:31 · 749 阅读 · 0 评论 -
四个线程写四个文件01 Semaphore + Event
题目:有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。初始都为空。现要让四 个文件呈如下格式:A:1 2 3 4 1 2....B:2 3 4 1 2 3....C:3 4 1 2 3 4....D:4 1 2 3 4 1....请设计程序。解答:我的思路是这样的:当每个子线程准备就绪后,主线程发出前进一步的命令【举旗】。...原创 2018-05-10 12:01:13 · 217 阅读 · 0 评论 -
四个线程写四个文件02 Semaphore = Event * 4
但是我有一个担心,当举旗时,4个线程至少有一个线程不在等待该旗子时【因为线程调度不可预知】,这样某个线程在某次命令中会不会多跑一圈?而那个掉队的线程就跑不了,导致死锁。试验:把threadfunc改成下面的代码,即让SetEvent和WaitForSingleObject有个不确定的间隔。跑了七八下,结果都正确。但是再跑一下,死锁真的发生了。所以这个现象是比较难以重复的。UINT WINAPI W...原创 2018-05-10 12:28:01 · 207 阅读 · 0 评论 -
WinInet和FTP
WinInet和FTP(1)WinInet接口(含HTTP、FTP)及FTP函数层次关系 (2)Ftp函数介绍 ①InternetOpen——初始化,它告诉 Internet DLL 初始化内部数据结构并准备接收应用程序之后的其他调用。参数含义LPCTSTR lpszAgent调用WinInet函数的应用程序名字,在HTTP协议中作为用户代理项DWORD dwAccessType访问要求类型...原创 2018-04-27 12:05:51 · 769 阅读 · 0 评论 -
读者写者问题01(关键段+事件)
读者写者也是一个非常著名的同步问题。读者写者问题描述非常简单,有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者在读文件时写者也不去能写文件。上面是读者写者问题示意图,类似于生产者消费者问题的分析过程,首先来找找哪些是属于“等待”情况。第一.写者要等到没有读者时才能去写文件。第二.所有读者要等待写者完成写文件后才能去读文件。找完“等待”情况后,再看看有没有...原创 2018-04-28 12:19:36 · 296 阅读 · 0 评论 -
读者写者问题02(关键段+读写锁)
//实现代码//读者与写者问题继 读写锁SRWLock #include <stdio.h> #include <process.h> #include <windows.h> #include<iostream>#include<iomanip>using namespace std;//设置控制台输出颜色 ...原创 2018-04-28 12:21:47 · 197 阅读 · 0 评论 -
内核对象的“遗弃”
一.什么是“遗弃”问题互斥量常用于多进程之间的线程互斥,所以它比关键段还多一个很有用的特性——“遗弃”情况的处理。比如有一个占用互斥量的线程在调用ReleaseMutex()触发互斥量前就意外终止了(相当于该互斥量被“遗弃”了),那么所有等待这个互斥量的线程是否会由于该互斥量无法被触发而陷入一个无穷的等待过程中了?这显然不合理。因为占用某个互斥量的线程既然终止了那足以证明它不再使用被该互斥量保护的...原创 2018-04-28 12:35:09 · 152 阅读 · 0 评论 -
双线程读写队列数据
MFC对话框中一个按钮的响应函数实现两个功能:显示数据同时处理数据,因此开两个线程,一个线程显示数据(开了一个定时器,响应WM_TIMER消息按照一定时间间隔向TeeChart图表添加数据并显示)同时在队列队尾添加数据,另一个线程从该队列队头去数据来处理。下面就来解决这个案例。先来分析下:这个案例是一个线程向队列中的队列头部读取数据,一个线程向队列中的队列尾部写入数据。看起来很像读者写者问题,但其...原创 2018-04-28 12:40:56 · 3782 阅读 · 0 评论 -
调用ShellExecute给定参数调用exe或bat
函数原型:HINSTANCE ShellExecute( _In_opt_ HWND hwnd,//父窗口句柄或出错时显示错误父窗口的句柄,可以为 NULL _In_opt_ LPCTSTR lpOperation,//操作 _In_ LPCTSTR lpFile,//要打开的文件名、执行的程序名、浏览的文件夹等。 _In_opt_ LPCTSTR lpParamet...原创 2018-06-05 20:10:16 · 2579 阅读 · 0 评论 -
设置控制台颜色SetConsoleColor
//字体颜色+背景颜色#include<windows.h>#include<iostream>#include<iomanip>using namespace std;BOOL SetConsoleColor(WORD wAttr){ HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); if(...原创 2018-04-25 12:09:54 · 2314 阅读 · 0 评论 -
一个经典的多线程同步问题05 信号量Semaphore
//创建信号量HANDLE CreateSemaphore( LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCTSTR lpName);函数说明:第一个参数表示安全控制,一般直接传入NULL。第二个参数表示初始资源数量。第三个参数表示最大并发数...原创 2018-04-25 11:15:31 · 431 阅读 · 0 评论 -
一个经典的多线程同步问题04 互斥量Mutex
//创建互斥量(注意与事件Event的创建函数对比)HANDLECreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, BOOLbInitialOwner, LPCTSTRlpName);函数说明:第一个参数表示安全控制,一般直接传入NULL。第二个参数用来确定互斥量的初始拥有者。如果传入TRUE表示互斥量对象内部会...原创 2018-04-25 11:00:30 · 264 阅读 · 0 评论 -
GetObject函数用法详解
GetObject函数用于从指定的图形对象中获取信息,原型如下: int GetObject( __in HGDIOBJ hgdiobj, //图形对象的句柄 __in int cbBuffer, //将写入到缓冲区中的图形对象信息的字节数 __out LPVOID lpvObject //指向接收图形对象信息的缓冲区的指针 )...原创 2018-04-17 12:29:47 · 4578 阅读 · 0 评论 -
DisableThreadLibraryCalls函数
DisableThreadLibraryCalls函数用于使指定DLL的DLL_THREAD_ATTACH和DLL_THREAD_DETACH通知无效,这可减少某些应用程序的工作集空间。原型如下:BOOL WINAPI DisableThreadLibraryCalls( __in HMODULE hModule//Dll的句柄);参数hModule是指定DLL模块的句柄,可以使用Lo...原创 2018-04-17 12:34:04 · 2806 阅读 · 0 评论 -
SetWindowLong函数
SetWindowLong函数用来改变指定窗口的属性LONG WINAPI SetWindowLong( __in HWND hWnd, //指定窗口的句柄,或者间接地,窗口所属的类 __in int nIndex, //指定要设置的属性值的偏移地址 __in LONG dwNewLong //指定设置的新值);参数nIndex的取值如下:GWL_EXSTYLE ...原创 2018-04-17 12:40:25 · 2425 阅读 · 0 评论 -
GetSystemTime和GetFileTime
FILETIME结构包含了文件或目录的日期和时间信息:(自1601年1月1日以来,单位为100纳秒)typedefstruct _FILETIME { DWORD dwLowDateTime; //低32位 DWORD dwHighDateTime; //高32位} FILETIME, *PFILETIME; SYSTEMTIME结构包含了用户可识别的系统日期信息:typedefstruct ...原创 2018-04-17 12:46:24 · 1166 阅读 · 0 评论 -
MultiByteToWideChar和WideCharToMultiByte
MultiByteToWideChar将多字节字符串转换为宽字符字符串,函数原型如下:int MultiByteToWideChar( __in UINT CodePage, //与多字节字符串关联的一个代码页值,一般设为CP_ACP __in DWORD dwFlags, //指定额外的转换控制,一般为0 __in LPCSTR lpMultiByteStr, ...原创 2018-04-17 12:57:38 · 284 阅读 · 0 评论 -
当前工作目录(GetCurrentDirectory)与当前执行文件名(GetModuleFileName)的区别
具体的解释:当前工作目录——进行某项操作的目的目录,会随着OpenFileDialog、SaveFileDialog等对象所确定的目录而改变。(变化的)当前执行目录——该进程从中启动的目录,即文件自身所在目录。(固定的)形象的比喻:工作目录与执行目录可以不同,例如一个人住在北京,但他的工作地点不一定在北京,可能在天津。...原创 2017-02-15 11:40:11 · 1528 阅读 · 1 评论 -
获得桌面的ListView控件窗口句柄的方法
XP://桌面的ListView控件是ProgMan窗口的孙子窗口hWndLV = GetFirstChild(GetFirstChild(FindWindow(TEXT("ProgMan"),NULL)));Win8:HWND GetDestopListViewHandle(){ HWND hWnd = NULL,hWndItem; HWND hWndParent = FindW...原创 2018-04-13 16:15:26 · 756 阅读 · 0 评论 -
远程线程的创建步骤(附源码)
(1)用VirtualAllocEx函数在远程进程的地址空间中分配一块内存。(2)用WriteProcessMemory函数反映Dll的路径名复制到第1步分配的内存中(3)用GetProcAddress函数来得到LoadLibrary W(或A)函数在Kernel32.dll的真实地址。(4)用CreateRemoteThread函数在远程进程中创建一个线程,让新线程调用正确的LoadLibrar...原创 2018-04-13 16:29:10 · 959 阅读 · 0 评论 -
GetLastError错误码大全
GetLastError的返回值的含义:(0)-操作成功完成。(1)-功能错误。(2)- 系统找不到指定的文件。(3)-系统找不到指定的路径。(4)-系统无法打开文件。(5)-拒绝访问。(6)-句柄无 效。(7)-存储控制块被损坏。(8)-存储空间不足,无法处理此命令。(9)-存储控制块地址无效。(10)-环境错 误。(11)-试图加载格式错误的程序。(12)-访问码无效。(13)-数据无效。(1...原创 2018-04-19 12:10:40 · 959 阅读 · 0 评论 -
CreateThread与_beginthreadex的本质区别
CreateThread函数原型:HANDLEWINAPICreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, ...原创 2018-04-25 08:18:53 · 167 阅读 · 0 评论 -
一个经典的多线程同步问题01 问题重现
程序描述:主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(50) -> 输出参数和全局变量。要求:1.子线程输出的线程序号不能重复。2.全局变量的输出必须递增。下面画了个简单的示意图:分析下这个问题的考察点,主要考察点有二个:1.主线程创建子线程并传入一个指向变量地址的指...原创 2018-04-25 08:42:45 · 258 阅读 · 0 评论 -
一个经典的多线程同步问题02 关键段CS
CRITICAL_SECTION一共就四个函数://定义关键段变量后必须先初始化void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection); //进入关键区域void EnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);//离开关关键区域void L...原创 2018-04-25 09:11:52 · 190 阅读 · 0 评论 -
一个经典的多线程同步问题03 事件Event
//创建事件HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes, BOOLbManualReset, BOOLbInitialState, LPCTSTRlpName);函数说明:第一个参数表示安全控制,一般直接传入NULL。第二个参数确定事件是手动置位还是自动置位,传入TRUE表示手动置位,传入FALSE表示自动...原创 2018-04-25 10:47:14 · 276 阅读 · 0 评论