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.
 
 
 
 
 
 

153 lines
3.5 KiB

/*++
Copyright (c) Microsoft Corporation
Module Name:
SimpleFp.cpp
Abstract:
simple file pointer, to replace msvcrt.dll
Author:
Xiaoyu Wu(xiaoyuw) July 2000
Revision History:
--*/
#include "stdinc.h"
#if SXS_PRECOMPILED_MANIFESTS_ENABLED
#include "simplefp.h"
#include "fusiontrace.h"
#include "csxspreservelasterror.h"
#include "util.h"
// NTRAID#NTBUG9 - 591005 - 2002/03/30 - mgrier - Operations which may fail may not be in a constructor
CSimpleFileStream::CSimpleFileStream(PCWSTR pFileName)
{
BOOL fSuccess = FALSE;
FN_TRACE_WIN32(fSuccess);
if (!pFileName)
{
// duplicate it so we can close it like normal
// NTRAID#NTBUG9 - 591005 - 2002/03/30 - mgrier - Missing error check from GetStdHandle
HANDLE hFile = ::GetStdHandle(STD_ERROR_HANDLE);
IFW32FALSE_ORIGINATE_AND_EXIT(::DuplicateHandle(::GetCurrentProcess(), hFile, ::GetCurrentProcess(), &m_hFile, 0, FALSE, DUPLICATE_SAME_ACCESS));
}
else
{
IFCOMFAILED_EXIT(this->fopen(pFileName));
}
fSuccess = FALSE;
Exit:
;
}
CSimpleFileStream::~CSimpleFileStream()
{
if ( m_hFile != INVALID_HANDLE_VALUE) // if it is GetStdHandle, Could I close the handle?
{
CSxsPreserveLastError ple;
this->fclose();
ple.Restore();
}
}
HRESULT
CSimpleFileStream::fopen(
PCWSTR pFileName
)
{
FN_PROLOG_HR
if (m_hFile != INVALID_HANDLE_VALUE)
IFCOMFAILED_EXIT(this->fclose());
INTERNAL_ERROR_CHECK(m_hFile == INVALID_HANDLE_VALUE);
IFW32INVALIDHANDLE_ORIGINATE_AND_EXIT(
m_hFile = ::CreateFileW(
pFileName,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
0,
NULL));
FN_EPILOG
}
HRESULT
CSimpleFileStream::fclose()
{
FN_PROLOG_HR
HANDLE hFile;
INTERNAL_ERROR_CHECK(m_hFile != INVALID_HANDLE_VALUE);
hFile = m_hFile;
m_hFile = INVALID_HANDLE_VALUE;
IFW32FALSE_ORIGINATE_AND_EXIT(::CloseHandle(hFile));
FN_EPILOG
}
HRESULT
CSimpleFileStream::fprintf(
const char *format,
...
)
{
FN_PROLOG_HR
va_list ap;
char rgchBuffer[2048];
int cchIn = 0;
DWORD cchWritten = 0;
INTERNAL_ERROR_CHECK(m_hFile != INVALID_HANDLE_VALUE);
va_start(ap, format);
cchIn = _vsnprintf(rgchBuffer, NUMBER_OF(rgchBuffer) - 1, format, ap);
rgchBuffer[NUMBER_OF(rgchBuffer) - 1] = 0;
va_end(ap);
// NTRAID#NTBUG9 - 591005 - 2002/03/30 - mgrier - this should be an origination and we should
// probably use errno to generate a more useful error code.
if (cchIn < 0)
IFCOMFAILED_EXIT(E_UNEXPECTED);
IFW32FALSE_ORIGINATE_AND_EXIT(::WriteFile(m_hFile, rgchBuffer, cchIn, &cchWritten, NULL));
FN_EPILOG
}
HRESULT CSimpleFileStream::fwrite(const VOID* pData, SIZE_T itemsize, SIZE_T itemcount)
{
FN_PROLOG_HR
SIZE_T count = 0;
DWORD ByteWritten = 0;
INTERNAL_ERROR_CHECK(m_hFile != INVALID_HANDLE_VALUE);
count = itemsize * itemcount;
while (count > ULONG_MAX)
{
IFW32FALSE_ORIGINATE_AND_EXIT(::WriteFile(m_hFile, pData, ULONG_MAX, &ByteWritten, NULL));
count -= ULONG_MAX;
pData = (const void *) (((ULONG_PTR) pData) + ULONG_MAX);
}
if (count != 0)
{
IFW32FALSE_ORIGINATE_AND_EXIT(::WriteFile(m_hFile, pData, static_cast<DWORD>(count), &ByteWritten, NULL));
}
FN_EPILOG
}
#endif