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#调用例子的更多相关文章

  1. 将QT开发的界面程序封装成DLL,在VC中成功调用

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  2. C#封装成DLL,并在C#中调用

    一.C#封装成DLL 1.在VS中创建项目选择类库,命名 myDll 2.建立好项目后自动生成的代码如下: 代码修改如下,添加自己要封装的C#代码,注意修饰符必须为public using Syste ...

  3. 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  4. 使用DOS命令将类库封装成dll

    1.Windows键+R.输入cmd进入DOS 2.使用 cd  加路径找到需要封装成dll的类库文件 3.csc /target:library /out:dll的名字.DLL 需要封装的cs文件

  5. Android 获取地理位置信息 封装好了 直接用

    前言:花了一个早上研究了以下android获取经纬度,然后网上的参考资料都是杂七杂八,基本上都是过去几年的,现在我用 android6.0参照别人的结果发生好多错误,我的内心几乎是崩溃的.后来,不断百 ...

  6. unity脚本封装成dll

    先申明一下这样做是有需要的.当我们需要把脚本提供给第三方使用,而又不希望对方看到具体的实现过程,这时候就需要将代码封装编译成dll文件,供第三方调用.或是多个项目都要用到同一个模块或同样的功能,则可以 ...

  7. VisualStuido中将C#脚本封装打包DLL并调用

    DLL (Dynamic Link Library)---动态链接库 首先了解下使用DLL的优势,程序运行时不用加载所有代码,只有运行到引用时,才从DLL库中取出.并且使用DLL文件还可以减小程序体积 ...

  8. Delphi Dll 动态调用例子(3)-仔细看一下

    http://blog.163.com/bxf_0011/blog/static/35420330200952075114318/ Delphi 动态链接库的动态和静态调用 为了让人能快速的理解 静态 ...

  9. 如何将.il、.res文件封装成dll文件

    将你的.il..res文件保存在你的硬盘上,如下图: 我存放的路径在E盘的test文件夹中,我们开始封装了咯.进入DOS命令,如下图: 我们通过DOS命令先进入.il..res文件目录,如下图: 然后 ...

  10. 将webservice封装成dll

    生成dll文件的步骤如下:1.发布完成后,在浏览器中打开WebService文件,如:http://localhost/WebSer/WebService1.asmx,可以看到WebService1. ...

随机推荐

  1. 存储过程分页以及参数拼接sql语句、C#调用存储过程

    1.C#调用存储过程,带参数返回的功能,而且是参数化拼接,这样就可以防止sql注入 System.Data.SqlClient.SqlParameter[] parameters = { new Sy ...

  2. APB_AHB_AXI协议的简单介绍

    一.AMBA概述 今天要介绍的三种嵌入式总线技术:APB.AHB.AXI,它们都属于AMBA 片上总线协议.所以,在介绍这几种总线技术之前,有必要先了解一下AMBA 片上总线协议是什么. AMBA ( ...

  3. jq 实现select 下拉框的联动效果

    实现联动的代码 $(document).ready(function() { $("#selectone").bind("change",function(){ ...

  4. Java 21 虚拟线程如何限流控制吞吐量

    虚拟线程(Virtual Threads)是 Java 21 所有新特性中最为吸引人的内容,它可以大大来简化和增强Java应用的并发性.但是,随着这些变化而来的是如何最好地管理此吞吐量的问题.本文,就 ...

  5. Ubuntu/Centos下OpenJ9 POI输出Excel的Bug

    项目更换 JDK为 OpenJ9 后, 使用 POI 导出 Excel 遇到的问题 OpenJ9 版本信息 /opt/jdk/jdk-11.0.17+8/bin/java -version openj ...

  6. zTree如何实现模糊查找实战

    1.说明 最近在研究zTree树控件.过程中涉及到了实现模糊查找结点的功能,特此分享一下. 有关zTree的有关介绍和使用,请访问其官网:zTree -- jQuery 树插件 本文假设你已经比较熟悉 ...

  7. java打印杨辉三角

    package com.dylan.practice.interview; /** * 打印杨辉三角 * * 原理 * 1.每个数等于它上方两数之和 * 2.第n行的数字有n个 * * @author ...

  8. Python中 r'', b'', u'', f'' 的含义

    python中 r'', b'', u'', f'' 的含义   r/R:非转义的原始字符串 与普通字符相比,其他相对特殊的字符,其中可能包含转义字符,即那些,反斜杠加上对应字母,表示对应的特殊含义的 ...

  9. C++检测句柄的权限

    主要是依靠NtQueryObject函数,其中需要传入ObjectBasicInformation参数 PUBLIC_OBJECT_BASIC_INFORMATION结构包含可用于对象的全部信息的子集 ...

  10. FART 脱壳机原理分析

    FART是一个基于Android 源码修改的脱壳机 可以脱整体壳和抽取壳 FART脱壳的步骤主要分为三步: 1.内存中DexFile结构体完整dex的dump 2.主动调用类中的每一个方法,并实现对应 ...