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.
 
 
 
 
 
 

481 lines
24 KiB

/********************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
PCH_FileUpload.CPP
Abstract:
WBEM provider class implementation for PCH_FileUpload class
Revision History:
Ghim-Sim Chua (gschua) 04/27/99
- Created
********************************************************************/
#include "pchealth.h"
#include "PCH_FileUpload.h"
#include "mpc_utils.h"
// MAX_FILE_SIZE is the limit set on the maximum file size of text files that will be collected.
// If the Filesize is larger than 262144 then the data property is not populated.
// This Number is arrived at by the PM.
#define MAX_FILE_SIZE 262144
#define READONLY "READONLY "
#define HIDDEN "HIDDEN "
#define SYSTEM "SYSTEM "
#define DIRECTORY "DIRECTORY "
#define ARCHIVE "ARCHIVE "
#define NORMAL "NORMAL "
#define TEMPORARY "TEMPORARY "
#define REPARSEPOINT "REPARSEPOINT "
#define SPARSEFILE "SPARSEFILE "
#define COMPRESSED "COMPRESSED "
#define OFFLINE "OFFLINE "
#define ENCRYPTED "ENCRYPTED "
/////////////////////////////////////////////////////////////////////////////
// tracing stuff
#ifdef THIS_FILE
#undef THIS_FILE
#endif
static char __szTraceSourceFile[] = __FILE__;
#define THIS_FILE __szTraceSourceFile
#define TRACE_ID DCID_FILEUPLOAD
CPCH_FileUpload MyPCH_FileUploadSet (PROVIDER_NAME_PCH_FILEUPLOAD, PCH_NAMESPACE) ;
// Property names
//===============
const static WCHAR* pTimeStamp = L"TimeStamp" ;
const static WCHAR* pChange = L"Change" ;
const static WCHAR* pData = L"Data" ;
const static WCHAR* pDateAccessed = L"DateAccessed" ;
const static WCHAR* pDateCreated = L"DateCreated" ;
const static WCHAR* pDateModified = L"DateModified" ;
const static WCHAR* pFileAttributes = L"FileAttributes" ;
const static WCHAR* pPath = L"Path" ;
const static WCHAR* pSize = L"Size" ;
/*****************************************************************************
*
* FUNCTION : CPCH_FileUpload::ExecQuery
*
* DESCRIPTION : You are passed a method context to use in the creation of
* instances that satisfy the query, and a CFrameworkQuery
* which describes the query. Create and populate all
* instances which satisfy the query. WinMgmt will post -
* filter the query for you, so you may return more instances
* or more properties than are requested and WinMgmt
* will filter out any that do not apply.
*
*
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
* A query object describing the query to satisfy.
* A long that contains the flags described in
* IWbemServices::CreateInstanceEnumAsync. Note that the following
* flags are handled by (and filtered out by) WinMgmt:
* WBEM_FLAG_FORWARD_ONLY
* WBEM_FLAG_BIDIRECTIONAL
* WBEM_FLAG_ENSURE_LOCATABLE
*
* RETURNS : WBEM_E_PROVIDER_NOT_CAPABLE if not supported for this class
* WBEM_E_FAILED if the query failed
* WBEM_S_NO_ERROR if query was successful
*
* COMMENTS : TO DO: Most providers will not need to implement this method. If you don't, WinMgmt
* will call your enumerate function to get all the instances and perform the
* filtering for you. Unless you expect SIGNIFICANT savings from implementing
* queries, you should remove this method.
*
*****************************************************************************/
HRESULT CPCH_FileUpload::ExecQuery (MethodContext *pMethodContext, CFrameworkQuery& Query, long lFlags)
{
TraceFunctEnter("CPCH_FileUpLoad::ExecQuery");
HRESULT hRes;
HANDLE hFile;
CHStringArray chstrFiles;
TCHAR tchFileName[MAX_PATH];
TCHAR tchRootDir[MAX_PATH];
TCHAR tchWindowsDir[MAX_PATH];
WIN32_FIND_DATA FindFileData;
// CInstance *pPCHFileUploadInstance;
SYSTEMTIME stUTCTime;
BOOL fTimeStamp;
BOOL fChange;
BOOL fData;
BOOL fDateAccessed;
BOOL fDateCreated;
BOOL fDateModified;
BOOL fFileAttributes;
BOOL fSize;
BOOL fCommit;
BOOL fFileRead = FALSE;
BOOL fFileFound = FALSE;
BOOL fNoData = TRUE;
CComVariant varAttributes;
CComVariant varSize;
CComVariant varRequestedFileName;
CComVariant varSnapshot = "SnapShot";
CComVariant varData;
ULARGE_INTEGER ulnFileSize;
WBEMINT64 wbemulnFileSize;
char *pbBuffer;
WCHAR *pwcBuffer;
DWORD dwDesiredAccess = GENERIC_READ;
DWORD dwNumBytesRead;
DWORD dwAttributes;
BSTR bstrData;
CComBSTR bstrFileName;
CComBSTR bstrFileNameWithPath;
CComBSTR bstrKey = L"Path";
int nBufferSize;
int nFilesRequested = 0;
int nIndex;
int nFileSize;
int nRetChars;
TCHAR tchAttributes[MAX_PATH];
//
std::tstring szEnv;
// End Declarations
GetSystemTime(&stUTCTime);
hRes = WBEM_S_NO_ERROR;
hRes = Query.GetValuesForProp(bstrKey, chstrFiles);
if(FAILED(hRes))
{
goto END;
}
else
{
fTimeStamp = Query.IsPropertyRequired(pTimeStamp);
fChange = Query.IsPropertyRequired(pChange);
fData = Query.IsPropertyRequired(pData);
fDateAccessed = Query.IsPropertyRequired(pDateAccessed);
fDateCreated = Query.IsPropertyRequired(pDateCreated);
fDateModified = Query.IsPropertyRequired(pDateModified);
fFileAttributes = Query.IsPropertyRequired(pFileAttributes);
fSize = Query.IsPropertyRequired(pSize);
nFilesRequested = chstrFiles.GetSize();
for (nIndex = 0; nIndex < nFilesRequested; nIndex++)
{
USES_CONVERSION;
varRequestedFileName = chstrFiles[nIndex];
bstrFileName = chstrFiles[nIndex];
szEnv = W2T(chstrFiles[nIndex]);
hRes = MPC::SubstituteEnvVariables(szEnv);
if(SUCCEEDED(hRes))
{
// Found the file
_tcscpy(tchFileName, szEnv.c_str());
hFile = FindFirstFile(tchFileName, &FindFileData);
if(hFile != INVALID_HANDLE_VALUE)
{
// Close the File Handle
FindClose(hFile);
// Create the Fileupload Instance
// Create an instance of PCH_Startup
CInstancePtr pPCHFileUploadInstance(CreateNewInstance(pMethodContext), false);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PATH //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
hRes = pPCHFileUploadInstance->SetVariant(pPath, varRequestedFileName);
if(SUCCEEDED(hRes))
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SIZE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
ulnFileSize.LowPart = FindFileData.nFileSizeLow;
ulnFileSize.HighPart = FindFileData.nFileSizeHigh;
if(ulnFileSize.HighPart > 0)
{
// File Size too large don't populate the Data field.
fNoData = TRUE;
}
else if(ulnFileSize.LowPart > MAX_FILE_SIZE)
{
// File Size Exceeds the set limit
fNoData = TRUE;
}
else
{
fNoData = FALSE;
nFileSize = ulnFileSize.LowPart;
}
if(fSize)
{
hRes = pPCHFileUploadInstance->SetWBEMINT64(pSize,ulnFileSize.QuadPart);
if (FAILED(hRes))
{
// Could not Set the Time Stamp
// Continue anyway
ErrorTrace(TRACE_ID, "SetVariant on Size Field failed.");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DATA //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(fData)
{
if(!fNoData)
{
hFile = CreateFile(tchFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
// Allocate the memory for the buffer
pbBuffer = new char[nFileSize];
if (pbBuffer != NULL)
{
try
{
fFileRead = ReadFile(hFile, pbBuffer, nFileSize, &dwNumBytesRead, NULL);
if(fFileRead)
{
pwcBuffer = new WCHAR[nFileSize];
if (pwcBuffer != NULL)
{
try
{
nRetChars = MultiByteToWideChar(CP_ACP, 0, (const char *)pbBuffer, nFileSize, pwcBuffer, nFileSize);
if(nRetChars != 0)
{
// MultiByteToWideChar succeeds
// Copy the byte buffer into BSTR
bstrData = SysAllocStringLen(pwcBuffer, nFileSize);
varData = bstrData;
SysFreeString(bstrData);
hRes = pPCHFileUploadInstance->SetVariant(pData,varData);
if(FAILED(hRes))
{
// Could not Set the Time Stamp
// Continue anyway
ErrorTrace(TRACE_ID, "SetVariant on Data Field failed.");
}
}
}
catch(...)
{
delete [] pwcBuffer;
throw;
}
delete [] pwcBuffer;
}
else
{
// Cannot allocate pwcBuffer
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
}
}
}
catch(...)
{
CloseHandle(hFile);
delete [] pbBuffer;
throw;
}
}
else
{
// Cannot allocate pwcBuffer
throw CHeap_Exception(CHeap_Exception::E_ALLOCATION_ERROR);
}
CloseHandle(hFile);
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// TIMESTAMP //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(fTimeStamp)
{
hRes = pPCHFileUploadInstance->SetDateTime(pTimeStamp, WBEMTime(stUTCTime));
if (FAILED(hRes))
{
// Could not Set the Time Stamp
// Continue anyway
ErrorTrace(TRACE_ID, "SetDateTime on Timestamp Field failed.");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// CHANGE //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(fChange)
{
hRes = pPCHFileUploadInstance->SetVariant(pChange, varSnapshot);
if (FAILED(hRes))
{
//Could not Set the CHANGE property
// Continue anyway
ErrorTrace(TRACE_ID, "Set Variant on SnapShot Field failed.");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DATEACCESSED //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ftLastAccessTime gives the last access time for the file.
if(fDateAccessed)
{
hRes = pPCHFileUploadInstance->SetDateTime(pDateAccessed, WBEMTime(FindFileData.ftLastAccessTime));
if (FAILED(hRes))
{
// Could not Set the Date Accessed
// Continue anyway
ErrorTrace(TRACE_ID, "SetDateTime on DATEACCESSED Field failed.");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DATECREATED //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(fDateCreated)
{
hRes = pPCHFileUploadInstance->SetDateTime(pDateCreated, WBEMTime(FindFileData.ftCreationTime));
if (FAILED(hRes))
{
// Could not Set the Date Created
// Continue anyway
ErrorTrace(TRACE_ID, "SetDateTime on DATECREATED Field failed.");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// DATEMODIFIED //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(fDateModified)
{
hRes = pPCHFileUploadInstance->SetDateTime(pDateModified, WBEMTime(FindFileData.ftLastWriteTime));
if (FAILED(hRes))
{
// Could not Set the Date Modified
// Continue anyway
ErrorTrace(TRACE_ID, "SetDateTime on DateModified Field failed.");
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FILEATTRIBUTES //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if(fFileAttributes)
{
dwAttributes = FindFileData.dwFileAttributes;
tchAttributes[0] = 0;
// Get the attributes as a string
if(dwAttributes & FILE_ATTRIBUTE_READONLY)
{
_tcscat(tchAttributes, READONLY);
}
if(dwAttributes & FILE_ATTRIBUTE_HIDDEN)
{
_tcscat(tchAttributes, HIDDEN);
}
if(dwAttributes & FILE_ATTRIBUTE_SYSTEM)
{
_tcscat(tchAttributes, SYSTEM);
}
if(dwAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
_tcscat(tchAttributes, DIRECTORY);
}
if(dwAttributes & FILE_ATTRIBUTE_ARCHIVE)
{
_tcscat(tchAttributes, ARCHIVE);
}
if(dwAttributes & FILE_ATTRIBUTE_NORMAL)
{
_tcscat(tchAttributes, NORMAL);
}
if(dwAttributes & FILE_ATTRIBUTE_TEMPORARY)
{
_tcscat(tchAttributes, TEMPORARY);
}
if(dwAttributes & FILE_ATTRIBUTE_COMPRESSED)
{
_tcscat(tchAttributes, COMPRESSED);
}
if(dwAttributes & FILE_ATTRIBUTE_ENCRYPTED)
{
_tcscat(tchAttributes, ENCRYPTED);
}
if(dwAttributes & FILE_ATTRIBUTE_OFFLINE)
{
_tcscat(tchAttributes, OFFLINE);
}
if(dwAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
{
_tcscat(tchAttributes, REPARSEPOINT);
}
if(dwAttributes & FILE_ATTRIBUTE_SPARSE_FILE)
{
_tcscat(tchAttributes, SPARSEFILE);
}
varAttributes = tchAttributes;
// hRes = varAttributes.ChangeType(VT_BSTR, NULL);
// if(SUCCEEDED(hRes))
// {
hRes = pPCHFileUploadInstance->SetVariant(pFileAttributes, varAttributes);
if (FAILED(hRes))
{
// Could not Set the File Attributes
// Continue anyway
ErrorTrace(TRACE_ID, "SetVariant on FileAttributes Field failed.");
// }
}
}
hRes = pPCHFileUploadInstance->Commit();
if(FAILED(hRes))
{
// Could not Commit the instance
ErrorTrace(TRACE_ID, "Commit on PCHFileUploadInstance Failed");
}
}
}
}
}
}
END:TraceFunctLeave();
return (hRes);
}