如何将进程信息转换为WTS_PROCESS_INFO
How to Convert ProcessInfo to WTS_PROCESS_INFO
我正在尝试调用WTSEnumerateProcesses()
但是在将类型ProcessInfo
转换为WTS_PROCESS_INFO
时遇到一些问题。
这是我到目前为止的代码:
进程信息
class ProcessInfo
{
public int basePriority;
public int handleCount;
public int mainModuleId;
public long pageFileBytes;
public long pageFileBytesPeak;
public long poolNonpagedBytes;
public long poolPagedBytes;
public long privateBytes;
public int processId;
public string processName;
public int sessionId;
public ArrayList threadInfoList;
public long virtualBytes;
public long virtualBytesPeak;
public long workingSet;
public long workingSetPeak;
public ProcessInfo()
{
}
}
WTS_PROCESS_INFO
public struct WTS_PROCESS_INFO
{
public int SessionID;
public int ProcessID;
// This is spointer to a string...
public IntPtr ProcessName;
public IntPtr userSid;
}
WTSEnumerateProcesses()
[DllImport("wtsapi32.dll", SetLastError = true)]
static extern bool WTSEnumerateProcesses(
IntPtr serverHandle, // Handle to a terminal server.
Int32 reserved, // must be 0
Int32 version, // must be 1
ref IntPtr ppProcessInfo, // pointer to array of WTS_PROCESS_INFO
ref Int32 pCount // pointer to number of processes
);
public static WTS_PROCESS_INFO[] WTSEnumerateProcesses()
{
IntPtr pProcessInfo = IntPtr.Zero;
int processCount = 0;
var hServer = OpenServer("XA7-06");
if (!WTSEnumerateProcesses(hServer, 0, 1, ref pProcessInfo, ref processCount))
return null;
IntPtr pMemory = pProcessInfo;
WTS_PROCESS_INFO[] processInfos = new WTS_PROCESS_INFO[processCount];
for (int i = 0; i < processCount; i++)
{
processInfos[i] = (ProcessInfo)Marshal.PtrToStructure(pProcessInfo, typeof(WTS_PROCESS_INFO));
pProcessInfo = (IntPtr)((int)pProcessInfo + Marshal.SizeOf(processInfos[i]));
}
WTSFreeMemory(pMemory);
return processInfos;
}
我的问题接近此行WTSEnumerateProcesses()
方法的末尾:
processInfos[i] = (ProcessInfo)Marshal.PtrToStructure(pProcessInfo, typeof(WTS_PROCESS_INFO));
我认为我可能错过了定义WTS_PROCESS_INFO
和ProcessInfo
之间关系的步骤,但我不确定如何做到这一点。有人能为我指出正确的方向吗?
这是我看到的错误:
// Cannot implicitly convert type 'ProcessInfo' to 'WTS_PROCESS_INFO'
您的ProcessInfo
类型与WTS_PROCESS_INFO
无关。所以这行:
processInfos[i] = (ProcessInfo)Marshal.PtrToStructure(pProcessInfo,
typeof(WTS_PROCESS_INFO));
实际上包含两个错误。编译器选取一个。具体来说,该processInfos[i]
属于 WTS_PROCESS_INFO
类型,并且与 ProcessInfo
的赋值不兼容。另一个错误更微妙一些。Marshal.PtrToStructure()
返回的值转换为类型 ProcessInfo
是错误的。Marshal.PtrToStructure()
返回的值是一个带框的WTS_PROCESS_INFO
。所以这行代码应该是:
processInfos[i] = (WTS_PROCESS_INFO)Marshal.PtrToStructure(pProcessInfo,
typeof(WTS_PROCESS_INFO));
指针算术可能会在 64 位进程中失败。如果您使用的是最新版本的 .net,则可以直接在 Intptr 上执行算术运算:
pProcessInfo += Marshal.SizeOf(processInfos[i]);
或者,如果面向较旧的 .net 版本,则应通过强制转换为 ulong
而不是 int
在 64 位上下文中执行算术。
至于你的ProcessInfo
类型,我认为这只是你的错误想法。这种类型在这里似乎没有用。
如果我是你,我会强制使用 Unicode 版本的 WTSEnumerateProcessesW
,例如这样:
[DllImport("wtsapi32.dll", EntryPoint = "WTSEnumerateProcessesW", SetLastError = true)]
static extern bool WTSEnumerateProcesses(
....
);
若要将进程名称读取为字符串,请将 WTS_PROCESS_INFO
结构中返回的指针传递给 Marshal.PtrToStringUni
。
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- 以某种方式告诉编译器"Do not process line of code"
- 尝试通过Process Pipe发送/接收到python包装器,c ++代码
- Boost::process on Windows - with MinGW?
- 如何将IEnumerable与Process.Start的输出事件处理程序一起使用?
- 使用单独的参数调用"boost::process::system()"时,获取"execv
- Boost.Process - 从具有休眠循环的进程读取
- AWS Lambda C++ 开发工具包"Process exited before completing request"
- 保持 boost.process 在函数之外处于活动状态,该函数被调用
- 使用boost.process同时读取和写入孩子的STDIO
- Android 从 Runtime.exec() 或 Java.Process() 执行本机库
- c++ get Process.GetCurrentProcess().SessionId
- BOOST PROCESS RUNTUN()和EXIT_CODE()线程安全
- 传递向量或论点以bubost :: process(boost :: fusion)
- 即使包含 process.h,_beginthreadex 和 _endthreadex 也是未定义的
- 我的程序在尝试将数据集追加到类对象时遇到"Process returned -1073741819 (0xC0000005)"
- 程序在使用异步的 Boost.Process 调用 std::future.get() 后挂起
- 如何在 boost.process 间共享内存中使用复杂结构"push_back"函数向量
- 由procexp(MS process explorer)创建的VC10调试转储文件-只有堆栈信息,没有变量值
- 为什么"Start Debugging"比VC2010中的"attach to process"慢得多?