Avatar billede ouch Nybegynder
01. januar 2004 - 02:15 Der er 20 kommentarer og
1 løsning

Win XP version af mempatcher

Jeg bruger funktionen "patcher.FindProcess" af denne c++ samling af funktioner omkring hvilke programmer windows kører, hvilke .dlls disse kører og funktioner til at modificere dem. Som sagt bruger jeg kun "patcher.FindProcess" men den funktion virker desværre ikke på XP (virker i Win 98 SE). Den giver altid resultatet "0" = Program ikke fundet på XP.

Jeg har brug for at få funktionen opdateret eller få noget ligende (Som stadig kan bruges til det samme),

http://frip.dk/zerosplugins/mempatcher.zip
Avatar billede arne_v Ekspert
01. januar 2004 - 11:29 #1
Den her kode er testet på både NT/2000/XP pg 95/98/ME:

http://www.vajhoej.dk/arne/eksperten/APPCHECK/
Avatar billede ouch Nybegynder
01. januar 2004 - 11:41 #2
Hmm kan du modificere en af dem så jeg bare kan include skidtet og skrive (som jeg gør nu):

if (!patcher.FindProcess("notepad.exe",&procentry))

Eller noget i den retning?
Avatar billede arne_v Ekspert
01. januar 2004 - 11:58 #3
Det er vel noget a la:

#include "EnumProc.h"

int fnd,procid;
char searchstr[256];

BOOL __stdcall Proc( DWORD dw, WORD alwaysZero, LPSTR lpstr, LPARAM lParam )
{
  if( strcmp( lpstr, searchstr) == 0 )
  {
    procid = dw;
    fnd = 1;
  }
  return 1;
}

BOOL MyFindProces(char *name, int *pid)
{
    strcpy(searchstr, name);
    fnd = 0;
    EnumProcs( Proc, 0 );
    if(fnd) *pid = procid;
    return fnd;
}

[ikke testet !]
Avatar billede ouch Nybegynder
01. januar 2004 - 15:08 #4
ok. Hvad skal argument 2 til MyFindProces være?
Avatar billede arne_v Ekspert
01. januar 2004 - 15:32 #5
Det samme som den kode du har brugt indtil nu.

En adresse på en int alias DWORD hvor PID bliver returneret.

Sådan gættede jeg ihvertfald på at andet argument var.
Avatar billede ouch Nybegynder
01. januar 2004 - 15:53 #6
g++ -c "main.cpp" "mempatcher.cpp" "procfinder.cpp" -s
main.cpp: In function `int main()':
main.cpp:61: passing `PROCESSENTRY32 *' as argument 2 of `MyFindProces(char *, i
nt *)'
g++ -o "main.exe" "main.o" "mempatcher.o" "procfinder.o" -s
G__~1.EXE: main.o: No such file or directory


:-/
Avatar billede arne_v Ekspert
01. januar 2004 - 15:58 #7
Ups.

Så er det andet argument altså ikke hvad jeg troede at det var.

Sorry.
Avatar billede arne_v Ekspert
01. januar 2004 - 16:00 #8
Det min kode returnerer er feltet th32ProcessID i den struct.
Avatar billede arne_v Ekspert
01. januar 2004 - 16:05 #9
Nu lige inden vi kaster os ud i det helt store !

Er du opmærksom på at der normalt er fuldt sti på EXE i NT/2000/XP ?

D.v.s. at du ikke skal søge på "notepad.exe" men på
"C:\WINNT\system32\notepad.exe"
Avatar billede ouch Nybegynder
01. januar 2004 - 16:07 #10
:-/

Jeg skal vide om *.exe (ntoepad.exe f.eks) kører. Lige meget fra hvor. Jeg har ikke stien til programmet. Som mempatcher gør.
Avatar billede arne_v Ekspert
01. januar 2004 - 16:40 #11
Skal du bare vide om det kører ?
Avatar billede arne_v Ekspert
01. januar 2004 - 16:43 #12
I så fald må du kunne bruge:

#include "EnumProc.h"

int fnd = 0;

char searchstr[256];

BOOL __stdcall Proc( DWORD dw, WORD alwaysZero, LPSTR lpstr, LPARAM lParam )
{
  if( strstr( lpstr, searchstr) != NULL ) fnd = 1;
  return 1;
}

og:

    strcpy(searchstr, "notepad.exe");
    EnumProcs( Proc, 0 );
    if(fnd)
    {
Avatar billede ouch Nybegynder
01. januar 2004 - 16:58 #13
g++ -c "main.cpp" -s
g++ -o "main.exe" "main.o" -s
main.o(.text+0x237):main.cpp: undefined reference to `EnumProcs__FPFUlUsPcl_il@8
'

main.cpp er den eneste fil og indeholder:
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <direct.h>
#include <sys/stat.h>
#include <windows.h>

typedef BOOL (CALLBACK *PROCENUMPROC)( DWORD, WORD, LPSTR, LPARAM ) ;

BOOL WINAPI EnumProcs( PROCENUMPROC lpProc, LPARAM lParam ) ;

int fnd = 0;
char searchstr[256];

BOOL __stdcall Proc( DWORD dw, WORD alwaysZero, LPSTR lpstr, LPARAM lParam )
{
  if( strstr( lpstr, searchstr) != NULL ) fnd = 1;
  return 1;
}

int main()
    {
        strcpy(searchstr, "notepad.exe");
    for ( ; ; Sleep (3000) )
        {
        EnumProcs(Proc,0);
        if (fnd)
            {
            printf ("ACTION!\n");
            continue;
            }
        continue;
        }
    system("pause Program is about to quit. Press any key to continue.\n");
    }
Avatar billede arne_v Ekspert
01. januar 2004 - 17:00 #14
Du skal også have EnumProc.cpp downloadet og buileded med.
Avatar billede ouch Nybegynder
01. januar 2004 - 17:03 #15
g++ -c "main.cpp" -s
In file included from main.cpp:8:
EnumProc.cpp:7: vdmdbg.h: No such file or directory
g++ -o "main.exe" "main.o" -s
main.o(.text+0x237):main.cpp: undefined reference to `EnumProcs__FPFUlUsPcl_il@8
'

Hvor får jeg den fætter fra?
Avatar billede arne_v Ekspert
01. januar 2004 - 17:09 #16
Den kommer med Microsoft og Borland compilerne.

Og med Windows Platform SDK.

Sidstnævnte kan hentes, men det fylder en del.
Avatar billede ouch Nybegynder
01. januar 2004 - 17:14 #17
g++ -c "main.cpp" -s
In file included from main.cpp:8:
EnumProc.cpp: In function `BOOL EnumProcs(BOOL (*)(long unsigned int, short unsi
gned int, CHAR *, long int), long int)':
EnumProc.cpp:123: ANSI C++ forbids implicit conversion from `void *' in assignme
nt
g++ -o "main.exe" "main.o" -s
main.o(.text+0x237):main.cpp: undefined reference to `EnumProcs__FPFUlUsPcl_il@8
'

Kopierede vdmdbg.h fra Borland command line tools. Kan ikke bruges sammen med MingW?
Avatar billede arne_v Ekspert
01. januar 2004 - 17:35 #18
Den fejl må kunne løses ved at rette linie 123 til:

        lpdwPIDs = (LPDWORD)HeapAlloc( GetProcessHeap(), 0, dwSize2 );

(tilføje eksplicit type cast)
Avatar billede ouch Nybegynder
01. januar 2004 - 18:11 #19
Takker. Nyt problem: Nu virker det ikke på 98 (Har ikke testet xp). fnd er altid 0.
Avatar billede ouch Nybegynder
29. marts 2004 - 09:17 #20
Lukker...
Avatar billede ouch Nybegynder
29. marts 2004 - 09:17 #21
Erm.. NU!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester