[CIFS] Fix walking out end of cifs dacl
[safe/jmp/linux-2.6] / fs / cifs / netmisc.c
1 /*
2  *   fs/cifs/netmisc.c
3  *
4  *   Copyright (c) International Business Machines  Corp., 2002
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         ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_INVALID}, {   /* mapping changed since shell does lookup on * and expects file not found */
257         ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND}, {
258         ERRDOS, ERRalreadyexists, NT_STATUS_OBJECT_NAME_COLLISION}, {
259         ERRHRD, ERRgeneral, NT_STATUS_HANDLE_NOT_WAITABLE}, {
260         ERRDOS, ERRbadfid, NT_STATUS_PORT_DISCONNECTED}, {
261         ERRHRD, ERRgeneral, NT_STATUS_DEVICE_ALREADY_ATTACHED}, {
262         ERRDOS, 161, NT_STATUS_OBJECT_PATH_INVALID}, {
263         ERRDOS, ERRbadpath, NT_STATUS_OBJECT_PATH_NOT_FOUND}, {
264         ERRDOS, 161, NT_STATUS_OBJECT_PATH_SYNTAX_BAD}, {
265         ERRHRD, ERRgeneral, NT_STATUS_DATA_OVERRUN}, {
266         ERRHRD, ERRgeneral, NT_STATUS_DATA_LATE_ERROR}, {
267         ERRDOS, 23, NT_STATUS_DATA_ERROR}, {
268         ERRDOS, 23, NT_STATUS_CRC_ERROR}, {
269         ERRDOS, ERRnomem, NT_STATUS_SECTION_TOO_BIG}, {
270         ERRDOS, ERRnoaccess, NT_STATUS_PORT_CONNECTION_REFUSED}, {
271         ERRDOS, ERRbadfid, NT_STATUS_INVALID_PORT_HANDLE}, {
272         ERRDOS, ERRbadshare, NT_STATUS_SHARING_VIOLATION}, {
273         ERRHRD, ERRgeneral, NT_STATUS_QUOTA_EXCEEDED}, {
274         ERRDOS, 87, NT_STATUS_INVALID_PAGE_PROTECTION}, {
275         ERRDOS, 288, NT_STATUS_MUTANT_NOT_OWNED}, {
276         ERRDOS, 298, NT_STATUS_SEMAPHORE_LIMIT_EXCEEDED}, {
277         ERRDOS, 87, NT_STATUS_PORT_ALREADY_SET}, {
278         ERRDOS, 87, NT_STATUS_SECTION_NOT_IMAGE}, {
279         ERRDOS, 156, NT_STATUS_SUSPEND_COUNT_EXCEEDED}, {
280         ERRDOS, ERRnoaccess, NT_STATUS_THREAD_IS_TERMINATING}, {
281         ERRDOS, 87, NT_STATUS_BAD_WORKING_SET_LIMIT}, {
282         ERRDOS, 87, NT_STATUS_INCOMPATIBLE_FILE_MAP}, {
283         ERRDOS, 87, NT_STATUS_SECTION_PROTECTION}, {
284         ERRDOS, ERReasnotsupported, NT_STATUS_EAS_NOT_SUPPORTED}, {
285         ERRDOS, 255, NT_STATUS_EA_TOO_LARGE}, {
286         ERRHRD, ERRgeneral, NT_STATUS_NONEXISTENT_EA_ENTRY}, {
287         ERRHRD, ERRgeneral, NT_STATUS_NO_EAS_ON_FILE}, {
288         ERRHRD, ERRgeneral, NT_STATUS_EA_CORRUPT_ERROR}, {
289         ERRDOS, ERRlock, NT_STATUS_FILE_LOCK_CONFLICT}, {
290         ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED}, {
291         ERRDOS, ERRbadfile, NT_STATUS_DELETE_PENDING}, {
292         ERRDOS, ERRunsup, NT_STATUS_CTL_FILE_NOT_SUPPORTED}, {
293         ERRHRD, ERRgeneral, NT_STATUS_UNKNOWN_REVISION}, {
294         ERRHRD, ERRgeneral, NT_STATUS_REVISION_MISMATCH}, {
295         ERRHRD, ERRgeneral, NT_STATUS_INVALID_OWNER}, {
296         ERRHRD, ERRgeneral, NT_STATUS_INVALID_PRIMARY_GROUP}, {
297         ERRHRD, ERRgeneral, NT_STATUS_NO_IMPERSONATION_TOKEN}, {
298         ERRHRD, ERRgeneral, NT_STATUS_CANT_DISABLE_MANDATORY}, {
299         ERRDOS, 2215, NT_STATUS_NO_LOGON_SERVERS}, {
300         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_LOGON_SESSION}, {
301         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_PRIVILEGE}, {
302         ERRDOS, ERRnoaccess, NT_STATUS_PRIVILEGE_NOT_HELD}, {
303         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ACCOUNT_NAME}, {
304         ERRHRD, ERRgeneral, NT_STATUS_USER_EXISTS},
305 /*      { This NT error code was 'sqashed'
306          from NT_STATUS_NO_SUCH_USER to NT_STATUS_LOGON_FAILURE
307          during the session setup } */
308         {
309         ERRDOS, ERRnoaccess, NT_STATUS_NO_SUCH_USER}, { /* could map to 2238 */
310         ERRHRD, ERRgeneral, NT_STATUS_GROUP_EXISTS}, {
311         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_GROUP}, {
312         ERRHRD, ERRgeneral, NT_STATUS_MEMBER_IN_GROUP}, {
313         ERRHRD, ERRgeneral, NT_STATUS_MEMBER_NOT_IN_GROUP}, {
314         ERRHRD, ERRgeneral, NT_STATUS_LAST_ADMIN},
315 /*      { This NT error code was 'sqashed'
316          from NT_STATUS_WRONG_PASSWORD to NT_STATUS_LOGON_FAILURE
317          during the session setup } */
318         {
319         ERRSRV, ERRbadpw, NT_STATUS_WRONG_PASSWORD}, {
320         ERRHRD, ERRgeneral, NT_STATUS_ILL_FORMED_PASSWORD}, {
321         ERRHRD, ERRgeneral, NT_STATUS_PASSWORD_RESTRICTION}, {
322         ERRDOS, ERRnoaccess, NT_STATUS_LOGON_FAILURE}, {
323         ERRHRD, ERRgeneral, NT_STATUS_ACCOUNT_RESTRICTION}, {
324         ERRSRV, ERRbadLogonTime, NT_STATUS_INVALID_LOGON_HOURS}, {
325         ERRSRV, ERRbadclient, NT_STATUS_INVALID_WORKSTATION}, {
326         ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_EXPIRED}, {
327         ERRSRV, ERRaccountexpired, NT_STATUS_ACCOUNT_DISABLED}, {
328         ERRHRD, ERRgeneral, NT_STATUS_NONE_MAPPED}, {
329         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_LUIDS_REQUESTED}, {
330         ERRHRD, ERRgeneral, NT_STATUS_LUIDS_EXHAUSTED}, {
331         ERRHRD, ERRgeneral, NT_STATUS_INVALID_SUB_AUTHORITY}, {
332         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ACL}, {
333         ERRHRD, ERRgeneral, NT_STATUS_INVALID_SID}, {
334         ERRHRD, ERRgeneral, NT_STATUS_INVALID_SECURITY_DESCR}, {
335         ERRDOS, 127, NT_STATUS_PROCEDURE_NOT_FOUND}, {
336         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_FORMAT}, {
337         ERRHRD, ERRgeneral, NT_STATUS_NO_TOKEN}, {
338         ERRHRD, ERRgeneral, NT_STATUS_BAD_INHERITANCE_ACL}, {
339         ERRDOS, 158, NT_STATUS_RANGE_NOT_LOCKED}, {
340         ERRDOS, 112, NT_STATUS_DISK_FULL}, {
341         ERRHRD, ERRgeneral, NT_STATUS_SERVER_DISABLED}, {
342         ERRHRD, ERRgeneral, NT_STATUS_SERVER_NOT_DISABLED}, {
343         ERRDOS, 68, NT_STATUS_TOO_MANY_GUIDS_REQUESTED}, {
344         ERRDOS, 259, NT_STATUS_GUIDS_EXHAUSTED}, {
345         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ID_AUTHORITY}, {
346         ERRDOS, 259, NT_STATUS_AGENTS_EXHAUSTED}, {
347         ERRDOS, 154, NT_STATUS_INVALID_VOLUME_LABEL}, {
348         ERRDOS, 14, NT_STATUS_SECTION_NOT_EXTENDED}, {
349         ERRDOS, 487, NT_STATUS_NOT_MAPPED_DATA}, {
350         ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_DATA_NOT_FOUND}, {
351         ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_TYPE_NOT_FOUND}, {
352         ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_NAME_NOT_FOUND}, {
353         ERRHRD, ERRgeneral, NT_STATUS_ARRAY_BOUNDS_EXCEEDED}, {
354         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_DENORMAL_OPERAND}, {
355         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_DIVIDE_BY_ZERO}, {
356         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_INEXACT_RESULT}, {
357         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_INVALID_OPERATION}, {
358         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_OVERFLOW}, {
359         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_STACK_CHECK}, {
360         ERRHRD, ERRgeneral, NT_STATUS_FLOAT_UNDERFLOW}, {
361         ERRHRD, ERRgeneral, NT_STATUS_INTEGER_DIVIDE_BY_ZERO}, {
362         ERRDOS, 534, NT_STATUS_INTEGER_OVERFLOW}, {
363         ERRHRD, ERRgeneral, NT_STATUS_PRIVILEGED_INSTRUCTION}, {
364         ERRDOS, ERRnomem, NT_STATUS_TOO_MANY_PAGING_FILES}, {
365         ERRHRD, ERRgeneral, NT_STATUS_FILE_INVALID}, {
366         ERRHRD, ERRgeneral, NT_STATUS_ALLOTTED_SPACE_EXCEEDED},
367 /*      { This NT error code was 'sqashed'
368          from NT_STATUS_INSUFFICIENT_RESOURCES to
369          NT_STATUS_INSUFF_SERVER_RESOURCES during the session setup } */
370         {
371         ERRDOS, ERRnomem, NT_STATUS_INSUFFICIENT_RESOURCES}, {
372         ERRDOS, ERRbadpath, NT_STATUS_DFS_EXIT_PATH_FOUND}, {
373         ERRDOS, 23, NT_STATUS_DEVICE_DATA_ERROR}, {
374         ERRHRD, ERRgeneral, NT_STATUS_DEVICE_NOT_CONNECTED}, {
375         ERRDOS, 21, NT_STATUS_DEVICE_POWER_FAILURE}, {
376         ERRDOS, 487, NT_STATUS_FREE_VM_NOT_AT_BASE}, {
377         ERRDOS, 487, NT_STATUS_MEMORY_NOT_ALLOCATED}, {
378         ERRHRD, ERRgeneral, NT_STATUS_WORKING_SET_QUOTA}, {
379         ERRDOS, 19, NT_STATUS_MEDIA_WRITE_PROTECTED}, {
380         ERRDOS, 21, NT_STATUS_DEVICE_NOT_READY}, {
381         ERRHRD, ERRgeneral, NT_STATUS_INVALID_GROUP_ATTRIBUTES}, {
382         ERRHRD, ERRgeneral, NT_STATUS_BAD_IMPERSONATION_LEVEL}, {
383         ERRHRD, ERRgeneral, NT_STATUS_CANT_OPEN_ANONYMOUS}, {
384         ERRHRD, ERRgeneral, NT_STATUS_BAD_VALIDATION_CLASS}, {
385         ERRHRD, ERRgeneral, NT_STATUS_BAD_TOKEN_TYPE}, {
386         ERRDOS, 87, NT_STATUS_BAD_MASTER_BOOT_RECORD}, {
387         ERRHRD, ERRgeneral, NT_STATUS_INSTRUCTION_MISALIGNMENT}, {
388         ERRDOS, ERRpipebusy, NT_STATUS_INSTANCE_NOT_AVAILABLE}, {
389         ERRDOS, ERRpipebusy, NT_STATUS_PIPE_NOT_AVAILABLE}, {
390         ERRDOS, ERRbadpipe, NT_STATUS_INVALID_PIPE_STATE}, {
391         ERRDOS, ERRpipebusy, NT_STATUS_PIPE_BUSY}, {
392         ERRDOS, ERRbadfunc, NT_STATUS_ILLEGAL_FUNCTION}, {
393         ERRDOS, ERRnotconnected, NT_STATUS_PIPE_DISCONNECTED}, {
394         ERRDOS, ERRpipeclosing, NT_STATUS_PIPE_CLOSING}, {
395         ERRHRD, ERRgeneral, NT_STATUS_PIPE_CONNECTED}, {
396         ERRHRD, ERRgeneral, NT_STATUS_PIPE_LISTENING}, {
397         ERRDOS, ERRbadpipe, NT_STATUS_INVALID_READ_MODE}, {
398         ERRDOS, 121, NT_STATUS_IO_TIMEOUT}, {
399         ERRDOS, 38, NT_STATUS_FILE_FORCED_CLOSED}, {
400         ERRHRD, ERRgeneral, NT_STATUS_PROFILING_NOT_STARTED}, {
401         ERRHRD, ERRgeneral, NT_STATUS_PROFILING_NOT_STOPPED}, {
402         ERRHRD, ERRgeneral, NT_STATUS_COULD_NOT_INTERPRET}, {
403         ERRDOS, ERRnoaccess, NT_STATUS_FILE_IS_A_DIRECTORY}, {
404         ERRDOS, ERRunsup, NT_STATUS_NOT_SUPPORTED}, {
405         ERRDOS, 51, NT_STATUS_REMOTE_NOT_LISTENING}, {
406         ERRDOS, 52, NT_STATUS_DUPLICATE_NAME}, {
407         ERRDOS, 53, NT_STATUS_BAD_NETWORK_PATH}, {
408         ERRDOS, 54, NT_STATUS_NETWORK_BUSY}, {
409         ERRDOS, 55, NT_STATUS_DEVICE_DOES_NOT_EXIST}, {
410         ERRDOS, 56, NT_STATUS_TOO_MANY_COMMANDS}, {
411         ERRDOS, 57, NT_STATUS_ADAPTER_HARDWARE_ERROR}, {
412         ERRDOS, 58, NT_STATUS_INVALID_NETWORK_RESPONSE}, {
413         ERRDOS, 59, NT_STATUS_UNEXPECTED_NETWORK_ERROR}, {
414         ERRDOS, 60, NT_STATUS_BAD_REMOTE_ADAPTER}, {
415         ERRDOS, 61, NT_STATUS_PRINT_QUEUE_FULL}, {
416         ERRDOS, 62, NT_STATUS_NO_SPOOL_SPACE}, {
417         ERRDOS, 63, NT_STATUS_PRINT_CANCELLED}, {
418         ERRDOS, 64, NT_STATUS_NETWORK_NAME_DELETED}, {
419         ERRDOS, 65, NT_STATUS_NETWORK_ACCESS_DENIED}, {
420         ERRDOS, 66, NT_STATUS_BAD_DEVICE_TYPE}, {
421         ERRDOS, ERRnosuchshare, NT_STATUS_BAD_NETWORK_NAME}, {
422         ERRDOS, 68, NT_STATUS_TOO_MANY_NAMES}, {
423         ERRDOS, 69, NT_STATUS_TOO_MANY_SESSIONS}, {
424         ERRDOS, 70, NT_STATUS_SHARING_PAUSED}, {
425         ERRDOS, 71, NT_STATUS_REQUEST_NOT_ACCEPTED}, {
426         ERRDOS, 72, NT_STATUS_REDIRECTOR_PAUSED}, {
427         ERRDOS, 88, NT_STATUS_NET_WRITE_FAULT}, {
428         ERRHRD, ERRgeneral, NT_STATUS_PROFILING_AT_LIMIT}, {
429         ERRDOS, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE}, {
430         ERRDOS, ERRnoaccess, NT_STATUS_FILE_RENAMED}, {
431         ERRDOS, 240, NT_STATUS_VIRTUAL_CIRCUIT_CLOSED}, {
432         ERRHRD, ERRgeneral, NT_STATUS_NO_SECURITY_ON_OBJECT}, {
433         ERRHRD, ERRgeneral, NT_STATUS_CANT_WAIT}, {
434         ERRDOS, ERRpipeclosing, NT_STATUS_PIPE_EMPTY}, {
435         ERRHRD, ERRgeneral, NT_STATUS_CANT_ACCESS_DOMAIN_INFO}, {
436         ERRHRD, ERRgeneral, NT_STATUS_CANT_TERMINATE_SELF}, {
437         ERRHRD, ERRgeneral, NT_STATUS_INVALID_SERVER_STATE}, {
438         ERRHRD, ERRgeneral, NT_STATUS_INVALID_DOMAIN_STATE}, {
439         ERRHRD, ERRgeneral, NT_STATUS_INVALID_DOMAIN_ROLE}, {
440         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_DOMAIN}, {
441         ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_EXISTS}, {
442         ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_LIMIT_EXCEEDED}, {
443         ERRDOS, 300, NT_STATUS_OPLOCK_NOT_GRANTED}, {
444         ERRDOS, 301, NT_STATUS_INVALID_OPLOCK_PROTOCOL}, {
445         ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_DB_CORRUPTION}, {
446         ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_ERROR}, {
447         ERRHRD, ERRgeneral, NT_STATUS_GENERIC_NOT_MAPPED}, {
448         ERRHRD, ERRgeneral, NT_STATUS_BAD_DESCRIPTOR_FORMAT}, {
449         ERRHRD, ERRgeneral, NT_STATUS_INVALID_USER_BUFFER}, {
450         ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_IO_ERROR}, {
451         ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_CREATE_ERR}, {
452         ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_MAP_ERROR}, {
453         ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_EXTEND_ERR}, {
454         ERRHRD, ERRgeneral, NT_STATUS_NOT_LOGON_PROCESS}, {
455         ERRHRD, ERRgeneral, NT_STATUS_LOGON_SESSION_EXISTS}, {
456         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_1}, {
457         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_2}, {
458         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_3}, {
459         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_4}, {
460         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_5}, {
461         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_6}, {
462         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_7}, {
463         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_8}, {
464         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_9}, {
465         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_10}, {
466         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_11}, {
467         ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_12}, {
468         ERRDOS, ERRbadpath, NT_STATUS_REDIRECTOR_NOT_STARTED}, {
469         ERRHRD, ERRgeneral, NT_STATUS_REDIRECTOR_STARTED}, {
470         ERRHRD, ERRgeneral, NT_STATUS_STACK_OVERFLOW}, {
471         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_PACKAGE}, {
472         ERRHRD, ERRgeneral, NT_STATUS_BAD_FUNCTION_TABLE}, {
473         ERRDOS, 203, 0xc0000100}, {
474         ERRDOS, 145, NT_STATUS_DIRECTORY_NOT_EMPTY}, {
475         ERRHRD, ERRgeneral, NT_STATUS_FILE_CORRUPT_ERROR}, {
476         ERRDOS, 267, NT_STATUS_NOT_A_DIRECTORY}, {
477         ERRHRD, ERRgeneral, NT_STATUS_BAD_LOGON_SESSION_STATE}, {
478         ERRHRD, ERRgeneral, NT_STATUS_LOGON_SESSION_COLLISION}, {
479         ERRDOS, 206, NT_STATUS_NAME_TOO_LONG}, {
480         ERRDOS, 2401, NT_STATUS_FILES_OPEN}, {
481         ERRDOS, 2404, NT_STATUS_CONNECTION_IN_USE}, {
482         ERRHRD, ERRgeneral, NT_STATUS_MESSAGE_NOT_FOUND}, {
483         ERRDOS, ERRnoaccess, NT_STATUS_PROCESS_IS_TERMINATING}, {
484         ERRHRD, ERRgeneral, NT_STATUS_INVALID_LOGON_TYPE}, {
485         ERRHRD, ERRgeneral, NT_STATUS_NO_GUID_TRANSLATION}, {
486         ERRHRD, ERRgeneral, NT_STATUS_CANNOT_IMPERSONATE}, {
487         ERRHRD, ERRgeneral, NT_STATUS_IMAGE_ALREADY_LOADED}, {
488         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_NOT_PRESENT}, {
489         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_LID_NOT_EXIST}, {
490         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_LID_ALREADY_OWNED}, {
491         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_NOT_LID_OWNER}, {
492         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_COMMAND}, {
493         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_LID}, {
494         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE}, {
495         ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_SELECTOR}, {
496         ERRHRD, ERRgeneral, NT_STATUS_NO_LDT}, {
497         ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_SIZE}, {
498         ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_OFFSET}, {
499         ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_DESCRIPTOR}, {
500         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_NE_FORMAT}, {
501         ERRHRD, ERRgeneral, NT_STATUS_RXACT_INVALID_STATE}, {
502         ERRHRD, ERRgeneral, NT_STATUS_RXACT_COMMIT_FAILURE}, {
503         ERRHRD, ERRgeneral, NT_STATUS_MAPPED_FILE_SIZE_ZERO}, {
504         ERRDOS, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES}, {
505         ERRHRD, ERRgeneral, NT_STATUS_CANCELLED}, {
506         ERRDOS, ERRnoaccess, NT_STATUS_CANNOT_DELETE}, {
507         ERRHRD, ERRgeneral, NT_STATUS_INVALID_COMPUTER_NAME}, {
508         ERRDOS, ERRnoaccess, NT_STATUS_FILE_DELETED}, {
509         ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_ACCOUNT}, {
510         ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_GROUP}, {
511         ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_USER}, {
512         ERRHRD, ERRgeneral, NT_STATUS_MEMBERS_PRIMARY_GROUP}, {
513         ERRDOS, ERRbadfid, NT_STATUS_FILE_CLOSED}, {
514         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_THREADS}, {
515         ERRHRD, ERRgeneral, NT_STATUS_THREAD_NOT_IN_PROCESS}, {
516         ERRHRD, ERRgeneral, NT_STATUS_TOKEN_ALREADY_IN_USE}, {
517         ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_QUOTA_EXCEEDED}, {
518         ERRHRD, ERRgeneral, NT_STATUS_COMMITMENT_LIMIT}, {
519         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_LE_FORMAT}, {
520         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_NOT_MZ}, {
521         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_PROTECT}, {
522         ERRDOS, 193, NT_STATUS_INVALID_IMAGE_WIN_16}, {
523         ERRHRD, ERRgeneral, NT_STATUS_LOGON_SERVER_CONFLICT}, {
524         ERRHRD, ERRgeneral, NT_STATUS_TIME_DIFFERENCE_AT_DC}, {
525         ERRHRD, ERRgeneral, NT_STATUS_SYNCHRONIZATION_REQUIRED}, {
526         ERRDOS, 126, NT_STATUS_DLL_NOT_FOUND}, {
527         ERRHRD, ERRgeneral, NT_STATUS_OPEN_FAILED}, {
528         ERRHRD, ERRgeneral, NT_STATUS_IO_PRIVILEGE_FAILED}, {
529         ERRDOS, 182, NT_STATUS_ORDINAL_NOT_FOUND}, {
530         ERRDOS, 127, NT_STATUS_ENTRYPOINT_NOT_FOUND}, {
531         ERRHRD, ERRgeneral, NT_STATUS_CONTROL_C_EXIT}, {
532         ERRDOS, 64, NT_STATUS_LOCAL_DISCONNECT}, {
533         ERRDOS, 64, NT_STATUS_REMOTE_DISCONNECT}, {
534         ERRDOS, 51, NT_STATUS_REMOTE_RESOURCES}, {
535         ERRDOS, 59, NT_STATUS_LINK_FAILED}, {
536         ERRDOS, 59, NT_STATUS_LINK_TIMEOUT}, {
537         ERRDOS, 59, NT_STATUS_INVALID_CONNECTION}, {
538         ERRDOS, 59, NT_STATUS_INVALID_ADDRESS}, {
539         ERRHRD, ERRgeneral, NT_STATUS_DLL_INIT_FAILED}, {
540         ERRHRD, ERRgeneral, NT_STATUS_MISSING_SYSTEMFILE}, {
541         ERRHRD, ERRgeneral, NT_STATUS_UNHANDLED_EXCEPTION}, {
542         ERRHRD, ERRgeneral, NT_STATUS_APP_INIT_FAILURE}, {
543         ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_CREATE_FAILED}, {
544         ERRHRD, ERRgeneral, NT_STATUS_NO_PAGEFILE}, {
545         ERRDOS, 124, NT_STATUS_INVALID_LEVEL}, {
546         ERRDOS, 86, NT_STATUS_WRONG_PASSWORD_CORE}, {
547         ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_FLOAT_CONTEXT}, {
548         ERRDOS, 109, NT_STATUS_PIPE_BROKEN}, {
549         ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_CORRUPT}, {
550         ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_IO_FAILED}, {
551         ERRHRD, ERRgeneral, NT_STATUS_NO_EVENT_PAIR}, {
552         ERRHRD, ERRgeneral, NT_STATUS_UNRECOGNIZED_VOLUME}, {
553         ERRHRD, ERRgeneral, NT_STATUS_SERIAL_NO_DEVICE_INITED}, {
554         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_ALIAS}, {
555         ERRHRD, ERRgeneral, NT_STATUS_MEMBER_NOT_IN_ALIAS}, {
556         ERRHRD, ERRgeneral, NT_STATUS_MEMBER_IN_ALIAS}, {
557         ERRHRD, ERRgeneral, NT_STATUS_ALIAS_EXISTS}, {
558         ERRHRD, ERRgeneral, NT_STATUS_LOGON_NOT_GRANTED}, {
559         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_SECRETS}, {
560         ERRHRD, ERRgeneral, NT_STATUS_SECRET_TOO_LONG}, {
561         ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_DB_ERROR}, {
562         ERRHRD, ERRgeneral, NT_STATUS_FULLSCREEN_MODE}, {
563         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_CONTEXT_IDS}, {
564         ERRDOS, ERRnoaccess, NT_STATUS_LOGON_TYPE_NOT_GRANTED}, {
565         ERRHRD, ERRgeneral, NT_STATUS_NOT_REGISTRY_FILE}, {
566         ERRHRD, ERRgeneral, NT_STATUS_NT_CROSS_ENCRYPTION_REQUIRED}, {
567         ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_CTRLR_CONFIG_ERROR}, {
568         ERRHRD, ERRgeneral, NT_STATUS_FT_MISSING_MEMBER}, {
569         ERRHRD, ERRgeneral, NT_STATUS_ILL_FORMED_SERVICE_ENTRY}, {
570         ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_CHARACTER}, {
571         ERRHRD, ERRgeneral, NT_STATUS_UNMAPPABLE_CHARACTER}, {
572         ERRHRD, ERRgeneral, NT_STATUS_UNDEFINED_CHARACTER}, {
573         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_VOLUME}, {
574         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_ID_MARK_NOT_FOUND}, {
575         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_WRONG_CYLINDER}, {
576         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_UNKNOWN_ERROR}, {
577         ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_BAD_REGISTERS}, {
578         ERRHRD, ERRgeneral, NT_STATUS_DISK_RECALIBRATE_FAILED}, {
579         ERRHRD, ERRgeneral, NT_STATUS_DISK_OPERATION_FAILED}, {
580         ERRHRD, ERRgeneral, NT_STATUS_DISK_RESET_FAILED}, {
581         ERRHRD, ERRgeneral, NT_STATUS_SHARED_IRQ_BUSY}, {
582         ERRHRD, ERRgeneral, NT_STATUS_FT_ORPHANING}, {
583         ERRHRD, ERRgeneral, 0xc000016e}, {
584         ERRHRD, ERRgeneral, 0xc000016f}, {
585         ERRHRD, ERRgeneral, 0xc0000170}, {
586         ERRHRD, ERRgeneral, 0xc0000171}, {
587         ERRHRD, ERRgeneral, NT_STATUS_PARTITION_FAILURE}, {
588         ERRHRD, ERRgeneral, NT_STATUS_INVALID_BLOCK_LENGTH}, {
589         ERRHRD, ERRgeneral, NT_STATUS_DEVICE_NOT_PARTITIONED}, {
590         ERRHRD, ERRgeneral, NT_STATUS_UNABLE_TO_LOCK_MEDIA}, {
591         ERRHRD, ERRgeneral, NT_STATUS_UNABLE_TO_UNLOAD_MEDIA}, {
592         ERRHRD, ERRgeneral, NT_STATUS_EOM_OVERFLOW}, {
593         ERRHRD, ERRgeneral, NT_STATUS_NO_MEDIA}, {
594         ERRHRD, ERRgeneral, 0xc0000179}, {
595         ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_MEMBER}, {
596         ERRHRD, ERRgeneral, NT_STATUS_INVALID_MEMBER}, {
597         ERRHRD, ERRgeneral, NT_STATUS_KEY_DELETED}, {
598         ERRHRD, ERRgeneral, NT_STATUS_NO_LOG_SPACE}, {
599         ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_SIDS}, {
600         ERRHRD, ERRgeneral, NT_STATUS_LM_CROSS_ENCRYPTION_REQUIRED}, {
601         ERRHRD, ERRgeneral, NT_STATUS_KEY_HAS_CHILDREN}, {
602         ERRHRD, ERRgeneral, NT_STATUS_CHILD_MUST_BE_VOLATILE}, {
603         ERRDOS, 87, NT_STATUS_DEVICE_CONFIGURATION_ERROR}, {
604         ERRHRD, ERRgeneral, NT_STATUS_DRIVER_INTERNAL_ERROR}, {
605         ERRDOS, 22, NT_STATUS_INVALID_DEVICE_STATE}, {
606         ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR}, {
607         ERRHRD, ERRgeneral, NT_STATUS_DEVICE_PROTOCOL_ERROR}, {
608         ERRHRD, ERRgeneral, NT_STATUS_BACKUP_CONTROLLER}, {
609         ERRHRD, ERRgeneral, NT_STATUS_LOG_FILE_FULL}, {
610         ERRDOS, 19, NT_STATUS_TOO_LATE}, {
611         ERRDOS, ERRnoaccess, NT_STATUS_NO_TRUST_LSA_SECRET},
612 /*      { This NT error code was 'sqashed'
613          from NT_STATUS_NO_TRUST_SAM_ACCOUNT to
614          NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE during the session setup } */
615         {
616         ERRDOS, ERRnoaccess, NT_STATUS_NO_TRUST_SAM_ACCOUNT}, {
617         ERRDOS, ERRnoaccess, NT_STATUS_TRUSTED_DOMAIN_FAILURE}, {
618         ERRDOS, ERRnoaccess, NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE}, {
619         ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_FILE_CORRUPT}, {
620         ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_CANT_START}, {
621         ERRDOS, ERRnoaccess, NT_STATUS_TRUST_FAILURE}, {
622         ERRHRD, ERRgeneral, NT_STATUS_MUTANT_LIMIT_EXCEEDED}, {
623         ERRDOS, ERRnetlogonNotStarted, NT_STATUS_NETLOGON_NOT_STARTED}, {
624         ERRSRV, ERRaccountexpired, NT_STATUS_ACCOUNT_EXPIRED}, {
625         ERRHRD, ERRgeneral, NT_STATUS_POSSIBLE_DEADLOCK}, {
626         ERRHRD, ERRgeneral, NT_STATUS_NETWORK_CREDENTIAL_CONFLICT}, {
627         ERRHRD, ERRgeneral, NT_STATUS_REMOTE_SESSION_LIMIT}, {
628         ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_FILE_CHANGED}, {
629         ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT}, {
630         ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT}, {
631         ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT},
632 /*      { This NT error code was 'sqashed'
633          from NT_STATUS_DOMAIN_TRUST_INCONSISTENT to NT_STATUS_LOGON_FAILURE
634          during the session setup }  */
635         {
636         ERRDOS, ERRnoaccess, NT_STATUS_DOMAIN_TRUST_INCONSISTENT}, {
637         ERRHRD, ERRgeneral, NT_STATUS_FS_DRIVER_REQUIRED}, {
638         ERRHRD, ERRgeneral, NT_STATUS_NO_USER_SESSION_KEY}, {
639         ERRDOS, 59, NT_STATUS_USER_SESSION_DELETED}, {
640         ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_LANG_NOT_FOUND}, {
641         ERRDOS, ERRnomem, NT_STATUS_INSUFF_SERVER_RESOURCES}, {
642         ERRHRD, ERRgeneral, NT_STATUS_INVALID_BUFFER_SIZE}, {
643         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ADDRESS_COMPONENT}, {
644         ERRHRD, ERRgeneral, NT_STATUS_INVALID_ADDRESS_WILDCARD}, {
645         ERRDOS, 68, NT_STATUS_TOO_MANY_ADDRESSES}, {
646         ERRDOS, 52, NT_STATUS_ADDRESS_ALREADY_EXISTS}, {
647         ERRDOS, 64, NT_STATUS_ADDRESS_CLOSED}, {
648         ERRDOS, 64, NT_STATUS_CONNECTION_DISCONNECTED}, {
649         ERRDOS, 64, NT_STATUS_CONNECTION_RESET}, {
650         ERRDOS, 68, NT_STATUS_TOO_MANY_NODES}, {
651         ERRDOS, 59, NT_STATUS_TRANSACTION_ABORTED}, {
652         ERRDOS, 59, NT_STATUS_TRANSACTION_TIMED_OUT}, {
653         ERRDOS, 59, NT_STATUS_TRANSACTION_NO_RELEASE}, {
654         ERRDOS, 59, NT_STATUS_TRANSACTION_NO_MATCH}, {
655         ERRDOS, 59, NT_STATUS_TRANSACTION_RESPONDED}, {
656         ERRDOS, 59, NT_STATUS_TRANSACTION_INVALID_ID}, {
657         ERRDOS, 59, NT_STATUS_TRANSACTION_INVALID_TYPE}, {
658         ERRDOS, ERRunsup, NT_STATUS_NOT_SERVER_SESSION}, {
659         ERRDOS, ERRunsup, NT_STATUS_NOT_CLIENT_SESSION}, {
660         ERRHRD, ERRgeneral, NT_STATUS_CANNOT_LOAD_REGISTRY_FILE}, {
661         ERRHRD, ERRgeneral, NT_STATUS_DEBUG_ATTACH_FAILED}, {
662         ERRHRD, ERRgeneral, NT_STATUS_SYSTEM_PROCESS_TERMINATED}, {
663         ERRHRD, ERRgeneral, NT_STATUS_DATA_NOT_ACCEPTED}, {
664         ERRHRD, ERRgeneral, NT_STATUS_NO_BROWSER_SERVERS_FOUND}, {
665         ERRHRD, ERRgeneral, NT_STATUS_VDM_HARD_ERROR}, {
666         ERRHRD, ERRgeneral, NT_STATUS_DRIVER_CANCEL_TIMEOUT}, {
667         ERRHRD, ERRgeneral, NT_STATUS_REPLY_MESSAGE_MISMATCH}, {
668         ERRHRD, ERRgeneral, NT_STATUS_MAPPED_ALIGNMENT}, {
669         ERRDOS, 193, NT_STATUS_IMAGE_CHECKSUM_MISMATCH}, {
670         ERRHRD, ERRgeneral, NT_STATUS_LOST_WRITEBEHIND_DATA}, {
671         ERRHRD, ERRgeneral, NT_STATUS_CLIENT_SERVER_PARAMETERS_INVALID}, {
672         ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_MUST_CHANGE}, {
673         ERRHRD, ERRgeneral, NT_STATUS_NOT_FOUND}, {
674         ERRHRD, ERRgeneral, NT_STATUS_NOT_TINY_STREAM}, {
675         ERRHRD, ERRgeneral, NT_STATUS_RECOVERY_FAILURE}, {
676         ERRHRD, ERRgeneral, NT_STATUS_STACK_OVERFLOW_READ}, {
677         ERRHRD, ERRgeneral, NT_STATUS_FAIL_CHECK}, {
678         ERRHRD, ERRgeneral, NT_STATUS_DUPLICATE_OBJECTID}, {
679         ERRHRD, ERRgeneral, NT_STATUS_OBJECTID_EXISTS}, {
680         ERRHRD, ERRgeneral, NT_STATUS_CONVERT_TO_LARGE}, {
681         ERRHRD, ERRgeneral, NT_STATUS_RETRY}, {
682         ERRHRD, ERRgeneral, NT_STATUS_FOUND_OUT_OF_SCOPE}, {
683         ERRHRD, ERRgeneral, NT_STATUS_ALLOCATE_BUCKET}, {
684         ERRHRD, ERRgeneral, NT_STATUS_PROPSET_NOT_FOUND}, {
685         ERRHRD, ERRgeneral, NT_STATUS_MARSHALL_OVERFLOW}, {
686         ERRHRD, ERRgeneral, NT_STATUS_INVALID_VARIANT}, {
687         ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND}, {
688         ERRDOS, ERRnoaccess, NT_STATUS_ACCOUNT_LOCKED_OUT}, {
689         ERRDOS, ERRbadfid, NT_STATUS_HANDLE_NOT_CLOSABLE}, {
690         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_REFUSED}, {
691         ERRHRD, ERRgeneral, NT_STATUS_GRACEFUL_DISCONNECT}, {
692         ERRHRD, ERRgeneral, NT_STATUS_ADDRESS_ALREADY_ASSOCIATED}, {
693         ERRHRD, ERRgeneral, NT_STATUS_ADDRESS_NOT_ASSOCIATED}, {
694         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_INVALID}, {
695         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_ACTIVE}, {
696         ERRHRD, ERRgeneral, NT_STATUS_NETWORK_UNREACHABLE}, {
697         ERRHRD, ERRgeneral, NT_STATUS_HOST_UNREACHABLE}, {
698         ERRHRD, ERRgeneral, NT_STATUS_PROTOCOL_UNREACHABLE}, {
699         ERRHRD, ERRgeneral, NT_STATUS_PORT_UNREACHABLE}, {
700         ERRHRD, ERRgeneral, NT_STATUS_REQUEST_ABORTED}, {
701         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_ABORTED}, {
702         ERRHRD, ERRgeneral, NT_STATUS_BAD_COMPRESSION_BUFFER}, {
703         ERRHRD, ERRgeneral, NT_STATUS_USER_MAPPED_FILE}, {
704         ERRHRD, ERRgeneral, NT_STATUS_AUDIT_FAILED}, {
705         ERRHRD, ERRgeneral, NT_STATUS_TIMER_RESOLUTION_NOT_SET}, {
706         ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_COUNT_LIMIT}, {
707         ERRHRD, ERRgeneral, NT_STATUS_LOGIN_TIME_RESTRICTION}, {
708         ERRHRD, ERRgeneral, NT_STATUS_LOGIN_WKSTA_RESTRICTION}, {
709         ERRDOS, 193, NT_STATUS_IMAGE_MP_UP_MISMATCH}, {
710         ERRHRD, ERRgeneral, 0xc000024a}, {
711         ERRHRD, ERRgeneral, 0xc000024b}, {
712         ERRHRD, ERRgeneral, 0xc000024c}, {
713         ERRHRD, ERRgeneral, 0xc000024d}, {
714         ERRHRD, ERRgeneral, 0xc000024e}, {
715         ERRHRD, ERRgeneral, 0xc000024f}, {
716         ERRHRD, ERRgeneral, NT_STATUS_INSUFFICIENT_LOGON_INFO}, {
717         ERRHRD, ERRgeneral, NT_STATUS_BAD_DLL_ENTRYPOINT}, {
718         ERRHRD, ERRgeneral, NT_STATUS_BAD_SERVICE_ENTRYPOINT}, {
719         ERRHRD, ERRgeneral, NT_STATUS_LPC_REPLY_LOST}, {
720         ERRHRD, ERRgeneral, NT_STATUS_IP_ADDRESS_CONFLICT1}, {
721         ERRHRD, ERRgeneral, NT_STATUS_IP_ADDRESS_CONFLICT2}, {
722         ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_QUOTA_LIMIT}, {
723         ERRSRV, 3, NT_STATUS_PATH_NOT_COVERED}, {
724         ERRHRD, ERRgeneral, NT_STATUS_NO_CALLBACK_ACTIVE}, {
725         ERRHRD, ERRgeneral, NT_STATUS_LICENSE_QUOTA_EXCEEDED}, {
726         ERRHRD, ERRgeneral, NT_STATUS_PWD_TOO_SHORT}, {
727         ERRHRD, ERRgeneral, NT_STATUS_PWD_TOO_RECENT}, {
728         ERRHRD, ERRgeneral, NT_STATUS_PWD_HISTORY_CONFLICT}, {
729         ERRHRD, ERRgeneral, 0xc000025d}, {
730         ERRHRD, ERRgeneral, NT_STATUS_PLUGPLAY_NO_DEVICE}, {
731         ERRHRD, ERRgeneral, NT_STATUS_UNSUPPORTED_COMPRESSION}, {
732         ERRHRD, ERRgeneral, NT_STATUS_INVALID_HW_PROFILE}, {
733         ERRHRD, ERRgeneral, NT_STATUS_INVALID_PLUGPLAY_DEVICE_PATH}, {
734         ERRDOS, 182, NT_STATUS_DRIVER_ORDINAL_NOT_FOUND}, {
735         ERRDOS, 127, NT_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND}, {
736         ERRDOS, 288, NT_STATUS_RESOURCE_NOT_OWNED}, {
737         ERRDOS, ErrTooManyLinks, NT_STATUS_TOO_MANY_LINKS}, {
738         ERRHRD, ERRgeneral, NT_STATUS_QUOTA_LIST_INCONSISTENT}, {
739         ERRHRD, ERRgeneral, NT_STATUS_FILE_IS_OFFLINE}, {
740         ERRDOS, 21, 0xc000026e}, {
741         ERRDOS, 161, 0xc0000281}, {
742         ERRDOS, ERRnoaccess, 0xc000028a}, {
743         ERRDOS, ERRnoaccess, 0xc000028b}, {
744         ERRHRD, ERRgeneral, 0xc000028c}, {
745         ERRDOS, ERRnoaccess, 0xc000028d}, {
746         ERRDOS, ERRnoaccess, 0xc000028e}, {
747         ERRDOS, ERRnoaccess, 0xc000028f}, {
748         ERRDOS, ERRnoaccess, 0xc0000290}, {
749         ERRDOS, ERRbadfunc, 0xc000029c}, {
750         ERRDOS, ERRinvlevel, 0x007c0001}, };
751
752 /*****************************************************************************
753  Print an error message from the status code
754  *****************************************************************************/
755 static void
756 cifs_print_status(__u32 status_code)
757 {
758         int idx = 0;
759
760         while (nt_errs[idx].nt_errstr != NULL) {
761                 if (((nt_errs[idx].nt_errcode) & 0xFFFFFF) ==
762                     (status_code & 0xFFFFFF)) {
763                         printk(KERN_NOTICE "Status code returned 0x%08x %s\n",
764                                    status_code, nt_errs[idx].nt_errstr);
765                 }
766                 idx++;
767         }
768         return;
769 }
770
771
772 static void
773 ntstatus_to_dos(__u32 ntstatus, __u8 *eclass, __u16 *ecode)
774 {
775         int i;
776         if (ntstatus == 0) {
777                 *eclass = 0;
778                 *ecode = 0;
779                 return;
780         }
781         for (i = 0; ntstatus_to_dos_map[i].ntstatus; i++) {
782                 if (ntstatus == ntstatus_to_dos_map[i].ntstatus) {
783                         *eclass = ntstatus_to_dos_map[i].dos_class;
784                         *ecode = ntstatus_to_dos_map[i].dos_code;
785                         return;
786                 }
787         }
788         *eclass = ERRHRD;
789         *ecode = ERRgeneral;
790 }
791
792 int
793 map_smb_to_linux_error(struct smb_hdr *smb, int logErr)
794 {
795         unsigned int i;
796         int rc = -EIO;  /* if transport error smb error may not be set */
797         __u8 smberrclass;
798         __u16 smberrcode;
799
800         /* BB if NT Status codes - map NT BB */
801
802         /* old style smb error codes */
803         if (smb->Status.CifsError == 0)
804                 return 0;
805
806         if (smb->Flags2 & SMBFLG2_ERR_STATUS) {
807                 /* translate the newer STATUS codes to old style SMB errors
808                  * and then to POSIX errors */
809                 __u32 err = le32_to_cpu(smb->Status.CifsError);
810                 if (logErr && (err != (NT_STATUS_MORE_PROCESSING_REQUIRED)))
811                         cifs_print_status(err);
812                 else if (cifsFYI & CIFS_RC)
813                         cifs_print_status(err);
814                 ntstatus_to_dos(err, &smberrclass, &smberrcode);
815         } else {
816                 smberrclass = smb->Status.DosError.ErrorClass;
817                 smberrcode = le16_to_cpu(smb->Status.DosError.Error);
818         }
819
820         /* old style errors */
821
822         /* DOS class smb error codes - map DOS */
823         if (smberrclass == ERRDOS) {  /* 1 byte field no need to byte reverse */
824                 for (i = 0;
825                      i <
826                      sizeof(mapping_table_ERRDOS) /
827                      sizeof(struct smb_to_posix_error); i++) {
828                         if (mapping_table_ERRDOS[i].smb_err == 0)
829                                 break;
830                         else if (mapping_table_ERRDOS[i].smb_err ==
831                                                                 smberrcode) {
832                                 rc = mapping_table_ERRDOS[i].posix_code;
833                                 break;
834                         }
835                         /* else try next error mapping one to see if match */
836                 }
837         } else if (smberrclass == ERRSRV) {   /* server class of error codes */
838                 for (i = 0;
839                      i <
840                      sizeof(mapping_table_ERRSRV) /
841                      sizeof(struct smb_to_posix_error); i++) {
842                         if (mapping_table_ERRSRV[i].smb_err == 0)
843                                 break;
844                         else if (mapping_table_ERRSRV[i].smb_err ==
845                                                                 smberrcode) {
846                                 rc = mapping_table_ERRSRV[i].posix_code;
847                                 break;
848                         }
849                         /* else try next error mapping to see if match */
850                 }
851         }
852         /* else ERRHRD class errors or junk  - return EIO */
853
854         cFYI(1, ("Mapping smb error code %d to POSIX err %d",
855                  smberrcode, rc));
856
857         /* generic corrective action e.g. reconnect SMB session on
858          * ERRbaduid could be added */
859
860         return rc;
861 }
862
863 /*
864  * calculate the size of the SMB message based on the fixed header
865  * portion, the number of word parameters and the data portion of the message
866  */
867 unsigned int
868 smbCalcSize(struct smb_hdr *ptr)
869 {
870         return (sizeof(struct smb_hdr) + (2 * ptr->WordCount) +
871                 2 /* size of the bcc field */ + BCC(ptr));
872 }
873
874 unsigned int
875 smbCalcSize_LE(struct smb_hdr *ptr)
876 {
877         return (sizeof(struct smb_hdr) + (2 * ptr->WordCount) +
878                 2 /* size of the bcc field */ + le16_to_cpu(BCC_LE(ptr)));
879 }
880
881 /* The following are taken from fs/ntfs/util.c */
882
883 #define NTFS_TIME_OFFSET ((u64)(369*365 + 89) * 24 * 3600 * 10000000)
884
885     /*
886      * Convert the NT UTC (based 1601-01-01, in hundred nanosecond units)
887      * into Unix UTC (based 1970-01-01, in seconds).
888      */
889 struct timespec
890 cifs_NTtimeToUnix(u64 ntutc)
891 {
892         struct timespec ts;
893         /* BB what about the timezone? BB */
894
895         /* Subtract the NTFS time offset, then convert to 1s intervals. */
896         u64 t;
897
898         t = ntutc - NTFS_TIME_OFFSET;
899         ts.tv_nsec = do_div(t, 10000000) * 100;
900         ts.tv_sec = t;
901         return ts;
902 }
903
904 /* Convert the Unix UTC into NT UTC. */
905 u64
906 cifs_UnixTimeToNT(struct timespec t)
907 {
908         /* Convert to 100ns intervals and then add the NTFS time offset. */
909         return (u64) t.tv_sec * 10000000 + t.tv_nsec/100 + NTFS_TIME_OFFSET;
910 }
911
912 static int total_days_of_prev_months[] =
913 {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
914
915
916 __le64 cnvrtDosCifsTm(__u16 date, __u16 time)
917 {
918         return cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(date, time)));
919 }
920
921 struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
922 {
923         struct timespec ts;
924         int sec, min, days, month, year;
925         SMB_TIME * st = (SMB_TIME *)&time;
926         SMB_DATE * sd = (SMB_DATE *)&date;
927
928         cFYI(1, ("date %d time %d", date, time));
929
930         sec = 2 * st->TwoSeconds;
931         min = st->Minutes;
932         if ((sec > 59) || (min > 59))
933                 cERROR(1, ("illegal time min %d sec %d", min, sec));
934         sec += (min * 60);
935         sec += 60 * 60 * st->Hours;
936         if (st->Hours > 24)
937                 cERROR(1, ("illegal hours %d", st->Hours));
938         days = sd->Day;
939         month = sd->Month;
940         if ((days > 31) || (month > 12)) {
941                 cERROR(1, ("illegal date, month %d day: %d", month, days));
942                 if (month > 12)
943                         month = 12;
944         }
945         month -= 1;
946         days += total_days_of_prev_months[month];
947         days += 3652; /* account for difference in days between 1980 and 1970 */
948         year = sd->Year;
949         days += year * 365;
950         days += (year/4); /* leap year */
951         /* generalized leap year calculation is more complex, ie no leap year
952         for years/100 except for years/400, but since the maximum number for DOS
953          year is 2**7, the last year is 1980+127, which means we need only
954          consider 2 special case years, ie the years 2000 and 2100, and only
955          adjust for the lack of leap year for the year 2100, as 2000 was a
956          leap year (divisable by 400) */
957         if (year >= 120)  /* the year 2100 */
958                 days = days - 1;  /* do not count leap year for the year 2100 */
959
960         /* adjust for leap year where we are still before leap day */
961         if (year != 120)
962                 days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
963         sec += 24 * 60 * 60 * days;
964
965         ts.tv_sec = sec;
966
967         /* cFYI(1,("sec after cnvrt dos to unix time %d",sec)); */
968
969         ts.tv_nsec = 0;
970         return ts;
971 }