diff options
-rw-r--r-- | include/apr_config.hw | 8 | ||||
-rw-r--r-- | include/apr_private.hw | 8 | ||||
-rw-r--r-- | include/arch/win32/apr_private.h | 8 | ||||
-rw-r--r-- | misc/win32/start.c | 34 |
4 files changed, 54 insertions, 4 deletions
diff --git a/include/apr_config.hw b/include/apr_config.hw index e64d023d3..e60c93a86 100644 --- a/include/apr_config.hw +++ b/include/apr_config.hw @@ -155,7 +155,13 @@ typedef void (Sigfunc)(int); typedef enum { APR_WIN_95 = 0, APR_WIN_98 = 4, - APR_WIN_NT = 8 + APR_WIN_NT = 8, + APR_WIN_NT_4 = 12, + APR_WIN_NT_4_SP2 = 14, + APR_WIN_NT_4_SP3 = 15, + APR_WIN_NT_4_SP4 = 16, + APR_WIN_NT_4_SP6 = 18, + APR_WIN_2000 = 24 } ap_oslevel_e; diff --git a/include/apr_private.hw b/include/apr_private.hw index e64d023d3..e60c93a86 100644 --- a/include/apr_private.hw +++ b/include/apr_private.hw @@ -155,7 +155,13 @@ typedef void (Sigfunc)(int); typedef enum { APR_WIN_95 = 0, APR_WIN_98 = 4, - APR_WIN_NT = 8 + APR_WIN_NT = 8, + APR_WIN_NT_4 = 12, + APR_WIN_NT_4_SP2 = 14, + APR_WIN_NT_4_SP3 = 15, + APR_WIN_NT_4_SP4 = 16, + APR_WIN_NT_4_SP6 = 18, + APR_WIN_2000 = 24 } ap_oslevel_e; diff --git a/include/arch/win32/apr_private.h b/include/arch/win32/apr_private.h index e64d023d3..e60c93a86 100644 --- a/include/arch/win32/apr_private.h +++ b/include/arch/win32/apr_private.h @@ -155,7 +155,13 @@ typedef void (Sigfunc)(int); typedef enum { APR_WIN_95 = 0, APR_WIN_98 = 4, - APR_WIN_NT = 8 + APR_WIN_NT = 8, + APR_WIN_NT_4 = 12, + APR_WIN_NT_4_SP2 = 14, + APR_WIN_NT_4_SP3 = 15, + APR_WIN_NT_4_SP4 = 16, + APR_WIN_NT_4_SP6 = 18, + APR_WIN_2000 = 24 } ap_oslevel_e; diff --git a/misc/win32/start.c b/misc/win32/start.c index 89913672e..20f41465c 100644 --- a/misc/win32/start.c +++ b/misc/win32/start.c @@ -119,14 +119,46 @@ ap_status_t ap_destroy_context(ap_context_t *cont) ap_status_t ap_get_oslevel(ap_context_t *cont, ap_oslevel_e *level) { static OSVERSIONINFO oslev; + static unsigned int servpack = 0; static BOOL first = TRUE; + char *pservpack; if (first) { first = FALSE; + oslev.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&oslev); + if (oslev.dwPlatformId == VER_PLATFORM_WIN32_NT) { + for (pservpack = oslev.szCSDVersion; + *pservpack && !isdigit(*pservpack); pservpack++) + ; + if (*pservpack) + servpack = atoi(pservpack); + } } if (oslev.dwPlatformId == VER_PLATFORM_WIN32_NT) { - (*level) = APR_WIN_NT; + if (oslev.dwMajorVersion == 5) { + (*level) = APR_WIN_2000; + } + else if (oslev.dwMajorVersion == 4) { + if (servpack >= 6) { + (*level) = APR_WIN_NT_4_SP6; + } + else if (servpack >= 4) { + (*level) = APR_WIN_NT_4_SP4; + } + else if (servpack >= 3) { + (*level) = APR_WIN_NT_4_SP3; + } + else if (servpack >= 2) { + (*level) = APR_WIN_NT_4_SP2; + } + else { + (*level) = APR_WIN_NT_4; + } + } + else { + (*level) = APR_WIN_NT; + } return APR_SUCCESS; } else if (oslev.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { |