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.
296 lines
13 KiB
296 lines
13 KiB
/********************************************************************
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
PCH_PrinterDriver.CPP
|
|
|
|
Abstract:
|
|
WBEM provider class implementation for PCH_PrinterDriver class
|
|
|
|
Revision History:
|
|
|
|
Ghim-Sim Chua (gschua) 04/27/99
|
|
- Created
|
|
|
|
Kalyani Narlanka (kalyanin) 05/11/99
|
|
- Added Code to get all the properties for this class
|
|
|
|
********************************************************************/
|
|
|
|
#include "pchealth.h"
|
|
#include "PCH_PrinterDriver.h"
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// tracing stuff
|
|
|
|
#ifdef THIS_FILE
|
|
#undef THIS_FILE
|
|
#endif
|
|
static char __szTraceSourceFile[] = __FILE__;
|
|
#define THIS_FILE __szTraceSourceFile
|
|
#define TRACE_ID DCID_PRINTERDRIVER
|
|
|
|
CPCH_PrinterDriver MyPCH_PrinterDriverSet (PROVIDER_NAME_PCH_PRINTERDRIVER, PCH_NAMESPACE) ;
|
|
|
|
// Property names
|
|
//===============
|
|
const static WCHAR* pTimeStamp = L"TimeStamp" ;
|
|
const static WCHAR* pChange = L"Change" ;
|
|
const static WCHAR* pDate = L"Date" ;
|
|
const static WCHAR* pFilename = L"Filename" ;
|
|
const static WCHAR* pManufacturer = L"Manufacturer" ;
|
|
const static WCHAR* pName = L"Name" ;
|
|
const static WCHAR* pSize = L"Size" ;
|
|
const static WCHAR* pVersion = L"Version" ;
|
|
const static WCHAR* pPath = L"Path" ;
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* FUNCTION : CPCH_PrinterDriver::EnumerateInstances
|
|
*
|
|
* DESCRIPTION : Returns all the instances of this class.
|
|
*
|
|
* INPUTS : A pointer to the MethodContext for communication with WinMgmt.
|
|
* 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_DEEP
|
|
* WBEM_FLAG_SHALLOW
|
|
* WBEM_FLAG_RETURN_IMMEDIATELY
|
|
* WBEM_FLAG_FORWARD_ONLY
|
|
* WBEM_FLAG_BIDIRECTIONAL
|
|
*
|
|
* RETURNS : WBEM_S_NO_ERROR if successful
|
|
*
|
|
* COMMENTS : TO DO: All instances on the machine should be returned here.
|
|
* If there are no instances, return WBEM_S_NO_ERROR.
|
|
* It is not an error to have no instances.
|
|
*
|
|
*****************************************************************************/
|
|
HRESULT CPCH_PrinterDriver::EnumerateInstances(
|
|
MethodContext* pMethodContext,
|
|
long lFlags
|
|
)
|
|
{
|
|
|
|
TraceFunctEnter("CPCH_PrinterDriver::EnumerateInstances");
|
|
|
|
// Begin Declarations
|
|
|
|
HRESULT hRes = WBEM_S_NO_ERROR;
|
|
|
|
// Query String
|
|
CComBSTR bstrPrinterQuery = L"Select DeviceID, PortName FROM win32_printer";
|
|
|
|
// Instances
|
|
CComPtr<IEnumWbemClassObject> pPrinterEnumInst;
|
|
CInstance *pPCHPrinterDriverInstance;
|
|
|
|
// SystemTime
|
|
SYSTEMTIME stUTCTime;
|
|
|
|
// Objects
|
|
IWbemClassObjectPtr pPrinterObj;
|
|
IWbemClassObjectPtr pFileObj;
|
|
|
|
// Unsigned Longs....
|
|
ULONG ulPrinterRetVal = 0;
|
|
ULONG uiReturn = 0;
|
|
|
|
// File Status structure
|
|
struct _stat filestat;
|
|
|
|
// Strings
|
|
CComBSTR bstrPrinterDriverWithPath;
|
|
CComBSTR bstrPrinterDriver;
|
|
CComBSTR bstrProperty;
|
|
CComBSTR bstrDeviceID = L"DeviceID";
|
|
|
|
LPCWSTR lpctstrPortName = L"PortName";
|
|
LPCWSTR lpctstrFileSize = L"FileSize";
|
|
LPCWSTR lpctstrLastModified = L"LastModified";
|
|
LPCWSTR lpctstrManufacturer = L"Manufacturer";
|
|
LPCWSTR lpctstrVersion = L"Version";
|
|
LPCTSTR lpctstrComma = _T(",");
|
|
LPCTSTR lpctstrDrvExtension = _T(".drv");
|
|
LPCTSTR lpctstrDevices = _T("Devices");
|
|
LPCWSTR lpctstrDeviceID = L"DeviceID";
|
|
|
|
TCHAR tchDeviceID[MAX_PATH];
|
|
|
|
TCHAR tchBuffer[MAX_PATH];
|
|
TCHAR *ptchToken;
|
|
|
|
CComVariant varValue;
|
|
CComVariant varSnapshot = "Snapshot";
|
|
|
|
BOOL fDriverFound;
|
|
|
|
BOOL fCommit = FALSE;
|
|
|
|
// Get the date and time to update the TimeStamp Field
|
|
GetSystemTime(&stUTCTime);
|
|
|
|
// Execute the query to get DeviceID, PORTName FROM Win32_Printer
|
|
// Class.
|
|
// pPrinterEnumInst contains a pointer to the list of instances returned.
|
|
|
|
tchDeviceID[0] = 0;
|
|
|
|
hRes = ExecWQLQuery(&pPrinterEnumInst, bstrPrinterQuery);
|
|
if (FAILED(hRes))
|
|
{
|
|
// Cannot get any properties.
|
|
goto END;
|
|
}
|
|
// Query Succeeded!
|
|
// Enumerate the instances from pPrinterEnumInstance
|
|
// Get the next instance into pPrinterObj object.
|
|
while(WBEM_S_NO_ERROR == pPrinterEnumInst->Next(WBEM_INFINITE, 1, &pPrinterObj, &ulPrinterRetVal))
|
|
{
|
|
// Create a new instance of PCH_PrinterDriver Class based on the passed-in MethodContext
|
|
CInstancePtr pPCHPrinterDriverInstance(CreateNewInstance(pMethodContext),false);
|
|
|
|
// Created a New Instance of PCH_PrinterDriver Successfully.
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// TIME STAMP //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
hRes = pPCHPrinterDriverInstance->SetDateTime(pTimeStamp, WBEMTime(stUTCTime));
|
|
if (FAILED(hRes))
|
|
{
|
|
// Could not Set the Time Stamp
|
|
// Continue anyway
|
|
ErrorTrace(TRACE_ID, "SetDateTime on Timestamp Field failed.");
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// CHANGE //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
hRes = pPCHPrinterDriverInstance->SetVariant(pChange, varSnapshot);
|
|
if (FAILED(hRes))
|
|
{
|
|
// Could not Set the Change Property
|
|
// Continue anyway
|
|
ErrorTrace(TRACE_ID, "SetCHString on Change Field failed.");
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// NAME //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
hRes = CopyProperty(pPrinterObj, lpctstrDeviceID, pPCHPrinterDriverInstance, pName);
|
|
if(SUCCEEDED(hRes))
|
|
{
|
|
fCommit = TRUE;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// PATH //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CopyProperty(pPrinterObj, lpctstrPortName, pPCHPrinterDriverInstance, pPath);
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// FILENAME //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Get the File Name i.e.driver from the INI file.
|
|
// Use the DeviceID of win32_printer class to get the PCH_Printer.FileName
|
|
|
|
// Get the device ID and use it to pick up the driver from win.ini File
|
|
hRes = pPrinterObj->Get(bstrDeviceID, 0, &varValue, NULL, NULL);
|
|
if(SUCCEEDED(hRes))
|
|
{
|
|
// Got the DeviceID
|
|
// Now call GetProfileString to get the Driver
|
|
USES_CONVERSION;
|
|
_tcscpy(tchDeviceID,W2T(varValue.bstrVal));
|
|
if (GetProfileString(lpctstrDevices, tchDeviceID, "\0", tchBuffer, MAX_PATH) > 1)
|
|
{
|
|
// tchBuffer contains a string of two tokens, first the driver, second the PathName
|
|
// Get the driver
|
|
ptchToken = _tcstok(tchBuffer,lpctstrComma);
|
|
if(ptchToken != NULL)
|
|
{
|
|
// Got the Driver Name
|
|
bstrPrinterDriver = ptchToken;
|
|
varValue = ptchToken;
|
|
|
|
// Use this to set the FileName
|
|
hRes = pPCHPrinterDriverInstance->SetVariant(pFilename, varValue);
|
|
if (FAILED(hRes))
|
|
{
|
|
// Could not Set the FileName Property
|
|
// Continue anyway
|
|
ErrorTrace(TRACE_ID, "Set Variant on Change Field failed.");
|
|
}
|
|
|
|
// Now get the properties of the File
|
|
// Concatenate ".drv" to get the driver's actual Name
|
|
bstrPrinterDriver.Append(lpctstrDrvExtension);
|
|
|
|
// Get the Complete Path of the File
|
|
fDriverFound = getCompletePath(bstrPrinterDriver, bstrPrinterDriverWithPath);
|
|
if (fDriverFound)
|
|
{
|
|
// Got the complete Path Call GetCIMDataFile Function to get
|
|
// properties of this file.
|
|
|
|
if (SUCCEEDED(GetCIMDataFile(bstrPrinterDriverWithPath, &pFileObj)))
|
|
{
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// VERSION //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CopyProperty(pFileObj, lpctstrVersion, pPCHPrinterDriverInstance, pVersion);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// FILESIZE //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CopyProperty(pFileObj, lpctstrFileSize, pPCHPrinterDriverInstance, pSize);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// DATE //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CopyProperty(pFileObj, lpctstrLastModified, pPCHPrinterDriverInstance, pDate);
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// MANUFACTURER //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CopyProperty(pFileObj, lpctstrManufacturer, pPCHPrinterDriverInstance, pManufacturer);
|
|
|
|
|
|
} //end of SUCCEEDED...
|
|
} // end of if fDriverFound
|
|
|
|
} // end of if (ptchToken != NULL)
|
|
|
|
} // end of GetProfileString...
|
|
|
|
}// end of got the DeviceID
|
|
|
|
// All the properties are set. Commit the instance
|
|
hRes = pPCHPrinterDriverInstance->Commit();
|
|
if(FAILED(hRes))
|
|
{
|
|
// Could not Commit the instance
|
|
ErrorTrace(TRACE_ID, "Could not commit the instance");
|
|
}
|
|
|
|
} // end of While
|
|
|
|
END: TraceFunctLeave();
|
|
return hRes;
|
|
|
|
}
|