windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/msg/msmqqmgr.cpp
2020-09-26 16:20:57 +08:00

287 lines
5.8 KiB
C++

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
Abstract:
History:
--*/
#include "precomp.h"
#include <wbemcli.h>
#include <comutl.h>
#include "msmqcomn.h"
#include "msmqqmgr.h"
static QUEUEPROPID g_aQueuePropID[] = { PROPID_Q_TRANSACTION,
PROPID_Q_PATHNAME,
PROPID_Q_AUTHENTICATE,
PROPID_Q_QUOTA,
PROPID_Q_TYPE };
const DWORD g_cQueueProp = sizeof(g_aQueuePropID) / sizeof(QUEUEPROPID);
#define CALLFUNC(FUNC) m_Api.m_fp ## FUNC
/*************************************************************************
CMsgMsmqQueueMgr
**************************************************************************/
HRESULT CMsgMsmqQueueMgr::EnsureMsmq()
{
HRESULT hr;
CInCritSec ics( &m_cs );
hr = m_Api.Initialize();
if ( FAILED(hr) )
{
return hr;
}
return EnsureMsmqService( m_Api );
}
HRESULT CMsgMsmqQueueMgr::Create( LPCWSTR wszPathName,
GUID guidType,
BOOL bAuth,
DWORD dwQos,
DWORD dwQuota,
PVOID pSecDesc )
{
HRESULT hr;
hr = EnsureMsmq();
if ( FAILED(hr) )
{
return hr;
}
MQPROPVARIANT aPropVar[g_cQueueProp];
BOOL bXact = dwQos == WMIMSG_FLAG_QOS_XACT ? TRUE : FALSE;
//
// transaction
//
aPropVar[0].vt = VT_UI1;
aPropVar[0].bVal = bXact ? MQ_TRANSACTIONAL : MQ_TRANSACTIONAL_NONE;
//
// pathname
//
aPropVar[1].vt = VT_LPWSTR;
aPropVar[1].pwszVal = LPWSTR(wszPathName);
//
// auth
//
aPropVar[2].vt = VT_UI1;
aPropVar[2].bVal = bAuth ? MQ_AUTHENTICATE : MQ_AUTHENTICATE_NONE;
//
// quota
//
aPropVar[3].vt = VT_UI4;
aPropVar[3].ulVal = dwQuota;
//
// type
//
aPropVar[4].vt = VT_CLSID;
aPropVar[4].puuid = &guidType;
MQQUEUEPROPS QueueProps;
QueueProps.cProp = g_cQueueProp;
QueueProps.aPropID = g_aQueuePropID;
QueueProps.aPropVar = aPropVar;
QueueProps.aStatus = NULL;
DWORD dwDummy = 0;
hr = CALLFUNC(MQCreateQueue)( pSecDesc, &QueueProps, NULL, &dwDummy );
if ( FAILED(hr) )
{
return MqResToWmiRes(hr);
}
return hr;
}
HRESULT CMsgMsmqQueueMgr::Destroy( LPCWSTR wszName )
{
ENTER_API_CALL
HRESULT hr;
hr = EnsureMsmq();
if ( FAILED(hr) )
{
return hr;
}
WString wsFormat;
hr = NormalizeQueueName( m_Api, wszName, wsFormat );
if ( FAILED(hr) )
{
return MqResToWmiRes( hr);
}
return CALLFUNC(MQDeleteQueue)( wsFormat );
EXIT_API_CALL
}
HRESULT CMsgMsmqQueueMgr::GetAllNames( GUID guidTypeFilter,
BOOL bPrivateOnly,
LPWSTR** ppwszNames,
ULONG* pcNames )
{
ENTER_API_CALL
HRESULT hr;
*ppwszNames = NULL;
*pcNames = 0;
hr = EnsureMsmq();
if ( FAILED(hr) )
{
return hr;
}
if ( bPrivateOnly != TRUE )
{
return WBEM_E_NOT_SUPPORTED;
}
//
// First get all private queue names.
//
MGMTPROPID MgmtPropID = PROPID_MGMT_MSMQ_PRIVATEQ;
MQPROPVARIANT MgmtPropVar;
MgmtPropVar.vt = VT_LPWSTR | VT_VECTOR;
MQMGMTPROPS MgmtProps;
MgmtProps.cProp = 1;
MgmtProps.aPropID = &MgmtPropID;
MgmtProps.aPropVar = &MgmtPropVar;
MgmtProps.aStatus = NULL;
hr = CALLFUNC(MQMgmtGetInfo)( NULL, L"MACHINE", &MgmtProps );
if ( FAILED(hr) )
{
return MqResToWmiRes( hr );
}
//
// Allocate return array to total number of private queues.
// Because of the filter guid, the actual returned number
// will most likely be smaller.
//
DWORD dwSize = sizeof(LPWSTR) * MgmtPropVar.calpwstr.cElems;
LPWSTR* awszNames = (LPWSTR*)CoTaskMemAlloc( dwSize );
if ( awszNames == NULL )
{
CALLFUNC(MQFreeMemory)( MgmtPropVar.calpwstr.pElems );
return WBEM_E_OUT_OF_MEMORY;
}
//
// for each name, get the queue type guid for it and compare
// with the filter type guid.
//
CLSID guidType;
QUEUEPROPID QueuePropID = PROPID_Q_TYPE;
MQPROPVARIANT QueuePropVar;
QueuePropVar.vt = VT_CLSID;
QueuePropVar.puuid = &guidType;
MQQUEUEPROPS QueueProps;
QueueProps.cProp = 1;
QueueProps.aPropID = &QueuePropID;
QueueProps.aPropVar = &QueuePropVar;
QueueProps.aStatus = NULL;
ULONG cNames = 0;
for( ULONG i=0; i < MgmtPropVar.calpwstr.cElems; i++ )
{
WString wsQueueName;
LPWSTR wszPathname = MgmtPropVar.calpwstr.pElems[i];
hr = NormalizeQueueName( m_Api, wszPathname, wsQueueName );
if ( FAILED(hr) )
{
return MqResToWmiRes( hr );
}
hr = CALLFUNC(MQGetQueueProperties)( wsQueueName, &QueueProps );
if ( FAILED(hr) )
{
continue;
}
if ( guidType == guidTypeFilter )
{
DWORD dwSize = (wcslen(wszPathname)+1)*sizeof(WCHAR);
awszNames[cNames] = (LPWSTR)CoTaskMemAlloc( dwSize );
if ( awszNames[cNames] == NULL )
{
hr = WBEM_E_OUT_OF_MEMORY;
break;
}
wcscpy( awszNames[cNames], wszPathname );
cNames++;
}
}
if ( FAILED(hr) )
{
for( i=0; i < cNames; i++ )
{
CoTaskMemFree( awszNames[i] );
}
CoTaskMemFree( awszNames );
}
CALLFUNC(MQFreeMemory)( MgmtPropVar.calpwstr.pElems );
*ppwszNames = awszNames;
*pcNames = cNames;
return hr;
EXIT_API_CALL
}