]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - fs/cifs/netmisc.c
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
[mirror_ubuntu-artful-kernel.git] / fs / cifs / netmisc.c
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/netmisc.c
3 *
4 * Copyright (c) International Business Machines Corp., 2002
5 * Author(s): Steve French (sfrench@us.ibm.com)
3870253e 6 *
1da177e4
LT
7 * Error mapping routines from Samba libsmb/errormap.c
8 * Copyright (C) Andrew Tridgell 2001
9 *
1da177e4
LT
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
3870253e 12 * the Free Software Foundation; either version 2 of the License, or
1da177e4 13 * (at your option) any later version.
3870253e 14 *
1da177e4
LT
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
3870253e 21 * along with this program; if not, write to the Free Software
1da177e4
LT
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>
5858ae44 32#include <linux/inet.h>
1da177e4
LT
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
41struct smb_to_posix_error {
42 __u16 smb_err;
43 int posix_code;
44};
45
46static 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},
3870253e 67 {ERRnosuchshare, -ENXIO},
1da177e4
LT
68 {ERRfilexists, -EEXIST},
69 {ERRinvparm, -EINVAL},
70 {ERRdiskfull, -ENOSPC},
71 {ERRinvname, -ENOENT},
3870253e 72 {ERRinvlevel, -EOPNOTSUPP},
1da177e4
LT
73 {ERRdirnotempty, -ENOTEMPTY},
74 {ERRnotlocked, -ENOLCK},
7ee1af76 75 {ERRcancelviolation, -ENOLCK},
1da177e4
LT
76 {ERRalreadyexists, -EEXIST},
77 {ERRmoredata, -EOVERFLOW},
3870253e 78 {ERReasnotsupported, -EOPNOTSUPP},
1da177e4
LT
79 {ErrQuota, -EDQUOT},
80 {ErrNotALink, -ENOLINK},
3870253e
SF
81 {ERRnetlogonNotStarted, -ENOPROTOOPT},
82 {ErrTooManyLinks, -EMLINK},
1da177e4
LT
83 {0, 0}
84};
85
86static const struct smb_to_posix_error mapping_table_ERRSRV[] = {
87 {ERRerror, -EIO},
7c7b25bc 88 {ERRbadpw, -EACCES}, /* was EPERM */
1da177e4
LT
89 {ERRbadtype, -EREMOTE},
90 {ERRaccess, -EACCES},
91 {ERRinvtid, -ENXIO},
43411d69 92 {ERRinvnetname, -ENXIO},
1da177e4
LT
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},
a761ac57
SF
117 {ERRnoSuchUser, -EACCES},
118/* {ERRaccountexpired, -EACCES},
1da177e4
LT
119 {ERRbadclient, -EACCES},
120 {ERRbadLogonTime, -EACCES},
a761ac57
SF
121 {ERRpasswordExpired, -EACCES},*/
122 {ERRaccountexpired, -EKEYEXPIRED},
123 {ERRbadclient, -EACCES},
124 {ERRbadLogonTime, -EACCES},
125 {ERRpasswordExpired, -EKEYEXPIRED},
126
1da177e4
LT
127 {ERRnosupport, -EINVAL},
128 {0, 0}
129};
130
131static const struct smb_to_posix_error mapping_table_ERRHRD[] = {
132 {0, 0}
133};
134
1fb64bfc
SF
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 */
143static 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
1da177e4
LT
163/* Convert string containing dotted ip address to binary form */
164/* returns 0 if invalid address */
165
1da177e4 166int
3870253e 167cifs_inet_pton(int address_family, char *cp, void *dst)
1da177e4 168{
5858ae44
SF
169 int ret = 0;
170
171 /* calculate length by finding first slash or NULL */
1fb64bfc
SF
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) {
5858ae44
SF
179 ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL);
180 }
181#ifdef CONFIG_CIFS_DEBUG2
fb8c4b14 182 cFYI(1, ("address conversion returned %d for %s", ret, cp));
5858ae44
SF
183#endif
184 if (ret > 0)
185 ret = 1;
186 return ret;
1da177e4
LT
187}
188
189/*****************************************************************************
190convert a NT status code to a dos class/code
191 *****************************************************************************/
192/* NT status -> dos error map */
193static 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}, {
75cf6bdc 201 ERRDOS, ERRinvlevel, NT_STATUS_INVALID_INFO_CLASS}, {
1da177e4
LT
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'
3870253e 221 from NT_STATUS_MORE_PROCESSING_REQUIRED to NT_STATUS_OK
1da177e4
LT
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'
3870253e 236 from NT_STATUS_ACCESS_DENIED to NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE
1da177e4
LT
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'
3870253e 306 from NT_STATUS_NO_SUCH_USER to NT_STATUS_LOGON_FAILURE
1da177e4
LT
307 during the session setup } */
308 {
a761ac57 309 ERRDOS, ERRnoaccess, NT_STATUS_NO_SUCH_USER}, { /* could map to 2238 */
1da177e4
LT
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'
3870253e 316 from NT_STATUS_WRONG_PASSWORD to NT_STATUS_LOGON_FAILURE
1da177e4
LT
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}, {
a761ac57
SF
324 ERRSRV, ERRbadLogonTime, NT_STATUS_INVALID_LOGON_HOURS}, {
325 ERRSRV, ERRbadclient, NT_STATUS_INVALID_WORKSTATION}, {
6ab16d24 326 ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_EXPIRED}, {
a761ac57 327 ERRSRV, ERRaccountexpired, NT_STATUS_ACCOUNT_DISABLED}, {
1da177e4
LT
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'
3870253e
SF
368 from NT_STATUS_INSUFFICIENT_RESOURCES to
369 NT_STATUS_INSUFF_SERVER_RESOURCES during the session setup } */
1da177e4
LT
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'
3870253e
SF
613 from NT_STATUS_NO_TRUST_SAM_ACCOUNT to
614 NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE during the session setup } */
1da177e4
LT
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}, {
a761ac57 624 ERRSRV, ERRaccountexpired, NT_STATUS_ACCOUNT_EXPIRED}, {
1da177e4
LT
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'
3870253e 633 from NT_STATUS_DOMAIN_TRUST_INCONSISTENT to NT_STATUS_LOGON_FAILURE
1da177e4
LT
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}, {
6ab16d24 672 ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_MUST_CHANGE}, {
1da177e4
LT
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}, {
11aa0149 737 ERRDOS, ErrTooManyLinks, NT_STATUS_TOO_MANY_LINKS}, {
1da177e4
LT
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 *****************************************************************************/
755static void
756cifs_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",
3870253e 764 status_code, nt_errs[idx].nt_errstr);
1da177e4
LT
765 }
766 idx++;
767 }
768 return;
769}
770
771
772static void
63d2583f 773ntstatus_to_dos(__u32 ntstatus, __u8 *eclass, __u16 *ecode)
1da177e4
LT
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
792int
a761ac57 793map_smb_to_linux_error(struct smb_hdr *smb, int logErr)
1da177e4
LT
794{
795 unsigned int i;
3870253e 796 int rc = -EIO; /* if transport error smb error may not be set */
1da177e4
LT
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) {
3870253e
SF
807 /* translate the newer STATUS codes to old style SMB errors
808 * and then to POSIX errors */
1da177e4 809 __u32 err = le32_to_cpu(smb->Status.CifsError);
a761ac57
SF
810 if (logErr && (err != (NT_STATUS_MORE_PROCESSING_REQUIRED)))
811 cifs_print_status(err);
812 else if (cifsFYI & CIFS_RC)
1da177e4
LT
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 */
3870253e 823 if (smberrclass == ERRDOS) { /* 1 byte field no need to byte reverse */
1da177e4
LT
824 for (i = 0;
825 i <
630f3f0c
SF
826 sizeof(mapping_table_ERRDOS) /
827 sizeof(struct smb_to_posix_error); i++) {
1da177e4
LT
828 if (mapping_table_ERRDOS[i].smb_err == 0)
829 break;
63135e08
SF
830 else if (mapping_table_ERRDOS[i].smb_err ==
831 smberrcode) {
1da177e4
LT
832 rc = mapping_table_ERRDOS[i].posix_code;
833 break;
834 }
3870253e 835 /* else try next error mapping one to see if match */
1da177e4 836 }
3870253e 837 } else if (smberrclass == ERRSRV) { /* server class of error codes */
1da177e4
LT
838 for (i = 0;
839 i <
630f3f0c
SF
840 sizeof(mapping_table_ERRSRV) /
841 sizeof(struct smb_to_posix_error); i++) {
1da177e4
LT
842 if (mapping_table_ERRSRV[i].smb_err == 0)
843 break;
63135e08
SF
844 else if (mapping_table_ERRSRV[i].smb_err ==
845 smberrcode) {
1da177e4
LT
846 rc = mapping_table_ERRSRV[i].posix_code;
847 break;
848 }
3870253e 849 /* else try next error mapping to see if match */
1da177e4
LT
850 }
851 }
852 /* else ERRHRD class errors or junk - return EIO */
853
a761ac57 854 cFYI(1, ("Mapping smb error code %d to POSIX err %d",
3870253e 855 smberrcode, rc));
1da177e4 856
50c2f753 857 /* generic corrective action e.g. reconnect SMB session on
3870253e 858 * ERRbaduid could be added */
1da177e4
LT
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 */
867unsigned int
868smbCalcSize(struct smb_hdr *ptr)
869{
630f3f0c 870 return (sizeof(struct smb_hdr) + (2 * ptr->WordCount) +
70ca734a
SF
871 2 /* size of the bcc field */ + BCC(ptr));
872}
873
874unsigned int
875smbCalcSize_LE(struct smb_hdr *ptr)
876{
630f3f0c 877 return (sizeof(struct smb_hdr) + (2 * ptr->WordCount) +
70ca734a 878 2 /* size of the bcc field */ + le16_to_cpu(BCC_LE(ptr)));
1da177e4
LT
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 */
889struct timespec
890cifs_NTtimeToUnix(u64 ntutc)
891{
3870253e 892 struct timespec ts;
1da177e4
LT
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;
3870253e 900 ts.tv_sec = t;
1da177e4
LT
901 return ts;
902}
903
904/* Convert the Unix UTC into NT UTC. */
905u64
906cifs_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}
1bd5bbcb
SF
911
912static 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}
268f3be1 920
1bd5bbcb
SF
921struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
922{
1bd5bbcb 923 struct timespec ts;
268f3be1
SF
924 int sec, min, days, month, year;
925 SMB_TIME * st = (SMB_TIME *)&time;
926 SMB_DATE * sd = (SMB_DATE *)&date;
1bd5bbcb 927
3870253e 928 cFYI(1, ("date %d time %d", date, time));
1bd5bbcb 929
268f3be1
SF
930 sec = 2 * st->TwoSeconds;
931 min = st->Minutes;
790fe579 932 if ((sec > 59) || (min > 59))
3870253e 933 cERROR(1, ("illegal time min %d sec %d", min, sec));
1bd5bbcb 934 sec += (min * 60);
268f3be1 935 sec += 60 * 60 * st->Hours;
790fe579 936 if (st->Hours > 24)
3870253e 937 cERROR(1, ("illegal hours %d", st->Hours));
268f3be1
SF
938 days = sd->Day;
939 month = sd->Month;
d5d18501 940 if ((days > 31) || (month > 12)) {
3870253e 941 cERROR(1, ("illegal date, month %d day: %d", month, days));
d5d18501
SF
942 if (month > 12)
943 month = 12;
944 }
1bd5bbcb
SF
945 month -= 1;
946 days += total_days_of_prev_months[month];
533f90af 947 days += 3652; /* account for difference in days between 1980 and 1970 */
268f3be1 948 year = sd->Year;
1bd5bbcb
SF
949 days += year * 365;
950 days += (year/4); /* leap year */
438dd926
SF
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
3870253e 955 adjust for the lack of leap year for the year 2100, as 2000 was a
438dd926 956 leap year (divisable by 400) */
790fe579 957 if (year >= 120) /* the year 2100 */
438dd926
SF
958 days = days - 1; /* do not count leap year for the year 2100 */
959
1bd5bbcb 960 /* adjust for leap year where we are still before leap day */
790fe579 961 if (year != 120)
70903ca0 962 days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
790fe579 963 sec += 24 * 60 * 60 * days;
1bd5bbcb 964
1bd5bbcb
SF
965 ts.tv_sec = sec;
966
268f3be1
SF
967 /* cFYI(1,("sec after cnvrt dos to unix time %d",sec)); */
968
1bd5bbcb
SF
969 ts.tv_nsec = 0;
970 return ts;
3870253e 971}