- 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);
}
dwinner 19.11.2010 18:25 # −2
Анонимус 22.11.2010 12:55 # +1
а как же с нативным кодом вязаться?
dwinner 22.11.2010 16:00 # 0
absolut 20.11.2010 12:06 # +2
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. не помешали бы константы для размеров.
есть дополнения ? :)
rat4 20.11.2010 15:31 # 0
10. В юникод билде возможно переполнение name
bugmenot 20.11.2010 15:55 # 0
rat4 20.11.2010 17:58 # 0
bugmenot 20.11.2010 19:03 # 0
Govnoeb 21.11.2010 14:10 # 0
и сколько байт по-твоему "C:\Documents and Settings\Local Settings\Application Data\Sun\Java" займет?
rat4 21.11.2010 15:52 # 0
Govnoeb 20.11.2010 16:53 # 0
12. в строке 13 подразумевается существование процесса, тогда как в говнокоде 4685 создаются новые SystemProcess (??)
13. потенцильное переполнение строки format ибо каждая "запись" занимает до 143 байт и их может быть до 1024 штук
14. формат sprintf() в строке 18 выведет знаковое целое число. более того на компиляторах, где sizeof(long) > sizeof(int), unsigned long при выводе sprintf(..., "%i", ...) может быть обрезан
15. jobject obj нигде не используется
absolut 20.11.2010 21:14 # 0
А кол-во процессов разве ограничено 1024 ? Хотя вероятно EnumProcesses() не должен вернуть больше.
Govnoeb 21.11.2010 14:09 # 0
unsigned long procs[1024];
absolut 21.11.2010 14:46 # 0
danilissimus 20.11.2010 23:10 # 0
в obj - ссылка на обьект, "вызвавший" метод.
в функции в JNI должен быть обязательно обьявлен
danilissimus 20.11.2010 23:08 # +1
почему?
http://java.sun.com/docs/books/jni/html/objtypes.html
$3.2.1
absolut 21.11.2010 14:51 # 0
bkiSKwd 25.08.2021 02:00 # 0