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.
 
 
 
 
 
 

731 lines
22 KiB

/*++
© 1998 Seagate Software, Inc. All rights reserved
Module Name:
WzUnmang.cpp
Abstract:
Wizard for Unmanaging media - Copy Set Wizard.
Author:
Rohde Wakefield [rohde] 26-09-1997
Revision History:
--*/
#include "stdafx.h"
#include "ManVol.h"
#include "WzUnmang.h"
#include "valwait.h"
#include "objidl.h"
// Thread function for running Validate job
static DWORD RunValidateJob(void* pVoid);
typedef struct {
DWORD dwResourceCookie;
DWORD dwHsmServerCookie;
} RUN_VALIDATE_PARAM;
/////////////////////////////////////////////////////////////////////////////
// CUnmanageWizard
CUnmanageWizard::CUnmanageWizard( )
{
WsbTraceIn( L"CUnmanageWizard::CUnmanageWizard", L"" );
AFX_MANAGE_STATE( AfxGetStaticModuleState( ) );
HRESULT hr = S_OK;
//
// Get interfaces to needed objects
//
try {
m_TitleId = IDS_WIZ_UNMANAGE_TITLE;
m_HeaderId = IDB_UNMANAGE_HEADER;
m_WatermarkId = IDB_UNMANAGE_WATERMARK;
} WsbCatch( hr );
WsbTraceOut( L"CUnmanageWizard::CUnmanageWizard", L"" );
}
STDMETHODIMP
CUnmanageWizard::AddWizardPages(
IN RS_PCREATE_HANDLE Handle,
IN IUnknown* pCallback,
IN ISakSnapAsk* pSakSnapAsk
)
{
WsbTraceIn( L"CUnmanageWizard::AddWizardPages", L"" );
HRESULT hr = S_OK;
try {
//
// Initialize the Sheet
//
WsbAffirmHr( InitSheet( Handle, pCallback, 0, pSakSnapAsk, 0, 0 ) );
//
// Load pages
//
WsbAffirmHr( AddPage( &m_IntroPage ) );
WsbAffirmHr( AddPage( &m_SelectPage ) );
WsbAffirmHr( AddPage( &m_FinishPage ) );
} WsbCatch( hr );
WsbTraceOut( L"CUnmanageWizard::AddWizardPages", L"" );
return( hr );
}
CUnmanageWizard::~CUnmanageWizard()
{
WsbTraceIn( L"CUnmanageWizard::~CUnmanageWizard", L"" );
WsbTraceOut( L"CUnmanageWizard::~CUnmanageWizard", L"" );
}
void
CUnmanageWizard::DoThreadSetup(
)
{
WsbTraceIn( L"CUnmanageWizard::DoThreadSetup", L"" );
HRESULT hr = S_OK;
try {
//
// Get the HSM and FSA objects for resource
//
CComPtr<IUnknown> pUnkHsmResource;
WsbAffirmHr( GetHsmObj( &pUnkHsmResource ) );
WsbAffirmHr( pUnkHsmResource.QueryInterface( &m_pHsmResource) );
CComPtr<IUnknown> pUnkFsaResource;
WsbAffirmHr( m_pHsmResource->GetFsaResource( &pUnkFsaResource ) );
WsbAffirmHr( pUnkFsaResource.QueryInterface( &m_pFsaResource ) );
//
// Grab the name of resource
//
WsbAffirmHr( RsGetVolumeDisplayName( m_pFsaResource, m_DisplayName ) );
} WsbCatch( hr );
WsbTraceOut( L"CUnmanageWizard::DoThreadSetup", L"hr = <%ls>", WsbHrAsString( hr ) );
}
HRESULT CUnmanageWizard::OnFinish( )
{
WsbTraceIn( L"CUnmanageWizard::OnFinish", L"" );
//
// The sheet really owns the process as a whole,
// so it will do the final assembly
//
HRESULT hr = S_OK;
try {
CComPtr<IHsmServer> pHsmServer;
WsbAffirmHrOk( GetHsmServer( &pHsmServer ) );
int selected = m_SelectPage.GetCheckedRadioButton( IDC_NOMANAGE, IDC_FULL );
switch( selected ) {
case IDC_NOMANAGE:
//
// Get the Engine's managed resource collection
//
{
CComPtr<IWsbIndexedCollection> pCollection;
WsbAffirmHr( pHsmServer->GetManagedResources( &pCollection ) );
WsbAffirmHr( pCollection->RemoveAndRelease( m_pHsmResource ) );
WsbAffirmHr( pHsmServer->SavePersistData( ) );
CComPtr<IFsaServer> pFsaServer;
WsbAffirmHr( GetFsaServer( &pFsaServer ) );
WsbAffirmHr( RsServerSaveAll( pFsaServer ) );
}
break;
case IDC_FULL:
WsbAffirmHr( RsCreateAndRunFsaJob( HSM_JOB_DEF_TYPE_FULL_UNMANAGE, pHsmServer, m_pFsaResource, FALSE ) );
break;
}
} WsbCatch( hr );
m_HrFinish = hr;
WsbTraceOut( L"CUnmanageWizard::OnFinish", L"hr = <%ls>", WsbHrAsString( hr ) );
return( hr );
}
/////////////////////////////////////////////////////////////////////////////
// CUnmanageWizardIntro property page
CUnmanageWizardIntro::CUnmanageWizardIntro()
: CSakWizardPage_InitBaseExt( WIZ_UNMANAGE_INTRO )
{
WsbTraceIn( L"CUnmanageWizardIntro::CUnmanageWizardIntro", L"" );
//{{AFX_DATA_INIT(CUnmanageWizardIntro)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
WsbTraceOut( L"CUnmanageWizardIntro::CUnmanageWizardIntro", L"" );
}
CUnmanageWizardIntro::~CUnmanageWizardIntro()
{
WsbTraceIn( L"CUnmanageWizardIntro::~CUnmanageWizardIntro", L"" );
WsbTraceOut( L"CUnmanageWizardIntro::~CUnmanageWizardIntro", L"" );
}
void CUnmanageWizardIntro::DoDataExchange(CDataExchange* pDX)
{
WsbTraceIn( L"CUnmanageWizardIntro::DoDataExchange", L"" );
CSakWizardPage::DoDataExchange(pDX );
//{{AFX_DATA_MAP(CUnmanageWizardIntro)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
WsbTraceOut( L"CUnmanageWizardIntro::DoDataExchange", L"" );
}
BEGIN_MESSAGE_MAP(CUnmanageWizardIntro, CSakWizardPage)
//{{AFX_MSG_MAP(CUnmanageWizardIntro)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUnmanageWizardIntro message handlers
BOOL CUnmanageWizardIntro::OnInitDialog( )
{
WsbTraceIn( L"CUnmanageWizardIntro::OnInitDialog", L"" );
CSakWizardPage::OnInitDialog( );
//
// Really, first chance that we know we're in the new thread
// Get sheet to initialize as needed
//
CUnmanageWizard* pSheet = (CUnmanageWizard*) m_pSheet;
pSheet->DoThreadSetup( );
WsbTraceOut( L"CUnmanageWizardIntro::OnInitDialog", L"" );
return( TRUE );
}
BOOL CUnmanageWizardIntro::OnSetActive( )
{
WsbTraceIn( L"CUnmanageWizardIntro::OnSetActive", L"" );
m_pSheet->SetWizardButtons( PSWIZB_NEXT );
BOOL retval = CSakWizardPage::OnSetActive( );
WsbTraceOut( L"CUnmanageWizardIntro::OnSetActive", L"" );
return( retval );
}
/////////////////////////////////////////////////////////////////////////////
// CUnmanageWizardSelect property page
CUnmanageWizardSelect::CUnmanageWizardSelect()
: CSakWizardPage_InitBaseInt( WIZ_UNMANAGE_SELECT )
{
WsbTraceIn( L"CUnmanageWizardSelect::CUnmanageWizardSelect", L"" );
//{{AFX_DATA_INIT(CUnmanageWizardSelect)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
WsbTraceOut( L"CUnmanageWizardSelect::CUnmanageWizardSelect", L"" );
}
CUnmanageWizardSelect::~CUnmanageWizardSelect()
{
WsbTraceIn( L"CUnmanageWizardSelect::~CUnmanageWizardSelect", L"" );
WsbTraceOut( L"CUnmanageWizardSelect::~CUnmanageWizardSelect", L"" );
}
void CUnmanageWizardSelect::DoDataExchange(CDataExchange* pDX)
{
WsbTraceIn( L"CUnmanageWizardSelect::DoDataExchange", L"" );
CSakWizardPage::DoDataExchange(pDX );
//{{AFX_DATA_MAP(CUnmanageWizardSelect)
//}}AFX_DATA_MAP
WsbTraceOut( L"CUnmanageWizardSelect::DoDataExchange", L"" );
}
BEGIN_MESSAGE_MAP(CUnmanageWizardSelect, CSakWizardPage)
//{{AFX_MSG_MAP(CUnmanageWizardSelect)
ON_BN_CLICKED(IDC_BUTTON_REFRESH, OnButtonRefresh)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUnmanageWizardSelect message handlers
BOOL CUnmanageWizardSelect::OnInitDialog( )
{
WsbTraceIn( L"CUnmanageWizardSelect::OnInitDialog", L"" );
CSakWizardPage::OnInitDialog( );
HRESULT hr = S_OK;
try {
m_hrAvailable = ((CUnmanageWizard*)m_pSheet)->m_pFsaResource->IsAvailable( );
CheckRadioButton( IDC_NOMANAGE, IDC_FULL, IDC_FULL );
} WsbCatch( hr );
WsbTraceOut( L"CUnmanageWizardSelect::OnInitDialog", L"" );
return TRUE;
}
BOOL CUnmanageWizardSelect::OnSetActive( )
{
WsbTraceIn( L"CUnmanageWizardSelect::OnSetActive", L"" );
BOOL retval = CSakWizardPage::OnSetActive( );
SetButtons( );
WsbTraceOut( L"CUnmanageWizardSelect::OnSetActive", L"" );
return( retval );
}
void CUnmanageWizardSelect::SetButtons()
{
WsbTraceIn( L"CUnmanageWizardSelect::SetButtons", L"" );
HRESULT hr = S_OK;
try {
CUnmanageWizard * pSheet = (CUnmanageWizard*)m_pSheet;
//
// Check if volume is still around (could be formatted now).
// If it is not available, then we don't want to let a job
// be started against it, so set up radio buttons appropriately.
//
if( S_OK == m_hrAvailable ) {
CString string;
LONGLONG total, free, premigrated, truncated;
WsbAffirmHr( pSheet->m_pFsaResource->GetSizes( &total, &free, &premigrated, &truncated ) );
WsbAffirmHr( RsGuiFormatLongLong4Char( free, string ) );
SetDlgItemText( IDC_UNMANAGE_FREE_SPACE, string );
WsbAffirmHr( RsGuiFormatLongLong4Char( truncated, string ) );
SetDlgItemText( IDC_UNMANAGE_TRUNCATE, string );
//
// See if there is enough room to bring everything back
//
BOOL disableRecall = free < truncated;
if( disableRecall ) {
switch( GetCheckedRadioButton( IDC_NOMANAGE, IDC_FULL ) ) {
case IDC_FULL:
CheckRadioButton( IDC_NOMANAGE, IDC_FULL, IDC_NOMANAGE );
break;
}
// Show the Refresh button and related items on every selection
GetDlgItem( IDC_BUTTON_REFRESH )->ShowWindow( SW_SHOW );
GetDlgItem( IDC_REFRESH_DESCRIPTION )->ShowWindow( SW_SHOW );
} else {
// Hide the Refresh button and related items
GetDlgItem( IDC_BUTTON_REFRESH )->ShowWindow( SW_HIDE );
GetDlgItem( IDC_REFRESH_DESCRIPTION )->ShowWindow( SW_HIDE );
}
GetDlgItem( IDC_FULL )->EnableWindow( !disableRecall );
GetDlgItem( IDC_UNMANAGE_FULL_DESCRIPTION )->EnableWindow( !disableRecall );
} else {
CheckRadioButton( IDC_NOMANAGE, IDC_FULL, IDC_NOMANAGE );
GetDlgItem( IDC_FULL )->EnableWindow( FALSE );
GetDlgItem( IDC_UNMANAGE_FULL_DESCRIPTION )->EnableWindow( FALSE );
GetDlgItem( IDC_UNMANAGE_FREE_SPACE_LABEL )->ShowWindow( SW_HIDE );
GetDlgItem( IDC_UNMANAGE_TRUNCATE_LABEL )->ShowWindow( SW_HIDE );
// Hide the Refresh button and related items
GetDlgItem( IDC_BUTTON_REFRESH )->ShowWindow( SW_HIDE );
GetDlgItem( IDC_REFRESH_DESCRIPTION )->ShowWindow( SW_HIDE );
}
//
// Enable the next / back buttons
//
m_pSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_NEXT );
} WsbCatchAndDo( hr,
m_pSheet->SetWizardButtons( PSWIZB_BACK );
);
WsbTraceOut( L"CUnmanageWizardSelect::SetButtons", L"" );
}
LRESULT CUnmanageWizardSelect::OnWizardNext()
{
WsbTraceIn( L"CUnmanageWizardSelect::SetDescription", L"" );
LRESULT retval = -1;
CUnmanageWizard * pSheet = (CUnmanageWizard*)m_pSheet;
if( S_OK == m_hrAvailable ) {
int boxReturn = IDNO;
const UINT type = MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON2;
CString warning;
switch( GetCheckedRadioButton( IDC_NOMANAGE, IDC_FULL ) ) {
case IDC_NOMANAGE:
AfxFormatString1( warning, IDS_WIZ_UNMANAGE_CONFIRM_NOMANAGE, pSheet->m_DisplayName );
break;
case IDC_FULL:
AfxFormatString1( warning, IDS_WIZ_UNMANAGE_CONFIRM_FULL, pSheet->m_DisplayName );
break;
}
boxReturn = AfxMessageBox( warning, type );
if( boxReturn == IDYES ) {
retval = CSakWizardPage::OnWizardNext();
}
} else {
//
// Assume the only action was to delete and the volume
// doesn't exist, so this is OK.
//
retval = 0;
}
WsbTraceOut( L"CUnmanageWizardSelect::SetDescription", L"retval = <%ld>", retval );
return( retval );
}
/////////////////////////////////////////////////////////////////////////////
// CUnmanageWizardFinish property page
CUnmanageWizardFinish::CUnmanageWizardFinish()
: CSakWizardPage_InitBaseExt( WIZ_UNMANAGE_FINISH )
{
WsbTraceIn( L"CUnmanageWizardFinish::CUnmanageWizardFinish", L"" );
//{{AFX_DATA_INIT(CUnmanageWizardFinish)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
WsbTraceOut( L"CUnmanageWizardFinish::CUnmanageWizardFinish", L"" );
}
CUnmanageWizardFinish::~CUnmanageWizardFinish()
{
WsbTraceIn( L"CUnmanageWizardFinish::~CUnmanageWizardFinish", L"" );
WsbTraceOut( L"CUnmanageWizardFinish::~CUnmanageWizardFinish", L"" );
}
void CUnmanageWizardFinish::DoDataExchange(CDataExchange* pDX)
{
WsbTraceIn( L"CUnmanageWizardFinish::DoDataExchange", L"" );
CSakWizardPage::DoDataExchange(pDX );
//{{AFX_DATA_MAP(CUnmanageWizardFinish)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
WsbTraceOut( L"CUnmanageWizardFinish::DoDataExchange", L"" );
}
BEGIN_MESSAGE_MAP(CUnmanageWizardFinish, CSakWizardPage)
//{{AFX_MSG_MAP(CUnmanageWizardFinish)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUnmanageWizardFinish message handlers
BOOL CUnmanageWizardFinish::OnInitDialog( )
{
WsbTraceIn( L"CUnmanageWizardFinish::OnInitDialog", L"" );
CSakWizardPage::OnInitDialog( );
HRESULT hr = S_OK;
WsbTraceOut( L"CUnmanageWizardFinish::OnInitDialog", L"" );
return TRUE;
}
BOOL CUnmanageWizardFinish::OnSetActive( )
{
WsbTraceIn( L"CUnmanageWizardFinish::OnSetActive", L"" );
HRESULT hr = S_OK;
BOOL fRet = CSakWizardPage::OnSetActive( );
try {
CUnmanageWizard * pSheet = (CUnmanageWizard*)m_pSheet;
int selected = pSheet->m_SelectPage.GetCheckedRadioButton( IDC_NOMANAGE, IDC_FULL );
CString actionString, jobName, taskString;
BOOL entersTask = TRUE;
switch( selected ) {
case IDC_NOMANAGE:
AfxFormatString1( actionString, IDS_WIZ_UNMANAGE_SEL_NOMANAGE, pSheet->m_DisplayName );
entersTask = FALSE;
taskString.LoadString( IDS_WIZ_UNMANAGE_NOMANAGE_TASK_TEXT );
break;
case IDC_FULL:
AfxFormatString1( actionString, IDS_WIZ_UNMANAGE_SEL_FULL, pSheet->m_DisplayName );
RsCreateJobName( HSM_JOB_DEF_TYPE_FULL_UNMANAGE, pSheet->m_pFsaResource, jobName );
break;
}
CString selectString;
AfxFormatString1( selectString, IDS_WIZ_UNMANAGE_SELECT, actionString );
SetDlgItemText( IDC_SELECT_TEXT, selectString );
if( entersTask ) {
CWsbStringPtr computerName;
CComPtr<IHsmServer> pHsmServer;
WsbAffirmHrOk( pSheet->GetHsmServer( &pHsmServer ) );
WsbAffirmHr( pHsmServer->GetName( &computerName ) );
AfxFormatString2( taskString, IDS_WIZ_FINISH_RUN_JOB, jobName, computerName );
}
SetDlgItemText( IDC_TASK_TEXT, taskString );
} WsbCatch( hr );
m_pSheet->SetWizardButtons( PSWIZB_BACK | PSWIZB_FINISH );
WsbTraceOut( L"CUnmanageWizardFinish::OnSetActive", L"" );
return fRet;
}
void CUnmanageWizardSelect::OnButtonRefresh()
{
WsbTraceIn( L"CUnmanageWizardFinish::OnButtonRefresh", L"" );
HRESULT hr = S_OK;
CValWaitDlg* pWaitDlg = 0;
HANDLE hJobThread[1] = { NULL };
BOOL bRunning = TRUE;
CComPtr<IGlobalInterfaceTable> pGIT;
RUN_VALIDATE_PARAM* pThreadParam = NULL;
BOOL bResCookieCreated = FALSE;
BOOL bHsmCookieCreated = FALSE;
CComPtr<IHsmServer> pHsmServer;
try {
CUnmanageWizard* pSheet = (CUnmanageWizard*)m_pSheet;
WsbAffirmHrOk(pSheet->GetHsmServer(&pHsmServer));
// Register interfaces so they can be used in other threads
pThreadParam = new RUN_VALIDATE_PARAM;
WsbAffirm(pThreadParam, E_OUTOFMEMORY);
WsbAffirmHr(CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL,
CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void **)&pGIT));
WsbAffirmHr(pGIT->RegisterInterfaceInGlobal((IUnknown *)(IFsaResource *)(pSheet->m_pFsaResource),
IID_IFsaResource, &(pThreadParam->dwResourceCookie)));
bResCookieCreated = TRUE;
WsbAffirmHr(pGIT->RegisterInterfaceInGlobal((IUnknown *)(IHsmServer *)pHsmServer,
IID_IHsmServer, &(pThreadParam->dwHsmServerCookie)));
bHsmCookieCreated = TRUE;
// Create a thread that runs a Validate job
hJobThread[0] = CreateThread(0, 0, RunValidateJob, (void *)pThreadParam, 0, 0);
if (!hJobThread[0]) {
WsbThrow(HRESULT_FROM_WIN32(GetLastError()));
}
// Open Validate Wait dialog
pWaitDlg = new CValWaitDlg(pSheet, this);
WsbAffirm(pWaitDlg, E_OUTOFMEMORY);
if (! pWaitDlg->Create(CValWaitDlg::IDD, this)) {
// Dialog creation failed
WsbThrow(E_FAIL);
}
while (bRunning) {
DWORD dwStatus;
// Wait for that thread to finish, dispatch messages while it's working
dwStatus = MsgWaitForMultipleObjects(1, hJobThread, FALSE, INFINITE, QS_ALLEVENTS);
switch (dwStatus) {
case WAIT_OBJECT_0: {
// The thread ended get it's exit code
DWORD dwExitCode;
if (GetExitCodeThread(hJobThread[0], &dwExitCode)) {
if (STILL_ACTIVE == dwExitCode) {
// This shouldn't happen
hr = E_FAIL;
} else {
// Thread return code
hr = static_cast<HRESULT>(dwExitCode);
}
} else {
hr = HRESULT_FROM_WIN32(GetLastError());
}
bRunning = FALSE;
break;
}
case (WAIT_OBJECT_0 + 1): {
// Message in the queue
MSG msg;
while (PeekMessage(&msg, pWaitDlg->m_hWnd, 0, 0, PM_REMOVE)) {
DispatchMessage(&msg);
}
while (PeekMessage(&msg, NULL, 0, 0, (PM_REMOVE | PM_QS_PAINT))) {
DispatchMessage(&msg);
}
break;
}
case 0xFFFFFFFF:
default:
// Error
hr = HRESULT_FROM_WIN32(GetLastError());
bRunning = FALSE;
break;
}
}
// Close Wait dialog
pWaitDlg->DestroyWindow( );
// Reset buttons
SetButtons();
} WsbCatch(hr);
// Check err code
if (SUCCEEDED(hr)) {
WsbTrace(L"CUnmanageWizardFinish::OnButtonRefresh: hr = <%ls>\n", WsbHrAsString(hr));
} else {
// Failure should happen only under sever resource conditions so
// display a messagebox on Refresh failure
WsbTraceAlways(L"CUnmanageWizardFinish::OnButtonRefresh: hr = <%ls>\n", WsbHrAsString(hr));
CString errString;
AfxFormatString1(errString, IDS_ERR_REFRESH_FAILED, WsbHrAsString(hr));
AfxMessageBox(errString, RS_MB_ERROR);
}
if (hJobThread[0]) {
CloseHandle(hJobThread[0]);
}
// Clean object registration staff
if (bResCookieCreated) {
pGIT->RevokeInterfaceFromGlobal(pThreadParam->dwResourceCookie);
}
if (bHsmCookieCreated) {
pGIT->RevokeInterfaceFromGlobal(pThreadParam->dwHsmServerCookie);
}
if (pThreadParam) {
delete pThreadParam;
}
WsbTraceOut( L"CUnmanageWizardFinish::OnButtonRefresh", L"" );
}
static DWORD RunValidateJob(void* pVoid)
{
WsbTraceIn( L"RunValidateJob", L"" );
HRESULT hr = S_OK;
HRESULT hrCom = S_OK;
try {
RUN_VALIDATE_PARAM* pThreadParam = NULL;
CComPtr<IHsmServer> pHsmServer;
CComPtr<IFsaResource> pFsaResource;
CComPtr<IGlobalInterfaceTable> pGIT;
hrCom = CoInitialize( 0 );
WsbAffirmHr( hrCom );
pThreadParam = (RUN_VALIDATE_PARAM*)pVoid;
WsbAffirmPointer(pThreadParam);
// Get Fsa Resource & HSM Server interface pointers for this thread
WsbAffirmHr(CoCreateInstance(CLSID_StdGlobalInterfaceTable, NULL,
CLSCTX_INPROC_SERVER, IID_IGlobalInterfaceTable, (void **)&pGIT));
WsbAffirmHr(pGIT->GetInterfaceFromGlobal(pThreadParam->dwResourceCookie,
IID_IFsaResource, (void **)&pFsaResource));
WsbAffirmHr(pGIT->GetInterfaceFromGlobal(pThreadParam->dwHsmServerCookie,
IID_IHsmServer, (void **)&pHsmServer));
// Run job
WsbTrace(L"RunValidateJob: Got interface pointers, running Validate job\n");
WsbAffirmHr(RsCreateAndRunDirectFsaJob(HSM_JOB_DEF_TYPE_VALIDATE, pHsmServer,
pFsaResource, TRUE));
} WsbCatch(hr);
if (SUCCEEDED(hrCom)) {
CoUninitialize();
}
WsbTraceOut( L"RunValidateJob", L"hr = <%ls>", WsbHrAsString( hr ) );
return(static_cast<DWORD>(hr));
}