C++获取任务管理器信息,封装成DLL,C#调用例子
C++代码
pch.h
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#include "tchar.h"
// 调整访问权限 返回 0 成功 1 失败(动态库加载时会自动调用)
extern "C" __declspec(dllexport)
int __stdcall Dog_AdjustPrivileges();
// 查询进程数据 返回值是进程总数 返回-1调用异常, 该接口与接口Dog_GetNextProcessInfo配合使用
extern "C" __declspec(dllexport)
int __stdcall Dog_QueryProcess();
// 获取进程数据 在调用了Dog_QueryProcess后,获取进程详细数据, 返回 0 成功 1 失败 -1 调用异常
// Pid 进程ID(输出参数)
// lpPName 进程名称(输出参数)
// lpFullPath 进程程序物理全路径(输出参数)
// lpRes1 备用(输出参数)
// lpRes2 备用(输出参数)
extern "C" __declspec(dllexport)
int __stdcall Dog_GetNextProcessInfo(DWORD &Pid, LPTSTR lpPName, LPTSTR lpFullPath, LPTSTR lpRes1, LPTSTR lpRes2);
#endif //PCH_H
dllmain.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
// 提升访问权限
if (!Dog_AdjustPrivileges())
{
//提升权限失败
int Error = -1;
}
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
pch.cpp
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
#include <TlHelp32.h>
//#include <afxtempl.h>
// 进程数据
struct PROCESS_ITME
{
PROCESS_ITME()
{
IsValid = 0;
SortIndex = -1;
ProcessID = 0;
memset(ProcessName, 0, 260);
memset(ProcessFullPath, 0, 756);
}
void INIT()
{
IsValid = 0;
SortIndex =-1;
ProcessID = 0;
memset(ProcessName, 0, 260);
memset(ProcessFullPath, 0, 756);
}
unsigned char IsValid;
short SortIndex;
DWORD ProcessID;
TCHAR ProcessName[260];
TCHAR ProcessFullPath[756];
};
#define MAX_PROCEES 1024
struct PROCESS_INFO
{
PROCESS_INFO()
{
ProcessNum = 0;
}
short ProcessNum; //数量
PROCESS_ITME ProcessData[MAX_PROCEES];
};
PROCESS_INFO ProcessInfo;
//提升访问权限
BOOL AdjustPrivileges()
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tp = { 0 };
TOKEN_PRIVILEGES oldtp = { 0 };
DWORD dwSize = sizeof(TOKEN_PRIVILEGES);
LUID luid = { 0 };
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
return TRUE;
else
return FALSE;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {
CloseHandle(hToken);
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
return TRUE;
}
BOOL GetProcessList()
{
try
{
ProcessInfo.ProcessNum = 0;
int nCount = 0;
BOOL bResult = FALSE;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnap == INVALID_HANDLE_VALUE)
return FALSE;
HANDLE hProcess = NULL;
PROCESSENTRY32 info = { 0 };
info.dwSize = sizeof(PROCESSENTRY32);
TCHAR processBaseName[512] = _T("");
DWORD nameBufferSize = 510;
BOOL bRet = Process32First(hSnap, &info);
while (bRet)
{
memset(processBaseName, 0, 512);
nameBufferSize = 510;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, info.th32ProcessID);
if (hProcess)
{
GetModuleFileNameEx(hProcess, NULL, processBaseName , nameBufferSize );
}
else
{
hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, info.th32ProcessID);
if (hProcess)
{
QueryFullProcessImageName(hProcess, NULL, processBaseName, &nameBufferSize);
}
else
{
}
}
CloseHandle(hProcess);
// 赋值数据
ProcessInfo.ProcessData[nCount].INIT();
ProcessInfo.ProcessData[nCount].IsValid = 1;
//ProcessInfo.ProcessData[nCount].SortIndex = info.th32ProcessID;
ProcessInfo.ProcessData[nCount].ProcessID = info.th32ProcessID;
_stprintf(ProcessInfo.ProcessData[nCount].ProcessName , _T("%s"), info.szExeFile);
_stprintf(ProcessInfo.ProcessData[nCount].ProcessFullPath , _T("%s"), processBaseName);
nCount++;
bRet = Process32Next(hSnap, &info);
}
CloseHandle(hSnap);
ProcessInfo.ProcessNum = nCount;
return TRUE;
}
catch (...)
{
}
return FALSE;
}
// 查询进程数据 返回进程数量
extern "C" __declspec(dllexport)
int __stdcall Dog_QueryProcess()
{
try
{
if (GetProcessList())
{
return ProcessInfo.ProcessNum;
}
}
catch (...)
{
return -1;
}
return 0;
}
// 获取进程数据 在调用了QueryProcess后,获取进程详细数据
extern "C" __declspec(dllexport)
int __stdcall Dog_GetNextProcessInfo(DWORD &Pid, LPTSTR lpPName, LPTSTR lpFullPath , LPTSTR lpRes1, LPTSTR lpRes2 )
{
try
{
if ( ProcessInfo.ProcessNum > 0)
{
int nCount = ProcessInfo.ProcessNum;
int tSort = -1;
int minIndex = -1;
int isHaved = 0;
for (int i = 0; i < nCount; i++)
{
if (ProcessInfo.ProcessData[i].IsValid == 1)
{
if (tSort == -1)
{
tSort = ProcessInfo.ProcessData[i].ProcessID;
minIndex = i;
}
else
{
if (ProcessInfo.ProcessData[i].ProcessID <= tSort)
{
tSort = ProcessInfo.ProcessData[i].ProcessID;
minIndex = i;
}
}
isHaved = 1;
}
}
if (isHaved && minIndex >= 0 )
{
Pid = ProcessInfo.ProcessData[minIndex].ProcessID;
if (lpPName != NULL)
{
_stprintf(lpPName, _T("%s"), ProcessInfo.ProcessData[minIndex].ProcessName);
}
if (lpFullPath != NULL)
{
_stprintf(lpFullPath, _T("%s"), ProcessInfo.ProcessData[minIndex].ProcessFullPath);
}
ProcessInfo.ProcessData[minIndex].INIT();
return 1;
}
else
ProcessInfo.ProcessNum = 0;
}
}
catch (...)
{
return -1;
}
return 0;
}
// 调整访问权限
extern "C" __declspec(dllexport)
int __stdcall Dog_AdjustPrivileges( )
{
if (AdjustPrivileges())
return 1;
return 0;
}
C#调用代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WinDog_dll_test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
[DllImport("WinDog.dll", EntryPoint = "Dog_QueryProcess", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int Dog_QueryProcess();
[DllImport("WinDog.dll", EntryPoint = "Dog_GetNextProcessInfo", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int Dog_GetNextProcessInfo_byte(ref int Pid, ref byte lpPName, ref byte lpFullPath, ref byte lpRes1, ref byte lpRes2);
[DllImport("WinDog.dll", EntryPoint = "Dog_GetNextProcessInfo", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
private static extern int Dog_GetNextProcessInfo_StringBuilder(ref int Pid, StringBuilder lpPName, StringBuilder lpFullPath, StringBuilder lpRes1, StringBuilder lpRes2);
/// <summary>
/// 获取进程详细信息(byte)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
int nProcessNum = Dog_QueryProcess();
int pid = 0;
StringBuilder pName = new StringBuilder(1024);
StringBuilder fullPath = new StringBuilder(1024);
StringBuilder res1 = new StringBuilder(1024);
StringBuilder res2 = new StringBuilder(1024);
while (Dog_GetNextProcessInfo_StringBuilder(ref pid, pName, fullPath, res1, res2) > 0)
{
Console.WriteLine(string.Format("pid:{0}, pName:{1}, fullPath:{2}", pid, pName, fullPath));
}
}
/// <summary>
/// 获取进程详细信息(StringBuilder)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
int nProcessNum = Dog_QueryProcess();
int pid = 0;
byte[] sName = new byte[1024];
byte[] sFullPath = new byte[1024];
byte[] sRes1 = new byte[1024];
byte[] sRes2 = new byte[1024];
while (Dog_GetNextProcessInfo_byte(ref pid, ref sName[0], ref sFullPath[0], ref sRes1[0], ref sRes2[0]) > 0)
{
string NameString = ByteToString(sName, 1024);
string FullPathString = ByteToString(sFullPath, 1024);
Console.WriteLine(string.Format("pid:{0}, pName:{1}, fullPath:{2}", pid, NameString, FullPathString, sRes1, sRes2));
}
}
public String ByteToString(byte[] bytes, int Lenth)
{
string temp = System.Text.Encoding.Unicode.GetString(bytes).ToString();
int i = 0;
for (i = 0; i < Lenth; i++)
{
if (temp[i] == '\0')
{
break;
}
}
return temp.Substring(0, i);
}
}
}
效果
C++获取任务管理器信息,封装成DLL,C#调用例子的更多相关文章
- 将QT开发的界面程序封装成DLL,在VC中成功调用
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- C#封装成DLL,并在C#中调用
一.C#封装成DLL 1.在VS中创建项目选择类库,命名 myDll 2.建立好项目后自动生成的代码如下: 代码修改如下,添加自己要封装的C#代码,注意修饰符必须为public using Syste ...
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- 使用DOS命令将类库封装成dll
1.Windows键+R.输入cmd进入DOS 2.使用 cd 加路径找到需要封装成dll的类库文件 3.csc /target:library /out:dll的名字.DLL 需要封装的cs文件
- Android 获取地理位置信息 封装好了 直接用
前言:花了一个早上研究了以下android获取经纬度,然后网上的参考资料都是杂七杂八,基本上都是过去几年的,现在我用 android6.0参照别人的结果发生好多错误,我的内心几乎是崩溃的.后来,不断百 ...
- unity脚本封装成dll
先申明一下这样做是有需要的.当我们需要把脚本提供给第三方使用,而又不希望对方看到具体的实现过程,这时候就需要将代码封装编译成dll文件,供第三方调用.或是多个项目都要用到同一个模块或同样的功能,则可以 ...
- VisualStuido中将C#脚本封装打包DLL并调用
DLL (Dynamic Link Library)---动态链接库 首先了解下使用DLL的优势,程序运行时不用加载所有代码,只有运行到引用时,才从DLL库中取出.并且使用DLL文件还可以减小程序体积 ...
- Delphi Dll 动态调用例子(3)-仔细看一下
http://blog.163.com/bxf_0011/blog/static/35420330200952075114318/ Delphi 动态链接库的动态和静态调用 为了让人能快速的理解 静态 ...
- 如何将.il、.res文件封装成dll文件
将你的.il..res文件保存在你的硬盘上,如下图: 我存放的路径在E盘的test文件夹中,我们开始封装了咯.进入DOS命令,如下图: 我们通过DOS命令先进入.il..res文件目录,如下图: 然后 ...
- 将webservice封装成dll
生成dll文件的步骤如下:1.发布完成后,在浏览器中打开WebService文件,如:http://localhost/WebSer/WebService1.asmx,可以看到WebService1. ...
随机推荐
- 手动实现apply、call、bind
手动实现apply.call.bind 每个Function对象都存在apply().call().bind()方法,其作用都是可以在特定的作用域中调用函数,等于设置函数体内this对象的值,以扩充函 ...
- centos7创建MySQL自动备份脚本
说明 最近需要给wordpress站点搞一个定时备份mysql数据库,所以记录一下. 操作步骤 1.创建备份脚本 这一步最重要,创建目录:/home/wpblog_backup,然后在目录下创建she ...
- spring boot发邮件
项目地址:https://gitee.com/indexman/spring_boot_in_action 在task模块下,我写了test类 邮件发送流程: 发件方:836491384@qq.com ...
- Java集合框架学习(一)介绍
介绍 Java集合框架是一组接口和类的集合,它使得存储和处理数据更加有效率. 该框架有一些类,有很多函数使得程序员更加容易的处理集合类型数据. 后面的教程就是针对这些常用类展开,配合例子代码来给大家一 ...
- Innodb存储引擎的文件
目录 概述 参数文件 日志文件 错误日志 慢查询日志 查询日志 二进制日志 binary log 二进制日志的配置 二进制日志的作用 二进制日志的保存 socket 套接字文件 pid文件 MySQL ...
- win32-ReadProcessMemory在x86和x64下运行
#include <iostream> #include <Windows.h> #include <winternl.h> #include <tchar. ...
- 【Android 逆向】【攻防世界】APK逆向
1. apk安装到手机,提示输入flag 2. jadx打开apk 定位到checkSN方法 public boolean checkSN(String userName, String sn) { ...
- 文心一言 VS 讯飞星火 VS chatgpt (202)-- 算法导论15.3 1题
一.对于矩阵链乘法问题,下面两种确定最优代价的方法哪种更高效?第一种方法是穷举所有可能的括号化方案,对每种方案计算乘法运算次数,第二种方法是运行RECURSIVE-MATRIX-CHAIN.证明你的结 ...
- 使用俩个链接在一起的容器运行wordpress
# 问题,如何分离mysql和wordpress,使它们每个都单独运行一个容器. # 解决办法:运行时通过--link选项使它们链接在一起 --link <container_name>: ...
- 记录一个错误:Unable to find a match: python-dev
今天尝试在Linux下运行一个Python项目,在安装requirements.txt时报错 执行命令如下: [root@VM-16-8-centos cve-search]# pip3 instal ...