1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
#include <ngx_config.h>
#include <ngx_core.h>
int ngx_max_sockets;
ngx_os_io_t ngx_os_io = {
ngx_wsarecv,
NULL,
NULL,
NULL
};
/* Should these pointers be per protocol ? */
LPFN_ACCEPTEX acceptex;
LPFN_GETACCEPTEXSOCKADDRS getacceptexsockaddrs;
LPFN_TRANSMITFILE transmitfile;
static GUID ae_guid = WSAID_ACCEPTEX;
static GUID as_guid = WSAID_GETACCEPTEXSOCKADDRS;
static GUID tf_guid = WSAID_TRANSMITFILE;
int ngx_os_init(ngx_log_t *log)
{
u_int sp;
DWORD bytes;
SOCKET s;
WSADATA wsd;
OSVERSIONINFOEX osvi;
/* get Windows version */
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
osviex = GetVersionEx((OSVERSIONINFO *) &osvi);
if (osviex == 0) {
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (GetVersionEx((OSVERSIONINFO *) &osvi) == 0)
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"GetVersionEx() failed");
return NGX_ERROR;
}
}
/*
* Windows 95 1400
* Windows 98 1410
* Windows ME 1490
* Windows NT 3.51 2351
* Windows NT 4.0 2400
* Windows 2000 2500
* Windows XP 2501
* Windows 2003 2502
*/
ngx_win32_version = osvi.dwPlatformId * 1000
+ osvi.dwMajorVersion * 100
+ osvi.dwMinorVersion;
if (osviex) {
sp = osvi.wServicePackMajor * 100 + osvi.wServicePackMinor;
ngx_log_error(NGX_LOG_INFO, log, 0,
"OS: %u build:%u, %s, SP:%u, suite:%x, type:%u",
ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion,
sp, osvi.wSuiteMask, osvi.wProductType);
} else {
ngx_log_error(NGX_LOG_INFO, log, 0, "OS: %u build:%u, %s",
ngx_win32_version, osvi.dwBuildNumber, osvi.szCSDVersion);
}
/* init Winsock */
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
"WSAStartup() failed");
return NGX_ERROR;
}
/* get AcceptEx(), GetAcceptExSockAddrs() and TransmitFile() addresses */
s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0);
if (s == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
ngx_socket_n " %s falied");
return NGX_ERROR;
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &ae_guid, sizeof(GUID),
&acceptex, sizeof(LPFN_ACCEPTEX), &bytes, NULL, NULL) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_ACCEPTEX) failed");
return NGX_ERROR;
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &as_guid, sizeof(GUID),
&getacceptexsockaddrs, sizeof(LPFN_GETACCEPTEXSOCKADDRS),
&bytes, NULL, NULL) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_ACCEPTEX) failed");
return NGX_ERROR;
}
if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER, &tf_guid, sizeof(GUID),
&transmitfile, sizeof(LPFN_TRANSMITFILE), &bytes,
NULL, NULL) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
"WSAIoctl(SIO_GET_EXTENSION_FUNCTION_POINTER, "
"WSAID_TRANSMITFILE) failed");
return NGX_ERROR;
}
if (ngx_close_socket(s) == -1) {
ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno,
ngx_close_socket_n " failed");
}
return NGX_OK;
}
|