#include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include #include int debug=0; char *ToLower(char *string) { char *s; if (string) { for (s = string; *s; ++s) *s = tolower(*s); } return string; } void printError(char* msg, DWORD *err ) { *err = GetLastError(); FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, *err, 0, msg, 512, NULL ); } static int not_here(char *s) { croak("%s not implemented on this architecture", s); return -1; } static double constant(char *name, int len, int arg) { errno = EINVAL; return 0; } MODULE = Win32::Process::List PACKAGE = Win32::Process::List void Setdebug(deb) int deb PPCODE: debug=deb; int ProcessAliveP(pid,perror) int pid SV* perror PREINIT: HANDLE hProcessSnap; PROCESSENTRY32 pe32; //DWORD dwPriorityClass; DWORD err; char wszMsgBuff[512]; CODE: { SetLastError(0); RETVAL=0; hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hProcessSnap == INVALID_HANDLE_VALUE ) { printError(wszMsgBuff, &err ); sv_upgrade(perror,SVt_PVIV); sv_setpvn(perror, (char*)wszMsgBuff, strlen(wszMsgBuff)); sv_setiv(perror,(IV) err); SvPOK_on(perror); XPUSHs(sv_2mortal(newSViv(-1))); RETVAL=-1; } pe32.dwSize = sizeof( PROCESSENTRY32 ); if( !Process32First( hProcessSnap, &pe32 ) ) { printError(wszMsgBuff,&err ); sv_upgrade(perror,SVt_PVIV); sv_setpvn(perror, (char*)wszMsgBuff, strlen(wszMsgBuff)); sv_setiv(perror,(IV) err); SvPOK_on(perror); XPUSHs(sv_2mortal(newSViv(-1))); CloseHandle( hProcessSnap ); RETVAL=-1; } do { //sprintf(temp, "%d", pe32.th32ProcessID); if(debug==1) { printf("Temp: %s\n",pe32.szExeFile); } //printf("%s\n", ToLower(pe32.szExeFile)); if(pid == pe32.th32ProcessID) { RETVAL=1; } } while( Process32Next( hProcessSnap, &pe32 ) ); CloseHandle( hProcessSnap ); } OUTPUT: RETVAL perror int ProcessAliveN(name,perror) char *name SV* perror PREINIT: HANDLE hProcessSnap; PROCESSENTRY32 pe32; //DWORD dwPriorityClass; DWORD err; char wszMsgBuff[512]; CODE: { SetLastError(0); RETVAL=0; hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hProcessSnap == INVALID_HANDLE_VALUE ) { printError(wszMsgBuff, &err ); sv_upgrade(perror,SVt_PVIV); sv_setpvn(perror, (char*)wszMsgBuff, strlen(wszMsgBuff)); sv_setiv(perror,(IV) err); SvPOK_on(perror); XPUSHs(sv_2mortal(newSViv(-1))); RETVAL=-1; } pe32.dwSize = sizeof( PROCESSENTRY32 ); if( !Process32First( hProcessSnap, &pe32 ) ) { printError(wszMsgBuff,&err ); sv_upgrade(perror,SVt_PVIV); sv_setpvn(perror, (char*)wszMsgBuff, strlen(wszMsgBuff)); sv_setiv(perror,(IV) err); SvPOK_on(perror); XPUSHs(sv_2mortal(newSViv(-1))); CloseHandle( hProcessSnap ); RETVAL=-1; } do { //sprintf(temp, "%d", pe32.th32ProcessID); if(debug==1) { printf("Temp: %s\n",pe32.szExeFile); } //printf("%s\n", ToLower(pe32.szExeFile)); if(strEQ(ToLower(name), ToLower(pe32.szExeFile))) { RETVAL=1; } } while( Process32Next( hProcessSnap, &pe32 ) ); CloseHandle( hProcessSnap ); } OUTPUT: RETVAL perror SV * ListProcesses(perror) SV* perror PREINIT: HANDLE hProcessSnap; PROCESSENTRY32 pe32; //DWORD dwPriorityClass; DWORD err; HV * rh; char wszMsgBuff[512]; char temp[512]; CODE: SetLastError(0); rh = newHV(); hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( hProcessSnap == INVALID_HANDLE_VALUE ) { printError(wszMsgBuff, &err ); sv_upgrade(perror,SVt_PVIV); sv_setpvn(perror, (char*)wszMsgBuff, strlen(wszMsgBuff)); sv_setiv(perror,(IV) err); SvPOK_on(perror); XPUSHs(sv_2mortal(newSViv(-1))); } else { pe32.dwSize = sizeof( PROCESSENTRY32 ); if( !Process32First( hProcessSnap, &pe32 ) ) { printError(wszMsgBuff,&err ); sv_upgrade(perror,SVt_PVIV); sv_setpvn(perror, (char*)wszMsgBuff, strlen(wszMsgBuff)); sv_setiv(perror,(IV) err); SvPOK_on(perror); XPUSHs(sv_2mortal(newSViv(-1))); CloseHandle( hProcessSnap ); } else { do { sprintf(temp, "%d", pe32.th32ProcessID); if(debug==1) { printf("Temp: %s\n",pe32.szExeFile); } if(hv_store(rh,temp,strlen(temp),newSVpv(pe32.szExeFile, strlen(pe32.szExeFile)), 0)==NULL) //if(hv_store(rh,pe32.szExeFile,strlen(pe32.szExeFile),newSVuv(pe32.th32ProcessID), 0)==NULL) { printf("can not store %s in hash!\n", pe32.szExeFile); } } while( Process32Next( hProcessSnap, &pe32 ) ); CloseHandle( hProcessSnap ); } } RETVAL = newRV_noinc((SV *)rh); OUTPUT: RETVAL perror double constant(sv,arg) PREINIT: STRLEN len; INPUT: SV * sv char * s = SvPV(sv, len); int arg CODE: RETVAL = constant(s,len,arg); OUTPUT: RETVAL