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.
 
 
 
 
 
 

326 lines
8.8 KiB

// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1995 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include <errno.h>
#ifdef AFX_CORE1_SEG
#pragma code_seg(AFX_CORE1_SEG)
#endif
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#ifdef _DEBUG
static const LPCSTR rgszCFileExceptionCause[] =
{
"none",
"generic",
"fileNotFound",
"badPath",
"tooManyOpenFiles",
"accessDenied",
"invalidFile",
"removeCurrentDir",
"directoryFull",
"badSeek",
"hardIO",
"sharingViolation",
"lockViolation",
"diskFull",
"endOfFile",
};
static const char szUnknown[] = "unknown";
#endif
/////////////////////////////////////////////////////////////////////////////
// CFileException
void PASCAL CFileException::ThrowOsError(LONG lOsError,
LPCTSTR lpszFileName /* = NULL */)
{
if (lOsError != 0)
AfxThrowFileException(CFileException::OsErrorToException(lOsError),
lOsError, lpszFileName);
}
void PASCAL CFileException::ThrowErrno(int nErrno,
LPCTSTR lpszFileName /* = NULL */)
{
#ifndef _MAC
if (nErrno != 0)
AfxThrowFileException(CFileException::ErrnoToException(nErrno),
_doserrno, lpszFileName);
#else
if (nErrno != 0)
AfxThrowFileException(CFileException::ErrnoToException(nErrno),
GetLastError(), lpszFileName);
#endif
}
BOOL CFileException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError,
PUINT pnHelpContext)
{
ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));
if (pnHelpContext != NULL)
*pnHelpContext = m_cause + AFX_IDP_FILE_NONE;
CString strMessage;
CString strFileName = m_strFileName;
if (strFileName.IsEmpty())
strFileName.LoadString(AFX_IDS_UNNAMED_FILE);
AfxFormatString1(strMessage,
m_cause + AFX_IDP_FILE_NONE, strFileName);
lstrcpyn(lpszError, strMessage, nMaxError);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CFileException diagnostics
#ifdef _DEBUG
void CFileException::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << "m_cause = ";
if (m_cause >= 0 && m_cause < _countof(rgszCFileExceptionCause))
dc << rgszCFileExceptionCause[m_cause];
else
dc << szUnknown;
dc << "\nm_lOsError = " << (void*)m_lOsError;
dc << "\n";
}
#endif
/////////////////////////////////////////////////////////////////////////////
// CFileException helpers
void AFXAPI AfxThrowFileException(int cause, LONG lOsError,
LPCTSTR lpszFileName /* == NULL */)
{
#ifdef _DEBUG
LPCSTR lpsz;
if (cause >= 0 && cause < _countof(rgszCFileExceptionCause))
lpsz = rgszCFileExceptionCause[cause];
else
lpsz = szUnknown;
TRACE3("CFile exception: %hs, File %s, OS error information = %ld.\n",
lpsz, (lpszFileName == NULL) ? _T("Unknown") : lpszFileName, lOsError);
#endif
THROW(new CFileException(cause, lOsError, lpszFileName));
}
int PASCAL CFileException::ErrnoToException(int nErrno)
{
switch(nErrno)
{
case EPERM:
case EACCES:
return CFileException::accessDenied;
case EBADF:
return CFileException::invalidFile;
case EDEADLOCK:
return CFileException::sharingViolation;
case EMFILE:
return CFileException::tooManyOpenFiles;
case ENOENT:
case ENFILE:
return CFileException::fileNotFound;
case ENOSPC:
return CFileException::diskFull;
case EINVAL:
case EIO:
return CFileException::hardIO;
default:
return CFileException::generic;
}
}
int PASCAL CFileException::OsErrorToException(LONG lOsErr)
{
// NT Error codes
switch ((UINT)lOsErr)
{
case NO_ERROR:
return CFileException::none;
case ERROR_FILE_NOT_FOUND:
return CFileException::fileNotFound;
case ERROR_PATH_NOT_FOUND:
return CFileException::badPath;
case ERROR_TOO_MANY_OPEN_FILES:
return CFileException::tooManyOpenFiles;
case ERROR_ACCESS_DENIED:
return CFileException::accessDenied;
case ERROR_INVALID_HANDLE:
return CFileException::fileNotFound;
case ERROR_BAD_FORMAT:
return CFileException::invalidFile;
case ERROR_INVALID_ACCESS:
return CFileException::accessDenied;
case ERROR_INVALID_DRIVE:
return CFileException::badPath;
case ERROR_CURRENT_DIRECTORY:
return CFileException::removeCurrentDir;
case ERROR_NOT_SAME_DEVICE:
return CFileException::badPath;
case ERROR_NO_MORE_FILES:
return CFileException::fileNotFound;
case ERROR_WRITE_PROTECT:
return CFileException::accessDenied;
case ERROR_BAD_UNIT:
return CFileException::hardIO;
case ERROR_NOT_READY:
return CFileException::hardIO;
case ERROR_BAD_COMMAND:
return CFileException::hardIO;
case ERROR_CRC:
return CFileException::hardIO;
case ERROR_BAD_LENGTH:
return CFileException::badSeek;
case ERROR_SEEK:
return CFileException::badSeek;
case ERROR_NOT_DOS_DISK:
return CFileException::invalidFile;
case ERROR_SECTOR_NOT_FOUND:
return CFileException::badSeek;
case ERROR_WRITE_FAULT:
return CFileException::accessDenied;
case ERROR_READ_FAULT:
return CFileException::badSeek;
case ERROR_SHARING_VIOLATION:
return CFileException::sharingViolation;
case ERROR_LOCK_VIOLATION:
return CFileException::lockViolation;
case ERROR_WRONG_DISK:
return CFileException::badPath;
case ERROR_SHARING_BUFFER_EXCEEDED:
return CFileException::tooManyOpenFiles;
case ERROR_HANDLE_EOF:
return CFileException::endOfFile;
case ERROR_HANDLE_DISK_FULL:
return CFileException::diskFull;
case ERROR_DUP_NAME:
return CFileException::badPath;
case ERROR_BAD_NETPATH:
return CFileException::badPath;
case ERROR_NETWORK_BUSY:
return CFileException::accessDenied;
case ERROR_DEV_NOT_EXIST:
return CFileException::badPath;
case ERROR_ADAP_HDW_ERR:
return CFileException::hardIO;
case ERROR_BAD_NET_RESP:
return CFileException::accessDenied;
case ERROR_UNEXP_NET_ERR:
return CFileException::hardIO;
case ERROR_BAD_REM_ADAP:
return CFileException::invalidFile;
case ERROR_NO_SPOOL_SPACE:
return CFileException::directoryFull;
case ERROR_NETNAME_DELETED:
return CFileException::accessDenied;
case ERROR_NETWORK_ACCESS_DENIED:
return CFileException::accessDenied;
case ERROR_BAD_DEV_TYPE:
return CFileException::invalidFile;
case ERROR_BAD_NET_NAME:
return CFileException::badPath;
case ERROR_TOO_MANY_NAMES:
return CFileException::tooManyOpenFiles;
case ERROR_SHARING_PAUSED:
return CFileException::badPath;
case ERROR_REQ_NOT_ACCEP:
return CFileException::accessDenied;
case ERROR_FILE_EXISTS:
return CFileException::accessDenied;
case ERROR_CANNOT_MAKE:
return CFileException::accessDenied;
case ERROR_ALREADY_ASSIGNED:
return CFileException::badPath;
case ERROR_INVALID_PASSWORD:
return CFileException::accessDenied;
case ERROR_NET_WRITE_FAULT:
return CFileException::hardIO;
case ERROR_DISK_CHANGE:
return CFileException::fileNotFound;
case ERROR_DRIVE_LOCKED:
return CFileException::lockViolation;
case ERROR_BUFFER_OVERFLOW:
return CFileException::badPath;
case ERROR_DISK_FULL:
return CFileException::diskFull;
case ERROR_NO_MORE_SEARCH_HANDLES:
return CFileException::tooManyOpenFiles;
case ERROR_INVALID_TARGET_HANDLE:
return CFileException::invalidFile;
case ERROR_INVALID_CATEGORY:
return CFileException::hardIO;
case ERROR_INVALID_NAME:
return CFileException::badPath;
case ERROR_INVALID_LEVEL:
return CFileException::badPath;
case ERROR_NO_VOLUME_LABEL:
return CFileException::badPath;
case ERROR_NEGATIVE_SEEK:
return CFileException::badSeek;
case ERROR_SEEK_ON_DEVICE:
return CFileException::badSeek;
case ERROR_DIR_NOT_ROOT:
return CFileException::badPath;
case ERROR_DIR_NOT_EMPTY:
return CFileException::removeCurrentDir;
case ERROR_LABEL_TOO_LONG:
return CFileException::badPath;
case ERROR_BAD_PATHNAME:
return CFileException::badPath;
case ERROR_LOCK_FAILED:
return CFileException::lockViolation;
case ERROR_BUSY:
return CFileException::accessDenied;
case ERROR_INVALID_ORDINAL:
return CFileException::invalidFile;
case ERROR_ALREADY_EXISTS:
return CFileException::accessDenied;
case ERROR_INVALID_EXE_SIGNATURE:
return CFileException::invalidFile;
case ERROR_BAD_EXE_FORMAT:
return CFileException::invalidFile;
case ERROR_FILENAME_EXCED_RANGE:
return CFileException::badPath;
case ERROR_META_EXPANSION_TOO_LONG:
return CFileException::badPath;
case ERROR_DIRECTORY:
return CFileException::badPath;
case ERROR_OPERATION_ABORTED:
return CFileException::hardIO;
case ERROR_IO_INCOMPLETE:
return CFileException::hardIO;
case ERROR_IO_PENDING:
return CFileException::hardIO;
case ERROR_SWAPERROR:
return CFileException::accessDenied;
default:
return CFileException::generic;
}
}
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(CFileException, CException)
/////////////////////////////////////////////////////////////////////////////