Laden...

Auslesen der Prozesstabelle [==> Process.GetProcesses()]

Erstellt von SnowballTwo vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.259 Views
S
SnowballTwo Themenstarter:in
11 Beiträge seit 2009
vor 12 Jahren
Auslesen der Prozesstabelle [==> Process.GetProcesses()]

Hallo,

ich versuche zurzeit in C# die Funktion(en) der Winapi zum Auslesen der Prozesstabelle zu nutzen.

Dazu habe ich folgende Klasse geschrieben:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct PROCESSENTRY32W
        {
            public ulong    dwSize;
            public ulong    cntUsage;
            public ulong    th32ProcessID;
            public UIntPtr  th32DefaultHeapID;
            public ulong    th32ModuleID;
            public ulong    cntThreads;
            public ulong    th32ParentProcessID;
            public long     pcPriClassBase;
            public ulong    dwFlags;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string   szExeFile;
        };

        [DllImport("kernel32.dll")]  
        static extern int CreateToolhelp32Snapshot(int flags, int pid);
        [DllImport("kernel32.dll")]  
        static extern bool Process32First(int snapshot, ref PROCESSENTRY32W proc);
        [DllImport("kernel32.dll")]
        static extern bool Process32Next(int snapshot, ref PROCESSENTRY32W proc);

        private List<string> ProcessList;

        public ProcessInfo()
        {
            ProcessList = new List<string>();

            PROCESSENTRY32W  lsPE = new PROCESSENTRY32W();

            int Snapshot = CreateToolhelp32Snapshot(0x02, 0);
            
            lsPE.dwSize = (ulong)Marshal.SizeOf(lsPE);

            if (Process32First(Snapshot, ref lsPE))
            {
                ProcessList.Add(lsPE.szExeFile);
                while (Process32Next(Snapshot, ref lsPE))
                {
                    ProcessList.Add(lsPE.szExeFile);
                }
            }
        }

Frage1:

Die Struktur, welche ich oben nach c# portiert habe benutzt jenachdem ob UNICODE definiert ist ein WCHAR Array oder ein CHAR Array der Länge 260.
Kann ich in c# ähnlich wie in c++ "UNICODE" als Präprozessordirektive in den Projektmappeneigenschaften eintragen? (bzw. hat es dort einen Effekt auf die DLL Funktion?)

Die Originalstruktur sieht so aus (mit Unicode):

typedef struct tagPROCESSENTRY32W
{
    DWORD   dwSize;
    DWORD   cntUsage;
    DWORD   th32ProcessID;          // this process
    ULONG_PTR th32DefaultHeapID;
    DWORD   th32ModuleID;           // associated exe
    DWORD   cntThreads;
    DWORD   th32ParentProcessID;    // this process's parent process
    LONG    pcPriClassBase;         // Base priority of process's threads
    DWORD   dwFlags;
    WCHAR   szExeFile[MAX_PATH];    // Path
} PROCESSENTRY32W;

Frage2:

Die Funktionen liefern mit true zurück, jedoch wird nicht in die Struktur geschrieben. Was mache ich falsch?

MfG Snowball

1.346 Beiträge seit 2008
vor 12 Jahren

Mal ne ganz dumme Frage. Warum nicht System.Diagnoctics.Process.GetProcesses() ?

lg pdelvo

S
SnowballTwo Themenstarter:in
11 Beiträge seit 2009
vor 12 Jahren

Weil ich das bis vor ner Minute noch nicht kannte... Danke.

Wär trotz allem interessant wie die Antwort(en) auf meine Frage(n) aussehen.

309 Beiträge seit 2008
vor 12 Jahren

Weil deine Umsetzungen der C Datentypen auf die .net Datentypen volkommen falsch sind.

Ein DWORD entspricht Uint32, ein HANDLE ein IntPtr, ein ULONG_PTR ein IntPtr, usw.

Und wenn du statt Process32First Process32FirstW (die UNICODE Version) nimmst hast du auch kein Problem mit der ASCII/Inicode Umsetzung.

Hier ist ein exzellenter Artikel im MSDN er alles nötige erklärt:
Calling Win32 DLLs in C# with P/Invoke

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

S
SnowballTwo Themenstarter:in
11 Beiträge seit 2009
vor 12 Jahren

Danke.

Ich hatte einen ähnlichen Beitrag gelesen (sogar teilweise mit den gleichen Beispielen), aber der hinter deinem Link ist deutlich besser und ausführlicher.