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
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
|