SHGetFileInfo should tolerate null pointers.
[wine] / dlls / netapi32 / netapi32.c
1 /*
2  * Copyright 2001 Mike McCormack
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #include "config.h"
20
21 #include <string.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <fcntl.h>
25 #ifdef HAVE_UNISTD_H
26 # include <unistd.h>
27 #endif
28
29 #include "winbase.h"
30 #include "winreg.h"
31 #include "wingdi.h"
32 #include "winuser.h"
33 #include "wine/debug.h"
34 #include "winerror.h"
35 #include "nb30.h"
36 #include "lmcons.h"
37 #include "iphlpapi.h"
38
39 WINE_DEFAULT_DEBUG_CHANNEL(netbios);
40
41 HMODULE NETAPI32_hModule = 0;
42
43 static UCHAR NETBIOS_Enum(PNCB ncb)
44 {
45     int             i;
46     LANA_ENUM *lanas = (PLANA_ENUM) ncb->ncb_buffer;
47     DWORD apiReturn, size = 0;
48     PMIB_IFTABLE table;
49     UCHAR ret;
50  
51     TRACE("NCBENUM\n");
52  
53     apiReturn = GetIfTable(NULL, &size, FALSE);
54     if (apiReturn != NO_ERROR)
55       {
56         table = (PMIB_IFTABLE)malloc(size);
57         if (table)
58           {
59             apiReturn = GetIfTable(table, &size, FALSE);
60             if (apiReturn == NO_ERROR)
61               {
62                 lanas->length = 0;
63                 for (i = 0; i < table->dwNumEntries && lanas->length < MAX_LANA;
64                  i++)
65                   {
66                     if (table->table[i].dwType != MIB_IF_TYPE_LOOPBACK)
67                       {
68                         lanas->lana[lanas->length] = table->table[i].dwIndex;
69                         lanas->length++;
70                       }
71                   }
72                 ret = NRC_GOODRET;
73               }
74             else
75                 ret = NRC_SYSTEM;
76             free(table);
77           }
78         else
79             ret = NRC_NORESOURCES;
80       }
81     else
82         ret = NRC_SYSTEM;
83     return ret;
84 }
85
86
87 static UCHAR NETBIOS_Astat(PNCB ncb)
88 {
89     PADAPTER_STATUS astat = (PADAPTER_STATUS) ncb->ncb_buffer;
90     MIB_IFROW row;
91   
92     TRACE("NCBASTAT (Adapter %d)\n", ncb->ncb_lana_num);
93   
94     memset(astat, 0, sizeof astat);
95   
96     row.dwIndex = ncb->ncb_lana_num;
97     if (GetIfEntry(&row) != NO_ERROR)
98         return NRC_INVADDRESS;
99     /* doubt anyone cares, but why not.. */
100     if (row.dwType == MIB_IF_TYPE_TOKENRING)
101         astat->adapter_type = 0xff;
102     else
103         astat->adapter_type = 0xfe; /* for Ethernet */
104     return NRC_GOODRET;
105 }
106
107 BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
108 {
109     TRACE("%p,%lx,%p\n", hinstDLL, fdwReason, lpvReserved);
110
111     switch (fdwReason) {
112         case DLL_PROCESS_ATTACH:
113             NETAPI32_hModule = hinstDLL;
114             break;
115         case DLL_PROCESS_DETACH:
116             break;
117     }
118
119     return TRUE;
120 }
121
122 BOOL WINAPI Netbios(PNCB pncb)
123 {
124     UCHAR ret = NRC_ILLCMD;
125
126     TRACE("ncb = %p\n",pncb);
127
128     if(!pncb)
129         return NRC_INVADDRESS;
130
131     switch(pncb->ncb_command&0x7f)
132     {
133     case NCBRESET:
134         FIXME("NCBRESET adapter %d\n",pncb->ncb_lana_num);
135         if(pncb->ncb_lana_num < MAX_LANA )
136           {
137             MIB_IFROW row;
138
139             row.dwIndex = pncb->ncb_lana_num;
140             if (GetIfEntry(&row) != NO_ERROR)
141                 ret = NRC_GOODRET;
142             else
143                 ret = NRC_ILLCMD; /* NetBIOS emulator not found */
144           }
145         else
146             ret = NRC_ILLCMD; /* NetBIOS emulator not found */
147         break;
148
149     case NCBADDNAME:
150         FIXME("NCBADDNAME\n");
151         break;
152
153     case NCBADDGRNAME:
154         FIXME("NCBADDGRNAME\n");
155         break;
156
157     case NCBDELNAME:
158         FIXME("NCBDELNAME\n");
159         break;
160
161     case NCBSEND:
162         FIXME("NCBSEND\n");
163         break;
164
165     case NCBRECV:
166         FIXME("NCBRECV\n");
167         break;
168
169     case NCBHANGUP:
170         FIXME("NCBHANGUP\n");
171         break;
172
173     case NCBCANCEL:
174         FIXME("NCBCANCEL\n");
175         break;
176
177     case NCBLISTEN:
178         FIXME("NCBLISTEN\n");
179         break;
180
181     case NCBASTAT:
182         ret = NETBIOS_Astat(pncb);
183         break;
184
185     case NCBENUM:
186         ret = NETBIOS_Enum(pncb);
187         break;
188
189     default:
190         FIXME("(%p): command code %02x\n", pncb, pncb->ncb_command);
191
192         ret = NRC_ILLCMD; /* NetBIOS emulator not found */
193     }
194     pncb->ncb_retcode = ret;
195     return ret;
196 }
197
198 NET_API_STATUS  WINAPI NetServerEnum(
199   LPCWSTR servername,
200   DWORD level,
201   LPBYTE* bufptr,
202   DWORD prefmaxlen,
203   LPDWORD entriesread,
204   LPDWORD totalentries,
205   DWORD servertype,
206   LPCWSTR domain,
207   LPDWORD resume_handle
208 )
209 {
210     FIXME("Stub (%p, %ld %p %ld %p %p %ld %s %p)\n",servername, level, bufptr,
211           prefmaxlen, entriesread, totalentries, servertype, debugstr_w(domain), resume_handle);
212
213     return ERROR_NO_BROWSER_SERVERS_FOUND;
214 }