进程枚举

ZwQuerySystemInformation枚举进程 ZwQuerySystemInformation函数的SystemProcessesAndThreadsInformation功能号实现驱动枚举进程:第一个参数为传入功能号, 第二个参数为输出进程信息的缓冲区, 为一个指向SYSTEM_PROCESS_INFORMATION结构体指针,结构的NextEntryOffset成员指向下一项目, 遍历此链表即可枚举进程,指向0则表示已达链表尾部第三个参数 阅读详情

各种进程枚举方法

方法一:使用工具库(Tool Help Library)函数
这是一种历史最悠久、也是最基本的方法(从Windows 95开始就支持这种方法)。这些API函数中,最重要的当属CreateToolhelp32Snapshot,它的函数原型如下:
HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);

这个函数的功能就是给系统拍“快照”。拍照的对象由参数dwFlags决定,比如dwFlags值为TH32CS_SNAPPROCESS表示对象为系统中的所有进程,值为TH32CS_SNAPMODULE表示对象为由th32ProcessID参数指定的进程调用的所有模块(也就是DLL)。

当调用CreateToolhelp32Snapshot函数给指定的对象拍完快照之后,我们就可以使用Process32First、Process32Next、Module32First、Module32Next等函数进行“取片”工作了,就是遍历刚才拍下来的所有进程、进程调用的所有模块。

我们的演示程序提供了完整的代码实现:
BOOL CToolHelpSpy::BuildProcessList(void)
{
// 给系统中所有进程拍快照
HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
return FALSE;
}

PROCESSENTRY32 pe32 = {0};
pe32.dwSize = sizeof(PROCESSENTRY32);

// 遍历拍下来的所有进程
if (Process32First(hProcessSnap, &pe32))
{
do
{
if (pe32.th32ProcessID && strcmp(pe32.szExeFile, "System"))
{
// 保存进程的名字、PID
CProcessItem processItem;
processItem.SetProcessName(pe32.szExeFile);
processItem.SetProcessId(pe32.th32ProcessID);
// 加入列表保存
mProcList.AddTail(processItem);
}
} while (Process32Next(hProcessSnap, &pe32));
}
CloseHandle(hProcessSnap);

return TRUE;
}

BOOL CToolHelpSpy::BuildModuleList(CProcessItem& inProcess)
{
// 给指定的进程调用的所有模块拍快照
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
inProcess.GetProcessId());
if (hModuleSnap == INVALID_HANDLE_VALUE)
{
return FALSE;
}

MODULEENTRY32 me32 = {0};
me32.dwSize = sizeof(MODULEENTRY32);

inProcess.CleanupModuleList();
// 遍历所有模块
if (Module32First(hModuleSnap, &me32))
{
do
{
// 保存模块文件全路径
inProcess.AddModuleItem(me32.szExePath);
} while (Module32Next(hModuleSnap, &me32));
}
CloseHandle(hModuleSnap);

return TRUE;
}

注:工具库函数在Kernel32.dll中实现。程序开发中,我们需要包含头文件Tlhelp32.h,连接库文件Kernel32.lib。

注:我们这里使用自定义类CProcessItem来描述一个进程,它保存了进程的名字、PID等信息,另外还维持一个该进程调用的所有模块的列表。相应地,我们也使用一个自定义类CModuleItem来描述模块,它保存模块文件的全路径、版本号、文件大小、说明信息、所属产品名等。(下同)

方法二:使用PSAPI (Process Status API)函数
这是一种Windows NT/2000下的方法。核心是使用EnumProcesses函数。它的原型如下:
BOOL EnumProcesses(
DWORD *lpidProcess, // 用于保存所有进程的PID的数组
DWORD cb, // 上述数组的大小
DWORD *cbNeeded // PID数组中实际返回的(有效)字节数
);

当获得系统中所有进程的PID后,我们就可以使用OpenProcess函数打开指定的进程,再调用GetModuleBaseName获得该进程的名字,调用EnumProcessModules枚举该进程调用的所有模块,调用GetModuleFileNameEx获得模块文件的全路径。

我们的演示程序提供了完整的代码实现:
BOOL CPSApiSpy::BuildProcessList(void)
{
// 枚举获得系统中的所有进程的PID
DWORD processes[1024], needed;
if (!EnumProcesses(processes, sizeof(processes), &needed))
{
return FALSE;
}

char szName[MAX_PATH] = "";
DWORD actualProcessCount = needed / sizeof(DWORD);
for (DWORD i = 0; i < actualProcessCount; i++)
{
// 保存进程的PID
CProcessItem processItem;
processItem.SetProcessId(processes[i]);

// 打开当前进程以获得进程操作句柄
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE, processes[i]);
if (hProcess)
{
HMODULE hModule;
DWORD needed;
// 枚举当前进程调用的所有模块
if (EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed))
{
// 获得并保存进程的名字
GetModuleBaseName(hProcess, hModule, szName, sizeof(szName));
processItem.SetProcessName(szName);
mProcList.AddTail(processItem);
}
CloseHandle(hProcess);
}
}
return TRUE;
}

BOOL CPSApiSpy::BuildModuleList(CProcessItem& inProcess)
{
// 根据PID打开该进程,获得一个进程操作句柄
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE, inProcess.GetProcessId());
if (hProcess)
{
HMODULE modules[1024];
DWORD needed;
// 枚举当前进程调用的所有模块
if (EnumProcessModules(hProcess, modules, sizeof(modules), &needed))
{
char szName[MAX_PATH] = "";
inProcess.CleanupModuleList();
DWORD actualModuleCount = needed / sizeof(DWORD);
// 获得各个模块文件的全路径
for (DWORD i = 1; i < actualModuleCount; i++)
{
GetModuleFileNameEx(hProcess, modules[i], szName, sizeof(szName));
inProcess.AddModuleItem(szName);
}
}
CloseHandle(hProcess);
}

return TRUE;
}

注:PSAPI函数在Psapi.dll中实现。程序开发中,我们需要包含头文件Psapi.h,连接库文件Psapi.lib。这些文件在安装了微软的Platform SDK后就可获得。

方法三:利用系统收集的性能数据(Performance Data)
这也是一种Windows NT/2000下的方法。首先,我们需要介绍一些关于性能监视(Performance Monitoring)的背景知识。

所谓性能监视,实际上是Windows NT/2000提供的一种系统功能,它能实时采集、分析系统内的应用程序、服务、驱动程序等的性能数据,以此来分析系统的瓶颈、监视组件的表现,最终帮助用户进行系统的合理调配。这里,还要引入一个性能对象(Performance Object)的概念,即被监视者。一般系统中的性能对象包括处理器(Processor)、进程(Process)、线程(Thread)、网络通讯(如TCP、UDP、ICMP、IP等)、系统服务(如ACS/RSVP Service)等。(本文我们关心的是进程,即名为“Process”的对象。)下面,我们给出系统性能数据的结构参考图:

图2 系统性能数据的结构

性能对象有两种:一种只支持一个实例,另一种支持多个实例。(我们关心的进程对象支持多个实例,而每个实例对应系统中的一个进程。)一个对象可以有多个性能指标;每个性能指标都用一个计数器(Counter)来记录。就进程对象而言,它拥有的计数器种类包括ID Process(进程的PID)、Thread Count(线程数)、Priority Base(进程优先级)、IO Read Bytes/sec(每秒IO读取字节数)、IO Writer Bytes/sec(每秒IO写出字节数)等。(本文我们只关心ID Process计数器的值。)

支持单一实例的对象数据结构如下(也就是图2中各个对象数据块的展开形式):

图3 支持单一实例的对象数据结构

支持多实例的对象数据结构如下(增加了各个实例的定义部分):

图4 支持多实例的对象数据结构

知道了性能数据结构,接下去我们怎么来读取它们呢?最基本的方法就是通过注册表函数,如RegOpenKeyEx、RegQueryValueEx、RegCloseKey等。值得注意的是,这里虽然使用的是注册表函数,但性能数据并不存储在注册表数据库中;读取性能数据时调用函数RegOpenKeyEx,主键值应该是HKEY_PERFORMANCE_DATA。而当性能数据获得之后,根据各部分数据结构的定义,计算偏移量,我们就能获取我们感兴趣的数据了。

我们的演示程序提供了完整的代码实现:
#define INITIAL_SIZE 51200
#define EXTEND_SIZE 25600
#define REGKEY_PERF _T("Software\\Microsoft\\Windows NT\\Currentversion\\Perflib")
#define REGSUBKEY_COUNTERS _T("Counters")
#define PROCESS_COUNTER _T("process")
#define PROCESSID_COUNTER _T("id process")

BOOL CPerformanceSpy::BuildProcessList(void)
{
// 步骤一:从特定的注册表路径下获取系统中所有的对象、计数器的名字
LANGID lid = MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL);
TCHAR szSubKey[1024];
_stprintf(szSubKey, _T("%s\\%03x"), REGKEY_PERF, lid);
HKEY hSubKey;
DWORD rt = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0,
KEY_READ, &hSubKey);
if (rt != ERROR_SUCCESS)
{
return FALSE;
}

DWORD dwType = 0;
DWORD dwSize = 0;
LPBYTE buffer = NULL;
BOOL pass = FALSE;
// 获得装载所有计数器名字的缓冲大小
rt = RegQueryValueEx(hSubKey, REGSUBKEY_COUNTERS, NULL,
&dwType, NULL, &dwSize);
if (rt == ERROR_SUCCESS)
{
buffer = (LPBYTE) malloc(dwSize);
memset(buffer, 0, dwSize);
rt = RegQueryValueEx(hSubKey, REGSUBKEY_COUNTERS, NULL,
&dwType, buffer, &dwSize);
}

LPSTR p, p2;
DWORD dwProcessIdTitle;
DWORD dwProcessIdCounter;
PPERF_DATA_BLOCK pPerf;
PPERF_OBJECT_TYPE pObj;
PPERF_INSTANCE_DEFINITION pInst;
PPERF_COUNTER_BLOCK pCounter;
PPERF_COUNTER_DEFINITION pCounterDef;
if (rt == ERROR_SUCCESS)
{
pass = TRUE;
// 步骤二:查找名为“Process”的对象以及名为“ID Process”的计数器
// 获取它们的索引值(因为对象、计数器在性能数据中是靠索引来标识的)
p = (LPSTR) buffer;
while (*p)
{
if (p > (LPSTR) buffer)
{
for (p2 = p - 2; _istdigit(*p2); p2--)
;
}

if (_tcsicmp(p, PROCESS_COUNTER) == 0)
{
// 获取“Process”对象的索引
for (p2 = p - 2; _istdigit(*p2); p2--)
;
_tcscpy(szSubKey, p2+1);
}
else if (stricmp(p, PROCESSID_COUNTER) == 0)
{
// 获取“ID Process”计数器的索引
for (p2 = p - 2; _istdigit(*p2); p2--)
;
dwProcessIdTitle = atol(p2 + 1);
}
// Point to the next string
p += (_tcslen(p) + 1);
}

// 步骤三:获取进程对象的所有性能数据
free(buffer);
buffer = NULL;
dwSize = INITIAL_SIZE;
buffer = (LPBYTE) malloc(dwSize);
memset(buffer, 0, dwSize);
while (pass)
{
rt = RegQueryValueEx(HKEY_PERFORMANCE_DATA, szSubKey, NULL,
&dwType, buffer, &dwSize);
pPerf = (PPERF_DATA_BLOCK) buffer;
// 性能数据块开头以四个字符“PERF”标识
if ((rt == ERROR_SUCCESS) && (dwSize > 0) &&
pPerf->Signature[0] == (WCHAR)'P' &&
pPerf->Signature[1] == (WCHAR)'E' &&
pPerf->Signature[2] == (WCHAR)'R' &&
pPerf->Signature[3] == (WCHAR)'F')
{
break;
}

// 如果缓冲不够大,扩大缓冲后再试
if (rt == ERROR_MORE_DATA)
{
dwSize += EXTEND_SIZE;
buffer = (LPBYTE) realloc(buffer, dwSize );
memset(buffer, 0, dwSize );
}
else
{
pass = FALSE;
}
}
}

if (pass)
{
pObj = (PPERF_OBJECT_TYPE) ((DWORD)pPerf + pPerf->HeaderLength);
// 步骤四:在进程对象数据的计数器定义部分寻找“ID Process”计数器
pCounterDef = (PPERF_COUNTER_DEFINITION) ((DWORD)pObj + pObj->HeaderLength);
for (DWORD i = 0; i < (DWORD)pObj->NumCounters; i++)
{
if (pCounterDef->CounterNameTitleIndex == dwProcessIdTitle)
{
dwProcessIdCounter = pCounterDef->CounterOffset;
break;
}
pCounterDef++;
}

// 步骤五:遍历所有实例,获取实例的名字(即进程名)以及PID
TCHAR szProcessName[MAX_PATH];
pInst = (PPERF_INSTANCE_DEFINITION) ((DWORD)pObj + pObj->DefinitionLength);
for (i = 0; i < (DWORD)pObj->NumInstances; i++)
{
// 获取进程名
p = (LPSTR) ((DWORD)pInst + pInst->NameOffset);
rt = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)p, -1, szProcessName,
sizeof(szProcessName), NULL, NULL);
// 获取进程PID
pCounter = (PPERF_COUNTER_BLOCK) ((DWORD)pInst + pInst->ByteLength);
DWORD processId = *((LPDWORD) ((DWORD)pCounter + dwProcessIdCounter));
if (strcmp(szProcessName, "System") && processId)
{
CProcessItem processItem;
processItem.SetProcessId(processId);
processItem.SetProcessName(szProcessName);
mProcList.AddTail(processItem);
}
// Point to the next process
pInst = (PPERF_INSTANCE_DEFINITION) ((DWORD)pCounter + pCounter->ByteLength);
}
}

if (buffer)
{
free(buffer);
buffer = NULL;
}
RegCloseKey(hSubKey);
RegCloseKey(HKEY_PERFORMANCE_DATA);
return pass;
}

注:方法三用到的仅仅是注册表操作函数,而这些函数在advapi32.dll中实现。程序开发中,我们需要包含头文件winperf.h。另外,该方法中各个进程所调用的模块,仍然使用方法二的PSAPI函数获得,这里就不再列出。

方法四:使用PDH (Performance Data Helper)函数
这种方法的底层实现跟方法三其实是一样的。但我们看到,方法三实现起来非常繁琐。为了简化应用,PDH函数对方法三的实现进行了一层封装。我们这里的进程枚举,主要使用PdhEnumObjectItems函数,它的函数原型如下:
PDH_STATUS PdhEnumObjectItems(
LPCTSTR szDataSource, // 数据源
LPCTSTR szMachineName, // 机器名
LPCTSTR szObjectName, // 对象名
LPTSTR mszCounterList, // 计数器列表
LPDWORD pcchCounterListLength, // 计数器列表长度
LPTSTR mszInstanceList, // 实例列表
LPDWORD pcchInstanceListLength, // 实例列表长度
DWORD dwDetailLevel, // 获取信息的级别
DWORD dwFlags // 保留为0
);

对于每一个获得的进程实例,我们还要得到它的PID,也就是得到“ID Process”计数器的值。这时,我们会用到其他的PDH函数,包括:PdhOpenQuery、PdhAddCounter、PdhCollectQueryData、PdhGetFormattedCounterValue、PdhCloseQuery等。

我们的演示程序提供了完整的代码实现:
BOOL CPDHSpy::BuildProcessList(void)
{
LPTSTR szCounterListBuffer = NULL;
DWORD dwCounterListSize = 0;
LPTSTR szInstanceListBuffer = NULL;
DWORD dwInstanceListSize = 0;

BOOL pass = FALSE;
// 第一次调用PdhEnumObjectItems以获取需要的列表长度
PDH_STATUS pdhStatus = PdhEnumObjectItems(NULL, NULL, TEXT("Process"),
szCounterListBuffer, &dwCounterListSize, szInstanceListBuffer,
&dwInstanceListSize, PERF_DETAIL_WIZARD, 0);
if (pdhStatus == ERROR_SUCCESS)
{
szCounterListBuffer = (LPTSTR) malloc((dwCounterListSize * sizeof (TCHAR)));
szInstanceListBuffer = (LPTSTR) malloc((dwInstanceListSize * sizeof (TCHAR)));
// 第二次调用PdhEnumObjectItems
// 获得“Process”对象的所有计数器和实例
pdhStatus = PdhEnumObjectItems(NULL, NULL, TEXT("Process"),
szCounterListBuffer, &dwCounterListSize, szInstanceListBuffer,
&dwInstanceListSize, PERF_DETAIL_WIZARD, 0);
if (pdhStatus == ERROR_SUCCESS)
{
pass = TRUE;
LPTSTR pInst = szInstanceListBuffer;
// 获得每个实例名,也就是进程名
for (; *pInst != 0; pInst += lstrlen(pInst) + 1)
{
if (strcmp(pInst, "System") && strcmp(pInst, "Idle") &&
strcmp(pInst, "_Total"))
{
CProcessItem processItem;
// 获得进程的PID
processItem.SetProcessId(GetPIDCounterValue(pInst));
processItem.SetProcessName(pInst);
mProcList.AddTail(processItem);
}
}
}
}

if (szCounterListBuffer != NULL)
{
free(szCounterListBuffer);
szCounterListBuffer = NULL;
}
if (szInstanceListBuffer != NULL)
{
free(szInstanceListBuffer);
szInstanceListBuffer = NULL;
}
return pass;
}

DWORD CPDHSpy::GetPIDCounterValue(LPTSTR inInstanceName)
{
// 打开一个查询对象
HQUERY hQuery = NULL;
PDH_STATUS pdhStatus = PdhOpenQuery (0, 0, &hQuery);

HCOUNTER hCounter = NULL;
char szPathBuffer[MAX_PATH];
sprintf(szPathBuffer, " Process", inInstanceName);
pdhStatus = PdhAddCounter(hQuery, szPathBuffer, 0, &hCounter);
pdhStatus = PdhCollectQueryData(hQuery);

// 获得当前实例的“ID Process”计数器的值
DWORD ctrType;
PDH_FMT_COUNTERVALUE fmtValue;
pdhStatus = PdhGetFormattedCounterValue(hCounter, PDH_FMT_LONG,
&ctrType, &fmtValue);

// 关闭查询对象
pdhStatus = PdhCloseQuery (hQuery);

return fmtValue.longValue;
}

注:PDH函数在Pdh.dll中实现。程序开发中,我们需要包含头文件Pdh.h,连接库文件Pdh.lib。

VC 枚举进程 有时我们在使用VC开发时,根据需要偶尔需要查看系统当前正在运行中的所有的进程,此时,可以使用VC开发中给我们提供的一种方法——枚举进程,以下介绍两个实例,主要是通过查看网上其他网友的文章,以及在MSDN上面搜索后本人再进行整理得到的历程。具体的话可以查看每个例子给出相应的网站。         以下每个例子都在VC2010测试通过!   第一个例子:给当前系统运行的所有进程“拍个照”,然后逐 阅读详情

相关推荐

C# 枚举进程模块

// namespace eMod {     using System;     using IO = System.IO;     using System.Collections.Generic;     using System.Text;     using System.Diagnostics;     using System.Runtime.InteropServ

芳华如梦 3274

进程枚举的四种方式

进程枚举是将系统中的所有进程显示出来,就像Windows中的任务管理器一样,可以看到系统中运行的所有进程。 进程枚举的四种方法: 通过系统快照进行枚举 通过psapi.dll中的函数进行枚举 通过ntdll.dll中的函数进行枚举 通过ntdll.dll中的函数进行枚举 第一种、通过系统快照进行枚举 1、CreateToolhelp32Snapshot() CreateToolhelp32Snapshot可以通过获取进程信息为指定的进程、进程使用的堆[HE.

qq_43812868的博客 2552

准确在64位系统下枚举进程模块

在32位进程中使用WMI枚举其他进程的模块,支持32位系统和64位系统。

9种枚举枚举进程的方法及实现

<br />//<br />//native api获得进程表<br />NTSTATUS NativeApiEnumProcess()<br />{<br /> ULONG pNeededSize=0;<br /> int iCount = 1;<br /> int bOver=0;<br /> NTSTATUS status;<br /> ULONG uSize;<br /> PVOID pSi=NULL; <br /> PSYSTEM_PROCESS_INFORMATION pSpiNext = NU

爱杀之爪的矩阵 1803

VC++枚举系统当前进程例子

VC++枚举系统当前进程例子

通过VAD树枚举进程DLL(通过processID)

通过VAD树枚举进程DLL,VAD(Virtual address descriptor) 是一棵平衡二叉搜索树。管理着一个进程的虚拟内存。当然其中也包含着一个进程的dll模块信息

7.1 实现进程内存块枚举

在`Windows`操作系统中,每个进程的虚拟地址空间都被划分为若干内存块,每个内存块都具有一些属性,如内存大小、保护模式、类型等。这些属性可以通过`VirtualQueryEx`函数查询得到。该函数可用于查询进程虚拟地址空间中的内存信息的函数。它的作用类似于`Windows`操作系统中的`Task Manager`中的进程选项卡,可以显示出一个进程的内存使用情况、模块列表等信息。使用`VirtualQueryEx`函数,可以枚举一个进程的所有内存块。该函数需要传入要查询的进程的句柄、基地址和一个`ME

微软技术分享 5913

枚举系统中正在运行的进程

枚举系统中正在运行的进程,包括了几种方法:快照、psapi.dll提供的API、wtsapi32.dll提供的API、ntdll.dll提供的API.

枚举进程

枚举进程 1、通过系统快照完成枚举系统进程 #include #include #include int main() { PROCESSENTRY32 processEntry = {0}; HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建进程(TH32CS_SNAPPROCESS

GyaoG的专栏 797

量化爬虫第一步:手把手教你搞定同花顺问财的hexin-v参数(附JS逆向实战)

本文详细介绍了如何通过JS逆向技术破解同花顺问财数据接口的核心加密参数hexin-v,构建稳定可靠的量化数据采集方案。从抓包分析到Cookie Hook技术应用,再到环境补全与参数生成实现,手把手教你完成量化爬虫的第一步。文章还提供了实战注意事项与优化建议,帮助开发者规避常见问题。

weixin_42620202的博客 304

告别卡顿!用U盘给你的MacBook Pro 2015+来一次macOS Monterey的‘大扫除’式安装

每次系统升级后,老款MacBook Pro用户最常抱怨的就是"怎么比之前更卡了?"——这不是错觉。系统迭代过程中积累的缓存文件、残留配置和隐形服务,就像房间角落堆积的灰尘,拖慢了整台机器的响应速度。而通过U盘进行的macOS Monterey全新安装,本质上是一次彻底的"数字大扫除":它不仅替换系统文件,还会重建所有索引、清理磁盘碎片,甚至能解决某些玄学般的卡顿问题。对于2015款及之后的MacBook Pro用户,这种安装方式能让老设备重获新生。

weixin_28731223的博客 312

64位操作系统下R3枚举进程及模块的两种方式

综上,第一种方法使用快照枚举进程和模块,优点是代码量少,缺点是32位进程无法枚举64位进程模块。第二种方法使用Nt函数枚举进程和模块,优点是32位进程可以枚举64位进程模块,缺点是代码量多且要使用未文档化的数据结构。

qq_31548855的博客 747

【多模态融合】TransFusion学习笔记(1)

工作上主要还是以纯lidar的算法开发,部署以及系统架构设计为主。对于多模态融合(这里主要是只指Lidar和Camer的融合)这方面研究甚少。最近借助和朋友们讨论论文的契机接触了一下这方面的知识,起步是晚了一点,但好歹是开了个头。下面就借助TransFusion论文及其开源代码来串一串这方面的知识。这个很好理解,参考FPointNet网络图示。就是利用现有的2D检测器在图像上提取2D初始框,根据Camera成像原理,捕获2D框视锥内的点云,再利用点云分类模型(如:PointNet)做进一步分类。

4964

VB 枚举隐藏进程

这篇文章是我翻译了两篇VC文章结合在一起的成果~具体是翻译的文章出处我也不清楚,我也是在网络上找到的希望原作者见谅!此文章是通过获取内核数据枚举EPROCESS结构来枚举进程的.所以现在大部分隐藏进程的程序都可以有一一列出来.在有的机器上运行可能会出错.由于时间关系我只写了检查注释如果有不懂的大家请在这里留言我会一一作答.下面是VB源码:VERSION 5.00Begin VB.Form

chenhui530的专栏 4724

自动化测试软件设计:C# + VISA 库实现多接口(GPIB/USB)测试仪器控制

本文介绍了如何利用C#和VISA库开发支持多接口的自动化测试软件。VISA库作为标准化API,能够统一控制GPIB、USB等不同接口的测试设备。文章详细阐述了软件设计目标,包括多接口支持、统一控制、自动化脚本执行等功能。重点讲解了C#中VISA库的安装配置,并提供了设备控制类的核心代码实现,涵盖设备连接、命令发送、响应读取等关键操作。通过具体示例展示了GPIB和USB设备的连接方式,并扩展了自动化测试脚本功能。该方案具有高扩展性和维护性,适用于电子设备测试、生产线检测等多种场景,为自动化测试系统开发提供了实

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1713

消息平台接入实战:Hermes Agent 实现微信/钉钉日常任务自动化的 4 步配置

揭示 Hermes Agent 接入微信/钉钉时高频失效的根本原因——非 API 调用问题,而是上下文边界缺失;详解通过 soul.md 锁定人格基线、skills/ 目录原子化封装技能、CLAUDE.md 控制记忆节奏、Docker 环境适配四步构建可信赖自动化信任链,并给出身份证号过滤、中文标点

weixin_42520239的博客 165

C/C++:Windows编程—创建进程、终止进程、枚举进程、枚举线程、枚举DLL

进程、线程及DLL枚举API介绍 无论是枚举进程还是枚举进程中的DLL文件,方法都是相同的,都是通过创建指定的相关快照,再通过循环逐条获取快照的内容。类似的枚举线程、枚举堆都是相同的方法,差别只是在创建快照时的参数不同,逐条获取快照的内容时的API函数不同而已。 枚举进程的API函数:CreateToolhelp32Snapshot()、Process32First()、Process32Next...

重庆李四 7431

【Dify】PPT生成工具应用

本文介绍了一款自动化PPT生成工具,通过智能接口将文本内容高效转化为结构化演示文档。该系统采用三阶段工作流(内容输入、HTTP请求上传、文件输出),无需复杂操作即可生成专业PPT。工具适用于教学课件、产品发布、企业培训等场景,能显著提升内容表达效率,特别适合初学者快速制作演示材料。文章详细说明了核心节点、应用场景及开发资源,为文本到PPT的自动化转换提供了实用解决方案。

Mr数据杨 1218

Windows下如何枚举所有进程

要编写一个类似于 Windows 任务管理器的软件,首先遇到的问题是如何实现枚举所有进程。暂且不考虑进入核心态去查隐藏进程一类的,下面提供几种方法。请注意每种方法的使用局限,比如使用这些 API 所需要的操作系统是什么(尤其是是否能在 Windows Mobile 下使用)。   本文参考用户态枚举进程的几种方法,原文对于每一种方法都给出了完整的代码,被我照抄下来。还有一篇:如何用 Win32 ...

weixin_34116110的博客 866

三菱MC协议(MC/TCP):避坑指南|C#实现三菱MC协议:软元件(X/Y/M/D)读写与帧格式解析

核心避坑逻辑:MC协议的坑80%集中在“PLC配置”“地址编码”“字节序”,先解决这三点,通信就成功了一半;实战优先级:新手优先用开源库(Mitsubishi.MCProtocol),避免手动拼接帧格式的复杂坑;进阶再研究帧格式解析;排坑技巧:先Ping通→用调试助手验证→写C#代码,分层排查,不要混在一起找问题。掌握这些避坑技巧后,你可以轻松实现C#与三菱全系列PLC的稳定通信,满足工业场景中数据采集、设备控制等核心需求。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 2197

【超分辨率(Super-Resolution)】关于【超分辨率重建】专栏的相关说明,包含专栏简介、专栏亮点、适配人群、相关说明、阅读顺序、超分理解、实现流程、研究方向、论文代码数据集汇总等

本专栏研究领域为【超分辨率重建】,涵盖图像超分、视频超分,实时超分,4K修复等方面。主要内容包括主流算法模型的论文精读、论文复现、毕业设计、涨点手段、调参技巧、论文写作、应用落地等方面。算法模型从SRCNN开始更新至今,一般是一篇论文精读对应一篇论文复现。论文精读详解理论,归化繁为简,归纳核心,积累词句,培养阅读论文和论文写作能力。论文复现依托Pytorch代码,实现完整的模型训练流程,总结调参方法,记录碰到的bug,论文插图可视化,培养读写代码能力、做实验的能力、以及应用落地能力。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 3万+

枚举进程,枚举窗口

枚举进程要用到下面几个函数1。HANDLE handle = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);得到一个processes and the heaps, modules, and threads 的快照,参数0表示从当前进程取得。2。PROCESSENTRY32 procinfo;procinfo.dwSize = si

vinep的专栏 2516

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

枚举进程的几种方法

原地址:http://blog.sina.com.cn/s/blog_97312deb01017loy.html 1、利用ToolHelp API 首先创建一个系统快照,然后通过对系统快照的访问完成进程的枚举。 获取系统快照使用CreateToolhelp32Snapshot() 函数 函数原型声明如下: HANDLE WINAPICreateToolhelp32Snapshot(

u014230987的专栏 928

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

内核枚举进程总结

我知道的有三种方法 这里的第三种和第二种是一样的 隐藏进程也可以在这么做手脚 但需要注意多线程,在操作前,理应加锁 可以参考这篇文章 http://blog.youkuaiyun.com/zfdyq0/article/details/41813747 1.暴力枚举进程 通过PsLookupProcessByProcessId获得EPROCESS 第一个参数我们使用循环 填入0~6553

zhuhuibeishadiao 3770

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: stl string常用函数
下一篇: 线程中CreateEvent和SetEvent及WaitForSingleObject的用法
CButtonST
博客等级 码龄16年 42粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值