xref: /reactos/dll/win32/ws2_32/src/rasdial.c (revision 40462c92)
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS WinSock 2 API
4  * FILE:        dll/win32/ws2_32_new/src/rasdial.c
5  * PURPOSE:     RAS Auto-Dial Support
6  * PROGRAMMER:  Alex Ionescu (alex@relsoft.net)
7  */
8 
9 /* INCLUDES ******************************************************************/
10 
11 #include <ws2_32.h>
12 
13 #define NDEBUG
14 #include <debug.h>
15 
16 /* DATA **********************************************************************/
17 
18 typedef BOOL
19 (WSAAPI *PWS_ATTEMPT_AUTODIAL_ADDR)(
20     IN CONST SOCKADDR FAR *Name,
21     IN INT NameLength
22 );
23 
24 typedef BOOL
25 (WSAAPI *PWS_ATTEMPT_AUTODIAL_NAME)(IN CONST LPWSAQUERYSETW lpqsRestrictions);
26 
27 typedef VOID
28 (WSAAPI *PWS_NOTE_SUCCESSFUL_HOSTENT_LOOKUP)(
29     IN CONST CHAR FAR *Name,
30     IN CONST ULONG Address
31 );
32 
33 BOOLEAN WsRasInitialized;
34 HINSTANCE WsRasDllHandle;
35 CRITICAL_SECTION WsRasHelperLock;
36 PWS_ATTEMPT_AUTODIAL_ADDR lpfnWSAttemptAutodialAddr;
37 PWS_ATTEMPT_AUTODIAL_NAME lpfnWSAttemptAutodialName;
38 PWS_NOTE_SUCCESSFUL_HOSTENT_LOOKUP lpfnWSNoteSuccessfulHostentLookup;
39 
40 #define WsRasLock()         EnterCriticalSection(&WsRasHelperLock)
41 #define WsRasUnlock()       LeaveCriticalSection(&WsRasHelperLock)
42 
43 /* FUNCTIONS *****************************************************************/
44 
45 VOID
46 WSAAPI
47 WsRasInitializeAutodial(VOID)
48 {
49     /* Initialize the autodial lock */
50     InitializeCriticalSection(&WsRasHelperLock);
51 }
52 
53 VOID
54 WSAAPI
55 WsRasUninitializeAutodial(VOID)
56 {
57     /* Acquire lock */
58     WsRasLock();
59 
60     /* Free the library if it's loaded */
61     if (WsRasDllHandle) FreeLibrary(WsRasDllHandle);
62     WsRasDllHandle = NULL;
63 
64     /* Release and delete lock */
65     WsRasUnlock();
66     DeleteCriticalSection(&WsRasHelperLock);
67 }
68 
69 INT
70 WSAAPI
71 WsRasLoadHelperDll(VOID)
72 {
73     CHAR HelperPath[MAX_PATH];
74     HKEY WinsockKey;
75     INT ErrorCode;
76     DWORD RegType = REG_SZ;
77     DWORD RegSize = MAX_PATH;
78 
79     /* Acquire the lock */
80     WsRasLock();
81 
82     /* Check if we were already initialized */
83     if (!WsRasInitialized)
84     {
85         /* Open the registry root key */
86         WinsockKey = WsOpenRegistryRoot();
87         if (WinsockKey)
88         {
89             /* Read the helper's location */
90             ErrorCode = RegQueryValueEx(WinsockKey,
91                                         "AutodialDLL",
92                                         0,
93                                         &RegType,
94                                         (LPBYTE)&HelperPath,
95                                         &RegSize);
96             RegCloseKey(WinsockKey);
97 
98             /* Make sure we read the path */
99             if (ErrorCode == ERROR_SUCCESS)
100             {
101                 /* Now load it */
102                 WsRasDllHandle = LoadLibrary(HelperPath);
103             }
104         }
105 
106         /* Check if we weren't able to load it and load the default */
107         if (!WsRasDllHandle) WsRasDllHandle = LoadLibrary("rasadhlp.dll");
108 
109         /* Check again if we loaded it */
110         if (WsRasDllHandle)
111         {
112             /* Get function pointers */
113             lpfnWSAttemptAutodialAddr =
114                 (PVOID)GetProcAddress(WsRasDllHandle,
115                                       "WSAttemptAutodialAddr");
116             lpfnWSAttemptAutodialName =
117                 (PVOID)GetProcAddress(WsRasDllHandle,
118                                       "WSAttemptAutodialName");
119             lpfnWSNoteSuccessfulHostentLookup =
120                 (PVOID)GetProcAddress(WsRasDllHandle,
121                                       "WSNoteSuccessfulHostentLookup");
122         }
123 
124         /* Mark us as loaded */
125         WsRasInitialized = TRUE;
126     }
127 
128     /* Release lock */
129     WsRasUnlock();
130 
131     /* Return status */
132     return WsRasInitialized;
133 }
134 
135 BOOL
136 WSAAPI
137 WSAttemptAutodialAddr(IN CONST SOCKADDR FAR *Name,
138                       IN INT NameLength)
139 {
140     /* Load the helper DLL and make sure it exports this routine */
141     if (!(WsRasLoadHelperDll()) || !(lpfnWSAttemptAutodialAddr)) return FALSE;
142 
143     /* Call the function in the helper */
144     return lpfnWSAttemptAutodialAddr(Name, NameLength);
145 }
146 
147 BOOL
148 WSAAPI
149 WSAttemptAutodialName(IN CONST LPWSAQUERYSETW lpqsRestrictions)
150 {
151     /* Load the helper DLL and make sure it exports this routine */
152     if (!(WsRasLoadHelperDll()) || !(lpfnWSAttemptAutodialName)) return FALSE;
153 
154     /* Call the function in the helper */
155     return lpfnWSAttemptAutodialName(lpqsRestrictions);
156 }
157 
158 VOID
159 WSAAPI
160 WSNoteSuccessfulHostentLookup(IN CONST CHAR FAR *Name,
161                               IN CONST ULONG Address)
162 {
163     /* Load the helper DLL and make sure it exports this routine */
164     if (!(WsRasLoadHelperDll()) || !(lpfnWSNoteSuccessfulHostentLookup)) return;
165 
166     /* Call the function in the helper */
167     lpfnWSNoteSuccessfulHostentLookup(Name, Address);
168 }
169