diff options
author | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
commit | 84adefa331c4159d432d22840663c38f155cd4c1 (patch) | |
tree | bff9a9c66adda4df2106dfd0e5c053ab182a12bd /erts/test/nt_SUITE_data/nt_info.c | |
download | otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2 otp-84adefa331c4159d432d22840663c38f155cd4c1.zip |
The R13B03 release.OTP_R13B03
Diffstat (limited to 'erts/test/nt_SUITE_data/nt_info.c')
-rw-r--r-- | erts/test/nt_SUITE_data/nt_info.c | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/erts/test/nt_SUITE_data/nt_info.c b/erts/test/nt_SUITE_data/nt_info.c new file mode 100644 index 0000000000..33cf046bb6 --- /dev/null +++ b/erts/test/nt_SUITE_data/nt_info.c @@ -0,0 +1,176 @@ +/* + * %CopyrightBegin% + * + * Copyright Ericsson AB 1998-2009. All Rights Reserved. + * + * The contents of this file are subject to the Erlang Public License, + * Version 1.1, (the "License"); you may not use this file except in + * compliance with the License. You should have received a copy of the + * Erlang Public License along with this software. If not, it can be + * retrieved online at http://www.erlang.org/. + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + * the License for the specific language governing rights and limitations + * under the License. + * + * %CopyrightEnd% + */ +/* + * This is a simple command that gives some interesting + * system information on NT. + * It is run as a port program by the nt test suite to find out priorities + * of programs etc. + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#if defined(VXWORKS) +int nt_info(int argc, char **argv){ + printf("Hello �lvsj�!\n"); + return 0; +} +#elif !defined(__WIN32__) +int main(int argc, char **argv){ + printf("Hello �lvsj�!\n"); + return 0; +} +#else /* Windows NT, here we go... */ + +#include <windows.h> + + +int erlang_format = 0; + +#if 0 +int last_error = 0; + +void print_last_error(void){ + char *mes; + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + (last_error) ? last_error : GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPTSTR) &mes, + 0, + NULL ); + fprintf(stderr,"Error: %s",mes); + LocalFree(mes); +} +#endif + +typedef BOOL (WINAPI *tEnumProcesses)(DWORD *, DWORD, DWORD *); +typedef BOOL (WINAPI *tEnumProcessModules)(HANDLE, HMODULE *, DWORD, DWORD *); +typedef DWORD (WINAPI *tGetModuleBaseName)(HANDLE, HMODULE, char *, DWORD); + +static tGetModuleBaseName pGetModuleBaseName = NULL; +static tEnumProcessModules pEnumProcessModules = NULL; +static tEnumProcesses pEnumProcesses = NULL; + +static BOOL init_fpointers(void){ + HINSTANCE instance = LoadLibrary("PSAPI.DLL"); + if(instance == NULL){ + fprintf(stderr,"Failed to load PSAPI.DLL.\n"); + return FALSE; + } + if((pEnumProcesses = + (tEnumProcesses) GetProcAddress(instance,"EnumProcesses")) == + NULL){ + fprintf(stderr,"Failed to find EnumProcesses in DLL.\n"); + return FALSE; + } + if((pEnumProcessModules = + (tEnumProcessModules) GetProcAddress(instance,"EnumProcessModules")) == + NULL){ + fprintf(stderr,"Failed to find EnumProcessModules in DLL.\n"); + return FALSE; + } + if((pGetModuleBaseName = + (tGetModuleBaseName) GetProcAddress(instance,"GetModuleBaseNameA")) == + NULL){ + fprintf(stderr,"Failed to find GetModuleBaseName in DLL.\n"); + return FALSE; + } + return TRUE; +} + + +void one_line(DWORD pid){ + char pname[MAX_PATH] = "???"; + HMODULE hmod = NULL; + DWORD dummy; + DWORD priority = -1; + struct { + DWORD sym; + char *txt; + } tab[] = { + {HIGH_PRIORITY_CLASS,"high"}, + {IDLE_PRIORITY_CLASS, "idle"}, + {NORMAL_PRIORITY_CLASS,"normal"}, + {REALTIME_PRIORITY_CLASS, "realtime"} + }; + int tabsiz = sizeof(tab)/sizeof(*tab); + char *class = "???"; + int i; + + HANDLE hproc = OpenProcess(PROCESS_QUERY_INFORMATION | + PROCESS_VM_READ, + FALSE, pid ); + if(!hproc) + goto print; + if(!(*pEnumProcessModules)(hproc,&hmod,sizeof(hmod),&dummy)) + goto print; + if(!(*pGetModuleBaseName)(hproc,hmod,pname,sizeof(pname))) + goto print; + if(!(priority = GetPriorityClass(hproc))) + goto print; + for(i=0;i<tabsiz;++i) + if(tab[i].sym == priority) + class = tab[i].txt; +print: + if(erlang_format) + printf("{\"%s\", %lu, \"%s\"}%s", pname, pid, class, + (erlang_format > 1) ? "" : "\n"); + else + printf("%-32s %8lu %-9s\n", pname, pid, class); + if(hproc) + CloseHandle(hproc); + if(hmod) + CloseHandle(hmod); +} + +int do_simple_ps(void){ + DWORD procs[1024]; + DWORD num_procs; + DWORD needed; + int i; + + if(!(*pEnumProcesses)(procs,sizeof(procs),&needed)){ + fprintf(stderr,"Failed to EnumProcesses\n"); + return 1; + } + num_procs = needed / sizeof(DWORD); + if(erlang_format > 1) + printf("["); + for(i=0;i<num_procs;++i){ + one_line(procs[i]); + if(erlang_format > 1 && i < num_procs -1) + printf(", "); + } + if(erlang_format > 1) + printf("]. \n"); + return 0; +} + +int main(int argc, char **argv){ + if(argc>1 && !strcmp(argv[1],"-e")) + erlang_format = 1; + else if(argc>1 && !strcmp(argv[1],"-E")) + erlang_format = 2; + if(!init_fpointers()) + return 1; + return do_simple_ps(); +} +#endif |