452
453 if (GetProcessTimes(handle, &CreationTime, &ExitTime, &KernelTime, &UserTime)) {
454 userTime = jlong_from(UserTime.dwHighDateTime, UserTime.dwLowDateTime);
455 totalTime = jlong_from( KernelTime.dwHighDateTime, KernelTime.dwLowDateTime);
456 totalTime = (totalTime + userTime) * 100; // convert sum to nano-seconds
457
458 startTime = jlong_from(CreationTime.dwHighDateTime,
459 CreationTime.dwLowDateTime) / 10000;
460 startTime -= 11644473600000L; // Rebase Epoch from 1601 to 1970
461
462 (*env)->SetLongField(env, jinfo,
463 ProcessHandleImpl_Info_totalTimeID, totalTime);
464 JNU_CHECK_EXCEPTION(env);
465 (*env)->SetLongField(env, jinfo,
466 ProcessHandleImpl_Info_startTimeID, startTime);
467 JNU_CHECK_EXCEPTION(env);
468 }
469 }
470
471 static void getCmdlineInfo(JNIEnv *env, HANDLE handle, jobject jinfo) {
472 char exeName[1024];
473 int bufsize = sizeof exeName;
474 jstring commandObj;
475
476 if (QueryFullProcessImageName(handle, 0, exeName, &bufsize)) {
477 commandObj = (*env)->NewStringUTF(env, exeName);
478 CHECK_NULL(commandObj);
479 (*env)->SetObjectField(env, jinfo,
480 ProcessHandleImpl_Info_commandID, commandObj);
481 }
482 }
483
484 static void procToUser(JNIEnv *env, HANDLE handle, jobject jinfo) {
485 #define TOKEN_LEN 256
486 DWORD token_len = TOKEN_LEN;
487 char token_buf[TOKEN_LEN];
488 TOKEN_USER *token_user = (TOKEN_USER*)token_buf;
489 HANDLE tokenHandle;
490 WCHAR domain[255 + 1 + 255 + 1]; // large enough to concat with '/' and name
491 WCHAR name[255 + 1];
492 DWORD domainLen = sizeof(domain) - sizeof(name);
493 DWORD nameLen = sizeof(name);
494 SID_NAME_USE use;
495 jstring s;
496 int ret;
497
|
452
453 if (GetProcessTimes(handle, &CreationTime, &ExitTime, &KernelTime, &UserTime)) {
454 userTime = jlong_from(UserTime.dwHighDateTime, UserTime.dwLowDateTime);
455 totalTime = jlong_from( KernelTime.dwHighDateTime, KernelTime.dwLowDateTime);
456 totalTime = (totalTime + userTime) * 100; // convert sum to nano-seconds
457
458 startTime = jlong_from(CreationTime.dwHighDateTime,
459 CreationTime.dwLowDateTime) / 10000;
460 startTime -= 11644473600000L; // Rebase Epoch from 1601 to 1970
461
462 (*env)->SetLongField(env, jinfo,
463 ProcessHandleImpl_Info_totalTimeID, totalTime);
464 JNU_CHECK_EXCEPTION(env);
465 (*env)->SetLongField(env, jinfo,
466 ProcessHandleImpl_Info_startTimeID, startTime);
467 JNU_CHECK_EXCEPTION(env);
468 }
469 }
470
471 static void getCmdlineInfo(JNIEnv *env, HANDLE handle, jobject jinfo) {
472 WCHAR exeName[1024];
473 DWORD bufsize = sizeof(exeName)/sizeof(WCHAR);
474 jstring commandObj;
475
476 if (QueryFullProcessImageNameW(handle, 0, exeName, &bufsize)) {
477 commandObj = (*env)->NewString(env, (const jchar *)exeName,
478 (jsize)wcslen(exeName));
479 CHECK_NULL(commandObj);
480 (*env)->SetObjectField(env, jinfo,
481 ProcessHandleImpl_Info_commandID, commandObj);
482 }
483 }
484
485 static void procToUser(JNIEnv *env, HANDLE handle, jobject jinfo) {
486 #define TOKEN_LEN 256
487 DWORD token_len = TOKEN_LEN;
488 char token_buf[TOKEN_LEN];
489 TOKEN_USER *token_user = (TOKEN_USER*)token_buf;
490 HANDLE tokenHandle;
491 WCHAR domain[255 + 1 + 255 + 1]; // large enough to concat with '/' and name
492 WCHAR name[255 + 1];
493 DWORD domainLen = sizeof(domain) - sizeof(name);
494 DWORD nameLen = sizeof(name);
495 SID_NAME_USE use;
496 jstring s;
497 int ret;
498
|