📄 cygcheck.cc
字号:
if (SetFilePointer (fh, expbase, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR) keyeprint ("dll_info: SetFilePointer()"); unsigned char *exp = (unsigned char *) malloc (expsz); if (!ReadFile (fh, exp, expsz, &junk, 0)) keyeprint ("dll_info: Readfile()"); ExpDirectory *ed = (ExpDirectory *) exp; int ofs = ed->name_rva - export_rva; struct tm *tm = localtime ((const time_t *) &(ed->timestamp)); if (tm->tm_year < 60) tm->tm_year += 2000; if (tm->tm_year < 200) tm->tm_year += 1900; printf ("%*c", lvl + 2, ' '); printf ("\"%s\" v%d.%d ts=", exp + ofs, ed->major_ver, ed->minor_ver); printf ("%d/%d/%d %d:%02d\n", tm->tm_year, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min); } } if (num_entries >= 2 && import_size > 0 && recurse) { int impsz; int impbase = rva_to_offset (import_rva, sections, nsections, &impsz); if (impbase) { if (SetFilePointer (fh, impbase, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER && GetLastError () != NO_ERROR) keyeprint ("dll_info: SetFilePointer()"); unsigned char *imp = (unsigned char *) malloc (impsz); if (imp == NULL) { keyeprint ("dll_info: malloc()"); return; } if (!ReadFile (fh, imp, impsz, &junk, 0)) keyeprint ("dll_info: Readfile()"); ImpDirectory *id = (ImpDirectory *) imp; for (i = 0; id[i].name_rva; i++) { /* int ofs = id[i].name_rva - import_rva; */ track_down ((char *) imp + id[i].name_rva - import_rva, (char *) ".dll", lvl + 2); } } } if (strstr (path, "\\cygwin1.dll")) cygwin_info (fh);}static voidtrack_down (char *file, char *suffix, int lvl){ if (file == NULL) { keyeprint ("track_down: malloc()"); return; } if (suffix == NULL) { keyeprint ("track_down: malloc()"); return; } char *path = find_on_path (file, suffix, 0, 1); if (!path) { printf ("Error: could not find %s\n", file); return; } Did *d = already_did (file); switch (d->state) { case DID_NEW: break; case DID_ACTIVE: if (verbose) { if (lvl) printf ("%*c", lvl, ' '); printf ("%s", path); printf (" (recursive)\n"); } return; case DID_INACTIVE: if (verbose) { if (lvl) printf ("%*c", lvl, ' '); printf ("%s", path); printf (" (already done)\n"); } return; default: break; } if (lvl) printf ("%*c", lvl, ' '); if (!path) { printf ("%s not found\n", file); return; } printf ("%s", path); HANDLE fh = CreateFile (path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (fh == INVALID_HANDLE_VALUE) { printf (" - Cannot open\n"); return; } d->state = DID_ACTIVE; dll_info (path, fh, lvl, 1); d->state = DID_INACTIVE; if (!CloseHandle (fh)) keyeprint ("track_down: CloseHandle()");}static voidls (char *f){ HANDLE h = CreateFile (f, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); BY_HANDLE_FILE_INFORMATION info; if (!GetFileInformationByHandle (h, &info)) keyeprint ("ls: GetFileInformationByHandle()"); SYSTEMTIME systime; if (!FileTimeToSystemTime (&info.ftLastWriteTime, &systime)) keyeprint ("ls: FileTimeToSystemTime()"); printf ("%5dk %04d/%02d/%02d %s", (((int) info.nFileSizeLow) + 512) / 1024, systime.wYear, systime.wMonth, systime.wDay, f); dll_info (f, h, 16, 0); if (!CloseHandle (h)) keyeprint ("ls: CloseHandle()");}static voidcygcheck (char *app){ char *papp = find_on_path (app, (char *) ".exe", 1, 0); if (!papp) { printf ("Error: could not find %s\n", app); return; } char *s = strdup (papp); char *sl = 0, *t; for (t = s; *t; t++) if (*t == '/' || *t == '\\' || *t == ':') sl = t; if (sl == 0) paths[0] = (char *) "."; else { *sl = 0; paths[0] = s; } did = 0; track_down (papp, (char *) ".exe", 0);}extern char **environ;struct RegInfo{ RegInfo *prev; char *name; HKEY key;};static voidshow_reg (RegInfo * ri, int nest){ if (!ri) return; show_reg (ri->prev, 1); if (nest) printf ("%s\\", ri->name); else printf ("%s\n", ri->name);}static voidscan_registry (RegInfo * prev, HKEY hKey, char *name, int cygnus){ RegInfo ri; ri.prev = prev; ri.name = name; ri.key = hKey; char *cp; for (cp = name; *cp; cp++) if (strncasecmp (cp, "cygnus", 6) == 0) cygnus = 1; DWORD num_subkeys, max_subkey_len, num_values; DWORD max_value_len, max_valdata_len, i; if (RegQueryInfoKey (hKey, 0, 0, 0, &num_subkeys, &max_subkey_len, 0, &num_values, &max_value_len, &max_valdata_len, 0, 0) != ERROR_SUCCESS) {#if 0 char tmp[400]; FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), tmp, 400, 0); printf ("RegQueryInfoKey: %s\n", tmp);#endif return; } if (cygnus) { show_reg (&ri, 0); char *value_name = (char *) malloc (max_value_len + 1); if (value_name == NULL) { keyeprint ("scan_registry: malloc()"); return; } char *value_data = (char *) malloc (max_valdata_len + 1); if (value_data == NULL) { keyeprint ("scan_registry: malloc()"); return; } for (i = 0; i < num_values; i++) { DWORD dlen = max_valdata_len + 1; DWORD nlen = max_value_len + 1; DWORD type; RegEnumValue (hKey, i, value_name, &nlen, 0, &type, (BYTE *) value_data, &dlen); { printf (" %s = ", i ? value_name : "(default)"); switch (type) { case REG_DWORD: printf ("0x%08x\n", *(unsigned *) value_data); break; case REG_EXPAND_SZ: case REG_SZ: printf ("`%s'\n", value_data); break; default: printf ("(unsupported type)\n"); break; } } } free (value_name); free (value_data); } char *subkey_name = (char *) malloc (max_subkey_len + 1); for (i = 0; i < num_subkeys; i++) { if (RegEnumKey (hKey, i, subkey_name, max_subkey_len + 1) == ERROR_SUCCESS) { HKEY sKey; if (RegOpenKeyEx (hKey, subkey_name, 0, KEY_READ, &sKey) == ERROR_SUCCESS) { scan_registry (&ri, sKey, subkey_name, cygnus); if (RegCloseKey (sKey) != ERROR_SUCCESS) keyeprint ("scan_registry: RegCloseKey()"); } } } free (subkey_name);}static voiddump_sysinfo (){ int i, j; char tmp[4000]; time_t now; char *found_cygwin_dll; printf ("\nCygwin Win95/NT Configuration Diagnostics\n"); time (&now); printf ("Current System Time: %s\n", ctime (&now)); OSVERSIONINFO osversion; osversion.dwOSVersionInfoSize = sizeof (osversion); if (!GetVersionEx (&osversion)) keyeprint ("dump_sysinfo: GetVersionEx()"); char *osname = (char *) "unknown OS"; switch (osversion.dwPlatformId) { case VER_PLATFORM_WIN32s: osname = (char *) "32s"; break; case VER_PLATFORM_WIN32_WINDOWS: switch (osversion.dwMinorVersion) { case 0: if (strchr (osversion.szCSDVersion, 'C')) osname = (char *) "95 OSR2"; else osname = (char *) "95"; break; case 10: if (strchr (osversion.szCSDVersion, 'A')) osname = (char *) "98 SE"; else osname = (char *) "98"; break; case 90: osname = (char *) "ME"; break; default: osname = (char *) "9X"; break; } break; case VER_PLATFORM_WIN32_NT: if (osversion.dwMajorVersion == 5) { BOOL more_info = FALSE; OSVERSIONINFOEX osversionex; osversionex.dwOSVersionInfoSize = sizeof (osversionex); if (GetVersionEx ((OSVERSIONINFO *) &osversionex)) more_info = TRUE; if (osversion.dwMinorVersion == 0) { if (!more_info) osname = (char *) "2000"; else if (osversionex.wProductType == VER_NT_SERVER || osversionex.wProductType == VER_NT_DOMAIN_CONTROLLER) { if (osversionex.wSuiteMask &VER_SUITE_DATACENTER) osname = (char *) "2000 Datacenter Server"; else if (osversionex.wSuiteMask & VER_SUITE_ENTERPRISE) osname = (char *) "2000 Advanced Server"; else osname = (char *) "2000 Server"; } else osname = (char *) "2000 Professional"; } else { if (!more_info) osname = (char *) "XP"; else if (osversionex.wProductType == VER_NT_SERVER || osversionex.wProductType == VER_NT_DOMAIN_CONTROLLER) { if (osversionex.wSuiteMask & VER_SUITE_ENTERPRISE) osname = (char *) ".NET Enterprise Server"; else osname = (char *) ".NET Server"; } else if (osversionex.wSuiteMask & VER_SUITE_PERSONAL) osname = (char *) "XP Home Edition"; else osname = (char *) "XP Professional"; } } else osname = (char *) "NT"; break; default: osname = (char *) "??"; break; } printf ("Windows %s Ver %lu.%lu Build %lu %s\n\n", osname, osversion.dwMajorVersion, osversion.dwMinorVersion, osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ? osversion.dwBuildNumber : (osversion.dwBuildNumber & 0xffff), osversion.dwPlatformId == VER_PLATFORM_WIN32_NT ? osversion.szCSDVersion : ""); printf ("Path:"); char *s = getenv ("PATH"), *e; char sep = strchr (s, ';') ? ';' : ':'; int count_path_items = 0; while (1) { for (e = s; *e && *e != sep; e++); printf ("\t%.*s\n", e - s, s); count_path_items++; if (!*e) break; s = e + 1; } if (!GetSystemDirectory (tmp, 4000)) keyeprint ("dump_sysinfo: GetSystemDirectory()"); printf ("\nSysDir: %s\n", tmp); GetWindowsDirectory (tmp, 4000); printf ("WinDir: %s\n\n", tmp); if (givehelp) printf ("Here's some environment variables that may affect cygwin:\n"); for (i = 0; environ[i]; i++) { char *eq = strchr (environ[i], '='); if (!eq) continue; /* int len = eq - environ[i]; */ for (j = 0; known_env_vars[j]; j++) { *eq = 0; if (strcmp (environ[i], "PATH") == 0) continue; /* we handle this one specially */ if (strcasecmp (environ[i], known_env_vars[j]) == 0) printf ("%s = `%s'\n", environ[i], eq + 1); *eq = '='; } } printf ("\n"); if (verbose) { if (givehelp) printf ("Here's the rest of your environment variables:\n"); for (i = 0; environ[i]; i++) { int found = 0; char *eq = strchr (environ[i], '='); if (!eq) continue; /* int len = eq - environ[i]; */ for (j = 0; known_env_vars[j]; j++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -