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.
 
 
 
 
 
 

356 lines
7.8 KiB

#include "stdafx.h"
#include "storageglobals.h"
#include "device.h"
#include "storage.h"
//#include "findleak.h"
//DECLARE_THIS_FILE;
//
// Initializtion
//
CStorageGlobals::CStorageGlobals()
{
memset(m_szStartPath, 0, sizeof(m_szStartPath) );
}
HRESULT CStorageGlobals::Init(LPCWSTR szStartPath, IMDSPDevice *pDevice)
{
DWORD dwAttrib;
if( NULL == szStartPath || NULL == pDevice)
{
return( E_INVALIDARG );
}
HRESULT hr = StringCbCopyW(m_szStartPath, sizeof(m_szStartPath), szStartPath);
if (FAILED(hr))
{
hr = HRESULT_FROM_WIN32(HRESULT_CODE(hr));
}
else
{
if( wcslen(m_szStartPath) > 1 )
{
LPWSTR szChop = wcschr( &m_szStartPath[1], L'\\' );
if( szChop )
{
WCHAR chSave = *szChop;
*szChop = _T('\0');
dwAttrib = CeGetFileAttributes( m_szStartPath );
if( ! ( ( dwAttrib & FILE_ATTRIBUTE_DIRECTORY ) &&
( dwAttrib & FILE_ATTRIBUTE_TEMPORARY ) ) )
{
m_szStartPath[1] = L'\0';
}
}
else
{
dwAttrib = CeGetFileAttributes( m_szStartPath );
if( ! ( ( dwAttrib & FILE_ATTRIBUTE_DIRECTORY ) &&
( dwAttrib & FILE_ATTRIBUTE_TEMPORARY ) ) )
{
m_szStartPath[1] = L'\0';
}
}
}
else
{
m_szStartPath[1] = L'\0';
}
m_spDevice = pDevice;
}
return hr;
}
//
// IMDSPStorageGloabls
//
STDMETHODIMP CStorageGlobals::GetCapabilities ( DWORD *pdwCapabilities )
{
if( NULL == pdwCapabilities )
{
return( E_INVALIDARG );
}
*pdwCapabilities = WMDM_STORAGECAP_FOLDERSINROOT | WMDM_STORAGECAP_FILESINROOT | WMDM_STORAGECAP_FOLDERSINFOLDERS | WMDM_STORAGECAP_FILESINFOLDERS;
return( S_OK );
}
STDMETHODIMP CStorageGlobals::GetSerialNumber ( PWMDMID pSerialNum, BYTE abMac[ 20 ] )
{
HRESULT hr = S_OK;
hr = CeUtilGetSerialNumber( m_szStartPath, pSerialNum, NULL, 0 );
if( hr == S_OK )
{
// MAC the parameters
HMAC hMAC;
hr = g_pAppSCServer->MACInit(&hMAC);
if( SUCCEEDED( hr ) )
{
hr = g_pAppSCServer->MACUpdate(hMAC, (BYTE*)(pSerialNum), sizeof(WMDMID));
}
if( SUCCEEDED( hr ) )
{
hr = g_pAppSCServer->MACFinal(hMAC, abMac);
}
}
else
{
hr = WMDM_E_NOTSUPPORTED;
}
return( hr );
}
STDMETHODIMP CStorageGlobals::GetTotalSize ( DWORD *pdwFreeLow, DWORD *pdwFreeHigh )
{
HRESULT hr = S_OK;
WCHAR wszTestPath[MAX_PATH];
LPCWSTR pszTestPath = wszTestPath;
memset( wszTestPath, 0, sizeof(wszTestPath) );
if( wcslen( m_szStartPath ) > 1 )
{
_snwprintf( wszTestPath, sizeof(wszTestPath)/sizeof(wszTestPath[0]) - 1, L"%s\\", m_szStartPath );
}
else
{
pszTestPath = m_szStartPath;
}
ULARGE_INTEGER liAvailFree;
ULARGE_INTEGER liTotalBytes;
ULARGE_INTEGER liTotalFree;
liAvailFree.QuadPart = 0;
liTotalBytes.QuadPart = 0;
liTotalFree.QuadPart = 0;
if( NULL != pdwFreeLow )
{
*pdwFreeLow = 0;
}
if( NULL != pdwFreeHigh )
{
*pdwFreeHigh = 0;
}
hr = CeGetDiskFreeSpaceEx( pszTestPath, &liAvailFree, &liTotalBytes, &liTotalFree );
if( SUCCEEDED( hr ) )
{
if( NULL != pdwFreeLow )
{
*pdwFreeLow = liTotalBytes.LowPart;
}
if( NULL != pdwFreeHigh )
{
*pdwFreeHigh = liTotalBytes.HighPart;
}
}
return( hr );
}
STDMETHODIMP CStorageGlobals::GetTotalFree ( DWORD *pdwFreeLow, DWORD *pdwFreeHigh )
{
HRESULT hr = S_OK;
WCHAR wszTestPath[MAX_PATH];
LPCWSTR pszTestPath = wszTestPath;
memset( wszTestPath, 0, sizeof(wszTestPath) );
if( wcslen( m_szStartPath ) > 1 )
{
_snwprintf( wszTestPath, sizeof(wszTestPath)/sizeof(wszTestPath[0]) - 1, L"%s\\", m_szStartPath );
}
else
{
pszTestPath = m_szStartPath;
}
ULARGE_INTEGER liAvailFree;
ULARGE_INTEGER liTotalBytes;
ULARGE_INTEGER liTotalFree;
liAvailFree.QuadPart = 0;
liTotalBytes.QuadPart = 0;
liTotalFree.QuadPart = 0;
if( NULL != pdwFreeLow )
{
*pdwFreeLow = 0;
}
if( NULL != pdwFreeHigh )
{
*pdwFreeHigh = 0;
}
hr = CeGetDiskFreeSpaceEx( pszTestPath, &liAvailFree, &liTotalBytes, &liTotalFree );
if( SUCCEEDED( hr ) )
{
if( NULL != pdwFreeLow )
{
*pdwFreeLow = liAvailFree.LowPart;
}
if( NULL != pdwFreeHigh )
{
*pdwFreeHigh = liAvailFree.HighPart;
}
}
return( hr );
}
STDMETHODIMP CStorageGlobals::GetTotalBad ( DWORD *pdwBadLow, DWORD *pdwBadHigh )
{
if( NULL != pdwBadLow )
{
*pdwBadLow = 0;
}
if( NULL != pdwBadHigh )
{
*pdwBadHigh = 0;
}
return( S_OK );
}
STDMETHODIMP CStorageGlobals::GetStatus ( DWORD *pdwStatus )
{
if( NULL == pdwStatus )
{
return( E_INVALIDARG );
}
if( _Module.g_fDeviceConnected )
{
*pdwStatus = WMDM_STATUS_READY;
}
else
{
*pdwStatus = WMDM_STATUS_STORAGE_NOTPRESENT;
}
return( S_OK );
}
STDMETHODIMP CStorageGlobals::Initialize ( UINT fuMode, IWMDMProgress *pProgress )
{
return( S_OK );
}
STDMETHODIMP CStorageGlobals::GetDevice ( IMDSPDevice * *ppDevice )
{
if( NULL == ppDevice )
{
return( E_INVALIDARG );
}
*ppDevice = m_spDevice;
if( *ppDevice )
{
(*ppDevice)->AddRef();
return( S_OK );
}
return( E_FAIL );
}
STDMETHODIMP CStorageGlobals::GetRootStorage ( IMDSPStorage * *ppRoot )
{
WCHAR wszPath[MAX_PATH];
CE_FIND_DATA findData;
CComStorage *pNewStorage = NULL;
HRESULT hr = S_OK;
if( NULL == ppRoot )
{
return( E_INVALIDARG );
}
*ppRoot = NULL;
hr = CComStorage::CreateInstance( &pNewStorage );
CComPtr<IMDSPStorage> spStorage = pNewStorage;
memset( wszPath, 0, sizeof(wszPath) );
if( SUCCEEDED( hr ) )
{
LPWSTR pszSlash = wcschr(&m_szStartPath[1], L'\\');
if( pszSlash )
{
wcsncpy(wszPath, m_szStartPath, (pszSlash - m_szStartPath) - 1 );
}
else
{
wcscpy(wszPath, m_szStartPath);
}
if( wcslen(wszPath) > 1 )
{
HANDLE hFind = CeFindFirstFile( wszPath, &findData );
if( INVALID_HANDLE_VALUE == hFind )
{
hr = HRESULT_FROM_WIN32( CeGetLastError() );
if( SUCCEEDED( hr ) )
{
hr = CeRapiGetError();
}
}
else
{
CeFindClose( hFind );
}
}
else
{
memset( &findData, 0, sizeof(findData) );
findData.dwFileAttributes = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY;
wcscpy(findData.cFileName, L"\\");
}
}
if( SUCCEEDED( hr ) )
{
if( ! ( findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) )
{
hr = E_FAIL;
}
}
if( SUCCEEDED( hr ) )
{
hr = pNewStorage->Init(&findData, m_szStartPath, TRUE, m_spDevice);
}
if( SUCCEEDED( hr ) )
{
*ppRoot = spStorage;
spStorage.Detach();
}
return( hr );
}