:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / drivers / net / wshtcpip / wshtcpip.c
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS WinSock Helper DLL for TCP/IP
4  * FILE:        wshtcpip.c
5  * PURPOSE:     DLL entry
6  * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7  * REVISIONS:
8  *   CSH 01/09-2000 Created
9  */
10 #include <wshtcpip.h>
11
12 #ifdef DBG
13
14 /* See debug.h for debug/trace constants */
15 DWORD DebugTraceLevel = MAX_TRACE;
16
17 #endif /* DBG */
18
19 /* To make the linker happy */
20 VOID STDCALL KeBugCheck (ULONG  BugCheckCode) {}
21
22
23 BOOL
24 EXPORT
25 DllMain(HANDLE hInstDll,
26         ULONG dwReason,
27         PVOID Reserved)
28 {
29     WSH_DbgPrint(MIN_TRACE, ("DllMain of wshtcpip.dll\n"));
30
31     switch (dwReason) {
32     case DLL_PROCESS_ATTACH:
33         /* Don't need thread attach notifications
34            so disable them to improve performance */
35         DisableThreadLibraryCalls(hInstDll);
36         break;
37
38     case DLL_THREAD_ATTACH:
39         break;
40
41     case DLL_THREAD_DETACH:
42         break;
43
44     case DLL_PROCESS_DETACH:
45         break;
46     }
47     return TRUE;
48 }
49
50
51 INT
52 EXPORT
53 WSHAddressToString(
54     IN      LPSOCKADDR Address,
55     IN      INT AddressLength,
56     IN      LPWSAPROTOCOL_INFOW ProtocolInfo    OPTIONAL,
57     OUT     LPWSTR AddressString,
58     IN OUT  LPDWORD AddressStringLength)
59 {
60     UNIMPLEMENTED
61
62     return 0;
63 }
64
65
66 INT
67 EXPORT
68 WSHEnumProtocols(
69     IN      LPINT lpiProtocols  OPTIONAL,
70     IN      LPWSTR lpTransportKeyName,
71     IN OUT  LPVOID lpProtocolBuffer,
72     IN OUT  LPDWORD lpdwBufferLength)
73 {
74     UNIMPLEMENTED
75
76     return 0;
77 }
78
79
80 INT
81 EXPORT
82 WSHGetBroadcastSockaddr(
83     IN  PVOID HelperDllSocketContext,
84     OUT PSOCKADDR Sockaddr,
85     OUT PINT SockaddrLength)
86 {
87     UNIMPLEMENTED
88
89     return 0;
90 }
91
92
93 INT
94 EXPORT
95 WSHGetProviderGuid(
96     IN  LPWSTR ProviderName,
97     OUT LPGUID ProviderGuid)
98 {
99     UNIMPLEMENTED
100
101     return 0;
102 }
103
104
105 INT
106 EXPORT
107 WSHGetSockaddrType(
108     IN  PSOCKADDR Sockaddr,
109     IN  DWORD SockaddrLength,
110     OUT PSOCKADDR_INFO SockaddrInfo)
111 {
112     UNIMPLEMENTED
113
114     return 0;
115 }
116
117
118 INT
119 EXPORT
120 WSHGetSocketInformation(
121     IN  PVOID HelperDllSocketContext,
122     IN  SOCKET SocketHandle,
123     IN  HANDLE TdiAddressObjectHandle,
124     IN  HANDLE TdiConnectionObjectHandle,
125     IN  INT Level,
126     IN  INT OptionName,
127     OUT PCHAR OptionValue,
128     OUT INT OptionLength)
129 {
130     UNIMPLEMENTED
131
132     return 0;
133 }
134
135
136 INT
137 EXPORT
138 WSHGetWildcardSockaddr(
139     IN  PVOID HelperDllSocketContext,
140     OUT PSOCKADDR Sockaddr,
141     OUT PINT SockaddrLength)
142 {
143     UNIMPLEMENTED
144
145     return 0;
146 }
147
148
149 DWORD
150 EXPORT
151 WSHGetWinsockMapping(
152     OUT PWINSOCK_MAPPING Mapping,
153     IN  DWORD MappingLength)
154 {
155     UNIMPLEMENTED
156
157     return 0;
158 }
159
160
161 INT
162 EXPORT
163 WSHGetWSAProtocolInfo(
164     IN  LPWSTR ProviderName,
165     OUT LPWSAPROTOCOL_INFOW *ProtocolInfo,
166     OUT LPDWORD ProtocolInfoEntries)
167 {
168     UNIMPLEMENTED
169
170     return 0;
171 }
172
173
174 INT
175 EXPORT
176 WSHIoctl(
177     IN  PVOID HelperDllSocketContext,
178     IN  SOCKET SocketHandle,
179     IN  HANDLE TdiAddressObjectHandle,
180     IN  HANDLE TdiConnectionObjectHandle,
181     IN  DWORD IoControlCode,
182     IN  LPVOID InputBuffer,
183     IN  DWORD InputBufferLength,
184     IN  LPVOID OutputBuffer,
185     IN  DWORD OutputBufferLength,
186     OUT LPDWORD NumberOfBytesReturned,
187     IN  LPWSAOVERLAPPED Overlapped,
188     IN  LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine,
189     OUT LPBOOL NeedsCompletion)
190 {
191     UNIMPLEMENTED
192
193     return 0;
194 }
195
196
197 INT
198 EXPORT
199 WSHJoinLeaf(
200     IN  PVOID HelperDllSocketContext,
201     IN  SOCKET SocketHandle,
202     IN  HANDLE TdiAddressObjectHandle,
203     IN  HANDLE TdiConnectionObjectHandle,
204     IN  PVOID LeafHelperDllSocketContext,
205     IN  SOCKET LeafSocketHandle,
206     IN  PSOCKADDR Sockaddr,
207     IN  DWORD SockaddrLength,
208     IN  LPWSABUF CallerData,
209     IN  LPWSABUF CalleeData,
210     IN  LPQOS SocketQOS,
211     IN  LPQOS GroupQOS,
212     IN  DWORD Flags)
213 {
214     UNIMPLEMENTED
215
216     return 0;
217 }
218
219
220 INT
221 EXPORT
222 WSHNotify(
223     IN  PVOID HelperDllSocketContext,
224     IN  SOCKET SocketHandle,
225     IN  HANDLE TdiAddressObjectHandle,
226     IN  HANDLE TdiConnectionObjectHandle,
227     IN  DWORD NotifyEvent)
228 {
229     UNIMPLEMENTED
230
231     return 0;
232 }
233
234
235 INT
236 EXPORT
237 WSHOpenSocket(
238     IN OUT  PINT AddressFamily,
239     IN OUT  PINT SocketType,
240     IN OUT  PINT Protocol,
241     OUT     PUNICODE_STRING TransportDeviceName,
242     OUT     PVOID HelperDllSocketContext,
243     OUT     PDWORD NotificationEvents)
244 /*
245  * FUNCTION: Opens a socket
246  */
247 {
248     return WSHOpenSocket2(AddressFamily,
249                           SocketType,
250                           Protocol,
251                           0,
252                           0,
253                           TransportDeviceName,
254                           HelperDllSocketContext,
255                           NotificationEvents);
256 }
257
258
259 INT
260 EXPORT
261 WSHOpenSocket2(
262     OUT PINT AddressFamily,
263     IN  OUT PINT SocketType,
264     IN  OUT PINT Protocol,
265     IN  GROUP Group,
266     IN  DWORD Flags,
267     OUT PUNICODE_STRING TransportDeviceName,
268     OUT PVOID *HelperDllSocketContext,
269     OUT PDWORD NotificationEvents)
270 /*
271  * FUNCTION: Opens a socket
272  * ARGUMENTS:
273  *     AddressFamily          = Address of buffer with address family (updated)
274  *     SocketType             = Address of buffer with type of socket (updated)
275  *     Protocol               = Address of buffer with protocol number (updated)
276  *     Group                  = Socket group
277  *     Flags                  = Socket flags
278  *     TransportDeviceName    = Address of buffer to place name of transport device
279  *     HelperDllSocketContext = Address of buffer to place socket context pointer
280  *     NotificationEvents     = Address of buffer to place flags for event notification
281  * RETURNS:
282  *     Status of operation
283  * NOTES:
284  *     Mapping tripple is returned in an canonicalized form
285  */
286 {
287     PSOCKET_CONTEXT Context;
288     UNICODE_STRING String;
289     NTSTATUS Status;
290
291     WSH_DbgPrint(MAX_TRACE, ("\n"));
292
293     switch (*SocketType) {
294     case SOCK_STREAM:
295         RtlInitUnicodeStringFromLiteral(&String, DD_TCP_DEVICE_NAME);
296         break;
297
298     case SOCK_DGRAM:
299         RtlInitUnicodeStringFromLiteral(&String, DD_UDP_DEVICE_NAME);
300         break;
301
302     case SOCK_RAW:
303         if ((*Protocol < 0) || (*Protocol > 255))
304           return WSAEINVAL;
305
306         RtlInitUnicodeStringFromLiteral(&String, DD_RAW_IP_DEVICE_NAME);
307         break;
308
309     default:
310         return WSAEINVAL;
311     }
312
313     RtlInitUnicodeString(TransportDeviceName, NULL);
314
315     TransportDeviceName->MaximumLength = String.Length +        /* Transport device name */
316                                          (4 * sizeof(WCHAR) +   /* Separator and protocol */
317                                          sizeof(UNICODE_NULL)); /* Terminating null */
318
319     TransportDeviceName->Buffer = HeapAlloc(
320         GetProcessHeap(),
321         0,
322         TransportDeviceName->MaximumLength);
323
324     if (!TransportDeviceName->Buffer)
325         return WSAENOBUFS;
326
327     /* Append the transport device name */
328     Status = RtlAppendUnicodeStringToString(TransportDeviceName, &String);
329
330     if (*SocketType == SOCK_RAW) {
331         /* Append a separator */
332         TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = OBJ_NAME_PATH_SEPARATOR;
333         TransportDeviceName->Length += sizeof(WCHAR);
334         TransportDeviceName->Buffer[TransportDeviceName->Length / sizeof(WCHAR)] = UNICODE_NULL;
335
336         /* Append the protocol number */
337         String.Buffer = TransportDeviceName->Buffer + (TransportDeviceName->Length / sizeof(WCHAR));
338         String.Length = 0;
339         String.MaximumLength = TransportDeviceName->MaximumLength - TransportDeviceName->Length;
340
341         Status = RtlIntegerToUnicodeString((ULONG)*Protocol, 10, &String);
342
343         TransportDeviceName->Length += String.Length;
344     }
345
346     /* Setup a socket context area */
347
348     Context = HeapAlloc(GetProcessHeap(), 0, sizeof(SOCKET_CONTEXT));
349     if (!Context) {
350         RtlFreeUnicodeString(TransportDeviceName);
351         return WSAENOBUFS;
352     }
353
354     Context->AddressFamily = *AddressFamily;
355     Context->SocketType    = *SocketType;
356     Context->Protocol      = *Protocol;
357     Context->Flags         = Flags;
358
359     *HelperDllSocketContext = Context;
360
361     return NO_ERROR;
362 }
363
364
365 INT
366 EXPORT
367 WSHSetSocketInformation(
368     IN  PVOID HelperDllSocketContext,
369     IN  SOCKET SocketHandle,
370     IN  HANDLE TdiAddressObjectHandle,
371     IN  HANDLE TdiConnectionObjectHandle,
372     IN  INT Level,
373     IN  INT OptionName,
374     IN  PCHAR OptionValue,
375     IN  INT OptionLength)
376 {
377     UNIMPLEMENTED
378
379     return 0;
380 }
381
382
383 INT
384 EXPORT
385 WSHStringToAddress(
386     IN      LPWSTR AddressString,
387     IN      DWORD AddressFamily,
388     IN      LPWSAPROTOCOL_INFOW ProtocolInfo    OPTIONAL,
389     OUT     LPSOCKADDR Address,
390     IN OUT  LPDWORD AddressStringLength)
391 {
392     UNIMPLEMENTED
393
394     return 0;
395 }
396
397 /* EOF */