mirror of https://github.com/tongzx/nt5src
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.
170 lines
4.7 KiB
170 lines
4.7 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2000.
|
|
//
|
|
// File: U P F I L E . C P P
|
|
//
|
|
// Contents: File utility functions.
|
|
//
|
|
// Notes: This is separate from ncfile.h so we don't bring the shell
|
|
// dependencies into upnphost.
|
|
//
|
|
// Author: mbend 18 Aug 2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
|
|
#include <pch.h>
|
|
#pragma hdrstop
|
|
|
|
#include "upfile.h"
|
|
#include "trace.h"
|
|
#include "ncbase.h"
|
|
#include "ComUtility.h"
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: HrCreateFile
|
|
//
|
|
// Purpose: Wrapper for CreateFile
|
|
//
|
|
// Arguments:
|
|
// szFilename [in] Filename
|
|
// dwDesiredAccess [in] 0 / GENERIC_READ / GENERIC_WRITE
|
|
// dwShareMode [in] 0 / FILE_SHARE_READ / FILE_SHARE_WRITE
|
|
// lpSecurityAttributes [in] Security
|
|
// dwCreationDisposition [in] CREATE_NEW / CREATE_ALWAYS / OPEN_EXISTING
|
|
// OPEN_ALWAYS / TRUNCATE_EXISTING
|
|
// dwFlagsAndAttributes [in] FILE_ATTRIBUTE_NORMAL / ...
|
|
// phandle [out]
|
|
//
|
|
// Returns: S_OK on success or COM error code on failure.
|
|
//
|
|
// Author: mbend 18 Aug 2000
|
|
//
|
|
// Notes:
|
|
//
|
|
HRESULT HrCreateFile(
|
|
const wchar_t * szFilename,
|
|
DWORD dwDesiredAccess,
|
|
DWORD dwShareMode,
|
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
|
DWORD dwCreationDisposition,
|
|
DWORD dwFlagsAndAttributes,
|
|
HANDLE * phandle)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
*phandle = CreateFile(szFilename, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
|
|
dwCreationDisposition, dwFlagsAndAttributes, NULL);
|
|
if(INVALID_HANDLE_VALUE == *phandle)
|
|
{
|
|
hr = HrFromLastWin32Error();
|
|
}
|
|
TraceHr(ttidError, FAL, hr, FALSE, "HrCreateFile");
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: HrLoadFileFromDisk
|
|
//
|
|
// Purpose: Loads a file's contents from disk into memory.
|
|
//
|
|
// Arguments:
|
|
// szFilename [in] Name of file to load
|
|
// pnFileSize [out] Size of file loaded
|
|
// parBytes [out] Bytes of file loaded
|
|
//
|
|
// Returns: S_OK on success and COM error code on failure.
|
|
//
|
|
// Author: mbend 18 Aug 2000
|
|
//
|
|
// Notes:
|
|
//
|
|
HRESULT HrLoadFileFromDisk(const wchar_t * szFilename, long * pnFileSize, byte ** parBytes)
|
|
{
|
|
CHECK_POINTER(szFilename);
|
|
CHECK_POINTER(pnFileSize);
|
|
CHECK_POINTER(parBytes);
|
|
|
|
HRESULT hr = S_OK;
|
|
HANDLE h;
|
|
hr = HrCreateFile(szFilename, GENERIC_READ, FILE_SHARE_READ,
|
|
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, &h);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
*pnFileSize = GetFileSize(h, NULL);
|
|
hr = HrCoTaskMemAllocArray(*pnFileSize, parBytes);
|
|
if(SUCCEEDED(hr))
|
|
{
|
|
DWORD dwDummy = 0;
|
|
if(!ReadFile(h, *parBytes, *pnFileSize, &dwDummy, NULL))
|
|
{
|
|
hr = HrFromLastWin32Error();
|
|
}
|
|
if(FAILED(hr))
|
|
{
|
|
if(*parBytes)
|
|
{
|
|
CoTaskMemFree(*parBytes);
|
|
}
|
|
}
|
|
}
|
|
CloseHandle(h);
|
|
}
|
|
if(FAILED(hr))
|
|
{
|
|
*pnFileSize = 0;
|
|
*parBytes = NULL;
|
|
}
|
|
TraceHr(ttidError, FAL, hr, FALSE, "HrLoadFileFromDisk");
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: HrGetFileExtension
|
|
//
|
|
// Purpose: Extracts an extension from a filename.
|
|
//
|
|
// Arguments:
|
|
// szFilename [in] Filename to process.
|
|
// szExt [out] Charachter buffer of size UH_MAX_EXTENSION.
|
|
//
|
|
// Returns: S_OK on success or E_INVALIDARG if filename doesn't have a valid extension.
|
|
//
|
|
// Author: mbend 18 Aug 2000
|
|
//
|
|
// Notes:
|
|
//
|
|
HRESULT HrGetFileExtension(const wchar_t * szFilename, wchar_t szExt[UH_MAX_EXTENSION])
|
|
{
|
|
CHECK_POINTER(szFilename);
|
|
CHECK_POINTER(szExt);
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
long nLength = lstrlen(szFilename);
|
|
long nMaxExt = UH_MAX_EXTENSION;
|
|
// Check that extension size to search for is not greater than string size
|
|
if(nLength < nMaxExt)
|
|
{
|
|
nMaxExt = nLength;
|
|
}
|
|
|
|
// Walk back until we hit a . or reach nMaxExt
|
|
for(long n = 0; n < nMaxExt; ++n)
|
|
{
|
|
if(L'.' == szFilename[nLength - (n+1)])
|
|
{
|
|
// Copy string and return success
|
|
hr = S_OK;
|
|
lstrcpy(szExt, &szFilename[nLength - n]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
TraceHr(ttidError, FAL, hr, FALSE, "HrGetFileExtension");
|
|
return hr;
|
|
}
|
|
|