6 Appendix A: Full IDL
For ease of implementation, the full IDL is provided below, where "ms-dtyp.idl" is the IDL found in [MS-DTYP] Appendix A (section 5), "ms-mqrr.idl" is the IDL found in [MS-MQRR] Appendix A (section 6), and "ms-mqmq.idl" is the IDL found in [MS-MQMQ] Appendix A (section 5).
-
// Please refer to [MS-MQMQ] for definitions of the // following types: // MULTICAST_ID // OBJECTID // PROPVARIANT // QUEUE_FORMAT // XACTUOW import "ms-mqmq.idl"; // Please refer to [MS-MQRR] for definitions of the // following types: // DL_ID import "ms-mqrr.idl"; // Please refer to [MS-DTYP] for definitions of the // following types: // DWORD // GUID [ uuid(fdb3a030-065f-11d1-bb9b-00a024ea5525), version(1.0), pointer_default(unique) ] interface qmcomm { typedef struct CACCreateRemoteCursor { DWORD hCursor; DWORD srv_hACQueue; DWORD cli_pQMQueue; } CACCreateRemoteCursor; typedef enum { CACTB_SEND = 0, CACTB_RECEIVE, CACTB_CREATECURSOR } TRANSFER_TYPE; typedef struct CACTransferBufferV1 { [range(0,2)] DWORD uTransferType; [switch_is(uTransferType)] union { [case(CACTB_SEND)] struct { QUEUE_FORMAT* pAdminQueueFormat; QUEUE_FORMAT* pResponseQueueFormat; } Send; [case(CACTB_RECEIVE)] struct { DWORD RequestTimeout; DWORD Action; DWORD Asynchronous; DWORD Cursor; [range(0,1024)] DWORD ulResponseFormatNameLen; [size_is(,ulResponseFormatNameLen)] WCHAR** ppResponseFormatName; DWORD* pulResponseFormatNameLenProp; [range(0,1024)] DWORD ulAdminFormatNameLen; [size_is(,ulAdminFormatNameLen)] WCHAR** ppAdminFormatName; DWORD* pulAdminFormatNameLenProp; [range(0,1024)] DWORD ulDestFormatNameLen; [size_is(,ulDestFormatNameLen)] WCHAR** ppDestFormatName; DWORD* pulDestFormatNameLenProp; [range(0,1024)] DWORD ulOrderingFormatNameLen; [size_is(,ulOrderingFormatNameLen)] WCHAR** ppOrderingFormatName; DWORD* pulOrderingFormatNameLenProp; } Receive; [case(CACTB_CREATECURSOR)] struct CACCreateRemoteCursor CreateCursor; }; unsigned short* pClass; OBJECTID** ppMessageID; [size_is(,20), length_is(,20)] unsigned char** ppCorrelationID; DWORD* pSentTime; DWORD* pArrivedTime; unsigned char* pPriority; unsigned char* pDelivery; unsigned char* pAcknowledge; unsigned char* pAuditing; DWORD* pApplicationTag; [size_is(,ulAllocBodyBufferInBytes), length_is(,ulBodyBufferSizeInBytes)] unsigned char** ppBody; DWORD ulBodyBufferSizeInBytes; DWORD ulAllocBodyBufferInBytes; DWORD* pBodySize; [size_is(,ulTitleBufferSizeInWCHARs), length_is(,ulTitleBufferSizeInWCHARs)] WCHAR** ppTitle; DWORD ulTitleBufferSizeInWCHARs; DWORD* pulTitleBufferSizeInWCHARs; DWORD ulAbsoluteTimeToQueue; DWORD* pulRelativeTimeToQueue; DWORD ulRelativeTimeToLive; DWORD* pulRelativeTimeToLive; unsigned char* pTrace; DWORD* pulSenderIDType; [size_is(,uSenderIDLen)] unsigned char** ppSenderID; DWORD* pulSenderIDLenProp; DWORD* pulPrivLevel; DWORD ulAuthLevel; unsigned char* pAuthenticated; DWORD* pulHashAlg; DWORD* pulEncryptAlg; [size_is(,ulSenderCertLen)] unsigned char** ppSenderCert; DWORD ulSenderCertLen; DWORD* pulSenderCertLenProp; [size_is(,ulProvNameLen)] WCHAR** ppwcsProvName; DWORD ulProvNameLen; DWORD* pulAuthProvNameLenProp; DWORD* pulProvType; long fDefaultProvider; [size_is(,ulSymmKeysSize)] unsigned char** ppSymmKeys; DWORD ulSymmKeysSize; DWORD* pulSymmKeysSizeProp; unsigned char bEncrypted; unsigned char bAuthenticated; unsigned short uSenderIDLen; [size_is(,ulSignatureSize)] unsigned char** ppSignature; DWORD ulSignatureSize; DWORD* pulSignatureSizeProp; GUID** ppSrcQMID; XACTUOW* pUow; [size_is(,ulMsgExtensionBufferInBytes), length_is(,ulMsgExtensionBufferInBytes)] unsigned char** ppMsgExtension; DWORD ulMsgExtensionBufferInBytes; DWORD* pMsgExtensionSize; GUID** ppConnectorType; DWORD* pulBodyType; DWORD* pulVersion; } CACTransferBufferV1; typedef struct CACTransferBufferV2 { struct CACTransferBufferV1 old; unsigned char* pbFirstInXact; unsigned char* pbLastInXact; OBJECTID** ppXactID; } CACTransferBufferV2; typedef struct OBJECT_FORMAT { [range(1,2)] DWORD ObjType; [switch_is(ObjType)] union { [case(1)] QUEUE_FORMAT* pQueueFormat; }; } OBJECT_FORMAT; typedef [context_handle] void* PCTX_OPENREMOTE_HANDLE_TYPE; typedef [context_handle] void* RPC_QUEUE_HANDLE; typedef [context_handle] void* RPC_INT_XACT_HANDLE; // opnum 0 void Opnum0NotUsedOnWire (void); // opnum 1 HRESULT R_QMGetRemoteQueueName( [in] handle_t hBind, [in] DWORD pQueue, [in, out, ptr, string] WCHAR** lplpRemoteQueueName ); // opnum 2 HRESULT R_QMOpenRemoteQueue( [in] handle_t hBind, [out] PCTX_OPENREMOTE_HANDLE_TYPE *pphContext, [out] DWORD *pdwContext, [in, unique] QUEUE_FORMAT *pQueueFormat, [in] DWORD dwCallingProcessID, [in] DWORD dwDesiredAccess, [in] DWORD dwShareMode, [in] GUID* pLicGuid, [in] DWORD dwMQS, [out] DWORD *dwpQueue, [out] DWORD *phQueue ); // opnum 3 void R_QMCloseRemoteQueueContext( [in, out] PCTX_OPENREMOTE_HANDLE_TYPE *pphContext ); // opnum 4 HRESULT R_QMCreateRemoteCursor( [in] handle_t hBind, [in] struct CACTransferBufferV1 * ptb1, [in] DWORD hQueue, [out] DWORD * phCursor ); // opnum 5 void Opnum5NotUsedOnWire (void); // opnum 6 HRESULT R_QMCreateObjectInternal( [in] handle_t hBind, [in] DWORD dwObjectType, [in, string] const WCHAR* lpwcsPathName, [in, range(0, 524288)] DWORD SDSize, [in, unique, size_is (SDSize)] unsigned char *pSecurityDescriptor, [in, range(1, 128)] DWORD cp, [in, size_is (cp)] DWORD aProp[], [in, size_is (cp)] PROPVARIANT apVar[] ); // opnum 7 HRESULT R_QMSetObjectSecurityInternal( [in] handle_t hBind, [in] struct OBJECT_FORMAT* pObjectFormat, [in] DWORD SecurityInformation, [in, range(0, 524288)] DWORD SDSize, [in, unique, size_is (SDSize)] unsigned char *pSecurityDescriptor); // opnum 8 HRESULT R_QMGetObjectSecurityInternal( [in] handle_t hBind, [in] struct OBJECT_FORMAT* pObjectFormat, [in] DWORD RequestedInformation, [out, size_is (nLength)] unsigned char *pSecurityDescriptor, [in, range(0, 524288)] DWORD nLength, [out] DWORD* lpnLengthNeeded ); // opnum 9 HRESULT R_QMDeleteObject( [in] handle_t hBind, [in] struct OBJECT_FORMAT* pObjectFormat ); // opnum 10 HRESULT R_QMGetObjectProperties( [in] handle_t hBind, [in] struct OBJECT_FORMAT* pObjectFormat, [in, range(1, 128)] DWORD cp, [in, size_is (cp )] DWORD aProp[], [in, out, size_is(cp )] PROPVARIANT apVar[] ); // opnum 11 HRESULT R_QMSetObjectProperties( [in] handle_t hBind, [in] struct OBJECT_FORMAT* pObjectFormat, [in, range(1, 128)] DWORD cp, [in, unique, size_is (cp )] DWORD aProp[], [in, unique, size_is(cp )] PROPVARIANT apVar[] ); // opnum 12 HRESULT R_QMObjectPathToObjectFormat( [in] handle_t hBind, [in, string] const WCHAR* lpwcsPathName, [in, out] struct OBJECT_FORMAT *pObjectFormat ); // opnum 13 void Opnum13NotUsedOnWire (void); // opnum 14 HRESULT R_QMGetTmWhereabouts( [in] handle_t hBind, [in, range(0, 131072)] DWORD cbBufSize, [out, size_is (cbBufSize)] unsigned char* pbWhereabouts, [out] DWORD *pcbWhereabouts ); // opnum 15 HRESULT R_QMEnlistTransaction( [in] handle_t hBind, [in] XACTUOW* pUow, [in, range(0, 131072)] DWORD cbCookie, [in, size_is (cbCookie)] unsigned char* pbCookie ); // opnum 16 HRESULT R_QMEnlistInternalTransaction( [in] handle_t hBind, [in] XACTUOW* pUow, [out] RPC_INT_XACT_HANDLE* phIntXact ); // opnum 17 HRESULT R_QMCommitTransaction( [in, out] RPC_INT_XACT_HANDLE* phIntXact ); // opnum 18 HRESULT R_QMAbortTransaction( [in, out] RPC_INT_XACT_HANDLE* phIntXact ); // opnum 19 HRESULT rpc_QMOpenQueueInternal( [in] handle_t hBind, [in] QUEUE_FORMAT* pQueueFormat, [in] DWORD dwDesiredAccess, [in] DWORD dwShareMode, [in] DWORD hRemoteQueue, [in, out, ptr, string] WCHAR** lplpRemoteQueueName, [in] DWORD* dwpQueue, [in] GUID* pLicGuid, [in, string] WCHAR* lpClientName, [out] DWORD* pdwQMContext, [out] RPC_QUEUE_HANDLE* phQueue, [in] DWORD dwRemoteProtocol, [in] DWORD dwpRemoteContext ); // opnum 20 HRESULT rpc_ACCloseHandle( [in, out] RPC_QUEUE_HANDLE* phQueue ); // opnum 21 void Opnum21NotUsedOnWire (void); // opnum 22 HRESULT rpc_ACCloseCursor( [in] RPC_QUEUE_HANDLE hQueue, [in] DWORD hCursor ); // opnum 23 HRESULT rpc_ACSetCursorProperties( [in] RPC_QUEUE_HANDLE hProxy, [in] DWORD hCursor, [in] DWORD hRemoteCursor ); // opnum 24 void Opnum24NotUsedOnWire (void); // opnum 25 void Opnum25NotUsedOnWire(void); // opnum 26 HRESULT rpc_ACHandleToFormatName( [in] RPC_QUEUE_HANDLE hQueue, [in, range(0, 524288)] DWORD dwFormatNameRPCBufferLen, [in, out, unique, size_is(dwFormatNameRPCBufferLen), length_is(dwFormatNameRPCBufferLen)] WCHAR* lpwcsFormatName, [in, out] DWORD* pdwLength ); // opnum 27 HRESULT rpc_ACPurgeQueue( [in] RPC_QUEUE_HANDLE hQueue ); // opnum 28 HRESULT R_QMQueryQMRegistryInternal( [in] handle_t hBind, [in] DWORD dwQueryType, [out, string] WCHAR** lplpMQISServer ); // opnum 29 void Opnum29NotUsedOnWire (void); // opnum 30 void Opnum30NotUsedOnWire (void); // opnum 31 DWORD R_QMGetRTQMServerPort( [in] handle_t hBind, [in] DWORD fIP ); // opnum 32 void Opnum32NotUsedOnWire (void); // opnum 33 void Opnum33NotUsedOnWire (void); // opnum 34 void Opnum34NotUsedOnWire(void); } // interface qmcomm [ uuid(76d12b80-3467-11d3-91ff-0090272f9ea3), version(1.0), pointer_default(unique) ] interface qmcomm2 { // opnum 0 HRESULT QMSendMessageInternalEx( [in] handle_t hBind, [in] QUEUE_FORMAT * pQueueFormat, [in] struct CACTransferBufferV2 * ptb, [in, out, unique] OBJECTID * pMessageID ); // opnum 1 HRESULT rpc_ACSendMessageEx( [in] RPC_QUEUE_HANDLE hQueue, [in] struct CACTransferBufferV2 * ptb, [in, out, unique] OBJECTID * pMessageID ); // opnum 2 HRESULT rpc_ACReceiveMessageEx( [in] handle_t hBind, [in] DWORD hQMContext, [in, out] struct CACTransferBufferV2 * ptb ); // opnum 3 HRESULT rpc_ACCreateCursorEx( [in] RPC_QUEUE_HANDLE hQueue, [in, out] struct CACCreateRemoteCursor * pcc ); } // interface qmcomm2