Prozesse auslesen

Vorhin hat sich dann sogar mein PC aufgehängt, kam ein Bluescreen mit Hard Error. war ganz schön geschockt, aber gott sei dank ist er ohne Probleme hochgefahren.
Vermutlich ist dein PC / Speicher / deine Festplatte defekt.
Also ich starte Procman.exe, dann erscheint folgende Anzeige: Zwischenablage02.jpg

Vorhin hatte ich Path ends with psapi.h then Include ausgewählt und Add geklickt.
Richtig.
Jetzt versuche ich lieber mal Path ends with psapi.h then exclude
Falsch.
, also bei mir läuft das dann schon länger als 2-3min, jetzt läufts nämlich schon 10min und unten steht dann "the current filter exclues all 2.684.745 events" und die zahlt steigt sekündlich.
Du mußt das nur solange laufen lassen bis die Kompilierung abgeschlossen ist.
Ok jetzt gings doch noch schnell, wenn ich then include angebe, dann ist das Ergebnis no events (capture disabled) und wenn ich exclude angebe, werden einige Prozesse angezeigt.
Was wird angezeigt?

Hast du denn mal in %programfiles%\Microsoft SDKs\Windows\vX.Y\include geschaut?

Gruß
 
Ok habe jetzt nochmal Procmon.exe mit dem Filter path ends with psapi.h then include gestartet, wenn ich beim Filter auf ok klicke, dann kommt manchmal erst so ein kleines Fenster(manchmal auch nicht), wo er recht schnell die Prozente hochzählt und anschließend wird das hier angezeigt:Zwischenablage03.jpg - lasse es mal weiterlaufen, hoffe er beendet sich dann irgendwann und zeigt was an, womit wir was anfangen können :)

Also mein Rechner ist recht neu und läuft jetzt wieder einwandfrei, hoffe mal nicht dass da was am Speicher ist.

ja hab ich - da sind ganz viele .h dateien aber kein psapi.h - ich habe auch extra mal nach psapi.h gesucht, da findet er unter program files\microsoft visual studio nichts

Hast du eine Idee, wo ich die datei herbekommen könnte bzw was ich verstellt haben könnte, so dass er nicht die psapi.h anmeckert sondern die FUnktionen?

Viele Grüße
 

Anhänge

  • Zwischenablage03.jpg
    Zwischenablage03.jpg
    59 KB · Aufrufe: 13
Ok habe jetzt nochmal Procmon.exe mit dem Filter path ends with psapi.h then include gestartet, wenn ich beim Filter auf ok klicke, dann kommt manchmal erst so ein kleines Fenster(manchmal auch nicht), wo er recht schnell die Prozente hochzählt und anschließend wird das hier angezeigt:Zwischenablage03.jpg - lasse es mal weiterlaufen, hoffe er beendet sich dann irgendwann und zeigt was an, womit wir was anfangen können
Nein, da beendet sich nichts von alleine.

Du mußt doch nun wirklich nur mal einen Kompilierungslauf starten und dann in Procmon auf F5 (bzw. auf die Lupe) drücken.
Also mein Rechner ist recht neu und läuft jetzt wieder einwandfrei, hoffe mal nicht dass da was am Speicher ist.
Ein Bluescreen kommt normalerweise nicht aus heiterem Himmel. Überprüfe den Speicher (memtest86). Könnte auch an anderer Hardware / Treibern (Viren?) liegen.
ja hab ich - da sind ganz viele .h dateien aber kein psapi.h - ich habe auch extra mal nach psapi.h gesucht, da findet er unter program files\microsoft visual studio nichts

Hast du eine Idee, wo ich die datei herbekommen könnte
Wie bereits gesagt, ist die Datei Teil des Platform SDKs. Das kann man bei Microsoft runterladen.
bzw was ich verstellt haben könnte, so dass er nicht die psapi.h anmeckert sondern die FUnktionen?
Nein. Zeig mal die kompletten Fehlermeldungen.

Gruß
 
Nein, da beendet sich nichts von alleine.

Du mußt doch nun wirklich nur mal einen Kompilierungslauf starten und dann in Procmon auf F5 (bzw. auf die Lupe) drücken.
So langsam komm ich mir echt bissl doof vor, also ich Start progmon.exe, gebe meinen Filter ein, klicke ok und dann läuft er los, wenn ich dann f5 drücke, passiert nichts und wenn cih auf die lupe klicke, kommt diese Meldung: Zwischenablage04.jpg und dann stoppt er den Lauf, zeigt aber nichts an: Zwischenablage05.jpg oder mache ich was falsch?

Ein Bluescreen kommt normalerweise nicht aus heiterem Himmel. Überprüfe den Speicher (memtest86). Könnte auch an anderer Hardware / Treibern (Viren?) liegen.
wie kann ich memtest86 durchführen? Kenne mich da leider nicht aus :(

Das sind die Fehlermeldungen:
--------------------Konfiguration: Shutdown_new - Win32 Debug--------------------
Kompilierung läuft...
Shutdown_new.cpp
C:\Projekte\Programmierung\C++\Shutdown_new\Shutdown_new.cpp(73) : error C2065: 'EnumProcessModules' : nichtdeklarierter Bezeichner
C:\Projekte\Programmierung\C++\Shutdown_new\Shutdown_new.cpp(76) : error C2065: 'GetModuleBaseName' : nichtdeklarierter Bezeichner
C:\Projekte\Programmierung\C++\Shutdown_new\Shutdown_new.cpp(199) : error C2065: 'EnumProcesses' : nichtdeklarierter Bezeichner
Fehler beim Ausführen von cl.exe.

Shutdown_new.exe - 3 Fehler, 0 Warnung(en)

Gruß
 

Anhänge

  • Zwischenablage04.jpg
    Zwischenablage04.jpg
    68,5 KB · Aufrufe: 7
  • Zwischenablage05.jpg
    Zwischenablage05.jpg
    59 KB · Aufrufe: 6
So langsam komm ich mir echt bissl doof vor, also ich Start progmon.exe, gebe meinen Filter ein, klicke ok und dann läuft er los, wenn ich dann f5 drücke, passiert nichts und wenn cih auf die lupe klicke, kommt diese Meldung: Zwischenablage04.jpg und dann stoppt er den Lauf, zeigt aber nichts an: Zwischenablage05.jpg oder mache ich was falsch?
Und du führst auch einen Kompilierungslauf durch? Und in shutdown_new.cpp befindet sich auch eine #include <psapi.h> Anweisung? Ist shutdown_new.cpp der Code aus http://msdn.microsoft.com/en-us/library/ms682623.aspx?
wie kann ich memtest86 durchführen? Kenne mich da leider nicht aus :(
z.B. indem du das ISO Image hier (http://www.memtest86.com/download.html) runterlädst, auf eine CD(-RW) brennst und den Rechner damit startest.

Gruß
 
Ich habe jetzt festgestellt, wann er die Fehlermeldung anzeigt, dass er <psapi.h> nicht findet. Ich habe eine MFC-Anwendung und hatte die beiden BLöcke vertauscht:

#include "stdafx.h"
#include "Shutdown.h"
#include "ShutdownDlg.h"


#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>

Wenn ich mit dem windows.h Block anfange und den anderen darunter kopiere, dann kennt er die Funktionen EnumProcesses, EnumProcessModules,.. nicht. Wenn ich in der Reihenfolge verwende, in der es oben steht, kommt folgende Fehlermeldung:

fatal error C1083: Include-Datei kann nicht geöffnet werden: 'psapi.h': No such file or directory

Ich habe auch schon auf der msdn-Seite gesucht, aber ein SDK für Visual Studio C++ 6.0 habe ich bisher nicht gefunden. Hast du eine Idee, wo ich das herbekommen könnte bzw wie ich die psapi.h bekommen könnte? Oder müsste das bei meinem Visual C++ dabei sein und ich muss mich sozusagen an den Help Support meiner Firma wenden?

danke für den Tipp mit memtest86, werde ich auf jeden Fall ausprobieren. Hoff ich hab genügend Rechte um das auszuführen!

Viele Grüße
 
Ich habe jetzt festgestellt, wann er die Fehlermeldung anzeigt, dass er <psapi.h> nicht findet. Ich habe eine MFC-Anwendung und hatte die beiden BLöcke vertauscht:

#include "stdafx.h"
#include "Shutdown.h"
#include "ShutdownDlg.h"


#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>

Wenn ich mit dem windows.h Block anfange und den anderen darunter kopiere, dann kennt er die Funktionen EnumProcesses, EnumProcessModules,.. nicht. Wenn ich in der Reihenfolge verwende, in der es oben steht, kommt folgende Fehlermeldung:

fatal error C1083: Include-Datei kann nicht geöffnet werden: 'psapi.h': No such file or directory
Seltsam.

Was steht denn in der stdafx.h?

Grundsätzlich: die stdafx.h muss die erste Datei sein, die du einbindest.
Ich habe auch schon auf der msdn-Seite gesucht, aber ein SDK für Visual Studio C++ 6.0 habe ich bisher nicht gefunden. Hast du eine Idee, wo ich das herbekommen könnte bzw wie ich die psapi.h bekommen könnte? Oder müsste das bei meinem Visual C++ dabei sein und ich muss mich sozusagen an den Help Support meiner Firma wenden?
Normalerweise ist eine Version des Platform SDKs bei VS dabei. Allerdings weiß ich nicht wie das bei VC++ 6 aussah (so alt bin ich noch nicht ;)). Die Version des SDKs ist dann z.B. nicht v6.0 sondern v6.0A.

Das aktuelle Windows SDK kann man hier runterladen: http://www.microsoft.com/downloads/...69-9671-4330-a63e-1fd44e0e2505&displaylang=en

\edit: Hab gerade gelesen, das VC++ 6.0 nicht von dem SDK unterstützt wird. Auf der Seite vom Windows Server 2003 R2 SDK (welches immerhin schon von 2006 ist) steht:
The last SDK that will work with VC 6.0 is the February 2003 Edition, you can order a CD on the fulfillment site. Side by side installations are not supported.
Vermutlich mußt du mal in deiner Firma fragen ob sie dir mal das SDK installieren oder nicht endlich mal einen anständigen Compiler / IDE erwerben wollen...

Findest du denn eine tlhelp32.h auf deinem Rechner?
danke für den Tipp mit memtest86, werde ich auf jeden Fall ausprobieren. Hoff ich hab genügend Rechte um das auszuführen!
Wenn du CDs brennen darfst und der Rechner von CD bootet (bzw. du das im BIOS Setup einstellen darfst) ist alles OK.

Gruß
 
Zuletzt bearbeitet:
Wollte grad mal die stdafx.h anhängen, dies ging aber nicht. Hier also der content:

Code:
// stdafx.h : Include-Datei für Standard-System-Include-Dateien,
//  oder projektspezifische Include-Dateien, die häufig benutzt, aber
//      in unregelmäßigen Abständen geändert werden.
//

#if !defined(AFX_STDAFX_H__B40B769D_81A7_4642_B53D_A9A61B1DBC72__INCLUDED_)
#define AFX_STDAFX_H__B40B769D_81A7_4642_B53D_A9A61B1DBC72__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define VC_EXTRALEAN		// Selten verwendete Teile der Windows-Header nicht einbinden

#include <afxwin.h>         // MFC-Kern- und -Standardkomponenten
#include <afxext.h>         // MFC-Erweiterungen
#include <afxdisp.h>        // MFC Automatisierungsklassen
#include <afxdtctl.h>		// MFC-Unterstützung für allgemeine Steuerelemente von Internet Explorer 4
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>			// MFC-Unterstützung für gängige Windows-Steuerelemente
#endif // _AFX_NO_AFXCMN_SUPPORT


//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ fügt unmittelbar vor der vorhergehenden Zeile zusätzliche Deklarationen ein.

#endif // !defined(AFX_STDAFX_H__B40B769D_81A7_4642_B53D_A9A61B1DBC72__INCLUDED_)

Grundsätzlich: die stdafx.h muss die erste Datei sein, die du einbindest.
Das wusste ich bisher nicht :eek: Danke da hab ich wieder was gelernt :)

Auf der Welt war ich schon als VC++ 6 rauskam, aber zum Programmieren war ich da auch noch bissl jung ;) Ist ja echt schon ganz schön alt *geschocktbin* Hatte die aktuelle Version mal heruntergeladen (war aber über einen anderen Link, da ich keine Netzversion hatte), beim Installieren meinte er dann natürlich dass die Version nicht übereinstimmen :( Hatte nochmal über deinen Link die exe heruntergeladen, aber beim Installieren hatte er glaube ich ein Problem, da ich zwar lokale Adminrechte, aber über diese dann keinen Internetzugang habe:rolleyes:

Findest du denn eine tlhelp32.h auf deinem Rechner?
Die gibt es :) Findet er unter Microsoft Visual Studio\VC98\Include, gibt dort zB auch eine Process.h aber leider keinen psapi.h :(

Wenn du CDs brennen darfst und der Rechner von CD bootet (bzw. du das im BIOS Setup einstellen darfst) ist alles OK.
CDs brennen darf ich natürlich :p das mit dem BIOS muss ich mal schauen, denk aber eigentlich schon

Gruß
 
Wollte grad mal die stdafx.h anhängen, dies ging aber nicht.
Du hättest die Endung (z.B. in .txt) ändern müssen.
Hier also der content:
OK, sieht ganz normal aus.

Das Problem ist wirklich die Reihenfolge. Wenn du vorkompilierte Header aktiviert hast (standardmäßig der Fall) werden alle #include Direktiven vor #include <stdafx.h> nicht wirklich ausgeführt. Deshalb gibt es keine Fehlermeldung und deswegen wird dann im ProcessExplorer nichts angezeigt.
Die gibt es :) Findet er unter Microsoft Visual Studio\VC98\Include, gibt dort zB auch eine Process.h aber leider keinen psapi.h :(
Dann verwende doch die Toolhelp-Variante um Prozesse auszulesen. Nicht vergessen: erst stdafx.h einbinden, dann die anderen Header.

Gruß
 
VIelen lieben Dank schon mal für deine tolle Hilfe. Bei der Toolhelp-Variante entstehen jetzt keine Fehler mehr, wenn ich den Code von der msdn-Seite kopiere, allerdings verstehe ich es noch nicht so ganz. Ich möchte den Prozess Apache.exe suchen und diesen dann herunterfahren. Ich würde in diesen Zweig kommen, da ich ja kein NT als Betriebssystem einsetze, ich verstehe allerdings nicht, wie ich an den Prozess herankomme.


Code:
} else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS
         || (osver.dwPlatformId == VER_PLATFORM_WIN32_NT
         && osver.dwMajorVersion > 4)) {

      __try {

         hInstLib = LoadLibraryA("Kernel32.DLL");
         if (hInstLib == NULL)
            __leave;

         // If NT-based OS, load VDMDBG.DLL.
         if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
            hInstLib2 = LoadLibraryA("VDMDBG.DLL");
            if (hInstLib2 == NULL)
               __leave;
         }

         // Get procedure addresses. We are linking to 
         // these functions explicitly, because a module using
         // this code would fail to load under Windows NT,
         // which does not have the Toolhelp32
         // functions in KERNEL32.DLL.
         lpfCreateToolhelp32Snapshot =
               (HANDLE (WINAPI *)(DWORD,DWORD))
               GetProcAddress(hInstLib, "CreateToolhelp32Snapshot");

         lpfProcess32First =
               (BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
               GetProcAddress(hInstLib, "Process32First");

         lpfProcess32Next =
               (BOOL (WINAPI *)(HANDLE,LPPROCESSENTRY32))
               GetProcAddress(hInstLib, "Process32Next");

         if (lpfProcess32Next == NULL
               || lpfProcess32First == NULL
               || lpfCreateToolhelp32Snapshot == NULL)
            __leave;

         if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
            lpfVDMEnumTaskWOWEx = (INT (WINAPI *)(DWORD, TASKENUMPROCEX,
                  LPARAM)) GetProcAddress(hInstLib2, "VDMEnumTaskWOWEx");
            if (lpfVDMEnumTaskWOWEx == NULL)
               __leave;
         }

         // Get a handle to a Toolhelp snapshot of all processes.
         hSnapShot = lpfCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
         if (hSnapShot == INVALID_HANDLE_VALUE) {
            FreeLibrary(hInstLib);
            return FALSE;
         }

         // Get the first process' information.
         procentry.dwSize = sizeof(PROCESSENTRY32);
         bFlag = lpfProcess32First(hSnapShot, &procentry);

         // While there are processes, keep looping.
         while (bFlag) {
            
            // Call the enum func with the filename and ProcID.
            if (lpProc(procentry.th32ProcessID, 0,
                  procentry.szExeFile, lParam)) {

               // Did we just bump into an Apache?
               if (_stricmp(procentry.szExeFile, "Apache.EXE") == 0) {
//->er geht wirklich hier rein und hier würde ich dann den Prozess beenden wollen
                  // Fill in some info for the 16-bit enum proc.
                  sInfo.dwPID = procentry.th32ProcessID;
                  sInfo.lpProc = lpProc;
                  sInfo.lParam = (DWORD) lParam;
                  sInfo.bEnd = FALSE;

                  // Enum the 16-bit stuff.
                  lpfVDMEnumTaskWOWEx(procentry.th32ProcessID,
                     (TASKENUMPROCEX) Enum16, (LPARAM) &sInfo);

                  // Did our main enum func say quit?
                  if (sInfo.bEnd)
                     break;
               }

               procentry.dwSize = sizeof(PROCESSENTRY32);
               bFlag = lpfProcess32Next(hSnapShot, &procentry);

            } else
               bFlag = FALSE;
         }

      } __finally {

         if (hInstLib)
            FreeLibrary(hInstLib);

         if (hInstLib2)
            FreeLibrary(hInstLib2);
      }

   }

Bisher hatten wir den Prozess so gestartet:
Code:
		PROCESS_INFORMATION piA;
		STARTUPINFO suiA;
		suiA.cb		=sizeof(STARTUPINFO);
		suiA.lpReserved	=0;
		suiA.lpDesktop	=NULL;
		suiA.lpTitle	=NULL;
		suiA.dwX		=0;
		suiA.dwY		=0;
		suiA.dwXSize	=0;
		suiA.dwYSize	=0;
		suiA.dwXCountChars	=0;
		suiA.dwYCountChars	=0;
		suiA.dwFillAttribute	=0;
		suiA.dwFlags	=STARTF_USESHOWWINDOW;
		suiA.wShowWindow	=SW_MINIMIZE;
		suiA.cbReserved2	=0;
		suiA.lpReserved2	=0;
//strApache = Pfad zum Apache -k start
		if(CreateProcess(NULL,strApache,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,NULL,NULL,&suiA,&piA)==TRUE) {
			//CloseHandle(piA.hThread);
		}
		WaitForInputIdle(piA.hProcess,INFINITE);

//Beenden von APache:
// Apache herunterfahren
		strcat(strApache, " -k shutdown");
		if(CreateProcess(NULL,strApache,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,NULL,NULL,&suiA,&piA)==TRUE) {
			CloseHandle(piA.hThread);
		}

Das Beenden würde ich jetzt in meinem Testprogramm aufnehmen wollen, nachdem ich den Apache.exe-Prozess gefunden habe. Kannst du mir hier auch nochmal einen Tipp geben?

LG
 
Zurück