linux/fs/cifs/netmisc.c
<<
>>
Prefs
   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
  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},
  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
  86static 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
 131static 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 */
 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
 163/* Convert string containing dotted ip address to binary form */
 164/* returns 0 if invalid address */
 165
 166int
 167cifs_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/*****************************************************************************
 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}, {
 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 *****************************************************************************/
 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",
 764                                   status_code, nt_errs[idx].nt_errstr);
 765                }
 766                idx++;
 767        }
 768        return;
 769}
 770
 771
 772static void
 773ntstatus_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
 792int
 793map_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 */
 867unsigned int
 868smbCalcSize(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
 874unsigned int
 875smbCalcSize_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     */
 889struct timespec
 890cifs_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. */
 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}
 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}
 920
 921struct 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}
 972