+int jattach(int pid, int argc, char** argv, int print_output) {
+ // When attaching as an Administrator, make sure the target process can connect to our pipe,
+ // i.e. allow read-write access to everyone. For the complete format description, see
+ // https://docs.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-string-format
+ SECURITY_ATTRIBUTES sec = {sizeof(SECURITY_ATTRIBUTES), NULL, FALSE};
+ ConvertStringSecurityDescriptorToSecurityDescriptor("D:(A;;GRGW;;;WD)", SDDL_REVISION_1,
+ &sec.lpSecurityDescriptor, NULL);
+
+ char pipeName[MAX_PATH];
+ sprintf(pipeName, "\\\\.\\pipe\\javatool%d", GetTickCount());
+ HANDLE hPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_INBOUND, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
+ 1, 4096, 8192, NMPWAIT_USE_DEFAULT_WAIT, &sec);
+ if (hPipe == INVALID_HANDLE_VALUE) {
+ print_error("Could not create pipe", GetLastError());
+ LocalFree(sec.lpSecurityDescriptor);
+ return 1;
+ }
+
+ LocalFree(sec.lpSecurityDescriptor);
+
+ if (!inject_thread(pid, pipeName, argc, argv)) {
+ CloseHandle(hPipe);
+ return 1;
+ }
+
+ int result = read_response(hPipe, print_output);
+ CloseHandle(hPipe);
+
+ return result;
+}
+
+#ifdef JATTACH_VERSION
+