/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
ntmap.c
Abstract:
This module contains the functions to map NT values into OS/2 values
and/or vice versa. So far there are two functions defined:
Or2MapStatus - maps NT Status Code into an OS/2 Error Code
Or2MapProtectionToFlags - maps NT page protection flags into OS/2
page protection flags
Or2MapFlagsToProtection - maps OS/2 page protection flags into NT
page protection flags
Author:
Steve Wood (stevewo) 07-Jul-1990
Revision History:
--*/
#define INCL_OS2V20_MEMORY
#define INCL_OS2V20_ERRORS
#include "os2ssrtl.h"
APIRET
Or2MapStatus(
IN NTSTATUS Status
)
{
//
// Map all warning and error status codes to comparable OS/2 error codes.
// Mappings that are defined, but probably incorrect, are marked with
// FIX, FIX. Mappings that are currently not defined are marked with
// the ERROR_SS_UNKNOWN_STATUS symbol. These later should be left as is
// unless you know of a case where the status code is legitimate for the
// OS/2 Subsystem and needs a defined mapping.
//
switch ( Status ) {
case STATUS_SUCCESS:
return( NO_ERROR);
case STATUS_GUARD_PAGE_VIOLATION:
return( ERROR_GUARDPAGE );
case STATUS_DATATYPE_MISALIGNMENT:
return( ERROR_NOACCESS ); // FIX, FIX - wait for new XCPT stuff
case STATUS_BREAKPOINT:
case STATUS_SINGLE_STEP:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_INTEGER_OVERFLOW:
return( ERROR_ARITHMETIC_OVERFLOW );
case STATUS_BUFFER_OVERFLOW:
return( ERROR_BUFFER_OVERFLOW );
case STATUS_NO_MORE_FILES:
return( ERROR_NO_MORE_FILES );
case STATUS_WAS_LOCKED:
case STATUS_NOT_LOCKED:
case STATUS_FILE_LOCK_CONFLICT:
case STATUS_LOCK_NOT_GRANTED:
case STATUS_RANGE_NOT_LOCKED:
case STATUS_WAS_UNLOCKED:
return( ERROR_LOCK_VIOLATION );
case STATUS_NO_MORE_EAS:
return( ERROR_NO_MORE_ITEMS ); // FIX, FIX - is this right?
case STATUS_UNSUCCESSFUL:
return( ERROR_GEN_FAILURE );
case STATUS_NOT_IMPLEMENTED:
return( ERROR_INVALID_FUNCTION );
case STATUS_INVALID_INFO_CLASS:
case STATUS_INFO_LENGTH_MISMATCH:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_ACCESS_VIOLATION:
return( ERROR_PROTECTION_VIOLATION ); // FIX, FIX - wait for new XCPT stuff
case STATUS_IN_PAGE_ERROR:
return( ERROR_SWAPERROR );
case STATUS_PAGEFILE_QUOTA:
return( ERROR_NOT_ENOUGH_MEMORY );
case STATUS_PAGEFILE_QUOTA_EXCEEDED:
return( ERROR_SWAP_FILE_FULL );
case STATUS_DISK_FULL:
case STATUS_COMMITMENT_LIMIT:
return( ERROR_DISK_FULL );
case STATUS_INVALID_HANDLE:
case STATUS_FILE_CLOSED:
case STATUS_FILE_FORCED_CLOSED:
return( ERROR_INVALID_HANDLE );
case STATUS_BAD_INITIAL_STACK:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_BAD_INITIAL_PC:
return( ERROR_BAD_EXE_FORMAT ); // FIX, FIX - should this be unknown?
case STATUS_INVALID_CID:
case STATUS_TIMER_NOT_CANCELED:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_INVALID_PARAMETER:
return( ERROR_INVALID_PARAMETER );
case STATUS_NO_SUCH_DEVICE:
return( ERROR_INVALID_PATH );
case STATUS_INVALID_DEVICE_REQUEST:
return( ERROR_INVALID_FUNCTION );
case STATUS_END_OF_FILE:
return( ERROR_HANDLE_EOF );
case STATUS_WRONG_VOLUME:
case STATUS_UNRECOGNIZED_MEDIA:
case STATUS_FILE_INVALID:
return( ERROR_WRONG_DISK );
case STATUS_NONEXISTENT_SECTOR:
return( ERROR_SECTOR_NOT_FOUND );
case STATUS_MORE_PROCESSING_REQUIRED:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_NO_MEMORY:
return( ERROR_NOT_ENOUGH_MEMORY );
case STATUS_NOT_MAPPED_VIEW:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_CONFLICTING_ADDRESSES:
case STATUS_UNABLE_TO_FREE_VM:
case STATUS_UNABLE_TO_DELETE_SECTION:
return( ERROR_INVALID_ADDRESS );
case STATUS_INVALID_SYSTEM_SERVICE:
return( ERROR_INVALID_FUNCTION );
case STATUS_ILLEGAL_INSTRUCTION:
return( NO_ERROR ); // FIX, FIX - wait for new XCPT stuff
case STATUS_INVALID_LOCK_SEQUENCE:
case STATUS_INVALID_VIEW_SIZE:
case STATUS_INVALID_FILE_FOR_SECTION:
case STATUS_ALREADY_COMMITTED:
case STATUS_ACCESS_DENIED:
case STATUS_CANNOT_DELETE:
case STATUS_NOT_A_DIRECTORY:
return( ERROR_ACCESS_DENIED );
case STATUS_DIRECTORY_NOT_EMPTY:
return( ERROR_CURRENT_DIRECTORY );
case STATUS_BUFFER_TOO_SMALL:
return( ERROR_INSUFFICIENT_BUFFER );
case STATUS_OBJECT_TYPE_MISMATCH:
return( ERROR_FILE_NOT_FOUND ); // FIX, FIX - is this bogus or not?
case STATUS_NONCONTINUABLE_EXCEPTION:
case STATUS_INVALID_DISPOSITION:
case STATUS_UNWIND:
case STATUS_BAD_STACK:
case STATUS_INVALID_UNWIND_TARGET:
return( NO_ERROR ); // FIX, FIX - wait for new XCPT stuff
case STATUS_PARITY_ERROR:
return( NO_ERROR ); // FIX, FIX - wait for new XCPT stuff
case STATUS_UNABLE_TO_DECOMMIT_VM:
return( ERROR_INVALID_ADDRESS );
break;
case STATUS_NOT_COMMITTED:
case STATUS_INVALID_PORT_ATTRIBUTES:
case STATUS_PORT_MESSAGE_TOO_LONG:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_INVALID_PARAMETER_MIX:
return( ERROR_INVALID_PARAMETER );
case STATUS_INVALID_QUOTA_LOWER:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_DISK_CORRUPT_ERROR:
return( ERROR_NOT_DOS_DISK ); // FIX, FIX - is this the best choice?
case STATUS_OBJECT_NAME_INVALID:
return( ERROR_INVALID_NAME );
case STATUS_OBJECT_PATH_NOT_FOUND:
case STATUS_OBJECT_PATH_INVALID:
case STATUS_OBJECT_PATH_SYNTAX_BAD:
case STATUS_REDIRECTOR_NOT_STARTED:
return( ERROR_PATH_NOT_FOUND );
case STATUS_NOT_SUPPORTED:
return( ERROR_NOT_SUPPORTED );
case STATUS_REMOTE_NOT_LISTENING:
return( ERROR_REM_NOT_LIST );
case STATUS_DUPLICATE_NAME:
return( ERROR_DUP_NAME );
case STATUS_BAD_NETWORK_PATH:
return( ERROR_BAD_NETPATH );
case STATUS_NETWORK_BUSY:
return( ERROR_NETWORK_BUSY );
case STATUS_DEVICE_DOES_NOT_EXIST:
return( ERROR_DEV_NOT_EXIST );
case STATUS_TOO_MANY_COMMANDS:
return( ERROR_TOO_MANY_CMDS );
case STATUS_ADAPTER_HARDWARE_ERROR:
return( ERROR_ADAP_HDW_ERR );
case STATUS_INVALID_NETWORK_RESPONSE:
return( ERROR_BAD_NET_RESP );
case STATUS_UNEXPECTED_NETWORK_ERROR:
return( ERROR_UNEXP_NET_ERR );
case STATUS_BAD_REMOTE_ADAPTER:
return( ERROR_BAD_REM_ADAP );
case STATUS_OBJECT_NAME_NOT_FOUND:
case STATUS_NO_SUCH_FILE:
case STATUS_DLL_NOT_FOUND:
case STATUS_FILE_IS_A_DIRECTORY:
case STATUS_DELETE_PENDING:
return( ERROR_FILE_NOT_FOUND );
case STATUS_OBJECT_NAME_COLLISION:
return( ERROR_FILE_EXISTS );
case STATUS_INVALID_PIPE_STATE:
case STATUS_PIPE_DISCONNECTED:
return( ERROR_PIPE_NOT_CONNECTED );
case STATUS_PIPE_BROKEN:
return( ERROR_BROKEN_PIPE );
case STATUS_BAD_NETWORK_NAME:
return( ERROR_BAD_NET_NAME );
case STATUS_VIRTUAL_CIRCUIT_CLOSED:
return( ERROR_VC_DISCONNECTED );
case STATUS_NET_WRITE_FAULT:
return( ERROR_NET_WRITE_FAULT );
case STATUS_PIPE_NOT_AVAILABLE:
return( ERROR_PIPE_BUSY );
case STATUS_PORT_DISCONNECTED:
case STATUS_DEVICE_ALREADY_ATTACHED:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_DATA_OVERRUN:
case STATUS_DATA_LATE_ERROR:
case STATUS_DATA_ERROR:
return( ERROR_BAD_LENGTH ); // FIX, FIX - is there a better choice?
case STATUS_CRC_ERROR:
return( ERROR_CRC );
case STATUS_SECTION_TOO_BIG:
case STATUS_PORT_CONNECTION_REFUSED:
case STATUS_INVALID_PORT_HANDLE:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_SHARING_VIOLATION:
return( ERROR_SHARING_VIOLATION );
case STATUS_QUOTA_EXCEEDED:
return( ERROR_NOT_ENOUGH_MEMORY );
case STATUS_INVALID_PAGE_PROTECTION:
return( ERROR_PMM_INVALID_FLAGS );
case STATUS_MUTANT_NOT_OWNED:
return( ERROR_NOT_OWNER );
case STATUS_SEMAPHORE_LIMIT_EXCEEDED:
return( ERROR_TOO_MANY_POSTS );
case STATUS_PORT_ALREADY_SET:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_SECTION_NOT_IMAGE:
case STATUS_SUSPEND_COUNT_EXCEEDED:
case STATUS_THREAD_IS_TERMINATING:
case STATUS_BAD_WORKING_SET_LIMIT:
case STATUS_INCOMPATIBLE_FILE_MAP:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_SECTION_PROTECTION:
return( ERROR_PMM_INVALID_FLAGS );
case STATUS_EAS_NOT_SUPPORTED:
return( ERROR_EAS_NOT_SUPPORTED );
case STATUS_NONEXISTENT_EA_ENTRY:
return( ERROR_INVALID_EA_NAME );
case STATUS_EA_TOO_LARGE:
return( ERROR_EA_LIST_TOO_LONG );
case STATUS_EA_CORRUPT_ERROR:
return( ERROR_EA_FILE_CORRUPT );
case STATUS_CTL_FILE_NOT_SUPPORTED:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_UNKNOWN_REVISION:
case STATUS_REVISION_MISMATCH:
case STATUS_INVALID_OWNER:
case STATUS_INVALID_PRIMARY_GROUP:
case STATUS_NO_IMPERSONATION_TOKEN:
case STATUS_CANT_DISABLE_MANDATORY:
case STATUS_NO_LOGON_SERVERS:
case STATUS_NO_SUCH_LOGON_SESSION:
case STATUS_NO_SUCH_PRIVILEGE:
case STATUS_PRIVILEGE_NOT_HELD:
case STATUS_INVALID_ACCOUNT_NAME:
case STATUS_USER_EXISTS:
case STATUS_NO_SUCH_USER:
case STATUS_GROUP_EXISTS:
case STATUS_NO_SUCH_GROUP:
case STATUS_SPECIAL_GROUP:
case STATUS_MEMBER_IN_GROUP:
case STATUS_MEMBER_NOT_IN_GROUP:
case STATUS_LAST_ADMIN:
// return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
return( ERROR_ACCESS_DENIED );
case STATUS_WRONG_PASSWORD:
return( ERROR_INVALID_PASSWORD );
case STATUS_ILL_FORMED_PASSWORD:
return( ERROR_INVALID_PASSWORD );
case STATUS_PASSWORD_RESTRICTION:
return( ERROR_INVALID_PASSWORD );
case STATUS_LOGON_FAILURE:
case STATUS_ACCOUNT_RESTRICTION:
case STATUS_INVALID_LOGON_HOURS:
case STATUS_INVALID_WORKSTATION:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_PASSWORD_EXPIRED:
return( ERROR_INVALID_PASSWORD );
case STATUS_ACCOUNT_DISABLED:
case STATUS_NONE_MAPPED:
case STATUS_TOO_MANY_LUIDS_REQUESTED:
case STATUS_LUIDS_EXHAUSTED:
case STATUS_INVALID_SUB_AUTHORITY:
case STATUS_INVALID_ACL:
case STATUS_INVALID_SID:
case STATUS_INVALID_SECURITY_DESCR:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_PROCEDURE_NOT_FOUND:
return( ERROR_PROC_NOT_FOUND );
case STATUS_INVALID_IMAGE_FORMAT:
return( ERROR_BAD_EXE_FORMAT );
case STATUS_INVALID_IMAGE_NE_FORMAT:
case STATUS_INVALID_IMAGE_LE_FORMAT:
return ( ERROR_BAD_FORMAT );
case STATUS_NO_TOKEN:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_INVALID_EA_NAME:
/*
BUBUG: Some cases where NT expects STATUS_INVALID_EA_NAME instead -
see filio204, variation 1
*/
return( ERROR_INVALID_EA_NAME );
case STATUS_EA_LIST_INCONSISTENT:
return( ERROR_EA_LIST_INCONSISTENT );
case STATUS_NO_EAS_ON_FILE:
return( ERROR_NEED_EAS_FOUND ); // FIX, FIX - is there a mapping?
case STATUS_SERVER_DISABLED:
case STATUS_SERVER_NOT_DISABLED:
case STATUS_TOO_MANY_GUIDS_REQUESTED:
case STATUS_GUIDS_EXHAUSTED:
case STATUS_INVALID_ID_AUTHORITY:
case STATUS_AGENTS_EXHAUSTED:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_INVALID_VOLUME_LABEL:
case STATUS_SECTION_NOT_EXTENDED:
case STATUS_NOT_MAPPED_DATA:
case STATUS_RESOURCE_DATA_NOT_FOUND:
case STATUS_RESOURCE_TYPE_NOT_FOUND:
case STATUS_RESOURCE_NAME_NOT_FOUND:
return( ERROR_INVALID_PARAMETER );
case STATUS_ARRAY_BOUNDS_EXCEEDED:
case STATUS_FLOAT_DENORMAL_OPERAND:
case STATUS_FLOAT_DIVIDE_BY_ZERO:
case STATUS_FLOAT_INEXACT_RESULT:
case STATUS_FLOAT_INVALID_OPERATION:
case STATUS_FLOAT_OVERFLOW:
case STATUS_FLOAT_STACK_CHECK:
case STATUS_FLOAT_UNDERFLOW:
case STATUS_INTEGER_DIVIDE_BY_ZERO:
case STATUS_PRIVILEGED_INSTRUCTION:
return( NO_ERROR ); // FIX, FIX - wait for new XCPT stuff
case STATUS_TOO_MANY_PAGING_FILES:
case STATUS_ALLOTTED_SPACE_EXCEEDED:
case STATUS_INSUFFICIENT_RESOURCES:
return( ERROR_NOT_ENOUGH_MEMORY );
case STATUS_DFS_EXIT_PATH_FOUND:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
case STATUS_DEVICE_PAPER_EMPTY:
return( ERROR_OUT_OF_PAPER );
case STATUS_NO_MEDIA_IN_DEVICE:
case STATUS_DEVICE_NOT_READY:
case STATUS_DEVICE_POWERED_OFF:
case STATUS_DEVICE_OFF_LINE:
case STATUS_DEVICE_NOT_CONNECTED:
case STATUS_DEVICE_POWER_FAILURE:
return( ERROR_NOT_READY );
case STATUS_MEDIA_WRITE_PROTECTED:
return( ERROR_WRITE_PROTECT );
case STATUS_DEVICE_DATA_ERROR:
return( ERROR_BAD_LENGTH ); // FIX, FIX - is there a better choice?
case STATUS_DEVICE_BUSY:
return( ERROR_BUSY ); // FIX, FIX - is there a better choice?
case STATUS_FREE_VM_NOT_AT_BASE:
case STATUS_MEMORY_NOT_ALLOCATED:
return( ERROR_INVALID_ADDRESS );
case STATUS_IO_TIMEOUT:
return( ERROR_SEM_TIMEOUT );
case STATUS_INSTANCE_NOT_AVAILABLE:
return( ERROR_PIPE_BUSY );
case STATUS_NOT_SAME_DEVICE:
return( ERROR_NOT_SAME_DEVICE );
default:
return( ERROR_SS_UNKNOWN_STATUS | (USHORT)Status );
}
}
UCHAR Or2MapFlagsTable[ 8 ] = {
0, // 0
PAGE_READONLY, // PAG_READ
PAGE_READWRITE, // PAG_WRITE
PAGE_READWRITE, // PAG_READ | PAG_WRITE
PAGE_EXECUTE, // PAG_EXECUTE
PAGE_EXECUTE_READ, // PAG_EXECUTE | PAG_READ
PAGE_EXECUTE_READWRITE, // PAG_EXECUTE | PAG_WRITE
PAGE_EXECUTE_READWRITE // PAG_EXECUTE | PAG_READ | PAG_WRITE
};
#if (PAG_EXECUTE | PAG_READ | PAG_WRITE) != 0x7
#error PAG_EXECUTE | PAG_READ | PAG_WRITE incorrectly defined.
#endif
UCHAR Or2MapProtectionTable[ 16 ] = {
0, // 0 (0x0)
0, // PAGE_NOACCESS (0x1)
PAG_READ, // PAGE_READONLY (0x2)
0, // 0 (0x3)
PAG_READ | PAG_WRITE, // PAGE_READWRITE (0x4)
0, // 0 (0x5)
0, // 0 (0x6)
0, // 0 (0x7)
0, // PAGE_WRITECOPY (0x8)
0, // 0 (0x9)
0, // 0 (0xA)
0, // 0 (0xB)
0, // 0 (0xC)
0, // 0 (0xD)
0, // 0 (0xE)
0 // 0 (0xF)
};
#if (PAGE_NOACCESS | PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY) != 0xF
#error PAGE_NOACCESS | PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY incorrectly defined.
#endif
#if (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY) != 0xF0
#error PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY incorrectly defined.
#endif
APIRET
Or2MapFlagsToProtection(
ULONG Flags,
PULONG Protection
)
{
*Protection = Or2MapFlagsTable[ Flags & ( PAG_EXECUTE |
PAG_READ |
PAG_WRITE
)
];
if (*Protection == 0) {
return( ERROR_INVALID_PARAMETER );
}
else {
if (Flags & PAG_GUARD) {
*Protection |= PAGE_GUARD;
}
return( NO_ERROR );
}
}
APIRET
Or2MapProtectionToFlags(
ULONG Protection,
PULONG Flags
)
{
if (Protection & 0x0F) {
*Flags = Or2MapProtectionTable[ Protection & 0x0F ];
}
else
if (Protection & 0xF0) {
*Flags = Or2MapProtectionTable[ (Protection & 0xF0) >> 4 ] |
PAG_EXECUTE;
}
else {
*Flags = 0;
}
if (*Flags == 0) {
return( ERROR_INVALID_PARAMETER );
}
else {
if (Protection & PAGE_GUARD) {
*Flags |= PAG_GUARD;
}
return( NO_ERROR );
}
}
APIRET
Or2MapNtStatusToOs2Error(
IN NTSTATUS Status,
IN APIRET DefaultRetCode
)
{
APIRET RetCode;
RetCode = Or2MapStatus(Status);
if ((RetCode & ERROR_SS_UNKNOWN_STATUS) == ERROR_SS_UNKNOWN_STATUS) {
#if DBG
DbgPrint("OS2SSRTL: Or2MapNtStatusToOs2Error: Using default mapping: 0x%x => %d\n",
Status, DefaultRetCode);
#endif
return DefaultRetCode;
}
return (RetCode);
}