
Windows核心编程
小米的修行之路
是日已过,命亦随减;如少水鱼,斯有何乐?当勤精进,如救头燃!但念无常,慎勿放逸。
展开
-
C++实现程序自动连接网络磁盘映射
bool netDeriverConnectProc(){ char szLocalName[3] = { 0 }, szRemoteName[MAX_PATH] = {0}; string strPasswd, strUserName; char szText[MAX_PATH] = { 0 }; GetPrivateProfileString("net_driver", "userName", "", szText, MAX_PATH, GetGlobleParam()->m_sz.原创 2021-09-02 09:37:04 · 1003 阅读 · 0 评论 -
C++获取本地ip、计算机名、判断端口是否被占用
1、获取ip地址、计算机名称和一个可用的端口号:bool CConfig::GetIpAndPort(){ int nRet = 0, nNum = 0; if (!GetHostNameAndIP(m_szHostName, m_szIP)) return false; while (1 != (nRet = PortIsValid(m_nPort))) { if (++nNum > 100) break; m_nPort++; } return nRet原创 2021-05-17 21:43:31 · 1704 阅读 · 0 评论 -
Windows线程池每隔一段时间调用一个函数
1、定义一个回调函数,用来在特定的时间执行特定的任务:VOID CALLBACK TimeoutCallback( PTP_CALLBACK_INSTANCE pInstance, PVOID pvContext, PTP_TIMER pTimer);2、创建一个线程池定时器来和回调函数绑定:PTP_TIMER CreateThreadpoolTimer( ...原创 2018-02-23 10:47:36 · 652 阅读 · 0 评论 -
内存映射文件---颠倒文本内容
// FileMapping.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include"windows.h"#include "iostream"using namespace std;#define FILENAME _T("D://FileName.Dat")BOOL FileReverse(PCTSTR pszPathName,...原创 2018-03-15 09:25:36 · 439 阅读 · 0 评论 -
QueueUserAPC()强制线程退出等待状态
#include "stdafx.h"volatile long nCount(0);VOID WINAPI APCFunc(ULONG_PTR dwParam){ printf("回调函数调用计数:%d\n",nCount++);}UINT WINAPI ThreadFunc(void* arg){ HANDLE hEvent = (HANDLE)arg; DWORD原创 2018-02-07 13:30:16 · 522 阅读 · 0 评论 -
ReadDirectoryChangesW---异步方式(IO完成端口)监控目录中的文件
同步方式处理的话如果多个文件有可能有处理不到的文件。采用异步方式可以解决这个问题。基于IO完成端口实现的封装类class P2PFileShare:#if !defined(AFX_P2PFILESHARE_H__5CFE59EF_7A09_4715_885F_FED4E2992470__INCLUDED_)#define AFX_P2PFILESHARE_H__5CFE59EF...原创 2018-02-05 12:54:43 · 4154 阅读 · 22 评论 -
ReadDirectoryChangesW()---同步模式监控目录中的文件
直接上代码:#include "stdafx.h"typedef struct ThreadParameter { LPTSTR in_directory;//监控的路径 FILE_NOTIFY_INFORMATION *in_out_notification;//存储监控函数返回信息地址 DWORD in_MemorySize;//传递存储返回信息的内存的...原创 2018-02-05 12:43:34 · 825 阅读 · 0 评论 -
监控目录中文件的变化---FindFirstChangeNotification
FindFirstChangeNotification()函数只能监控到目录或是目录中的文件发生了哪种变化,但是更详细的变化信息是不能得到的。要得到更详细的信息,可以使用ReadDirectoryChangesW()函数,下次讲解这个函数的使用方法。使用举例:#include "stdafx.h"void WatchDirectory(LPTSTR lpDir) { DWORD原创 2018-02-05 09:41:15 · 1244 阅读 · 0 评论 -
struct hostent ---获取本机的IP地址
struct hostent{ char *h_name; //主机名,即官方域名 char **h_aliases; //主机所有别名构成的字符串数组,同一IP可绑定多个域名 int h_addrtype; //主机IP地址的类型,例如IPV4(AF_INET)还是IPV6 int h_length; //主机IP地址长度,IPV4地址为4,IPV6地址则...原创 2018-02-09 10:56:45 · 1278 阅读 · 0 评论 -
SetConsoleCtrlHandler处理控制台程序的消息
今天看一个控制台程序,此程序的功能是监视特定配置文件是否修改,使用了FindFirstChangeNotification()函数。其中涉及到当用户点击了控制台的“X”号时,如何使程序优雅的退出的问题,这样就不会产生内存泄露。采取截获控制台"X"号的点击时间的方法,然后给主线程发送一个WM_QUIT消息即可。程序代码如下:1、一个进程定时修改特定的配置文件:#include "stda原创 2018-02-04 13:05:04 · 1179 阅读 · 0 评论 -
进程间通信之内存映射文件
1、内存映射文件分为:1、以磁盘文件为后备存储器; 2、以页交换文件为后备存储器。2、在进行进程间通信时,如果进程间为了共享数据必须让应用程序在磁盘上创建数据文件并把数据保存在文件中,是很不方便的,所以进程间通信都是以页交换文件为后备存储器。这就省掉了CreateFile()函数,只需调用CreateFileMapping()函数,...原创 2018-03-16 09:39:25 · 559 阅读 · 0 评论 -
共享段---只运行一个实例
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<cstring>#include <string>#include "iostream"using namespace std;#pragma comment(linker,"/SECTION:shared,RWS")//更改编译开关#pr...原创 2018-03-13 17:22:37 · 291 阅读 · 0 评论 -
VirtualAlloc的使用
1、在虚拟地址空间中预定一块内存区域;2、调拨物理存储器。// VirtualAlloc.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Windows.h"#include "iostream"using namespace std;int _tmain(int argc, _TCHAR* argv[]){ //申请内存区...原创 2018-03-20 10:13:46 · 5496 阅读 · 0 评论 -
获取磁盘盘符类型和其总容量、可用容量
DRIVER Dir; BOOL bResult=FALSE; for(TCHAR szDisk='A';szDisk<='Z';szDisk++) { memset(&Dir,0,sizeof(DRIVER)); unsigned _int64 i64FreeBytesToCaller; unsigned _int64 i64TotalBytes; uns...原创 2017-02-24 14:30:22 · 788 阅读 · 0 评论 -
C++获取操作系统的类型
int CSystemINFO::GetSysVersion(){ OSVERSIONINFO osver = {sizeof(OSVERSIONINFO)}; GetVersionEx(&osver); int t; if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0) { t = 0;/...原创 2017-02-24 14:50:54 · 2752 阅读 · 0 评论 -
进程间通讯---匿名管道
最近实现一个远程超级终端的功能,通信模式是这样的:客户端------通过网络发送cmd命令到------服务器端------通过进程间通信(管道),将此cmd命令发给-----cmd.exe程序,cmd.exe执行此cmd命令接下来:cmd.exe------程序将执行结果返回------服务器端------发送此次结果到------客户端,客户端对结果进行显示其中服务器端程序和c...原创 2017-03-09 13:05:53 · 624 阅读 · 0 评论 -
几种获取进程列表的方法
1.CreateToolhelp32Snapshot法: // ////////////////////////////////////////////////////////////////////////// // // CreateToolhelp32Snapshot 法 #include <Tlhelp32.h> // /...转载 2017-03-13 09:05:09 · 890 阅读 · 0 评论 -
提权获取进程路径并获取进程列表
1、进程提权:BOOL CProgressInfo::AdjustPrivileges(){ HANDLE hToken = NULL; TOKEN_PRIVILEGES tp = {0}; TOKEN_PRIVILEGES oldtp = {0}; DWORD dwSize = sizeof(TOKEN_PRIVILEGES); LUID luid = {0}; if...原创 2017-03-13 09:17:54 · 667 阅读 · 0 评论 -
使用SetUnhandledExceptionFilter()调试windows平台下的崩溃弹窗问题
昨天看了同事的程序,发现解决崩溃弹窗问题的方法很不错,上网搜了一下,也基本都是这个方法,以前确实没怎么关注过这个问题,测试了一下,把出现问题的源代码准确的定位了出来。1、同事对其进行了封装,封装类如下:#pragma once#include <windows.h>#include <imagehlp.h>#include <stdlib.h>...原创 2019-02-27 09:20:31 · 2153 阅读 · 3 评论 -
Windows挂钩注入DLL
代码实现(被注入进程):private: DWORD m_dwId; HHOOK m_hHook; HMODULE m_hmDll;private: DWORD GetPIdByProcessName(const char* pszProcessName); BOOL InjectDllBySetWindowsHook(ULONG32 ulTargetProcessID,char* p...原创 2018-04-04 15:33:27 · 920 阅读 · 0 评论 -
使用动态库DLL导出类
首先创建一个DLL工程,名称为ServMgrDll,新建一个类,包含头文件ServConfig.h和cpp文件ServConfig.cpp。类的代码如下:.h:#pragma once/* 如果没有定义:ServConfigAPI,则ServConfigAPI定义为:_declspec(dllimport), 编译器就知道可执行源文件要从DLL模块中导入某些函数。*/#ifdef...原创 2018-04-02 16:18:06 · 2149 阅读 · 1 评论 -
创建和使用自己额外的堆
1、默认系统为每一个进程都分配一个默认的Heap,可以使用GetProcessHeap取得默认堆句柄。但是这个堆,是不允许程序自己释放,也就是不允许Destroy。在某些应用场合,可能会在某一个时间段内,或者某一个任务内需要大量的内存,并且可能是一个个很小很小的分片。如果全都使用默认的堆,那么全用完之后,需要释放就显得相当麻烦,必须一个个的释放,而如果这个作业中途异常,可能导致一些内存分片的句柄丢...原创 2018-03-21 15:45:00 · 280 阅读 · 0 评论 -
重置物理存储器MEM_RESET
// MemReset.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "Windows.h"#include "iostream"using namespace std;int _tmain(int argc, _TCHAR* argv[]){ char szText[] = "Some Test Data"; //预定...原创 2018-03-20 13:38:47 · 1394 阅读 · 0 评论 -
柔性数组---FILE_NOTIFY_INFORMATION的使用说明
最近看别人的代码,发现中间有这样的使用:tmp->FileName[i];其中tmp是一个指针,指针类型是FILE_NOTIFY_INFORMATION *的。而FILE_NOTIFY_INFORMATION 的定义是这样的:typedef struct _FILE_NOTIFY_INFORMATION { DWORD NextEntryOffset;转载 2018-02-02 13:07:46 · 1396 阅读 · 0 评论 -
线程同步之Signal ObjectAndWait()
前面提到过使用PulseEvent()函数时,如果线程还没准备好处于等待状态的话,那么这个触发脉冲就会丢失掉。例如下面的代码:线程一:SetEvent(hEvent1);WaiForSingleObject(hEvent2,INFINITE);线程二:WaiForSingleObject(hEvent1,INFINITE);PulseEvent(hEvent2);上面代码就会发原创 2018-01-31 16:26:17 · 660 阅读 · 0 评论 -
专有命名空间---只运行一个实例
如果想确保我们的应用程序创建的内核对象名称永远不和其他的应用程序冲突,或是确保他们免遭劫持,可以定义一个自定义的前缀,并把它作为自己的专有命名空间使用。其中定义的边界描述符用于对命名空间名称自身进行保护。#pragma once #include "windows.h"#include "iostream"using namespace std; class CSingle原创 2017-12-07 10:07:04 · 555 阅读 · 0 评论 -
GetVersionEx()获取系统的版本
int CSystemINFO::GetSysVersion(){ OSVERSIONINFO osver = {sizeof(OSVERSIONINFO)}; GetVersionEx(&osver); int t; if (osver.dwMajorVersion == 5 && osver.dwMinorVersion == 0) { t = 0;//windows 2000原创 2017-12-15 13:21:25 · 1135 阅读 · 0 评论 -
GetCurrentDirectory()和GetMoudleFileName()获取进程所在目录
1、GetCurrentDirectory()某个线程调用此函数用来获取其所在进程的当前驱动器和目录,注意并不是进程镜像文件(.exe)所在的目录。使用此函数时,不同情况获得的当前目录是不同的;GetMoudleFileName()此函数得到当前应用程序(.exe)的运行目录,包括应用程序的文件名。2、(1)使用VS编译器直接运行时,获取目录如下图:(2)在命令原创 2017-12-15 12:58:48 · 4672 阅读 · 0 评论 -
ANSI编码和Unicode编码之深入理解
利用今天一天的时间,研究了一下ANSI编码和Unicode编码的不同,下面把我的研究成果写下来,以备日后参考。 ANSI编码最常见的应用就是在Windows当中的记事本程序中,当新建一个记事本,默认的保存编码格式就是ANSI,ANSI应该算是一种压缩编码了,当遇到标准的ASCII字符时,采用单字节表示,当遇到非标准的ASCII字符(如中文)时,采用双字节表示。Unicode编转载 2017-12-06 09:44:04 · 952 阅读 · 0 评论 -
CreateProcess使用
BOOL WINAPI CreateProcess( _In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_原创 2017-12-20 17:15:22 · 951 阅读 · 0 评论 -
Windows下当前权限上下文
>一书中第四章讲解UAC(用户账户控制)的时候,有一个函数GetProcessElevation能返回提升类型和一个指出进程是否正在以管理员身份运行的布尔值.BOOL GetProcesElevation(TOKEN_ELEVATION_TYPE *pElevation, BOOL *pIsAdmin) { HANDLE hToken = NULL; DWORD原创 2017-12-19 15:14:11 · 901 阅读 · 0 评论 -
获取子进程的退出码
#include "stdafx.h"#include "windows.h"#include "iostream"using namespace std;int _tmain(int argc, _TCHAR* argv[]){ LPCTSTR lpName(_T("zzc")); LPCTSTR lpValue(_T("88888")); //设置环境变量的值 :原创 2017-12-20 09:25:22 · 1669 阅读 · 0 评论 -
从Win32程序中的主函数中获取命令行参数
【翻译文章,原文来自:http://codingmisadventures.wordpress.com/2009/03/10/retrieving-command-line-parameters-from-winmain-in-win32/】在标准C或者Win32控制台程序的main函数中,它们都有两个参数:"argc" 和 "argv",如下所示:int main(int argc, c转载 2017-12-11 09:47:47 · 1392 阅读 · 0 评论 -
进程的环境变量
环境变量是进程中一组变量信息,环境变量分为系统环境变量、用户环境变量和进程环境变量。系统有全局的环境变量,在进程创建时,进程继承了系统的全局环境变量、当前登录用户的用户环境变量和父进程的环境变量。进程也可以有自己的环境变量。设置和获取所在进程的环境变量使用函数GetEnvironmentStrings、GetEnvironmentVariable和SetEnvironmentVariable:转载 2017-12-08 16:43:44 · 1456 阅读 · 0 评论 -
DuplicateHandle进程间句柄复制
1、BOOL DuplicateHandle( HANDLE hSourceProcessHandle, HANDLE hSourceHandle, HANDLE hTargetProcessHandle, LPHANDLE lpTargetHandle, DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwOpt原创 2017-12-07 14:05:56 · 5079 阅读 · 0 评论 -
带你玩转Visual Studio——带你跳出坑爹的Runtime Library坑
在Windows下进行C++的开发,不可避免的要与Windows的底层库进行交互,然而VS下的一项设置MT、MTd、MD和MDd却经常让人搞迷糊,相信不少人都被他坑过,特别是你工程使用了很多第三库的时候,及容易出现各种链接问题。看一下下面这个错误提示: LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined in转载 2018-01-02 10:09:01 · 3032 阅读 · 0 评论 -
事件对象之 PulseEvent( )
BOOL PulseEvent( );Sets the state of the event to signaled (available), releases any waiting threads, and resets it to nonsignaled (unavailable) automatically.与SetEvent()函数的区别在于两点,PulseEvent( )相当原创 2018-01-31 16:03:02 · 1519 阅读 · 0 评论 -
window图像组件
今天在2003服务器上安装vs2010旗舰版时提示我需要安装windows图像组件,岁下载了一个:http://download.youkuaiyun.com/download/u012372584/10221363原创 2018-01-24 11:11:55 · 272 阅读 · 0 评论 -
临界区和代码段与条件变量的混合使用
1、当读者线程当没有数据可读取时,则应释放锁并等待,直到写者线程产生了新的数据。同理,当写者线程把数据结构写满时,那么写者应该释放SRWLock并等待,直到读者把数据结构清空。条件变量的目的让线程以原子方式释放锁并将自己阻塞,直到某一个条件成立,再唤醒自己。2、条件变量的使用方法:1)声明+初始化:CONDITION_VARIABLE cv;InitializeConditionVaria原创 2018-01-16 16:01:38 · 483 阅读 · 0 评论 -
Slim读写锁
基于http://blog.youkuaiyun.com/morewindows/article/details/7442333提出的经典问题,使用Slim读写锁解决。问题如下:主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。要求:1.子线原创 2018-01-16 12:53:25 · 508 阅读 · 0 评论