# -*- coding: binary -*-
##
# $Id$
##

#
# Windows system error codes (0-499)
#
# http://msdn.microsoft.com/en-us/library/ms681382%28v=VS.85%29.aspx
#

module Msf

class WindowsError

	#
	# Constants
	#
	SUCCESS = 0
	INVALID_FUNCTION = 1
	FILE_NOT_FOUND = 2
	PATH_NOT_FOUND = 3
	TOO_MANY_OPEN_FILES = 4
	ACCESS_DENIED = 5
	INVALID_HANDLE = 6
	ARENA_TRASHED = 7
	NOT_ENOUGH_MEMORY = 8
	INVALID_BLOCK = 9
	BAD_ENVIRONMENT = 10
	BAD_FORMAT = 11
	INVALID_ACCESS = 12
	INVALID_DATA = 13
	OUTOFMEMORY = 14
	INVALID_DRIVE = 15
	CURRENT_DIRECTORY = 16
	NOT_SAME_DEVICE = 17
	NO_MORE_FILES = 18
	WRITE_PROTECT = 19
	BAD_UNIT = 20
	NOT_READY = 21
	BAD_COMMAND = 22
	CRC = 23
	BAD_LENGTH = 24
	SEEK = 25
	NOT_DOS_DISK = 26
	SECTOR_NOT_FOUND = 27
	OUT_OF_PAPER = 28
	WRITE_FAULT = 29
	READ_FAULT = 30
	GEN_FAILURE = 31
	SHARING_VIOLATION = 32
	LOCK_VIOLATION = 33
	WRONG_DISK = 34
	SHARING_BUFFER_EXCEEDED = 36
	HANDLE_EOF = 38
	HANDLE_DISK_FULL = 39
	NOT_SUPPORTED = 50
	REM_NOT_LIST = 51
	DUP_NAME = 52
	BAD_NETPATH = 53
	NETWORK_BUSY = 54
	DEV_NOT_EXIST = 55
	TOO_MANY_CMDS = 56
	ADAP_HDW_ERR = 57
	BAD_NET_RESP = 58
	UNEXP_NET_ERR = 59
	BAD_REM_ADAP = 60
	PRINTQ_FULL = 61
	NO_SPOOL_SPACE = 62
	PRINT_CANCELLED = 63
	NETNAME_DELETED = 64
	NETWORK_ACCESS_DENIED = 65
	BAD_DEV_TYPE = 66
	BAD_NET_NAME = 67
	TOO_MANY_NAMES = 68
	TOO_MANY_SESS = 69
	SHARING_PAUSED = 70
	REQ_NOT_ACCEP = 71
	REDIR_PAUSED = 72
	FILE_EXISTS = 80
	CANNOT_MAKE = 82
	FAIL_I24 = 83
	OUT_OF_STRUCTURES = 84
	ALREADY_ASSIGNED = 85
	INVALID_PASSWORD = 86
	INVALID_PARAMETER = 87
	NET_WRITE_FAULT = 88
	NO_PROC_SLOTS = 89

	TOO_MANY_SEMAPHORES = 100
	EXCL_SEM_ALREADY_OWNED = 101
	SEM_IS_SET = 102
	TOO_MANY_SEM_REQUESTS = 103
	INVALID_AT_INTERRUPT_TIME = 104
	SEM_OWNER_DIED = 105
	SEM_USER_LIMIT = 106
	DISK_CHANGE = 107
	DRIVE_LOCKED = 108
	BROKEN_PIPE = 109
	OPEN_FAILED = 110
	BUFFER_OVERFLOW = 111
	DISK_FULL = 112
	NO_MORE_SEARCH_HANDLES = 113
	INVALID_TARGET_HANDLE = 114
	INVALID_CATEGORY = 117
	INVALID_VERIFY_SWITCH = 118
	BAD_DRIVER_LEVEL = 119
	CALL_NOT_IMPLEMENTED = 120
	SEM_TIMEOUT = 121
	INSUFFICIENT_BUFFER = 122
	INVALID_NAME = 123
	INVALID_LEVEL = 124
	NO_VOLUME_LABEL = 125
	MOD_NOT_FOUND = 126
	PROC_NOT_FOUND = 127
	WAIT_NO_CHILDREN = 128
	CHILD_NOT_COMPLETE = 129
	DIRECT_ACCESS_HANDLE = 130
	NEGATIVE_SEEK = 131
	SEEK_ON_DEVICE = 132
	IS_JOIN_TARGET = 133
	IS_JOINED = 134
	IS_SUBSTED = 135
	NOT_JOINED = 136
	NOT_SUBSTED = 137
	JOIN_TO_JOIN = 138
	SUBST_TO_SUBST = 139
	JOIN_TO_SUBST = 140
	SUBST_TO_JOIN = 141
	BUSY_DRIVE = 142
	SAME_DRIVE = 143
	DIR_NOT_ROOT = 144
	DIR_NOT_EMPTY = 145
	IS_SUBST_PATH = 146
	IS_JOIN_PATH = 147
	PATH_BUSY = 148
	IS_SUBST_TARGET = 149
	SYSTEM_TRACE = 150
	INVALID_EVENT_COUNT = 151
	TOO_MANY_MUXWAITERS = 152
	INVALID_LIST_FORMAT = 153
	LABEL_TOO_LONG = 154
	TOO_MANY_TCBS = 155
	SIGNAL_REFUSED = 156
	DISCARDED = 157
	NOT_LOCKED = 158
	BAD_THREADID_ADDR = 159
	BAD_ARGUMENTS = 160
	BAD_PATHNAME = 161
	SIGNAL_PENDING = 162
	MAX_THRDS_REACHED = 164
	LOCK_FAILED = 167
	BUSY = 170
	CANCEL_VIOLATION = 173
	ATOMIC_LOCKS_NOT_SUPPORTED = 174
	INVALID_SEGMENT_NUMBER = 180
	INVALID_ORDINAL = 182
	ALREADY_EXISTS = 183
	INVALID_FLAG_NUMBER = 186
	SEM_NOT_FOUND = 187
	INVALID_STARTING_CODESEG = 188
	INVALID_STACKSEG = 189
	INVALID_MODULETYPE = 190
	INVALID_EXE_SIGNATURE = 191
	EXE_MARKED_INVALID = 192
	BAD_EXE_FORMAT = 193
	ITERATED_DATA_EXCEEDS_64k = 194
	INVALID_MINALLOCSIZE = 195
	DYNLINK_FROM_INVALID_RING = 196
	IOPL_NOT_ENABLED = 197
	INVALID_SEGDPL = 198
	AUTODATASEG_EXCEEDS_64k = 199

	RING2SEG_MUST_BE_MOVABLE = 200
	RELOC_CHAIN_XEEDS_SEGLIM = 201
	INFLOOP_IN_RELOC_CHAIN = 202
	ENVVAR_NOT_FOUND = 203
	NO_SIGNAL_SENT = 205
	FILENAME_EXCED_RANGE = 206
	RING2_STACK_IN_USE = 207
	META_EXPANSION_TOO_LONG = 208
	INVALID_SIGNAL_NUMBER = 209
	THREAD_1_INACTIVE = 210
	LOCKED = 212
	TOO_MANY_MODULES = 214
	NESTING_NOT_ALLOWED = 215
	EXE_MACHINE_TYPE_MISMATCH = 216
	EXE_CANNOT_MODIFY_SIGNED_BINARY = 217
	EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY = 218
	FILE_CHECKED_OUT = 220
	CHECKOUT_REQUIRED = 221
	BAD_FILE_TYPE = 222
	FILE_TOO_LARGE = 223
	FORMS_AUTH_REQUIRED = 224
	VIRUS_INFECTED = 225
	VIRUS_DELETED = 226
	PIPE_LOCAL = 229
	BAD_PIPE = 230
	PIPE_BUSY = 231
	NO_DATA = 232
	PIPE_NOT_CONNECTED = 233
	MORE_DATA = 234
	VC_DISCONNECTED = 240
	INVALID_EA_NAME = 254
	EA_LIST_INCONSISTENT = 255
	WAIT_TIMEOUT = 258
	NO_MORE_ITEMS = 259
	CANNOT_COPY = 266
	DIRECTORY = 267
	EAS_DIDNT_FIT = 275
	EA_FILE_CORRUPT = 276
	EA_TABLE_FULL = 277
	INVALID_EA_HANDLE = 278
	EAS_NOT_SUPPORTED = 282
	NOT_OWNER = 288
	TOO_MANY_POSTS = 298
	PARTIAL_COPY = 299

	OPLOCK_NOT_GRANTED = 300
	INVALID_OPLOCK_PROTOCOL = 301
	DISK_TOO_FRAGMENTED = 302
	DELETE_PENDING = 303
	INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING = 304
	SHORT_NAMES_NOT_ENABLED_ON_VOLUME = 305
	SECURITY_STREAM_IS_INCONSISTENT = 306
	INVALID_LOCK_RANGE = 307
	IMAGE_SUBSYSTEM_NOT_PRESENT = 308
	NOTIFICATION_GUID_ALREADY_DEFINED = 309
	MR_MID_NOT_FOUND = 317
	SCOPE_NOT_FOUND = 318
	FAIL_NOACTION_REBOOT = 350
	FAIL_SHUTDOWN = 351
	FAIL_RESTART = 352
	MAX_SESSIONS_REACHED = 353

	THREAD_MODE_ALREADY_BACKGROUND = 400
	THREAD_MODE_NOT_BACKGROUND = 401
	PROCESS_MODE_ALREADY_BACKGROUND = 402
	PROCESS_MODE_NOT_BACKGROUND = 403
	INVALID_ADDRESS = 487

	#
	# Return a string representation of the constant for a number
	#
	def self.const_name(code)
		self.constants.each { |c|
			return c.to_s if self.const_get(c) == code
		}
		return nil
	end

	#
	# Return the description of an error code
	def self.description(code)

		case code
		when SUCCESS
			"The operation completed successfully."
		when INVALID_FUNCTION
			"Incorrect function."
		when FILE_NOT_FOUND
			"The system cannot find the file specified."
		when PATH_NOT_FOUND
			"The system cannot find the path specified."
		when TOO_MANY_OPEN_FILES
			"The system cannot open the file."
		when ACCESS_DENIED
			"Access is denied."
		when INVALID_HANDLE
			"The handle is invalid."
		when ARENA_TRASHED
			"The storage control blocks were destroyed."
		when NOT_ENOUGH_MEMORY
			"Not enough storage is available to process this command."
		when INVALID_BLOCK
			"The storage control block address is invalid."
		when BAD_ENVIRONMENT
			"The environment is incorrect."
		when BAD_FORMAT
			"An attempt was made to load a program with an incorrect format."
		when INVALID_ACCESS
			"The access code is invalid."
		when INVALID_DATA
			"The data is invalid."
		when OUTOFMEMORY
			"Not enough storage is available to complete this operation."
		when INVALID_DRIVE
			"The system cannot find the drive specified."
		when CURRENT_DIRECTORY
			"The directory cannot be removed."
		when NOT_SAME_DEVICE
			"The system cannot move the file to a different disk drive."
		when NO_MORE_FILES
			"There are no more files."
		when WRITE_PROTECT
			"The media is write protected."
		when BAD_UNIT
			"The system cannot find the device specified."
		when NOT_READY
			"The device is not ready."
		when BAD_COMMAND
			"The device does not recognize the command."
		when CRC
			"Data error ;."
		when BAD_LENGTH
			"The program issued a command but the command length is incorrect."
		when SEEK
			"The drive cannot locate a specific area or track on the disk."
		when NOT_DOS_DISK
			"The specified disk or diskette cannot be accessed."
		when SECTOR_NOT_FOUND
			"The drive cannot find the sector requested."
		when OUT_OF_PAPER
			"The printer is out of paper."
		when WRITE_FAULT
			"The system cannot write to the specified device."
		when READ_FAULT
			"The system cannot read from the specified device."
		when GEN_FAILURE
			"A device attached to the system is not functioning."
		when SHARING_VIOLATION
			"The process cannot access the file because it is being used by another process."
		when LOCK_VIOLATION
			"The process cannot access the file because another process has locked a portion of the file."
		when WRONG_DISK
			"The wrong diskette is in the drive. Insert %2 ; into drive %1."
		when SHARING_BUFFER_EXCEEDED
			"Too many files opened for sharing."
		when HANDLE_EOF
			"Reached the end of the file."
		when HANDLE_DISK_FULL
			"The disk is full."
		when NOT_SUPPORTED
			"The request is not supported."
		when REM_NOT_LIST
			"Windows cannot find the network path. Verify that the network path is correct and the destination computer is not busy or turned off. If Windows still cannot find the network path, contact your network administrator."
		when DUP_NAME
			"You were not connected because a duplicate name exists on the network. If joining a domain, go to System in Control Panel to change the computer name and try again. If joining a workgroup, choose another workgroup name."
		when BAD_NETPATH
			"The network path was not found."
		when NETWORK_BUSY
			"The network is busy."
		when DEV_NOT_EXIST
			"The specified network resource or device is no longer available."
		when TOO_MANY_CMDS
			"The network BIOS command limit has been reached."
		when ADAP_HDW_ERR
			"A network adapter hardware error occurred."
		when BAD_NET_RESP
			"The specified server cannot perform the requested operation."
		when UNEXP_NET_ERR
			"An unexpected network error occurred."
		when BAD_REM_ADAP
			"The remote adapter is not compatible."
		when PRINTQ_FULL
			"The printer queue is full."
		when NO_SPOOL_SPACE
			"Space to store the file waiting to be printed is not available on the server."
		when PRINT_CANCELLED
			"Your file waiting to be printed was deleted."
		when NETNAME_DELETED
			"The specified network name is no longer available."
		when NETWORK_ACCESS_DENIED
			"Network access is denied."
		when BAD_DEV_TYPE
			"The network resource type is not correct."
		when BAD_NET_NAME
			"The network name cannot be found."
		when TOO_MANY_NAMES
			"The name limit for the local computer network adapter card was exceeded."
		when TOO_MANY_SESS
			"The network BIOS session limit was exceeded."
		when SHARING_PAUSED
			"The remote server has been paused or is in the process of being started."
		when REQ_NOT_ACCEP
			"No more connections can be made to this remote computer at this time because there are already as many connections as the computer can accept."
		when REDIR_PAUSED
			"The specified printer or disk device has been paused."
		when FILE_EXISTS
			"The file exists."
		when CANNOT_MAKE
			"The directory or file cannot be created."
		when FAIL_I24
			"Fail on INT 24."
		when OUT_OF_STRUCTURES
			"Storage to process this request is not available."
		when ALREADY_ASSIGNED
			"The local device name is already in use."
		when INVALID_PASSWORD
			"The specified network password is not correct."
		when INVALID_PARAMETER
			"The parameter is incorrect."
		when NET_WRITE_FAULT
			"A write fault occurred on the network."
		when NO_PROC_SLOTS
			"The system cannot start another process at this time."
		when TOO_MANY_SEMAPHORES
			"Cannot create another system semaphore."
		when EXCL_SEM_ALREADY_OWNED
			"The exclusive semaphore is owned by another process."
		when SEM_IS_SET
			"The semaphore is set and cannot be closed."
		when TOO_MANY_SEM_REQUESTS
			"The semaphore cannot be set again."
		when INVALID_AT_INTERRUPT_TIME
			"Cannot request exclusive semaphores at interrupt time."
		when SEM_OWNER_DIED
			"The previous ownership of this semaphore has ended."
		when SEM_USER_LIMIT
			"Insert the diskette for drive %1."
		when DISK_CHANGE
			"The program stopped because an alternate diskette was not inserted."
		when DRIVE_LOCKED
			"The disk is in use or locked by another process."
		when BROKEN_PIPE
			"The pipe has been ended."
		when OPEN_FAILED
			"The system cannot open the device or file specified."
		when BUFFER_OVERFLOW
			"The file name is too long."
		when DISK_FULL
			"There is not enough space on the disk."
		when NO_MORE_SEARCH_HANDLES
			"No more internal file identifiers available."
		when INVALID_TARGET_HANDLE
			"The target internal file identifier is incorrect."
		when INVALID_CATEGORY
			"The IOCTL call made by the application program is not correct."
		when INVALID_VERIFY_SWITCH
			"The verify-on-write switch parameter value is not correct."
		when BAD_DRIVER_LEVEL
			"The system does not support the command requested."
		when CALL_NOT_IMPLEMENTED
			"This function is not supported on this system."
		when SEM_TIMEOUT
			"The semaphore timeout period has expired."
		when INSUFFICIENT_BUFFER
			"The data area passed to a system call is too small."
		when INVALID_NAME
			"The filename, directory name, or volume label syntax is incorrect."
		when INVALID_LEVEL
			"The system call level is not correct."
		when NO_VOLUME_LABEL
			"The disk has no volume label."
		when MOD_NOT_FOUND
			"The specified module could not be found."
		when PROC_NOT_FOUND
			"The specified procedure could not be found."
		when WAIT_NO_CHILDREN
			"There are no child processes to wait for."
		when CHILD_NOT_COMPLETE
			"The %1 application cannot be run in Win32 mode."
		when DIRECT_ACCESS_HANDLE
			"Attempt to use a file handle to an open disk partition for an operation other than raw disk I/O."
		when NEGATIVE_SEEK
			"An attempt was made to move the file pointer before the beginning of the file."
		when SEEK_ON_DEVICE
			"The file pointer cannot be set on the specified device or file."
		when IS_JOIN_TARGET
			"A JOIN or SUBST command cannot be used for a drive that contains previously joined drives."
		when IS_JOINED
			"An attempt was made to use a JOIN or SUBST command on a drive that has already been joined."
		when IS_SUBSTED
			"An attempt was made to use a JOIN or SUBST command on a drive that has already been substituted."
		when NOT_JOINED
			"The system tried to delete the JOIN of a drive that is not joined."
		when NOT_SUBSTED
			"The system tried to delete the substitution of a drive that is not substituted."
		when JOIN_TO_JOIN
			"The system tried to join a drive to a directory on a joined drive."
		when SUBST_TO_SUBST
			"The system tried to substitute a drive to a directory on a substituted drive."
		when JOIN_TO_SUBST
			"The system tried to join a drive to a directory on a substituted drive."
		when SUBST_TO_JOIN
			"The system tried to SUBST a drive to a directory on a joined drive."
		when BUSY_DRIVE
			"The system cannot perform a JOIN or SUBST at this time."
		when SAME_DRIVE
			"The system cannot join or substitute a drive to or for a directory on the same drive."
		when DIR_NOT_ROOT
			"The directory is not a subdirectory of the root directory."
		when DIR_NOT_EMPTY
			"The directory is not empty."
		when IS_SUBST_PATH
			"The path specified is being used in a substitute."
		when IS_JOIN_PATH
			"Not enough resources are available to process this command."
		when PATH_BUSY
			"The path specified cannot be used at this time."
		when IS_SUBST_TARGET
			"An attempt was made to join or substitute a drive for which a directory on the drive is the target of a previous substitute."
		when SYSTEM_TRACE
			"System trace information was not specified in your CONFIG.SYS file, or tracing is disallowed."
		when INVALID_EVENT_COUNT
			"The number of specified semaphore events for DosMuxSemWait is not correct."
		when TOO_MANY_MUXWAITERS
			"DosMuxSemWait did not execute; too many semaphores are already set."
		when INVALID_LIST_FORMAT
			"The DosMuxSemWait list is not correct."
		when LABEL_TOO_LONG
			"The volume label you entered exceeds the label character limit of the target file system."
		when TOO_MANY_TCBS
			"Cannot create another thread."
		when SIGNAL_REFUSED
			"The recipient process has refused the signal."
		when DISCARDED
			"The segment is already discarded and cannot be locked."
		when NOT_LOCKED
			"The segment is already unlocked."
		when BAD_THREADID_ADDR
			"The address for the thread ID is not correct."
		when BAD_ARGUMENTS
			"One or more arguments are not correct."
		when BAD_PATHNAME
			"The specified path is invalid."
		when SIGNAL_PENDING
			"A signal is already pending."
		when MAX_THRDS_REACHED
			"No more threads can be created in the system."
		when LOCK_FAILED
			"Unable to lock a region of a file."
		when BUSY
			"The requested resource is in use."
		when CANCEL_VIOLATION
			"A lock request was not outstanding for the supplied cancel region."
		when ATOMIC_LOCKS_NOT_SUPPORTED
			"The file system does not support atomic changes to the lock type."
		when INVALID_SEGMENT_NUMBER
			"The system detected a segment number that was not correct."
		when INVALID_ORDINAL
			"The operating system cannot run %1."
		when ALREADY_EXISTS
			"Cannot create a file when that file already exists."
		when INVALID_FLAG_NUMBER
			"The flag passed is not correct."
		when SEM_NOT_FOUND
			"The specified system semaphore name was not found."
		when INVALID_STARTING_CODESEG
			"The operating system cannot run %1."
		when INVALID_STACKSEG
			"The operating system cannot run %1."
		when INVALID_MODULETYPE
			"The operating system cannot run %1."
		when INVALID_EXE_SIGNATURE
			"Cannot run %1 in Win32 mode."
		when EXE_MARKED_INVALID
			"The operating system cannot run %1."
		when BAD_EXE_FORMAT
			"is not a valid Win32 application."
		when ITERATED_DATA_EXCEEDS_64k
			"The operating system cannot run %1."
		when INVALID_MINALLOCSIZE
			"The operating system cannot run %1."
		when DYNLINK_FROM_INVALID_RING
			"The operating system cannot run this application program."
		when IOPL_NOT_ENABLED
			"The operating system is not presently configured to run this application."
		when INVALID_SEGDPL
			"The operating system cannot run %1."
		when AUTODATASEG_EXCEEDS_64k
			"The operating system cannot run this application program."
		when RING2SEG_MUST_BE_MOVABLE
			"The code segment cannot be greater than or equal to 64K."
		when RELOC_CHAIN_XEEDS_SEGLIM
			"The operating system cannot run %1."
		when INFLOOP_IN_RELOC_CHAIN
			"The operating system cannot run %1."
		when ENVVAR_NOT_FOUND
			"The system could not find the environment option that was entered."
		when NO_SIGNAL_SENT
			"No process in the command subtree has a signal handler."
		when FILENAME_EXCED_RANGE
			"The filename or extension is too long."
		when RING2_STACK_IN_USE
			"The ring 2 stack is in use."
		when META_EXPANSION_TOO_LONG
			"The global filename characters, * or ?, are entered incorrectly or too many global filename characters are specified."
		when INVALID_SIGNAL_NUMBER
			"The signal being posted is not correct."
		when THREAD_1_INACTIVE
			"The signal handler cannot be set."
		when LOCKED
			"The segment is locked and cannot be reallocated."
		when TOO_MANY_MODULES
			"Too many dynamic-link modules are attached to this program or dynamic-link module."
		when NESTING_NOT_ALLOWED
			"Cannot nest calls to LoadModule."
		when EXE_MACHINE_TYPE_MISMATCH
			"The version of %1 is not compatible with the version you're running. Check your computer's system information to see whether you need a x86 ; or x64 ; version of the program, and then contact the software publisher."
		when EXE_CANNOT_MODIFY_SIGNED_BINARY
			"The image file %1 is signed, unable to modify."
		when EXE_CANNOT_MODIFY_STRONG_SIGNED_BINARY
			"The image file %1 is strong signed, unable to modify."
		when FILE_CHECKED_OUT
			"This file is checked out or locked for editing by another user."
		when CHECKOUT_REQUIRED
			"The file must be checked out before saving changes."
		when BAD_FILE_TYPE
			"The file type being saved or retrieved has been blocked."
		when FILE_TOO_LARGE
			"The file size exceeds the limit allowed and cannot be saved."
		when FORMS_AUTH_REQUIRED
			"Access Denied. Before opening files in this location, you must first add the web site to your trusted sites list, browse to the web site, and select the option to login automatically."
		when VIRUS_INFECTED
			"Operation did not complete successfully because the file contains a virus."
		when VIRUS_DELETED
			"This file contains a virus and cannot be opened. Due to the nature of this virus, the file has been removed from this location."
		when PIPE_LOCAL
			"The pipe is local."
		when BAD_PIPE
			"The pipe state is invalid."
		when PIPE_BUSY
			"All pipe instances are busy."
		when NO_DATA
			"The pipe is being closed."
		when PIPE_NOT_CONNECTED
			"No process is on the other end of the pipe."
		when MORE_DATA
			"More data is available."
		when VC_DISCONNECTED
			"The session was canceled."
		when INVALID_EA_NAME
			"The specified extended attribute name was invalid."
		when EA_LIST_INCONSISTENT
			"The extended attributes are inconsistent."
		when WAIT_TIMEOUT
			"The wait operation timed out."
		when NO_MORE_ITEMS
			"No more data is available."
		when CANNOT_COPY
			"The copy functions cannot be used."
		when DIRECTORY
			"The directory name is invalid."
		when EAS_DIDNT_FIT
			"The extended attributes did not fit in the buffer."
		when EA_FILE_CORRUPT
			"The extended attribute file on the mounted file system is corrupt."
		when EA_TABLE_FULL
			"The extended attribute table file is full."
		when INVALID_EA_HANDLE
			"The specified extended attribute handle is invalid."
		when EAS_NOT_SUPPORTED
			"The mounted file system does not support extended attributes."
		when NOT_OWNER
			"Attempt to release mutex not owned by caller."
		when TOO_MANY_POSTS
			"Too many posts were made to a semaphore."
		when PARTIAL_COPY
			"Only part of a ReadProcessMemory or WriteProcessMemory request was completed."
		when OPLOCK_NOT_GRANTED
			"The oplock request is denied."
		when INVALID_OPLOCK_PROTOCOL
			"An invalid oplock acknowledgment was received by the system."
		when DISK_TOO_FRAGMENTED
			"The volume is too fragmented to complete this operation."
		when DELETE_PENDING
			"The file cannot be opened because it is in the process of being deleted."
		when INCOMPATIBLE_WITH_GLOBAL_SHORT_NAME_REGISTRY_SETTING
			"Short name settings may not be changed on this volume due to the global registry setting."
		when SHORT_NAMES_NOT_ENABLED_ON_VOLUME
			"Short names are not enabled on this volume."
		when SECURITY_STREAM_IS_INCONSISTENT
			"The security stream for the given volume is in an inconsistent state. Please run CHKDSK on the volume."
		when INVALID_LOCK_RANGE
			"A requested file lock operation cannot be processed due to an invalid byte range."
		when IMAGE_SUBSYSTEM_NOT_PRESENT
			"The subsystem needed to support the image type is not present."
		when NOTIFICATION_GUID_ALREADY_DEFINED
			"The specified file already has a notification GUID associated with it."
		when MR_MID_NOT_FOUND
			"The system cannot find message text for message number 0x%1 in the message file for %2."
		when SCOPE_NOT_FOUND
			"The scope specified was not found."
		when FAIL_NOACTION_REBOOT
			"No action was taken as a system reboot is required."
		when FAIL_SHUTDOWN
			"The shutdown operation failed."
		when FAIL_RESTART
			"The restart operation failed."
		when MAX_SESSIONS_REACHED
			"The maximum number of sessions has been reached."
		when THREAD_MODE_ALREADY_BACKGROUND
			"The thread is already in background processing mode."
		when THREAD_MODE_NOT_BACKGROUND
			"The thread is not in background processing mode."
		when PROCESS_MODE_ALREADY_BACKGROUND
			"The process is already in background processing mode."
		when PROCESS_MODE_NOT_BACKGROUND
			"The process is not in background processing mode."
		when INVALID_ADDRESS
			"Attempt to access invalid address."
		else
			"#{code}"
		end
	end

end

end
