gpt4 book ai didi

c# - 如何将 ProcessInfo 转换为 WTS_PROCESS_INFO

转载 作者:行者123 更新时间:2023-11-30 05:31:22 24 4
gpt4 key购买 nike

我正在尝试调用 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_INFOProcessInfo 之间关系的步骤,但我不确定该怎么做。有人能指出我正确的方向吗?

这是我看到的错误:

// 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 类型,我认为这只是您的错误想法。这种类型在这里似乎没有用。

如果我是你,我会强制使用 WTSEnumerateProcessesW 的 Unicode 版本,例如:

[DllImport("wtsapi32.dll", EntryPoint = "WTSEnumerateProcessesW", SetLastError = true)]
static extern bool WTSEnumerateProcesses(
....
);

要将进程名称作为字符串读取,请将 WTS_PROCESS_INFO 结构中返回的指针传递给 Marshal.PtrToStringUni

关于c# - 如何将 ProcessInfo 转换为 WTS_PROCESS_INFO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com