mirror of https://github.com/tongzx/nt5src
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.
286 lines
5.8 KiB
286 lines
5.8 KiB
/*++
|
|
|
|
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
|
|
}
|
|
|
|
|
|
|
|
|