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.
|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation 1996-2001.
//
// File: svcattch.cpp
//
// Contents: implementation of CComponentDataImpl
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "snapmgr.h"
#include <scesvc.h>
#define TEMPLATE_MAGIC_NUMBER (DWORD)-1
/*-------------------------------------------------------------------------------
This is a private structure used for SceSvcQueryInfo it expects the handle to be one step above what it is now. -------------------------------------------------------------------------------*/ typedef struct _tag_SCEP_HANDLE { LPVOID hProfile; // SCE_HANDLE
PWSTR ServiceName; // Service name.
} SCEP_HANDLE, *LPSCEP_HANDLE;
STDMETHODIMP CComponentDataImpl::GetData (SCESVC_HANDLE sceHandle, SCESVC_INFO_TYPE sceType, PVOID *ppvData, PSCE_ENUMERATION_CONTEXT psceEnumHandle) { SCESTATUS status; SCESVCP_HANDLE *scesvcHandle;
// if (m_fSvcNotReady) {
// return E_PENDING;
// }
if (!sceHandle) { return E_INVALIDARG; }
if (!ppvData) { return E_POINTER; }
scesvcHandle = (SCESVCP_HANDLE *) sceHandle; if (!scesvcHandle->ServiceName) { return E_INVALIDARG; }
if (scesvcHandle->TemplateName && lstrcmp(GT_COMPUTER_TEMPLATE, scesvcHandle->TemplateName) != 0 ) {
if (psceEnumHandle && *psceEnumHandle == TEMPLATE_MAGIC_NUMBER) { *ppvData = NULL; status = SCESTATUS_SUCCESS; } else { if (psceEnumHandle) { *psceEnumHandle = TEMPLATE_MAGIC_NUMBER; } status = SceSvcGetInformationTemplate(scesvcHandle->TemplateName, scesvcHandle->ServiceName, 0, (PSCESVC_CONFIGURATION_INFO *) ppvData); } } else { //
// This structure needs to be sent to SceSvcQueryInfo;
//
SCEP_HANDLE hScep; ZeroMemory(&hScep, sizeof(SCEP_HANDLE)); hScep.hProfile = SadHandle; hScep.ServiceName = scesvcHandle->ServiceName;
status = SceSvcQueryInfo((SCE_HANDLE)&hScep,sceType,0,0,ppvData,psceEnumHandle); }
if (SCESTATUS_SUCCESS == status) { return S_OK; } else { return E_FAIL; } }
STDMETHODIMP CComponentDataImpl::Initialize(LPCTSTR ServiceName, LPCTSTR TemplateName, LPSCESVCATTACHMENTPERSISTINFO lpSceSvcPersistInfo, SCESVC_HANDLE *sceHandle) { SCESVCP_HANDLE *scesvcHandle; CEditTemplate *pET;
ASSERT(ServiceName); ASSERT(lpSceSvcPersistInfo); ASSERT(sceHandle);
if (!ServiceName || !lpSceSvcPersistInfo || !sceHandle) { return E_POINTER; }
*sceHandle = NULL;
//
// Cache Service & Template -> lpUnknown.
//
if (TemplateName && lstrlen(TemplateName)) { //
// If TemplateName is not NULL then find the template and store it there
//
pET = GetTemplate(TemplateName); if (!pET) { return E_FAIL; } pET->AddService(ServiceName,lpSceSvcPersistInfo); } else { return E_INVALIDARG; }
// Open & retrieve SCE_HANDLE
scesvcHandle = new SCESVCP_HANDLE; if (!scesvcHandle) { return E_OUTOFMEMORY; } scesvcHandle->ServiceName = new TCHAR [ lstrlen(ServiceName)+1 ]; if (!scesvcHandle->ServiceName) { delete scesvcHandle; return E_OUTOFMEMORY; } //This is a safe usage.
lstrcpy(scesvcHandle->ServiceName,ServiceName); if (TemplateName) { scesvcHandle->TemplateName = new TCHAR [ lstrlen(TemplateName)+1 ]; if (!scesvcHandle->TemplateName) { delete [] scesvcHandle->ServiceName; delete scesvcHandle; return E_OUTOFMEMORY; } //This is a safe usage.
lstrcpy(scesvcHandle->TemplateName,TemplateName); } else { scesvcHandle->TemplateName = NULL; } *sceHandle = (SCESVC_HANDLE *) scesvcHandle;
return S_OK; }
STDMETHODIMP CComponentDataImpl::FreeBuffer(PVOID pvData) { HRESULT hr;
if (!pvData) { hr = E_POINTER; } else if (SCESTATUS_SUCCESS == SceSvcFree(pvData)) { hr = S_OK; } else { hr = E_FAIL; }
return hr; }
STDMETHODIMP CComponentDataImpl::CloseHandle(SCESVC_HANDLE sceHandle) { HRESULT hr; PSCESVCP_HANDLE pHandle;
if (sceHandle) { pHandle = (PSCESVCP_HANDLE) sceHandle; // Free the handle
if (pHandle->TemplateName) { delete[] pHandle->TemplateName; } delete[] pHandle->ServiceName; delete pHandle; hr = S_OK; } else { hr = E_INVALIDARG; }
return hr; }
|