brintos

brintos / linux-shallow public Read only

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