summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/apr_config.hw8
-rw-r--r--include/apr_private.hw8
-rw-r--r--include/arch/win32/apr_private.h8
-rw-r--r--misc/win32/start.c34
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) {