Leaked source code of windows server 2003
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.
|
|
// from base\ntos\rtl\error.c
// should be gotten from a static .lib
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
error.c
Abstract:
This module contains a routine for converting NT status codes to DOS/OS|2 error codes.
Author:
David Treadwell (davidtr) 04-Apr-1991
Revision History:
--*/ #include "spprecmp.h"
#define _NTOS_ /* prevent #including ntos.h, only use functions exports from ntdll/ntoskrnl */
#include "nt.h"
#include "ntrtl.h"
#include "nturtl.h"
#include "winerror.h"
#if defined(ALLOC_PRAGMA) && defined(NTOS_KERNEL_RUNTIME)
#pragma alloc_text(PAGE, RtlGetLastNtStatus)
#pragma alloc_text(PAGE, RtlGetLastWin32Error)
#pragma alloc_text(PAGE, RtlNtStatusToDosError)
#pragma alloc_text(PAGE, RtlRestoreLastWin32Error)
#pragma alloc_text(PAGE, RtlSetLastWin32Error)
#pragma alloc_text(PAGE, RtlSetLastWin32ErrorAndNtStatusFromNtStatus)
#endif
//
// Ensure that the Registry ERROR_SUCCESS error code and the
// NO_ERROR error code remain equal and zero.
//
#if ERROR_SUCCESS != 0 || NO_ERROR != 0
#error Invalid value for ERROR_SUCCESS.
#endif
NTSYSAPI ULONG RtlNtStatusToDosError ( IN NTSTATUS Status )
/*++
Routine Description:
This routine converts an NT status code to its DOS/OS|2 equivalent. Remembers the Status code value in the TEB.
Arguments:
Status - Supplies the status value to convert.
Return Value:
The matching DOS/OS|2 error code.
--*/
{ PTEB Teb;
Teb = NtCurrentTeb();
if (Teb) { try { Teb->LastStatusValue = Status; } except (EXCEPTION_EXECUTE_HANDLER) { } }
return RtlNtStatusToDosErrorNoTeb( Status ); }
NTSYSAPI NTSTATUS NTAPI RtlGetLastNtStatus( VOID ) { return NtCurrentTeb()->LastStatusValue; }
NTSYSAPI LONG NTAPI RtlGetLastWin32Error( VOID ) { return NtCurrentTeb()->LastErrorValue; }
NTSYSAPI VOID NTAPI RtlSetLastWin32ErrorAndNtStatusFromNtStatus( NTSTATUS Status ) { //
// RtlNtStatusToDosError stores into NtCurrentTeb()->LastStatusValue.
//
RtlSetLastWin32Error(RtlNtStatusToDosError(Status)); }
NTSYSAPI VOID NTAPI RtlSetLastWin32Error( LONG Win32Error ) { //
// Arguably this should clear or reset the last nt status, but it does not
// touch it.
//
NtCurrentTeb()->LastErrorValue = Win32Error; }
NTSYSAPI VOID NTAPI RtlRestoreLastWin32Error( LONG Win32Error ) { #if DBG
if ((LONG)NtCurrentTeb()->LastErrorValue != Win32Error) #endif
NtCurrentTeb()->LastErrorValue = Win32Error; }
|