mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
606 lines
18 KiB
606 lines
18 KiB
/*++
|
|
|
|
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);
|
|
}
|