1 /* This file is part of Netwib. Read and honor its license.
2 */
3 
4 /*-------------------------------------------------------------*/
netwib_priv_dll_init(void)5 netwib_err netwib_priv_dll_init(void)
6 {
7   netwib_err ret;
8 
9   /* init iphlpapi */
10   ret = netwib_priv_dll_iphlpapi_init(&netwib_global_dll_iphlpapi);
11   if (ret != NETWIB_ERR_OK) {
12     /* ensure it is not loaded */
13     netwib_global_dll_iphlpapi.isloaded = NETWIB_FALSE;
14   }
15 
16   /* init winsock version 2.2  */
17   ret = netwib_priv_dll_winsock2_init(&netwib_global_dll_winsock2);
18   if (ret != NETWIB_ERR_OK) {
19     /* ensure it is not loaded */
20     netwib_global_dll_winsock2.isloaded = NETWIB_FALSE;
21   }
22 
23   /* init snmp */
24  #if NETWIBDEF_HAVEFUNC_WINDOWS_SNMP == 1
25   ret = netwib_priv_dll_snmp_init(&netwib_global_dll_snmp);
26   if (ret != NETWIB_ERR_OK) {
27     /* ensure it is not loaded */
28     netwib_global_dll_snmp.isloaded = NETWIB_FALSE;
29   }
30  #endif
31 
32   /* init kernel32 */
33   ret = netwib_priv_dll_kernel32_init(&netwib_global_dll_kernel32);
34   if (ret != NETWIB_ERR_OK) {
35     /* ensure it is not loaded */
36     netwib_global_dll_kernel32.isloaded = NETWIB_FALSE;
37   }
38 
39   /* init packet */
40   ret = netwib_priv_dll_packet_init(&netwib_global_dll_packet);
41   if (ret != NETWIB_ERR_OK) {
42     /* ensure it is not loaded */
43     netwib_global_dll_packet.isloaded = NETWIB_FALSE;
44   }
45 
46   /* init winpcap */
47   ret = netwib_priv_dll_winpcap_init(&netwib_global_dll_winpcap);
48   if (ret != NETWIB_ERR_OK) {
49     /* ensure it is not loaded */
50     netwib_global_dll_winpcap.isloaded = NETWIB_FALSE;
51   }
52 
53 #if 0
54   /* currently unused */
55   /* init RAS api */
56   ret = netwib_priv_dll_rasapi32_init(&netwib_global_dll_rasapi32);
57   if (ret != NETWIB_ERR_OK) {
58     /* ensure it is not loaded */
59     netwib_global_dll_rasapi32.isloaded = NETWIB_FALSE;
60   }
61 #endif
62 
63   return(NETWIB_ERR_OK);
64 }
65 
66 /*-------------------------------------------------------------*/
netwib_priv_dll_close(void)67 netwib_err netwib_priv_dll_close(void)
68 {
69   netwib_err ret, retret;
70 
71   /* ignore error, but return it */
72   retret = NETWIB_ERR_OK;
73 
74 #if 0
75   /* currently unused */
76   ret = netwib_priv_dll_rasapi32_close(&netwib_global_dll_rasapi32);
77   if (ret != NETWIB_ERR_OK)
78     retret = ret;
79 #endif
80   ret = netwib_priv_dll_winpcap_close(&netwib_global_dll_winpcap);
81   if (ret != NETWIB_ERR_OK)
82     retret = ret;
83   ret = netwib_priv_dll_packet_close(&netwib_global_dll_packet);
84   if (ret != NETWIB_ERR_OK)
85     retret = ret;
86   ret = netwib_priv_dll_kernel32_close(&netwib_global_dll_kernel32);
87   if (ret != NETWIB_ERR_OK)
88     retret = ret;
89  #if NETWIBDEF_HAVEFUNC_WINDOWS_SNMP == 1
90   ret = netwib_priv_dll_snmp_close(&netwib_global_dll_snmp);
91   if (ret != NETWIB_ERR_OK)
92     retret = ret;
93  #endif
94   ret = netwib_priv_dll_winsock2_close(&netwib_global_dll_winsock2);
95   if (ret != NETWIB_ERR_OK)
96     retret = ret;
97   ret = netwib_priv_dll_iphlpapi_close(&netwib_global_dll_iphlpapi);
98   if (ret != NETWIB_ERR_OK)
99     retret = ret;
100 
101   return(retret);
102 }
103 
104 /*-------------------------------------------------------------*/
netwib_priv_dll_loadlibrary(netwib_conststring name,HINSTANCE * ph)105 netwib_err netwib_priv_dll_loadlibrary(netwib_conststring name,
106                                        HINSTANCE *ph)
107 {
108   netwib_data bufarray[MAX_PATH];
109   netwib_string str;
110   netwib_buf buf;
111   UINT err;
112 
113   netwib_er(netwib_buf_init_ext_storagearraysizeof(bufarray, &buf));
114 
115   /* search in system directory */
116   err = GetSystemDirectory((netwib_string)netwib__buf_ref_data_ptr(&buf), MAX_PATH);
117   if (err != 0 && err <= MAX_PATH) {
118     buf.endoffset = err;
119     netwib_er(netwib_buf_append_byte('\\', &buf));
120     netwib_er(netwib_buf_append_string(name, &buf));
121     netwib_er(netwib_buf_ref_string(&buf, &str));
122     *ph = LoadLibrary(str);
123     if (*ph != NULL) {
124       netwib_er(netwib_buf_close(&buf));
125       return(NETWIB_ERR_OK);
126     }
127   }
128 
129   /* search in windows directory */
130   err = GetWindowsDirectory((netwib_string)netwib__buf_ref_data_ptr(&buf), MAX_PATH);
131   if (err != 0 && err <= MAX_PATH) {
132     buf.endoffset = err;
133     netwib_er(netwib_buf_append_byte('\\', &buf));
134     netwib_er(netwib_buf_append_string(name, &buf));
135     netwib_er(netwib_buf_ref_string(&buf, &str));
136     *ph = LoadLibrary(str);
137     if (*ph != NULL) {
138       netwib_er(netwib_buf_close(&buf));
139       return(NETWIB_ERR_OK);
140     }
141   }
142   netwib_er(netwib_buf_close(&buf));
143 
144   /* search in path */
145   *ph = LoadLibrary(name);
146   if (*ph == NULL) {
147     return(NETWIB_ERR_FULOADLIBRARY);
148   }
149 
150   return(NETWIB_ERR_OK);
151 }
152