[CIFS] reduce checkpatch warnings
[firefly-linux-kernel-4.4.55.git] / fs / cifs / netmisc.c
1 /*
2  *   fs/cifs/netmisc.c
3  *
4  *   Copyright (c) International Business Machines  Corp., 2002,2008
5  *   Author(s): Steve French (sfrench@us.ibm.com)
6  *
7  *   Error mapping routines from Samba libsmb/errormap.c
8  *   Copyright (C) Andrew Tridgell 2001
9  *
10  *   This program is free software;  you can redistribute it and/or modify
11  *   it under the terms of the GNU General Public License as published by
12  *   the Free Software Foundation; either version 2 of the License, or
13  *   (at your option) any later version.
14  *
15  *   This program is distributed in the hope that it will be useful,
16  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
17  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
18  *   the GNU General Public License for more details.
19  *
20  *   You should have received a copy of the GNU General Public License
21  *   along with this program;  if not, write to the Free Software
22  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23  */
24
25 #include <linux/net.h>
26 #include <linux/string.h>
27 #include <linux/in.h>
28 #include <linux/ctype.h>
29 #include <linux/fs.h>
30 #include <asm/div64.h>
31 #include <asm/byteorder.h>
32 #include <linux/inet.h>
33 #include "cifsfs.h"
34 #include "cifspdu.h"
35 #include "cifsglob.h"
36 #include "cifsproto.h"
37 #include "smberr.h"
38 #include "cifs_debug.h"
39 #include "nterr.h"
40
41 struct smb_to_posix_error {
42         __u16 smb_err;
43         int posix_code;
44 };
45
46 static const struct smb_to_posix_error mapping_table_ERRDOS[] = {
47         {ERRbadfunc, -EINVAL},
48         {ERRbadfile, -ENOENT},
49         {ERRbadpath, -ENOTDIR},
50         {ERRnofids, -EMFILE},
51         {ERRnoaccess, -EACCES},
52         {ERRbadfid, -EBADF},
53         {ERRbadmcb, -EIO},
54         {ERRnomem, -ENOMEM},
55         {ERRbadmem, -EFAULT},
56         {ERRbadenv, -EFAULT},
57         {ERRbadformat, -EINVAL},
58         {ERRbadaccess, -EACCES},
59         {ERRbaddata, -EIO},
60         {ERRbaddrive, -ENXIO},
61         {ERRremcd, -EACCES},
62         {ERRdiffdevice, -EXDEV},
63         {ERRnofiles, -ENOENT},
64         {ERRbadshare, -ETXTBSY},
65         {ERRlock, -EACCES},
66         {ERRunsup, -EINVAL},
67         {ERRnosuchshare, -ENXIO},
68         {ERRfilexists, -EEXIST},
69         {ERRinvparm, -EINVAL},
70         {ERRdiskfull, -ENOSPC},
71         {ERRinvname, -ENOENT},
72         {ERRinvlevel, -EOPNOTSUPP},
73         {ERRdirnotempty, -ENOTEMPTY},
74         {ERRnotlocked, -ENOLCK},
75         {ERRcancelviolation, -ENOLCK},
76         {ERRalreadyexists, -EEXIST},
77         {ERRmoredata, -EOVERFLOW},
78         {ERReasnotsupported, -EOPNOTSUPP},
79         {ErrQuota, -EDQUOT},
80         {ErrNotALink, -ENOLINK},
81         {ERRnetlogonNotStarted, -ENOPROTOOPT},
82         {ErrTooManyLinks, -EMLINK},
83         {0, 0}
84 };
85
86 static const struct smb_to_posix_error mapping_table_ERRSRV[] = {
87         {ERRerror, -EIO},
88         {ERRbadpw, -EACCES},  /* was EPERM */
89         {ERRbadtype, -EREMOTE},
90         {ERRaccess, -EACCES},
91         {ERRinvtid, -ENXIO},
92         {ERRinvnetname, -ENXIO},
93         {ERRinvdevice, -ENXIO},
94         {ERRqfull, -ENOSPC},
95         {ERRqtoobig, -ENOSPC},
96         {ERRqeof, -EIO},
97         {ERRinvpfid, -EBADF},
98         {ERRsmbcmd, -EBADRQC},
99         {ERRsrverror, -EIO},
100         {ERRbadBID, -EIO},
101         {ERRfilespecs, -EINVAL},
102         {ERRbadLink, -EIO},
103         {ERRbadpermits, -EINVAL},
104         {ERRbadPID, -ESRCH},
105         {ERRsetattrmode, -EINVAL},
106         {ERRpaused, -EHOSTDOWN},
107         {ERRmsgoff, -EHOSTDOWN},
108         {ERRnoroom, -ENOSPC},
109         {ERRrmuns, -EUSERS},
110         {ERRtimeout, -ETIME},
111         {ERRnoresource, -ENOBUFS},
112         {ERRtoomanyuids, -EUSERS},
113         {ERRbaduid, -EACCES},
114         {ERRusempx, -EIO},
115         {ERRusestd, -EIO},
116         {ERR_NOTIFY_ENUM_DIR, -ENOBUFS},
117         {ERRnoSuchUser, -EACCES},
118 /*      {ERRaccountexpired, -EACCES},
119         {ERRbadclient, -EACCES},
120         {ERRbadLogonTime, -EACCES},
121         {ERRpasswordExpired, -EACCES},*/
122         {ERRaccountexpired, -EKEYEXPIRED},
123         {ERRbadclient, -EACCES},
124         {ERRbadLogonTime, -EACCES},
125         {ERRpasswordExpired, -EKEYEXPIRED},
126
127         {ERRnosupport, -EINVAL},
128         {0, 0}
129 };
130
131 static const struct smb_to_posix_error mapping_table_ERRHRD[] = {
132         {0, 0}
133 };
134
135
136 /* if the mount helper is missing we need to reverse the 1st slash
137    from '/' to backslash in order to format the UNC properly for
138    ip address parsing and for tree connect (unless the user
139    remembered to put the UNC name in properly). Fortunately we do
140    not have to call this twice (we check for IPv4 addresses
141    first, so it is already converted by the time we
142    try IPv6 addresses */
143 static int canonicalize_unc(char *cp)
144 {
145         int i;
146
147         for (i = 0; i <= 46 /* INET6_ADDRSTRLEN */ ; i++) {
148                 if (cp[i] == 0)
149                         break;
150                 if (cp[i] == '\\')
151                         break;
152                 if (cp[i] == '/') {
153 #ifdef CONFIG_CIFS_DEBUG2
154                         cFYI(1, ("change slash to backslash in malformed UNC"));
155 #endif
156                         cp[i] = '\\';
157                         return 1;
158                 }
159         }
160         return 0;
161 }
162
163 /* Convert string containing dotted ip address to binary form */
164 /* returns 0 if invalid address */
165
166 int
167 cifs_inet_pton(int address_family, char *cp, void *dst)
168 {
169         int ret = 0;
170
171         /* calculate length by finding first slash or NULL */
172         if (address_family == AF_INET) {
173                 ret = in4_pton(cp, -1 /* len */, dst, '\\', NULL);
174                 if (ret == 0) {
175                         if (canonicalize_unc(cp))
176                                 ret = in4_pton(cp, -1, dst, '\\', NULL);
177                 }
178         } else if (address_family == AF_INET6) {
179                 ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL);
180         }
181 #ifdef CONFIG_CIFS_DEBUG2
182         cFYI(1, ("address conversion returned %d for %s", ret, cp));
183 #endif
184         if (ret > 0)
185                 ret = 1;
186         return ret;
187 }
188
189 /*****************************************************************************
190 convert a NT status code to a dos class/code
191  *****************************************************************************/
192 /* NT status -> dos error map */
193 static const struct {
194         __u8 dos_class;
195         __u16 dos_code;
196         __u32 ntstatus;
197 } ntstatus_to_dos_map[] = {
198         {
199         ERRDOS, ERRgeneral, NT_STATUS_UNSUCCESSFUL}, {
200         ERRDOS, ERRbadfunc, NT_STATUS_NOT_IMPLEMENTED}, {
201         ERRDOS, ERRinvlevel, NT_STATUS_INVALID_INFO_CLASS}, {
202         ERRDOS, 24, NT_STATUS_INFO_LENGTH_MISMATCH}, {
203         ERRHRD, ERRgeneral, NT_STATUS_ACCESS_VIOLATION}, {
204         ERRHRD, ERRgeneral, NT_STATUS_IN_PAGE_ERROR}, {
205         ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_QUOTA}, {
206         ERRDOS, ERRbadfid, NT_STATUS_INVALID_HANDLE}, {
207         ERRHRD, ERRgeneral, NT_STATUS_BAD_INITIAL_STACK}, {
208         ERRDOS, 193, NT_STATUS_BAD_INITIAL_PC}, {
209         ERRDOS, 87, NT_STATUS_INVALID_CID}, {
210         ERRHRD, ERRgeneral, NT_STATUS_TIMER_NOT_CANCELED}, {
211         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER}, {
212         ERRDOS, ERRbadfile, NT_STATUS_NO_SUCH_DEVICE}, {
213         ERRDOS, ERRbadfile, NT_STATUS_NO_SUCH_FILE}, {
214         ERRDOS, ERRbadfunc, NT_STATUS_INVALID_DEVICE_REQUEST}, {
215         ERRDOS, 38, NT_STATUS_END_OF_FILE}, {
216         ERRDOS, 34, NT_STATUS_WRONG_VOLUME}, {
217         ERRDOS, 21, NT_STATUS_NO_MEDIA_IN_DEVICE}, {
218         ERRHRD, ERRgeneral, NT_STATUS_UNRECOGNIZED_MEDIA}, {
219         ERRDOS, 27, NT_STATUS_NONEXISTENT_SECTOR},
220 /*      { This NT error code was 'sqashed'
221          from NT_STATUS_MORE_PROCESSING_REQUIRED to NT_STATUS_OK
222          during the session setup } */
223         {
224         ERRDOS, ERRnomem, NT_STATUS_NO_MEMORY}, {
225         ERRDOS, 487, NT_STATUS_CONFLICTING_ADDRESSES}, {
226         ERRDOS, 487, NT_STATUS_NOT_MAPPED_VIEW}, {
227         ERRDOS, 87, NT_STATUS_UNABLE_TO_FREE_VM}, {
228         ERRDOS, 87, NT_STATUS_UNABLE_TO_DELETE_SECTION}, {
229         ERRDOS, 2142, NT_STATUS_INVALID_SYSTEM_SERVICE}, {
230         ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_INSTRUCTION}, {
231         ERRDOS, ERRnoaccess, NT_STATUS_INVALID_LOCK_SEQUENCE}, {
232         ERRDOS, ERRnoaccess, NT_STATUS_INVALID_VIEW_SIZE}, {
233         ERRDOS, 193, NT_STATUS_INVALID_FILE_FOR_SECTION}, {
234         ERRDOS, ERRnoaccess, NT_STATUS_ALREADY_COMMITTED},
235 /*      { This NT error code was 'sqashed'
236          from NT_STATUS_ACCESS_DENIED to NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE
237          during the session setup }   */
238         {
239         ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED}, {
240         ERRDOS, 111, NT_STATUS_BUFFER_TOO_SMALL}, {
241         ERRDOS, ERRbadfid, NT_STATUS_OBJECT_TYPE_MISMATCH}, {
242         ERRHRD, ERRgeneral, NT_STATUS_NONCONTINUABLE_EXCEPTION}, {
243         ERRHRD, ERRgeneral, NT_STATUS_INVALID_DISPOSITION}, {
244         ERRHRD, ERRgeneral, NT_STATUS_UNWIND}, {
245         ERRHRD, ERRgeneral, NT_STATUS_BAD_STACK}, {
246         ERRHRD, ERRgeneral, NT_STATUS_INVALID_UNWIND_TARGET}, {
247         ERRDOS, 158, NT_STATUS_NOT_LOCKED}, {
248         ERRHRD, ERRgeneral, NT_STATUS_PARITY_ERROR}, {
249         ERRDOS, 487, NT_STATUS_UNABLE_TO_DECOMMIT_VM}, {
250         ERRDOS, 487, NT_STATUS_NOT_COMMITTED}, {
251         ERRHRD, ERRgeneral, NT_STATUS_INVALID_PORT_ATTRIBUTES}, {
252         ERRHRD, ERRgeneral, NT_STATUS_PORT_MESSAGE_TOO_LONG}, {
253         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_MIX}, {
254         ERRHRD, ERRgeneral, NT_STATUS_INVALID_QUOTA_LOWER}, {
255         ERRHRD, ERRgeneral, NT_STATUS_DISK_CORRUPT_ERROR}, {
256          /* mapping changed since shell does lookup on * expects FileNotFound */
257         ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_INVALID}, {
258         ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND}, {
259         ERRDOS, ERRalreadyexists, NT_STATUS_OBJECT_NAME_COLLISION}, {
260         ERRHRD, ERRgeneral, NT_STATUS_HANDLE_NOT_WAITABLE}, {
261         ERRDOS, ERRbadfid, NT_STATUS_PORT_DISCONNECTED}, {
262         ERRHRD, ERRgeneral, NT_STATUS_DEVICE_ALREADY_ATTACHED}, {
263         ERRDOS, 161, NT_STATUS_OBJECT_PATH_INVALID}, {
264         ERRDOS, ERRbadpath, NT_STATUS_OBJECT_PATH_NOT_FOUND}, {
265         ERRDOS, 161, NT_STATUS_OBJECT_PATH_SYNTAX_BAD}, {
266         ERRHRD, ERRgeneral, NT_STATUS_DATA_OVERRUN}, {
267         ERRHRD, ERRgeneral, NT_STATUS_DATA_LATE_ERROR}, {
268         ERRDOS, 23, NT_STATUS_DATA_ERROR}, {
269         ERRDOS, 23, NT_STATUS_CRC_ERROR}, {
270         ERRDOS, ERRnomem, NT_STATUS_SECTION_TOO_BIG}, {
271         ERRDOS, ERRnoaccess, NT_STATUS_PORT_CONNECTION_REFUSED}, {
272         ERRDOS, ERRbadfid, NT_STATUS_INVALID_PORT_HANDLE}, {
273         ERRDOS, ERRbadshare, NT_STATUS_SHARING_VIOLATION}, {
274         ERRHRD, ERRgeneral, NT_STATUS_QUOTA_EXCEEDED}, {
275         ERRDOS, 87, NT_STATUS_INVALID_PAGE_PROTECTION}, {
276         ERRDOS, 288, NT_STATUS_MUTANT_NOT_OWNED}, {
277         ERRDOS, 298, NT_STATUS_SEMAPHORE_LIMIT_EXCEEDED}, {
278         ERRDOS, 87, NT_STATUS_PORT_ALREADY_SET}, {
279         ERRDOS, 87, NT_STATUS_SECTION_NOT_IMAGE}, {
280         ERRDOS, 156, NT_STATUS_SUSPEND_COUNT_EXCEEDED}, {
281         ERRDOS, ERRnoaccess, NT_STATUS_THREAD_IS_TERMINATING}, {
282         ERRDOS, 87, NT_STATUS_BAD_WORKING_SET_LIMIT}, {
283         ERRDOS, 87, NT_STATUS_INCOMPATIBLE_FILE_MAP}, {
284         ERRDOS, 87, NT_STATUS_SECTION_PROTECTION}, {
285         ERRDOS, ERReasnotsupported, NT_STATUS_EAS_NOT_SUPPORTED}, {
286         ERRDOS, 255, NT_STATUS_EA_TOO_LARGE}, {
287         ERRHRD, ERRgeneral, NT_STATUS_NONEXISTENT_EA_ENTRY}, {
288         ERRHRD, ERRgeneral, NT_STATUS_NO_EAS_ON_FILE}, {
289         ERRHRD, ERRgeneral, NT_STATUS_EA_CORRUPT_ERROR}, {
290         ERRDOS, ERRlock, NT_STATUS_FILE_LOCK_CONFLICT}, {
291         ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED}, {
292         ERRDOS, ERRbadfile, NT_STATUS_DELETE_PENDING}, {
293         ERRDOS, ERRunsup, NT_STATUS_CTL_FILE_NOT_SUPPORTED}, {
294         ERRHRD, ERRgeneral, NT_STATUS_UNKNOWN_REVISION}, {
295         ERRHRD, ERRgeneral, NT_STATUS_REVISION_MISMATCH}, {
296         ERRHRD, ERRgeneral, NT_STATUS_INVALID_OWNER}, {
297         ERRHRD, ERRgeneral, NT_STATUS_INVALID_PRIMARY_GROUP}, {
298         ERRHRD, ERRgeneral, NT_STATUS_NO_IMPERSONATION_TOKEN}, {
299         ERRHRD, ERRgeneral, NT_STATUS_CANT_DISABLE_MANDATORY}, {
300         ERRDOS, 2215, NT_STATUS_NO_LOGON_SERVERS}, {
301         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_LOGON_SESSION}, {
302         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_PRIVILEGE}, {
303         ERRDOS, ERRnoaccess, NT_STATUS_PRIVILEGE_NOT_HELD}, {
304         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ACCOUNT_NAME}, {
305         ERRHRD, ERRgeneral, NT_STATUS_USER_EXISTS},
306 /*      { This NT error code was 'sqashed'
307          from NT_STATUS_NO_SUCH_USER to NT_STATUS_LOGON_FAILURE
308          during the session setup } */
309         {
310         ERRDOS, ERRnoaccess, NT_STATUS_NO_SUCH_USER}, { /* could map to 2238 */
311         ERRHRD, ERRgeneral, NT_STATUS_GROUP_EXISTS}, {
312         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_GROUP}, {
313         ERRHRD, ERRgeneral, NT_STATUS_MEMBER_IN_GROUP}, {
314         ERRHRD, ERRgeneral, NT_STATUS_MEMBER_NOT_IN_GROUP}, {
315         ERRHRD, ERRgeneral, NT_STATUS_LAST_ADMIN},
316 /*      { This NT error code was 'sqashed'
317          from NT_STATUS_WRONG_PASSWORD to NT_STATUS_LOGON_FAILURE
318          during the session setup } */
319         {
320         ERRSRV, ERRbadpw, NT_STATUS_WRONG_PASSWORD}, {
321         ERRHRD, ERRgeneral, NT_STATUS_ILL_FORMED_PASSWORD}, {
322         ERRHRD, ERRgeneral, NT_STATUS_PASSWORD_RESTRICTION}, {
323         ERRDOS, ERRnoaccess, NT_STATUS_LOGON_FAILURE}, {
324         ERRHRD, ERRgeneral, NT_STATUS_ACCOUNT_RESTRICTION}, {
325         ERRSRV, ERRbadLogonTime, NT_STATUS_INVALID_LOGON_HOURS}, {
326         ERRSRV, ERRbadclient, NT_STATUS_INVALID_WORKSTATION}, {
327         ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_EXPIRED}, {
328         ERRSRV, ERRaccountexpired, NT_STATUS_ACCOUNT_DISABLED}, {
329         ERRHRD, ERRgeneral, NT_STATUS_NONE_MAPPED}, {
330         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_LUIDS_REQUESTED}, {
331         ERRHRD, ERRgeneral, NT_STATUS_LUIDS_EXHAUSTED}, {
332         ERRHRD, ERRgeneral, NT_STATUS_INVALID_SUB_AUTHORITY}, {
333         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ACL}, {
334         ERRHRD, ERRgeneral, NT_STATUS_INVALID_SID}, {
335         ERRHRD, ERRgeneral, NT_STATUS_INVALID_SECURITY_DESCR}, {
336         ERRDOS, 127, NT_STATUS_PROCEDURE_NOT_FOUND}, {
337         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_FORMAT}, {
338         ERRHRD, ERRgeneral, NT_STATUS_NO_TOKEN}, {
339         ERRHRD, ERRgeneral, NT_STATUS_BAD_INHERITANCE_ACL}, {
340         ERRDOS, 158, NT_STATUS_RANGE_NOT_LOCKED}, {
341         ERRDOS, 112, NT_STATUS_DISK_FULL}, {
342         ERRHRD, ERRgeneral, NT_STATUS_SERVER_DISABLED}, {
343         ERRHRD, ERRgeneral, NT_STATUS_SERVER_NOT_DISABLED}, {
344         ERRDOS, 68, NT_STATUS_TOO_MANY_GUIDS_REQUESTED}, {
345         ERRDOS, 259, NT_STATUS_GUIDS_EXHAUSTED}, {
346         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ID_AUTHORITY}, {
347         ERRDOS, 259, NT_STATUS_AGENTS_EXHAUSTED}, {
348         ERRDOS, 154, NT_STATUS_INVALID_VOLUME_LABEL}, {
349         ERRDOS, 14, NT_STATUS_SECTION_NOT_EXTENDED}, {
350         ERRDOS, 487, NT_STATUS_NOT_MAPPED_DATA}, {
351         ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_DATA_NOT_FOUND}, {
352         ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_TYPE_NOT_FOUND}, {
353         ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_NAME_NOT_FOUND}, {
354         ERRHRD, ERRgeneral, NT_STATUS_ARRAY_BOUNDS_EXCEEDED}, {
355         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_DENORMAL_OPERAND}, {
356         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_DIVIDE_BY_ZERO}, {
357         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_INEXACT_RESULT}, {
358         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_INVALID_OPERATION}, {
359         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_OVERFLOW}, {
360         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_STACK_CHECK}, {
361         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_UNDERFLOW}, {
362         ERRHRD, ERRgeneral, NT_STATUS_INTEGER_DIVIDE_BY_ZERO}, {
363         ERRDOS, 534, NT_STATUS_INTEGER_OVERFLOW}, {
364         ERRHRD, ERRgeneral, NT_STATUS_PRIVILEGED_INSTRUCTION}, {
365         ERRDOS, ERRnomem, NT_STATUS_TOO_MANY_PAGING_FILES}, {
366         ERRHRD, ERRgeneral, NT_STATUS_FILE_INVALID}, {
367         ERRHRD, ERRgeneral, NT_STATUS_ALLOTTED_SPACE_EXCEEDED},
368 /*      { This NT error code was 'sqashed'
369          from NT_STATUS_INSUFFICIENT_RESOURCES to
370          NT_STATUS_INSUFF_SERVER_RESOURCES during the session setup } */
371         {
372         ERRDOS, ERRnomem, NT_STATUS_INSUFFICIENT_RESOURCES}, {
373         ERRDOS, ERRbadpath, NT_STATUS_DFS_EXIT_PATH_FOUND}, {
374         ERRDOS, 23, NT_STATUS_DEVICE_DATA_ERROR}, {
375         ERRHRD, ERRgeneral, NT_STATUS_DEVICE_NOT_CONNECTED}, {
376         ERRDOS, 21, NT_STATUS_DEVICE_POWER_FAILURE}, {
377         ERRDOS, 487, NT_STATUS_FREE_VM_NOT_AT_BASE}, {
378         ERRDOS, 487, NT_STATUS_MEMORY_NOT_ALLOCATED}, {
379         ERRHRD, ERRgeneral, NT_STATUS_WORKING_SET_QUOTA}, {
380         ERRDOS, 19, NT_STATUS_MEDIA_WRITE_PROTECTED}, {
381         ERRDOS, 21, NT_STATUS_DEVICE_NOT_READY}, {
382         ERRHRD, ERRgeneral, NT_STATUS_INVALID_GROUP_ATTRIBUTES}, {
383         ERRHRD, ERRgeneral, NT_STATUS_BAD_IMPERSONATION_LEVEL}, {
384         ERRHRD, ERRgeneral, NT_STATUS_CANT_OPEN_ANONYMOUS}, {
385         ERRHRD, ERRgeneral, NT_STATUS_BAD_VALIDATION_CLASS}, {
386         ERRHRD, ERRgeneral, NT_STATUS_BAD_TOKEN_TYPE}, {
387         ERRDOS, 87, NT_STATUS_BAD_MASTER_BOOT_RECORD}, {
388         ERRHRD, ERRgeneral, NT_STATUS_INSTRUCTION_MISALIGNMENT}, {
389         ERRDOS, ERRpipebusy, NT_STATUS_INSTANCE_NOT_AVAILABLE}, {
390         ERRDOS, ERRpipebusy, NT_STATUS_PIPE_NOT_AVAILABLE}, {
391         ERRDOS, ERRbadpipe, NT_STATUS_INVALID_PIPE_STATE}, {
392         ERRDOS, ERRpipebusy, NT_STATUS_PIPE_BUSY}, {
393         ERRDOS, ERRbadfunc, NT_STATUS_ILLEGAL_FUNCTION}, {
394         ERRDOS, ERRnotconnected, NT_STATUS_PIPE_DISCONNECTED}, {
395         ERRDOS, ERRpipeclosing, NT_STATUS_PIPE_CLOSING}, {
396         ERRHRD, ERRgeneral, NT_STATUS_PIPE_CONNECTED}, {
397         ERRHRD, ERRgeneral, NT_STATUS_PIPE_LISTENING}, {
398         ERRDOS, ERRbadpipe, NT_STATUS_INVALID_READ_MODE}, {
399         ERRDOS, 121, NT_STATUS_IO_TIMEOUT}, {
400         ERRDOS, 38, NT_STATUS_FILE_FORCED_CLOSED}, {
401         ERRHRD, ERRgeneral, NT_STATUS_PROFILING_NOT_STARTED}, {
402         ERRHRD, ERRgeneral, NT_STATUS_PROFILING_NOT_STOPPED}, {
403         ERRHRD, ERRgeneral, NT_STATUS_COULD_NOT_INTERPRET}, {
404         ERRDOS, ERRnoaccess, NT_STATUS_FILE_IS_A_DIRECTORY}, {
405         ERRDOS, ERRunsup, NT_STATUS_NOT_SUPPORTED}, {
406         ERRDOS, 51, NT_STATUS_REMOTE_NOT_LISTENING}, {
407         ERRDOS, 52, NT_STATUS_DUPLICATE_NAME}, {
408         ERRDOS, 53, NT_STATUS_BAD_NETWORK_PATH}, {
409         ERRDOS, 54, NT_STATUS_NETWORK_BUSY}, {
410         ERRDOS, 55, NT_STATUS_DEVICE_DOES_NOT_EXIST}, {
411         ERRDOS, 56, NT_STATUS_TOO_MANY_COMMANDS}, {
412         ERRDOS, 57, NT_STATUS_ADAPTER_HARDWARE_ERROR}, {
413         ERRDOS, 58, NT_STATUS_INVALID_NETWORK_RESPONSE}, {
414         ERRDOS, 59, NT_STATUS_UNEXPECTED_NETWORK_ERROR}, {
415         ERRDOS, 60, NT_STATUS_BAD_REMOTE_ADAPTER}, {
416         ERRDOS, 61, NT_STATUS_PRINT_QUEUE_FULL}, {
417         ERRDOS, 62, NT_STATUS_NO_SPOOL_SPACE}, {
418         ERRDOS, 63, NT_STATUS_PRINT_CANCELLED}, {
419         ERRDOS, 64, NT_STATUS_NETWORK_NAME_DELETED}, {
420         ERRDOS, 65, NT_STATUS_NETWORK_ACCESS_DENIED}, {
421         ERRDOS, 66, NT_STATUS_BAD_DEVICE_TYPE}, {
422         ERRDOS, ERRnosuchshare, NT_STATUS_BAD_NETWORK_NAME}, {
423         ERRDOS, 68, NT_STATUS_TOO_MANY_NAMES}, {
424         ERRDOS, 69, NT_STATUS_TOO_MANY_SESSIONS}, {
425         ERRDOS, 70, NT_STATUS_SHARING_PAUSED}, {
426         ERRDOS, 71, NT_STATUS_REQUEST_NOT_ACCEPTED}, {
427         ERRDOS, 72, NT_STATUS_REDIRECTOR_PAUSED}, {
428         ERRDOS, 88, NT_STATUS_NET_WRITE_FAULT}, {
429         ERRHRD, ERRgeneral, NT_STATUS_PROFILING_AT_LIMIT}, {
430         ERRDOS, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE}, {
431         ERRDOS, ERRnoaccess, NT_STATUS_FILE_RENAMED}, {
432         ERRDOS, 240, NT_STATUS_VIRTUAL_CIRCUIT_CLOSED}, {
433         ERRHRD, ERRgeneral, NT_STATUS_NO_SECURITY_ON_OBJECT}, {
434         ERRHRD, ERRgeneral, NT_STATUS_CANT_WAIT}, {
435         ERRDOS, ERRpipeclosing, NT_STATUS_PIPE_EMPTY}, {
436         ERRHRD, ERRgeneral, NT_STATUS_CANT_ACCESS_DOMAIN_INFO}, {
437         ERRHRD, ERRgeneral, NT_STATUS_CANT_TERMINATE_SELF}, {
438         ERRHRD, ERRgeneral, NT_STATUS_INVALID_SERVER_STATE}, {
439         ERRHRD, ERRgeneral, NT_STATUS_INVALID_DOMAIN_STATE}, {
440         ERRHRD, ERRgeneral, NT_STATUS_INVALID_DOMAIN_ROLE}, {
441         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_DOMAIN}, {
442         ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_EXISTS}, {
443         ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_LIMIT_EXCEEDED}, {
444         ERRDOS, 300, NT_STATUS_OPLOCK_NOT_GRANTED}, {
445         ERRDOS, 301, NT_STATUS_INVALID_OPLOCK_PROTOCOL}, {
446         ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_DB_CORRUPTION}, {
447         ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_ERROR}, {
448         ERRHRD, ERRgeneral, NT_STATUS_GENERIC_NOT_MAPPED}, {
449         ERRHRD, ERRgeneral, NT_STATUS_BAD_DESCRIPTOR_FORMAT}, {
450         ERRHRD, ERRgeneral, NT_STATUS_INVALID_USER_BUFFER}, {
451         ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_IO_ERROR}, {
452         ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_CREATE_ERR}, {
453         ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_MAP_ERROR}, {
454         ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_EXTEND_ERR}, {
455         ERRHRD, ERRgeneral, NT_STATUS_NOT_LOGON_PROCESS}, {
456         ERRHRD, ERRgeneral, NT_STATUS_LOGON_SESSION_EXISTS}, {
457         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_1}, {
458         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_2}, {
459         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_3}, {
460         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_4}, {
461         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_5}, {
462         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_6}, {
463         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_7}, {
464         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_8}, {
465         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_9}, {
466         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_10}, {
467         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_11}, {
468         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_12}, {
469         ERRDOS, ERRbadpath, NT_STATUS_REDIRECTOR_NOT_STARTED}, {
470         ERRHRD, ERRgeneral, NT_STATUS_REDIRECTOR_STARTED}, {
471         ERRHRD, ERRgeneral, NT_STATUS_STACK_OVERFLOW}, {
472         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_PACKAGE}, {
473         ERRHRD, ERRgeneral, NT_STATUS_BAD_FUNCTION_TABLE}, {
474         ERRDOS, 203, 0xc0000100}, {
475         ERRDOS, 145, NT_STATUS_DIRECTORY_NOT_EMPTY}, {
476         ERRHRD, ERRgeneral, NT_STATUS_FILE_CORRUPT_ERROR}, {
477         ERRDOS, 267, NT_STATUS_NOT_A_DIRECTORY}, {
478         ERRHRD, ERRgeneral, NT_STATUS_BAD_LOGON_SESSION_STATE}, {
479         ERRHRD, ERRgeneral, NT_STATUS_LOGON_SESSION_COLLISION}, {
480         ERRDOS, 206, NT_STATUS_NAME_TOO_LONG}, {
481         ERRDOS, 2401, NT_STATUS_FILES_OPEN}, {
482         ERRDOS, 2404, NT_STATUS_CONNECTION_IN_USE}, {
483         ERRHRD, ERRgeneral, NT_STATUS_MESSAGE_NOT_FOUND}, {
484         ERRDOS, ERRnoaccess, NT_STATUS_PROCESS_IS_TERMINATING}, {
485         ERRHRD, ERRgeneral, NT_STATUS_INVALID_LOGON_TYPE}, {
486         ERRHRD, ERRgeneral, NT_STATUS_NO_GUID_TRANSLATION}, {
487         ERRHRD, ERRgeneral, NT_STATUS_CANNOT_IMPERSONATE}, {
488         ERRHRD, ERRgeneral, NT_STATUS_IMAGE_ALREADY_LOADED}, {
489         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_NOT_PRESENT}, {
490         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_LID_NOT_EXIST}, {
491         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_LID_ALREADY_OWNED}, {
492         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_NOT_LID_OWNER}, {
493         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_COMMAND}, {
494         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_LID}, {
495         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE}, {
496         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_SELECTOR}, {
497         ERRHRD, ERRgeneral, NT_STATUS_NO_LDT}, {
498         ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_SIZE}, {
499         ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_OFFSET}, {
500         ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_DESCRIPTOR}, {
501         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_NE_FORMAT}, {
502         ERRHRD, ERRgeneral, NT_STATUS_RXACT_INVALID_STATE}, {
503         ERRHRD, ERRgeneral, NT_STATUS_RXACT_COMMIT_FAILURE}, {
504         ERRHRD, ERRgeneral, NT_STATUS_MAPPED_FILE_SIZE_ZERO}, {
505         ERRDOS, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES}, {
506         ERRHRD, ERRgeneral, NT_STATUS_CANCELLED}, {
507         ERRDOS, ERRnoaccess, NT_STATUS_CANNOT_DELETE}, {
508         ERRHRD, ERRgeneral, NT_STATUS_INVALID_COMPUTER_NAME}, {
509         ERRDOS, ERRnoaccess, NT_STATUS_FILE_DELETED}, {
510         ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_ACCOUNT}, {
511         ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_GROUP}, {
512         ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_USER}, {
513         ERRHRD, ERRgeneral, NT_STATUS_MEMBERS_PRIMARY_GROUP}, {
514         ERRDOS, ERRbadfid, NT_STATUS_FILE_CLOSED}, {
515         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_THREADS}, {
516         ERRHRD, ERRgeneral, NT_STATUS_THREAD_NOT_IN_PROCESS}, {
517         ERRHRD, ERRgeneral, NT_STATUS_TOKEN_ALREADY_IN_USE}, {
518         ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_QUOTA_EXCEEDED}, {
519         ERRHRD, ERRgeneral, NT_STATUS_COMMITMENT_LIMIT}, {
520         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_LE_FORMAT}, {
521         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_NOT_MZ}, {
522         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_PROTECT}, {
523         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_WIN_16}, {
524         ERRHRD, ERRgeneral, NT_STATUS_LOGON_SERVER_CONFLICT}, {
525         ERRHRD, ERRgeneral, NT_STATUS_TIME_DIFFERENCE_AT_DC}, {
526         ERRHRD, ERRgeneral, NT_STATUS_SYNCHRONIZATION_REQUIRED}, {
527         ERRDOS, 126, NT_STATUS_DLL_NOT_FOUND}, {
528         ERRHRD, ERRgeneral, NT_STATUS_OPEN_FAILED}, {
529         ERRHRD, ERRgeneral, NT_STATUS_IO_PRIVILEGE_FAILED}, {
530         ERRDOS, 182, NT_STATUS_ORDINAL_NOT_FOUND}, {
531         ERRDOS, 127, NT_STATUS_ENTRYPOINT_NOT_FOUND}, {
532         ERRHRD, ERRgeneral, NT_STATUS_CONTROL_C_EXIT}, {
533         ERRDOS, 64, NT_STATUS_LOCAL_DISCONNECT}, {
534         ERRDOS, 64, NT_STATUS_REMOTE_DISCONNECT}, {
535         ERRDOS, 51, NT_STATUS_REMOTE_RESOURCES}, {
536         ERRDOS, 59, NT_STATUS_LINK_FAILED}, {
537         ERRDOS, 59, NT_STATUS_LINK_TIMEOUT}, {
538         ERRDOS, 59, NT_STATUS_INVALID_CONNECTION}, {
539         ERRDOS, 59, NT_STATUS_INVALID_ADDRESS}, {
540         ERRHRD, ERRgeneral, NT_STATUS_DLL_INIT_FAILED}, {
541         ERRHRD, ERRgeneral, NT_STATUS_MISSING_SYSTEMFILE}, {
542         ERRHRD, ERRgeneral, NT_STATUS_UNHANDLED_EXCEPTION}, {
543         ERRHRD, ERRgeneral, NT_STATUS_APP_INIT_FAILURE}, {
544         ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_CREATE_FAILED}, {
545         ERRHRD, ERRgeneral, NT_STATUS_NO_PAGEFILE}, {
546         ERRDOS, 124, NT_STATUS_INVALID_LEVEL}, {
547         ERRDOS, 86, NT_STATUS_WRONG_PASSWORD_CORE}, {
548         ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_FLOAT_CONTEXT}, {
549         ERRDOS, 109, NT_STATUS_PIPE_BROKEN}, {
550         ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_CORRUPT}, {
551         ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_IO_FAILED}, {
552         ERRHRD, ERRgeneral, NT_STATUS_NO_EVENT_PAIR}, {
553         ERRHRD, ERRgeneral, NT_STATUS_UNRECOGNIZED_VOLUME}, {
554         ERRHRD, ERRgeneral, NT_STATUS_SERIAL_NO_DEVICE_INITED}, {
555         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_ALIAS}, {
556         ERRHRD, ERRgeneral, NT_STATUS_MEMBER_NOT_IN_ALIAS}, {
557         ERRHRD, ERRgeneral, NT_STATUS_MEMBER_IN_ALIAS}, {
558         ERRHRD, ERRgeneral, NT_STATUS_ALIAS_EXISTS}, {
559         ERRHRD, ERRgeneral, NT_STATUS_LOGON_NOT_GRANTED}, {
560         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_SECRETS}, {
561         ERRHRD, ERRgeneral, NT_STATUS_SECRET_TOO_LONG}, {
562         ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_DB_ERROR}, {
563         ERRHRD, ERRgeneral, NT_STATUS_FULLSCREEN_MODE}, {
564         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_CONTEXT_IDS}, {
565         ERRDOS, ERRnoaccess, NT_STATUS_LOGON_TYPE_NOT_GRANTED}, {
566         ERRHRD, ERRgeneral, NT_STATUS_NOT_REGISTRY_FILE}, {
567         ERRHRD, ERRgeneral, NT_STATUS_NT_CROSS_ENCRYPTION_REQUIRED}, {
568         ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_CTRLR_CONFIG_ERROR}, {
569         ERRHRD, ERRgeneral, NT_STATUS_FT_MISSING_MEMBER}, {
570         ERRHRD, ERRgeneral, NT_STATUS_ILL_FORMED_SERVICE_ENTRY}, {
571         ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_CHARACTER}, {
572         ERRHRD, ERRgeneral, NT_STATUS_UNMAPPABLE_CHARACTER}, {
573         ERRHRD, ERRgeneral, NT_STATUS_UNDEFINED_CHARACTER}, {
574         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_VOLUME}, {
575         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_ID_MARK_NOT_FOUND}, {
576         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_WRONG_CYLINDER}, {
577         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_UNKNOWN_ERROR}, {
578         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_BAD_REGISTERS}, {
579         ERRHRD, ERRgeneral, NT_STATUS_DISK_RECALIBRATE_FAILED}, {
580         ERRHRD, ERRgeneral, NT_STATUS_DISK_OPERATION_FAILED}, {
581         ERRHRD, ERRgeneral, NT_STATUS_DISK_RESET_FAILED}, {
582         ERRHRD, ERRgeneral, NT_STATUS_SHARED_IRQ_BUSY}, {
583         ERRHRD, ERRgeneral, NT_STATUS_FT_ORPHANING}, {
584         ERRHRD, ERRgeneral, 0xc000016e}, {
585         ERRHRD, ERRgeneral, 0xc000016f}, {
586         ERRHRD, ERRgeneral, 0xc0000170}, {
587         ERRHRD, ERRgeneral, 0xc0000171}, {
588         ERRHRD, ERRgeneral, NT_STATUS_PARTITION_FAILURE}, {
589         ERRHRD, ERRgeneral, NT_STATUS_INVALID_BLOCK_LENGTH}, {
590         ERRHRD, ERRgeneral, NT_STATUS_DEVICE_NOT_PARTITIONED}, {
591         ERRHRD, ERRgeneral, NT_STATUS_UNABLE_TO_LOCK_MEDIA}, {
592         ERRHRD, ERRgeneral, NT_STATUS_UNABLE_TO_UNLOAD_MEDIA}, {
593         ERRHRD, ERRgeneral, NT_STATUS_EOM_OVERFLOW}, {
594         ERRHRD, ERRgeneral, NT_STATUS_NO_MEDIA}, {
595         ERRHRD, ERRgeneral, 0xc0000179}, {
596         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_MEMBER}, {
597         ERRHRD, ERRgeneral, NT_STATUS_INVALID_MEMBER}, {
598         ERRHRD, ERRgeneral, NT_STATUS_KEY_DELETED}, {
599         ERRHRD, ERRgeneral, NT_STATUS_NO_LOG_SPACE}, {
600         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_SIDS}, {
601         ERRHRD, ERRgeneral, NT_STATUS_LM_CROSS_ENCRYPTION_REQUIRED}, {
602         ERRHRD, ERRgeneral, NT_STATUS_KEY_HAS_CHILDREN}, {
603         ERRHRD, ERRgeneral, NT_STATUS_CHILD_MUST_BE_VOLATILE}, {
604         ERRDOS, 87, NT_STATUS_DEVICE_CONFIGURATION_ERROR}, {
605         ERRHRD, ERRgeneral, NT_STATUS_DRIVER_INTERNAL_ERROR}, {
606         ERRDOS, 22, NT_STATUS_INVALID_DEVICE_STATE}, {
607         ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR}, {
608         ERRHRD, ERRgeneral, NT_STATUS_DEVICE_PROTOCOL_ERROR}, {
609         ERRHRD, ERRgeneral, NT_STATUS_BACKUP_CONTROLLER}, {
610         ERRHRD, ERRgeneral, NT_STATUS_LOG_FILE_FULL}, {
611         ERRDOS, 19, NT_STATUS_TOO_LATE}, {
612         ERRDOS, ERRnoaccess, NT_STATUS_NO_TRUST_LSA_SECRET},
613 /*      { This NT error code was 'sqashed'
614          from NT_STATUS_NO_TRUST_SAM_ACCOUNT to
615          NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE during the session setup } */
616         {
617         ERRDOS, ERRnoaccess, NT_STATUS_NO_TRUST_SAM_ACCOUNT}, {
618         ERRDOS, ERRnoaccess, NT_STATUS_TRUSTED_DOMAIN_FAILURE}, {
619         ERRDOS, ERRnoaccess, NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE}, {
620         ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_FILE_CORRUPT}, {
621         ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_CANT_START}, {
622         ERRDOS, ERRnoaccess, NT_STATUS_TRUST_FAILURE}, {
623         ERRHRD, ERRgeneral, NT_STATUS_MUTANT_LIMIT_EXCEEDED}, {
624         ERRDOS, ERRnetlogonNotStarted, NT_STATUS_NETLOGON_NOT_STARTED}, {
625         ERRSRV, ERRaccountexpired, NT_STATUS_ACCOUNT_EXPIRED}, {
626         ERRHRD, ERRgeneral, NT_STATUS_POSSIBLE_DEADLOCK}, {
627         ERRHRD, ERRgeneral, NT_STATUS_NETWORK_CREDENTIAL_CONFLICT}, {
628         ERRHRD, ERRgeneral, NT_STATUS_REMOTE_SESSION_LIMIT}, {
629         ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_FILE_CHANGED}, {
630         ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT}, {
631         ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT}, {
632         ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT},
633 /*      { This NT error code was 'sqashed'
634          from NT_STATUS_DOMAIN_TRUST_INCONSISTENT to NT_STATUS_LOGON_FAILURE
635          during the session setup }  */
636         {
637         ERRDOS, ERRnoaccess, NT_STATUS_DOMAIN_TRUST_INCONSISTENT}, {
638         ERRHRD, ERRgeneral, NT_STATUS_FS_DRIVER_REQUIRED}, {
639         ERRHRD, ERRgeneral, NT_STATUS_NO_USER_SESSION_KEY}, {
640         ERRDOS, 59, NT_STATUS_USER_SESSION_DELETED}, {
641         ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_LANG_NOT_FOUND}, {
642         ERRDOS, ERRnomem, NT_STATUS_INSUFF_SERVER_RESOURCES}, {
643         ERRHRD, ERRgeneral, NT_STATUS_INVALID_BUFFER_SIZE}, {
644         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ADDRESS_COMPONENT}, {
645         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ADDRESS_WILDCARD}, {
646         ERRDOS, 68, NT_STATUS_TOO_MANY_ADDRESSES}, {
647         ERRDOS, 52, NT_STATUS_ADDRESS_ALREADY_EXISTS}, {
648         ERRDOS, 64, NT_STATUS_ADDRESS_CLOSED}, {
649         ERRDOS, 64, NT_STATUS_CONNECTION_DISCONNECTED}, {
650         ERRDOS, 64, NT_STATUS_CONNECTION_RESET}, {
651         ERRDOS, 68, NT_STATUS_TOO_MANY_NODES}, {
652         ERRDOS, 59, NT_STATUS_TRANSACTION_ABORTED}, {
653         ERRDOS, 59, NT_STATUS_TRANSACTION_TIMED_OUT}, {
654         ERRDOS, 59, NT_STATUS_TRANSACTION_NO_RELEASE}, {
655         ERRDOS, 59, NT_STATUS_TRANSACTION_NO_MATCH}, {
656         ERRDOS, 59, NT_STATUS_TRANSACTION_RESPONDED}, {
657         ERRDOS, 59, NT_STATUS_TRANSACTION_INVALID_ID}, {
658         ERRDOS, 59, NT_STATUS_TRANSACTION_INVALID_TYPE}, {
659         ERRDOS, ERRunsup, NT_STATUS_NOT_SERVER_SESSION}, {
660         ERRDOS, ERRunsup, NT_STATUS_NOT_CLIENT_SESSION}, {
661         ERRHRD, ERRgeneral, NT_STATUS_CANNOT_LOAD_REGISTRY_FILE}, {
662         ERRHRD, ERRgeneral, NT_STATUS_DEBUG_ATTACH_FAILED}, {
663         ERRHRD, ERRgeneral, NT_STATUS_SYSTEM_PROCESS_TERMINATED}, {
664         ERRHRD, ERRgeneral, NT_STATUS_DATA_NOT_ACCEPTED}, {
665         ERRHRD, ERRgeneral, NT_STATUS_NO_BROWSER_SERVERS_FOUND}, {
666         ERRHRD, ERRgeneral, NT_STATUS_VDM_HARD_ERROR}, {
667         ERRHRD, ERRgeneral, NT_STATUS_DRIVER_CANCEL_TIMEOUT}, {
668         ERRHRD, ERRgeneral, NT_STATUS_REPLY_MESSAGE_MISMATCH}, {
669         ERRHRD, ERRgeneral, NT_STATUS_MAPPED_ALIGNMENT}, {
670         ERRDOS, 193, NT_STATUS_IMAGE_CHECKSUM_MISMATCH}, {
671         ERRHRD, ERRgeneral, NT_STATUS_LOST_WRITEBEHIND_DATA}, {
672         ERRHRD, ERRgeneral, NT_STATUS_CLIENT_SERVER_PARAMETERS_INVALID}, {
673         ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_MUST_CHANGE}, {
674         ERRHRD, ERRgeneral, NT_STATUS_NOT_FOUND}, {
675         ERRHRD, ERRgeneral, NT_STATUS_NOT_TINY_STREAM}, {
676         ERRHRD, ERRgeneral, NT_STATUS_RECOVERY_FAILURE}, {
677         ERRHRD, ERRgeneral, NT_STATUS_STACK_OVERFLOW_READ}, {
678         ERRHRD, ERRgeneral, NT_STATUS_FAIL_CHECK}, {
679         ERRHRD, ERRgeneral, NT_STATUS_DUPLICATE_OBJECTID}, {
680         ERRHRD, ERRgeneral, NT_STATUS_OBJECTID_EXISTS}, {
681         ERRHRD, ERRgeneral, NT_STATUS_CONVERT_TO_LARGE}, {
682         ERRHRD, ERRgeneral, NT_STATUS_RETRY}, {
683         ERRHRD, ERRgeneral, NT_STATUS_FOUND_OUT_OF_SCOPE}, {
684         ERRHRD, ERRgeneral, NT_STATUS_ALLOCATE_BUCKET}, {
685         ERRHRD, ERRgeneral, NT_STATUS_PROPSET_NOT_FOUND}, {
686         ERRHRD, ERRgeneral, NT_STATUS_MARSHALL_OVERFLOW}, {
687         ERRHRD, ERRgeneral, NT_STATUS_INVALID_VARIANT}, {
688         ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND}, {
689         ERRDOS, ERRnoaccess, NT_STATUS_ACCOUNT_LOCKED_OUT}, {
690         ERRDOS, ERRbadfid, NT_STATUS_HANDLE_NOT_CLOSABLE}, {
691         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_REFUSED}, {
692         ERRHRD, ERRgeneral, NT_STATUS_GRACEFUL_DISCONNECT}, {
693         ERRHRD, ERRgeneral, NT_STATUS_ADDRESS_ALREADY_ASSOCIATED}, {
694         ERRHRD, ERRgeneral, NT_STATUS_ADDRESS_NOT_ASSOCIATED}, {
695         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_INVALID}, {
696         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_ACTIVE}, {
697         ERRHRD, ERRgeneral, NT_STATUS_NETWORK_UNREACHABLE}, {
698         ERRHRD, ERRgeneral, NT_STATUS_HOST_UNREACHABLE}, {
699         ERRHRD, ERRgeneral, NT_STATUS_PROTOCOL_UNREACHABLE}, {
700         ERRHRD, ERRgeneral, NT_STATUS_PORT_UNREACHABLE}, {
701         ERRHRD, ERRgeneral, NT_STATUS_REQUEST_ABORTED}, {
702         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_ABORTED}, {
703         ERRHRD, ERRgeneral, NT_STATUS_BAD_COMPRESSION_BUFFER}, {
704         ERRHRD, ERRgeneral, NT_STATUS_USER_MAPPED_FILE}, {
705         ERRHRD, ERRgeneral, NT_STATUS_AUDIT_FAILED}, {
706         ERRHRD, ERRgeneral, NT_STATUS_TIMER_RESOLUTION_NOT_SET}, {
707         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_COUNT_LIMIT}, {
708         ERRHRD, ERRgeneral, NT_STATUS_LOGIN_TIME_RESTRICTION}, {
709         ERRHRD, ERRgeneral, NT_STATUS_LOGIN_WKSTA_RESTRICTION}, {
710         ERRDOS, 193, NT_STATUS_IMAGE_MP_UP_MISMATCH}, {
711         ERRHRD, ERRgeneral, 0xc000024a}, {
712         ERRHRD, ERRgeneral, 0xc000024b}, {
713         ERRHRD, ERRgeneral, 0xc000024c}, {
714         ERRHRD, ERRgeneral, 0xc000024d}, {
715         ERRHRD, ERRgeneral, 0xc000024e}, {
716         ERRHRD, ERRgeneral, 0xc000024f}, {
717         ERRHRD, ERRgeneral, NT_STATUS_INSUFFICIENT_LOGON_INFO}, {
718         ERRHRD, ERRgeneral, NT_STATUS_BAD_DLL_ENTRYPOINT}, {
719         ERRHRD, ERRgeneral, NT_STATUS_BAD_SERVICE_ENTRYPOINT}, {
720         ERRHRD, ERRgeneral, NT_STATUS_LPC_REPLY_LOST}, {
721         ERRHRD, ERRgeneral, NT_STATUS_IP_ADDRESS_CONFLICT1}, {
722         ERRHRD, ERRgeneral, NT_STATUS_IP_ADDRESS_CONFLICT2}, {
723         ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_QUOTA_LIMIT}, {
724         ERRSRV, 3, NT_STATUS_PATH_NOT_COVERED}, {
725         ERRHRD, ERRgeneral, NT_STATUS_NO_CALLBACK_ACTIVE}, {
726         ERRHRD, ERRgeneral, NT_STATUS_LICENSE_QUOTA_EXCEEDED}, {
727         ERRHRD, ERRgeneral, NT_STATUS_PWD_TOO_SHORT}, {
728         ERRHRD, ERRgeneral, NT_STATUS_PWD_TOO_RECENT}, {
729         ERRHRD, ERRgeneral, NT_STATUS_PWD_HISTORY_CONFLICT}, {
730         ERRHRD, ERRgeneral, 0xc000025d}, {
731         ERRHRD, ERRgeneral, NT_STATUS_PLUGPLAY_NO_DEVICE}, {
732         ERRHRD, ERRgeneral, NT_STATUS_UNSUPPORTED_COMPRESSION}, {
733         ERRHRD, ERRgeneral, NT_STATUS_INVALID_HW_PROFILE}, {
734         ERRHRD, ERRgeneral, NT_STATUS_INVALID_PLUGPLAY_DEVICE_PATH}, {
735         ERRDOS, 182, NT_STATUS_DRIVER_ORDINAL_NOT_FOUND}, {
736         ERRDOS, 127, NT_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND}, {
737         ERRDOS, 288, NT_STATUS_RESOURCE_NOT_OWNED}, {
738         ERRDOS, ErrTooManyLinks, NT_STATUS_TOO_MANY_LINKS}, {
739         ERRHRD, ERRgeneral, NT_STATUS_QUOTA_LIST_INCONSISTENT}, {
740         ERRHRD, ERRgeneral, NT_STATUS_FILE_IS_OFFLINE}, {
741         ERRDOS, 21, 0xc000026e}, {
742         ERRDOS, 161, 0xc0000281}, {
743         ERRDOS, ERRnoaccess, 0xc000028a}, {
744         ERRDOS, ERRnoaccess, 0xc000028b}, {
745         ERRHRD, ERRgeneral, 0xc000028c}, {
746         ERRDOS, ERRnoaccess, 0xc000028d}, {
747         ERRDOS, ERRnoaccess, 0xc000028e}, {
748         ERRDOS, ERRnoaccess, 0xc000028f}, {
749         ERRDOS, ERRnoaccess, 0xc0000290}, {
750         ERRDOS, ERRbadfunc, 0xc000029c}, {
751         ERRDOS, ERRinvlevel, 0x007c0001}, };
752
753 /*****************************************************************************
754  Print an error message from the status code
755  *****************************************************************************/
756 static void
757 cifs_print_status(__u32 status_code)
758 {
759         int idx = 0;
760
761         while (nt_errs[idx].nt_errstr != NULL) {
762                 if (((nt_errs[idx].nt_errcode) & 0xFFFFFF) ==
763                     (status_code & 0xFFFFFF)) {
764                         printk(KERN_NOTICE "Status code returned 0x%08x %s\n",
765                                    status_code, nt_errs[idx].nt_errstr);
766                 }
767                 idx++;
768         }
769         return;
770 }
771
772
773 static void
774 ntstatus_to_dos(__u32 ntstatus, __u8 *eclass, __u16 *ecode)
775 {
776         int i;
777         if (ntstatus == 0) {
778                 *eclass = 0;
779                 *ecode = 0;
780                 return;
781         }
782         for (i = 0; ntstatus_to_dos_map[i].ntstatus; i++) {
783                 if (ntstatus == ntstatus_to_dos_map[i].ntstatus) {
784                         *eclass = ntstatus_to_dos_map[i].dos_class;
785                         *ecode = ntstatus_to_dos_map[i].dos_code;
786                         return;
787                 }
788         }
789         *eclass = ERRHRD;
790         *ecode = ERRgeneral;
791 }
792
793 int
794 map_smb_to_linux_error(struct smb_hdr *smb, int logErr)
795 {
796         unsigned int i;
797         int rc = -EIO;  /* if transport error smb error may not be set */
798         __u8 smberrclass;
799         __u16 smberrcode;
800
801         /* BB if NT Status codes - map NT BB */
802
803         /* old style smb error codes */
804         if (smb->Status.CifsError == 0)
805                 return 0;
806
807         if (smb->Flags2 & SMBFLG2_ERR_STATUS) {
808                 /* translate the newer STATUS codes to old style SMB errors
809                  * and then to POSIX errors */
810                 __u32 err = le32_to_cpu(smb->Status.CifsError);
811                 if (logErr && (err != (NT_STATUS_MORE_PROCESSING_REQUIRED)))
812                         cifs_print_status(err);
813                 else if (cifsFYI & CIFS_RC)
814                         cifs_print_status(err);
815                 ntstatus_to_dos(err, &smberrclass, &smberrcode);
816         } else {
817                 smberrclass = smb->Status.DosError.ErrorClass;
818                 smberrcode = le16_to_cpu(smb->Status.DosError.Error);
819         }
820
821         /* old style errors */
822
823         /* DOS class smb error codes - map DOS */
824         if (smberrclass == ERRDOS) {
825                 /* 1 byte field no need to byte reverse */
826                 for (i = 0;
827                      i <
828                      sizeof(mapping_table_ERRDOS) /
829                      sizeof(struct smb_to_posix_error); i++) {
830                         if (mapping_table_ERRDOS[i].smb_err == 0)
831                                 break;
832                         else if (mapping_table_ERRDOS[i].smb_err ==
833                                                                 smberrcode) {
834                                 rc = mapping_table_ERRDOS[i].posix_code;
835                                 break;
836                         }
837                         /* else try next error mapping one to see if match */
838                 }
839         } else if (smberrclass == ERRSRV) {
840                 /* server class of error codes */
841                 for (i = 0;
842                      i <
843                      sizeof(mapping_table_ERRSRV) /
844                      sizeof(struct smb_to_posix_error); i++) {
845                         if (mapping_table_ERRSRV[i].smb_err == 0)
846                                 break;
847                         else if (mapping_table_ERRSRV[i].smb_err ==
848                                                                 smberrcode) {
849                                 rc = mapping_table_ERRSRV[i].posix_code;
850                                 break;
851                         }
852                         /* else try next error mapping to see if match */
853                 }
854         }
855         /* else ERRHRD class errors or junk  - return EIO */
856
857         cFYI(1, ("Mapping smb error code %d to POSIX err %d",
858                  smberrcode, rc));
859
860         /* generic corrective action e.g. reconnect SMB session on
861          * ERRbaduid could be added */
862
863         return rc;
864 }
865
866 /*
867  * calculate the size of the SMB message based on the fixed header
868  * portion, the number of word parameters and the data portion of the message
869  */
870 unsigned int
871 smbCalcSize(struct smb_hdr *ptr)
872 {
873         return (sizeof(struct smb_hdr) + (2 * ptr->WordCount) +
874                 2 /* size of the bcc field */ + BCC(ptr));
875 }
876
877 unsigned int
878 smbCalcSize_LE(struct smb_hdr *ptr)
879 {
880         return (sizeof(struct smb_hdr) + (2 * ptr->WordCount) +
881                 2 /* size of the bcc field */ + le16_to_cpu(BCC_LE(ptr)));
882 }
883
884 /* The following are taken from fs/ntfs/util.c */
885
886 #define NTFS_TIME_OFFSET ((u64)(369*365 + 89) * 24 * 3600 * 10000000)
887
888     /*
889      * Convert the NT UTC (based 1601-01-01, in hundred nanosecond units)
890      * into Unix UTC (based 1970-01-01, in seconds).
891      */
892 struct timespec
893 cifs_NTtimeToUnix(u64 ntutc)
894 {
895         struct timespec ts;
896         /* BB what about the timezone? BB */
897
898         /* Subtract the NTFS time offset, then convert to 1s intervals. */
899         u64 t;
900
901         t = ntutc - NTFS_TIME_OFFSET;
902         ts.tv_nsec = do_div(t, 10000000) * 100;
903         ts.tv_sec = t;
904         return ts;
905 }
906
907 /* Convert the Unix UTC into NT UTC. */
908 u64
909 cifs_UnixTimeToNT(struct timespec t)
910 {
911         /* Convert to 100ns intervals and then add the NTFS time offset. */
912         return (u64) t.tv_sec * 10000000 + t.tv_nsec/100 + NTFS_TIME_OFFSET;
913 }
914
915 static int total_days_of_prev_months[] =
916 {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
917
918
919 __le64 cnvrtDosCifsTm(__u16 date, __u16 time)
920 {
921         return cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(date, time)));
922 }
923
924 struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
925 {
926         struct timespec ts;
927         int sec, min, days, month, year;
928         SMB_TIME *st = (SMB_TIME *)&time;
929         SMB_DATE *sd = (SMB_DATE *)&date;
930
931         cFYI(1, ("date %d time %d", date, time));
932
933         sec = 2 * st->TwoSeconds;
934         min = st->Minutes;
935         if ((sec > 59) || (min > 59))
936                 cERROR(1, ("illegal time min %d sec %d", min, sec));
937         sec += (min * 60);
938         sec += 60 * 60 * st->Hours;
939         if (st->Hours > 24)
940                 cERROR(1, ("illegal hours %d", st->Hours));
941         days = sd->Day;
942         month = sd->Month;
943         if ((days > 31) || (month > 12)) {
944                 cERROR(1, ("illegal date, month %d day: %d", month, days));
945                 if (month > 12)
946                         month = 12;
947         }
948         month -= 1;
949         days += total_days_of_prev_months[month];
950         days += 3652; /* account for difference in days between 1980 and 1970 */
951         year = sd->Year;
952         days += year * 365;
953         days += (year/4); /* leap year */
954         /* generalized leap year calculation is more complex, ie no leap year
955         for years/100 except for years/400, but since the maximum number for DOS
956          year is 2**7, the last year is 1980+127, which means we need only
957          consider 2 special case years, ie the years 2000 and 2100, and only
958          adjust for the lack of leap year for the year 2100, as 2000 was a
959          leap year (divisable by 400) */
960         if (year >= 120)  /* the year 2100 */
961                 days = days - 1;  /* do not count leap year for the year 2100 */
962
963         /* adjust for leap year where we are still before leap day */
964         if (year != 120)
965                 days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
966         sec += 24 * 60 * 60 * days;
967
968         ts.tv_sec = sec;
969
970         /* cFYI(1,("sec after cnvrt dos to unix time %d",sec)); */
971
972         ts.tv_nsec = 0;
973         return ts;
974 }