- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
JNIEXPORT jstring JNICALL _Java_com_fl_nat_Status_listProcessess0(JNIEnv *env, jobject obj) {
char format[1024*128];
char name[128];
unsigned long procs[1024], needed, ret;
if(!EnumProcesses(procs, sizeof(procs), &needed)) return (*env)->NewStringUTF(env, "");
ret = needed / sizeof(unsigned long);
unsigned int i = 0;
for(; i < ret; i++) {
if(procs[i] == 0) continue;
HANDLE hproc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, procs[i]);
GetModuleBaseName(hproc, 0, name, 128);
strncat(format, name, strlen(name));
strncat(format, ",", 1);
sprintf(name, "%i", procs[i]);
strncat(format, name, strlen(name));
strncat(format, ";", 1);
CloseHandle(hproc);
}
return (*env)->NewStringUTF(env, format);
}
а как же с нативным кодом вязаться?
2. не понятно почему в needed нельзя вернуть сразу нужное число, что не делить потом на sizeof(unsigned long).
3. strncat(format, name, strlen(name)); попытался обрезать строку, а получилось то же, что и strcat( format, name );
4. format не проинициализирован перед strncat(). итог - жди нерегулярного вылета.
5. strncat(format, ",", 1); просто чудесно :))
6. подозрительные return'ы.
7. 128Kb на стеке.
8. не помешали бы константы для размеров.
есть дополнения ? :)
10. В юникод билде возможно переполнение name
и сколько байт по-твоему "C:\Documents and Settings\Local Settings\Application Data\Sun\Java" займет?
12. в строке 13 подразумевается существование процесса, тогда как в говнокоде 4685 создаются новые SystemProcess (??)
13. потенцильное переполнение строки format ибо каждая "запись" занимает до 143 байт и их может быть до 1024 штук
14. формат sprintf() в строке 18 выведет знаковое целое число. более того на компиляторах, где sizeof(long) > sizeof(int), unsigned long при выводе sprintf(..., "%i", ...) может быть обрезан
15. jobject obj нигде не используется
А кол-во процессов разве ограничено 1024 ? Хотя вероятно EnumProcesses() не должен вернуть больше.
unsigned long procs[1024];
в obj - ссылка на обьект, "вызвавший" метод.
в функции в JNI должен быть обязательно обьявлен
почему?
http://java.sun.com/docs/books/jni/html/objtypes.html
$3.2.1