/* * Class: sun_tools_attach_WindowsVirtualMachine * Method: openProcess * Signature: (I)J */ JNIEXPORT jlong JNICALL Java_sun_tools_attach_WindowsVirtualMachine_openProcess (JNIEnv *env, jclass cls, jint pid) { HANDLE hProcess; /* * Attempt to open process. If it fails then we try to enable the * SE_DEBUG_NAME privilege and retry. */ hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid); if (hProcess == NULL && GetLastError() == ERROR_ACCESS_DENIED) { hProcess = doPrivilegedOpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid); } if (hProcess == NULL) { if (GetLastError() == ERROR_INVALID_PARAMETER) { JNU_ThrowIOException(env, "no such process"); } else { JNU_ThrowIOExceptionWithLastError(env, "OpenProcess failed"); } return (jlong)0; } /* * On Windows 64-bit we need to handle 32-bit tools trying to attach to 64-bit * processes (and visa versa). X-architecture attaching is currently not supported * by this implementation. */ if (_IsWow64Process != NULL) { BOOL isCurrent32bit, isTarget32bit; (*_IsWow64Process)(GetCurrentProcess(), &isCurrent32bit); (*_IsWow64Process)(hProcess, &isTarget32bit); if (isCurrent32bit != isTarget32bit) { CloseHandle(hProcess); #ifdef _WIN64 JNU_ThrowByName(env, "com/sun/tools/attach/AttachNotSupportedException", "Unable to attach to 32-bit process running under WOW64"); #else JNU_ThrowByName(env, "com/sun/tools/attach/AttachNotSupportedException", "Unable to attach to 64-bit process"); #endif } } return (jlong)hProcess; }
/* * Class: sun_tools_attach_VirtualMachineImpl * Method: openProcess * Signature: (I)J */ JNIEXPORT jlong JNICALL Java_sun_tools_attach_VirtualMachineImpl_openProcess (JNIEnv *env, jclass cls, jint pid) { HANDLE hProcess = NULL; if (pid == (jint) GetCurrentProcessId()) { /* process is attaching to itself; get a pseudo handle instead */ hProcess = GetCurrentProcess(); /* duplicate the pseudo handle so it can be used in more contexts */ if (DuplicateHandle(hProcess, hProcess, hProcess, &hProcess, PROCESS_ALL_ACCESS, FALSE, 0) == 0) { /* * Could not duplicate the handle which isn't a good sign, * but we'll try again with OpenProcess() below. */ hProcess = NULL; } } if (hProcess == NULL) { /* * Attempt to open process. If it fails then we try to enable the * SE_DEBUG_NAME privilege and retry. */ hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid); if (hProcess == NULL && GetLastError() == ERROR_ACCESS_DENIED) { hProcess = doPrivilegedOpenProcess(PROCESS_ALL_ACCESS, FALSE, (DWORD)pid); } if (hProcess == NULL) { if (GetLastError() == ERROR_INVALID_PARAMETER) { JNU_ThrowIOException(env, "no such process"); } else { char err_mesg[255]; /* include the last error in the default detail message */ sprintf(err_mesg, "OpenProcess(pid=%d) failed; LastError=0x%x", (int)pid, (int)GetLastError()); JNU_ThrowIOExceptionWithLastError(env, err_mesg); } return (jlong)0; } } /* * On Windows 64-bit we need to handle 32-bit tools trying to attach to 64-bit * processes (and visa versa). X-architecture attaching is currently not supported * by this implementation. */ if (_IsWow64Process != NULL) { BOOL isCurrent32bit, isTarget32bit; (*_IsWow64Process)(GetCurrentProcess(), &isCurrent32bit); (*_IsWow64Process)(hProcess, &isTarget32bit); if (isCurrent32bit != isTarget32bit) { CloseHandle(hProcess); #ifdef _WIN64 JNU_ThrowByName(env, "com/sun/tools/attach/AttachNotSupportedException", "Unable to attach to 32-bit process running under WOW64"); #else JNU_ThrowByName(env, "com/sun/tools/attach/AttachNotSupportedException", "Unable to attach to 64-bit process"); #endif } } return (jlong)hProcess; }