DWORD selectProcessFlag(JNIEnv *env, jstring cmd0) { DWORD newFlag = 0; char *exe = (char *)JNU_GetStringPlatformChars(env, cmd0, 0); if (exe != NULL) { char buf[MAX_PATH]; char *name; DWORD len; exe = extractExecutablePath(env, exe); if (exe != NULL) { /* We are here for Win9x/Me, so the [/] is not the path sep */ char *p = strrchr(exe, '\\'); if (p == NULL) { len = SearchPath(NULL, exe, EXE_EXT, MAX_PATH, buf, &name); } else { *p = 0; len = SearchPath(exe, p + 1, EXE_EXT, MAX_PATH, buf, &name); } } if (len > 0 && len < MAX_PATH) { /* Here the [buf] path is valid and null terminated */ int fd = _open(buf, _O_RDONLY); if (fd != -1) { unsigned char buffer[2]; if (_read(fd, buffer, 2) == 2 && buffer[0] == 'M' && buffer[1] == 'Z' && _lseek(fd, 60L, SEEK_SET) == 60L && _read(fd, buffer, 2) == 2) { long headerLoc = (long)buffer[1] << 8 | (long)buffer[0]; if (_lseek(fd, headerLoc, SEEK_SET) == headerLoc && _read(fd, buffer, 2) == 2 && buffer[0] == 'P' && buffer[1] == 'E') { newFlag = DETACHED_PROCESS; } } _close(fd); } } JNU_ReleaseStringPlatformChars(env, cmd0, exe); } return newFlag; }
DWORD selectProcessFlag(JNIEnv *env, jstring cmd0) { char buf[MAX_PATH]; DWORD newFlag = 0; char *exe, *p, *name; unsigned char buffer[2]; long headerLoc = 0; int fd = 0; exe = (char *)JNU_GetStringPlatformChars(env, cmd0, 0); exe = extractExecutablePath(env, exe); if (exe != NULL) { if ((p = strchr(exe, '\\')) == NULL) { SearchPath(NULL, exe, ".exe", MAX_PATH, buf, &name); } else { p = strrchr(exe, '\\'); *p = 0; p++; SearchPath(exe, p, ".exe", MAX_PATH, buf, &name); } } fd = _open(buf, _O_RDONLY); if (fd > 0) { _read(fd, buffer, 2); if (buffer[0] == 'M' && buffer[1] == 'Z') { _lseek(fd, 60L, SEEK_SET); _read(fd, buffer, 2); headerLoc = (long)buffer[1] << 8 | (long)buffer[0]; _lseek(fd, headerLoc, SEEK_SET); _read(fd, buffer, 2); if (buffer[0] == 'P' && buffer[1] == 'E') { newFlag = DETACHED_PROCESS; } } _close(fd); } JNU_ReleaseStringPlatformChars(env, cmd0, exe); return newFlag; }