Windows 7 Home Premium SP1 64ビット
gcc (GCC) 4.8.1
起動しているプロセスとそのファイル名を列挙したいのですが、うまくいきません。
EnumProcessModulesを使ったところ、「ハンドルが無効です。」と出て、
サクラエディタなどの32ビットアプリケーションも含めてOpenProcessに成功しても1件もモジュールの列挙に成功しませんでした。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <psapi.h>
DWORD *getProcesses(DWORD *num) {
DWORD n = 1;
DWORD res;
DWORD *p = NULL;
for (;;) {
if (p != NULL) free(p);
p = malloc(sizeof(DWORD) * n);
if (p == NULL) exit(1);
if(EnumProcesses(p, sizeof(DWORD) * n, &res) == 0) {
static char err[10240];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), LANG_USER_DEFAULT, err, sizeof(err) / sizeof(err[0]), NULL);
printf("EnumProcesses failed : n = %u, error = %s\n", (unsigned int)n, err);
free(p);
return NULL;
}
res /= sizeof(DWORD);
if (res < n) {
*num = res;
return p;
}
n *= 2;
}
}
HMODULE *getModules(DWORD *num, HANDLE hProcess) {
DWORD n = 1;
DWORD res;
HMODULE *p = NULL;
for (;;) {
if (p != NULL) free(p);
p = malloc(sizeof(HMODULE) * n);
if (p == NULL) exit(1);
if (EnumProcessModules(hProcess, p, sizeof(HMODULE) * n, &res) == 0) {
static char err[10240];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), LANG_USER_DEFAULT, err, sizeof(err) / sizeof(err[0]), NULL);
printf("EnumProcessModules failed : n = %u, error = %s\n", (unsigned int)n, err);
free(p);
return NULL;
}
res /= sizeof(HMODULE);
if (res < n) {
*num = res;
return p;
}
n *= 2;
}
}
int main(void) {
DWORD pn;
DWORD *pl;
DWORD i;
pl = getProcesses(&pn);
if (pl == NULL) return 1;
for (i = 0; i < pn; i++) {
HANDLE hProcess;
printf("%u:\n", (unsigned int)pl[i]);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pl[i]);
if (hProcess == NULL) {
puts("!!!OpenProcess Error!!!");
} else {
HMODULE *m;
DWORD mn;
DWORD j;
static char data[1000000];
m = getModules(hProcess, &mn);
if (m != NULL) {
for (j = 0; j < mn; j++) {
GetModuleFileNameA(m[j], data, sizeof(data) / sizeof(data[0]));
puts(data);
}
free(m);
}
CloseHandle(hProcess);
}
}
free(pl);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <psapi.h>
DWORD *getProcesses(DWORD *num) {
DWORD n = 1;
DWORD res;
DWORD *p = NULL;
for (;;) {
if (p != NULL) free(p);
p = malloc(sizeof(DWORD) * n);
if (p == NULL) exit(1);
if(EnumProcesses(p, sizeof(DWORD) * n, &res) == 0) {
char err[10240];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), LANG_USER_DEFAULT, err, sizeof(err) / sizeof(err[0]), NULL);
printf("EnumProcesses failed : n = %u, error = %s\n", (unsigned int)n, err);
free(p);
return NULL;
}
res /= sizeof(DWORD);
if (res < n) {
*num = res;
return p;
}
n *= 2;
}
}
typedef DWORD (*gpif_ptr)(HANDLE,char*,DWORD);
int main(void) {
DWORD pn;
DWORD *pl;
DWORD i;
gpif_ptr gpif;
HINSTANCE hi;
hi = LoadLibraryA("psapi.dll");
if (hi == 0) {
puts("LoadLibraryA failed");
return 1;
}
gpif = (gpif_ptr)GetProcAddress(hi, "GetProcessImageFileNameA");
if (gpif == NULL) {
puts("GetProcAddress failed");
FreeLibrary(hi);
return 1;
}
pl = getProcesses(&pn);
if (pl == NULL) {
FreeLibrary(hi);
return 1;
}
for (i = 0; i < pn; i++) {
HANDLE hProcess;
printf("%u : ", (unsigned int)pl[i]);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pl[i]);
if (hProcess == NULL) {
puts("!!!OpenProcess Error!!!");
} else {
static char data[1000000];
if (gpif(hProcess, data, sizeof(data) / sizeof(data[0])) == 0) {
static char err[10240];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), LANG_USER_DEFAULT, err, sizeof(err) / sizeof(err[0]), NULL);
printf("GetProcessImageFileNameA failed : %s\n", err);
} else {
puts(data);
}
CloseHandle(hProcess);
}
}
free(pl);
FreeLibrary(hi);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <psapi.h>
DWORD *getProcesses(DWORD *num) {
DWORD n = 1;
DWORD res;
DWORD *p = NULL;
for (;;) {
if (p != NULL) free(p);
p = malloc(sizeof(DWORD) * n);
if (p == NULL) exit(1);
if(EnumProcesses(p, sizeof(DWORD) * n, &res) == 0) {
char err[10240];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), LANG_USER_DEFAULT, err, sizeof(err) / sizeof(err[0]), NULL);
printf("EnumProcesses failed : n = %u, error = %s\n", (unsigned int)n, err);
free(p);
return NULL;
}
res /= sizeof(DWORD);
if (res < n) {
*num = res;
return p;
}
n *= 2;
}
}
typedef DWORD (*qfpin_ptr)(HANDLE,DWORD,char*,PDWORD);
int main(void) {
DWORD pn;
DWORD *pl;
DWORD i;
qfpin_ptr qfpin;
HINSTANCE hi;
hi = LoadLibraryA("kernel32.dll");
if (hi == 0) {
puts("LoadLibraryA failed");
return 1;
}
qfpin = (qfpin_ptr)GetProcAddress(hi, "QueryFullProcessImageNameA");
if (qfpin == NULL) {
puts("GetProcAddress failed");
FreeLibrary(hi);
return 1;
}
pl = getProcesses(&pn);
if (pl == NULL) {
FreeLibrary(hi);
return 1;
}
for (i = 0; i < pn; i++) {
HANDLE hProcess;
printf("%u : ", (unsigned int)pl[i]);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pl[i]);
if (hProcess == NULL) {
puts("!!!OpenProcess Error!!!");
} else {
static char data[1000000];
DWORD sz = sizeof(data) / sizeof(data[0]);
if (qfpin(hProcess, 0, data, &sz) == 0) {
static char err[10240];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), LANG_USER_DEFAULT, err, sizeof(err) / sizeof(err[0]), NULL);
printf("GetProcessImageFileNameA failed : %s\n", err);
} else {
puts(data);
}
CloseHandle(hProcess);
}
}
free(pl);
FreeLibrary(hi);
return 0;
}
全部のプロセスについて取得したいとは言いませんが、取得できるものは取得し、強制終了しないようにしたいです。
これらのコードのどこが悪く、どう改善すればいいのでしょうか?
よろしくお願いします。