Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

138 lines
2.7 KiB

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
error.c
Abstract:
This routine implements the mapping between SMB/Net errors and NT
errors.
Author:
Larry Osterman (LarryO) 20-Jul-1990
Revision History:
20-Jul-1990 LarryO
Created
--*/
#include "precomp.h"
#pragma hdrstop
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE2VC, RdrMapSmbError)
#endif
//
#define BASE_DOS_ERROR ((NTSTATUS )0xC0010000L)
NTSTATUS
RdrMapSmbError (
IN PSMB_HEADER Smb,
IN PSERVERLISTENTRY Sle OPTIONAL
)
/*++
Routine Description:
This routine takes an SMB, grabs the error from it, and maps it to an NT
error.
Arguments:
IN PSMB_HEADER Smb - Supplies the SMB buffer to check.
IN PSERVERLISTENTRY Sle OPTIONAL - Supplies the server name for the Smb.
Return Value:
NTSTATUS - Status of resulting operation.
--*/
{
NTSTATUS Status;
USHORT Error;
USHORT i;
UCHAR ErrorClass;
DISCARDABLE_CODE(RdrVCDiscardableSection);
//
// If this SMB contains an NT status for the operation, return
// that, otherwise map the resulting error.
//
if (SmbGetUshort(&Smb->Flags2) & SMB_FLAGS2_NT_STATUS) {
PNT_SMB_HEADER NtSmb = (PNT_SMB_HEADER)Smb;
return(SmbGetUlong(&NtSmb->Status.NtStatus));
} else {
if ((ErrorClass = Smb->ErrorClass) == SMB_ERR_SUCCESS) {
return STATUS_SUCCESS;
}
}
Error = SmbGetUshort(&Smb->Error);
if (Error == SMB_ERR_SUCCESS) {
Status = STATUS_UNEXPECTED_NETWORK_ERROR;
goto ReturnStatus;
}
switch (ErrorClass) {
case SMB_ERR_CLASS_DOS:
case SMB_ERR_CLASS_HARDWARE:
for (i=0;i<RdrOs2ErrorMapLength;i++) {
if (RdrOs2ErrorMap[i].ErrorCode==Error) {
Status = RdrOs2ErrorMap[i].ResultingStatus;
goto ReturnStatus;
}
}
Status = BASE_DOS_ERROR + SmbGetUshort(&Smb->Error);
break;
case SMB_ERR_CLASS_SERVER:
for (i=0;i<RdrSmbErrorMapLength;i++) {
if (RdrSmbErrorMap[i].ErrorCode==Error) {
Status = RdrSmbErrorMap[i].ResultingStatus;
goto ReturnStatus;
}
}
Status = STATUS_UNEXPECTED_NETWORK_ERROR;
break;
default:
dprintf(DPRT_SMB|DPRT_ERROR, ("Unknown error SMB error class %x", ErrorClass));
Status = STATUS_NOT_IMPLEMENTED;
break;
}
ReturnStatus:
if ( Status == STATUS_UNEXPECTED_NETWORK_ERROR ) {
RdrStatistics.NetworkErrors += 1;
RdrWriteErrorLogEntry(
Sle,
IO_ERR_LAYERED_FAILURE,
EVENT_RDR_UNEXPECTED_ERROR,
Status,
Smb,
sizeof(SMB_HEADER)
);
}
return Status;
}