📄 scutil.cxx
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft shared
// source or premium shared source license agreement under which you licensed
// this source code. If you did not accept the terms of the license agreement,
// you are not authorized to use this source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the SOURCE.RTF on your install media or the root of your tools installation.
// THE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES.
//
/*++
Module Name:
scutil.cxx
Abstract:
Small client utilities
--*/
#include <sc.hxx>
#include <mq.h>
#include <scapi.h>
#include <scfile.hxx>
#include <scutil.hxx>
#include <scpacket.hxx>
#include <scqueue.hxx>
#include <scqman.hxx>
#include <srmpDefs.hxx>
#include <mq.h>
#include <mqformat.h>
#include <pkfuncs.h>
#include <service.h>
void scutil_uuidgen (GUID *pguid) {
if (gMachine->CeGenerateGUID && (gMachine->CeGenerateGUID (pguid) == 0))
return;
static int iserial = 0;
SYSTEMTIME st;
GetLocalTime (&st);
SystemTimeToFileTime (&st, (FILETIME *)pguid->Data4);
pguid->Data1 = ++iserial;
if (! iserial)
srand (*(unsigned int *)pguid->Data4);
pguid->Data2 = rand ();
pguid->Data3 = rand ();
}
unsigned int scutil_now (void) {
SYSTEMTIME st;
GetSystemTime (&st);
LARGE_INTEGER ft;
SystemTimeToFileTime (&st, (FILETIME *)&ft);
ft.QuadPart -= 0x019db1ded53e8000;
ft.QuadPart /= 10000000;
return ft.LowPart;
}
static WCHAR *scutil_MachineJournalQueue (void) {
WCHAR szMJQ[_MAX_PATH];
if (FAILED(StringCchPrintfW(szMJQ, _MAX_PATH, L"MACHINE=" SC_GUID_FORMAT L";JOURNAL", SC_GUID_ELEMENTS((&gMachine->guid)))))
return NULL;
return svsutil_wcsdup (szMJQ);
}
static WCHAR *scutil_DeadLetterQueue (void) {
WCHAR szDLQ[_MAX_PATH];
if (FAILED(StringCchPrintfW(szDLQ, _MAX_PATH, L"MACHINE=" SC_GUID_FORMAT L";DEADLETTER", SC_GUID_ELEMENTS((&gMachine->guid)))))
return NULL;
return svsutil_wcsdup (szDLQ);
}
/*
int scutil_IsDeadLetterFormatName (WCHAR *a_lpszFormatName) {
if (wcsnicmp (a_lpszFormatName, MSMQ_SC_FORMAT_MACHINE, SVSUTIL_CONSTSTRLEN (MSMQ_SC_FORMAT_MACHINE)) != 0)
return FALSE;
WCHAR *p = wcsrchr (a_lpszFormatName, L';');
if ((! p) || (wcsicmp (p, MSMQ_SC_FORMAT_DEADLT) != 0))
return FALSE;
WCHAR *lpTrueDLQ = scutil_DeadLetterQueue ();
int iRes = wcsicmp (a_lpszFormatName, lpTrueDLQ) == 0;
g_funcFree (lpTrueDLQ, g_pvFreeData);
return iRes;
}
*/
//
// Pathname is of a form machine[\\private$]\\filename
//
// Only private and direct formats are supported, so insist on them.
//
WCHAR *scutil_MakeFormatName (WCHAR *a_lpszPathName, ScQueueParms *a_pqp) {
SVSUTIL_ASSERT (a_lpszPathName && a_pqp);
SVSUTIL_ASSERT (a_pqp->bIsIncoming);
SVSUTIL_ASSERT (a_pqp->bFormatType == SCFILE_QP_FORMAT_OS);
if (a_pqp->bIsDeadLetter)
return scutil_DeadLetterQueue ();
if (a_pqp->bIsMachineJournal)
return scutil_MachineJournalQueue ();
WCHAR *lpHost = a_lpszPathName;
WCHAR *lpPath = wcschr (a_lpszPathName, L'\\');
if (! lpPath)
return NULL;
int ccHostName = lpPath - a_lpszPathName;
if ((ccHostName == 1) && (*lpHost == L'.')) {
lpHost = gMachine->lpszHostName;
ccHostName = wcslen (lpHost);
}
int ccQueueName = wcslen (lpPath) + 1;
int ccTag = 0;
if (a_pqp->bIsJournal)
ccTag = SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_JOURNAL);
WCHAR *lpszFormatName = (WCHAR *)g_funcAlloc ((ccQueueName + ccHostName + ccTag +
SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_OS)) * sizeof(WCHAR), g_pvAllocData);
if (! lpszFormatName)
return NULL;
memcpy (lpszFormatName, MSMQ_SC_FORMAT_DIRECT_OS, sizeof(WCHAR) * SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_OS));
memcpy (&lpszFormatName[SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_OS)], lpHost, ccHostName * sizeof(WCHAR));
memcpy (&lpszFormatName[ccHostName + SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_OS)], lpPath, ccQueueName * sizeof(WCHAR));
if (a_pqp->bIsJournal)
memcpy (&lpszFormatName[ccHostName + ccQueueName + SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_OS) - 1], MSMQ_SC_FORMAT_JOURNAL, sizeof (MSMQ_SC_FORMAT_JOURNAL));
return lpszFormatName;
}
WCHAR *scutil_MakeFormatName (WCHAR *a_lpszHostName, WCHAR *a_lpszQueueName, ScQueueParms *a_pqp) {
if (a_pqp->bIsDeadLetter)
return scutil_DeadLetterQueue ();
if (a_pqp->bIsMachineJournal)
return scutil_MachineJournalQueue ();
int ccHostNameLen = wcslen (a_lpszHostName);
int ccQueueNameLen = wcslen (a_lpszQueueName);
int ccx1 = (a_pqp->bFormatType == SCFILE_QP_FORMAT_HTTP) ? SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_HTTP) :
((a_pqp->bFormatType == SCFILE_QP_FORMAT_HTTPS) ? SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_HTTPS) :
((a_pqp->bFormatType == SCFILE_QP_FORMAT_TCP) ? SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_TCP) :
SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_OS)));
int ccx2 = a_pqp->bIsPublic ? 0 : SVSUTIL_CONSTSTRLEN(MSMQ_SC_PATHNAME_PRIVATE) + 1;
int ccTag = 0;
if (a_pqp->bIsJournal)
ccTag = SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_JOURNAL);
WCHAR *lpszFormatName = (WCHAR *)g_funcAlloc ((ccQueueNameLen + ccHostNameLen + ccx1 + ccx2 + 2 + ccTag) * sizeof(WCHAR), g_pvAllocData);
if (! lpszFormatName)
return NULL;
WCHAR chPathSeparator;
switch (a_pqp->bFormatType) {
case SCFILE_QP_FORMAT_HTTP:
memcpy (lpszFormatName, MSMQ_SC_FORMAT_DIRECT_HTTP, sizeof(MSMQ_SC_FORMAT_DIRECT_HTTP));
chPathSeparator = L'/';
break;
case SCFILE_QP_FORMAT_HTTPS:
memcpy (lpszFormatName, MSMQ_SC_FORMAT_DIRECT_HTTPS, sizeof(MSMQ_SC_FORMAT_DIRECT_HTTPS));
chPathSeparator = L'/';
break;
case SCFILE_QP_FORMAT_TCP:
memcpy (lpszFormatName, MSMQ_SC_FORMAT_DIRECT_TCP, sizeof(MSMQ_SC_FORMAT_DIRECT_TCP));
chPathSeparator = L'\\';
break;
default:
memcpy (lpszFormatName, MSMQ_SC_FORMAT_DIRECT_OS, sizeof(MSMQ_SC_FORMAT_DIRECT_OS));
chPathSeparator = L'\\';
break;
}
memcpy (&lpszFormatName[ccx1], a_lpszHostName, ccHostNameLen * sizeof(WCHAR));
lpszFormatName[ccx1 + ccHostNameLen] = chPathSeparator;
if (ccx2) {
memcpy (&lpszFormatName[ccHostNameLen + ccx1 + 1], MSMQ_SC_PATHNAME_PRIVATE, (ccx2 - 1) * sizeof(WCHAR));
lpszFormatName[ccx1 + ccx2 + ccHostNameLen] = chPathSeparator;
}
memcpy (&lpszFormatName[ccHostNameLen + ccx1 + ccx2 + 1], a_lpszQueueName, (ccQueueNameLen + 1) * sizeof(WCHAR));
if (a_pqp->bIsJournal)
memcpy (&lpszFormatName[ccHostNameLen + ccQueueNameLen + ccx1 + ccx2 + 1], MSMQ_SC_FORMAT_JOURNAL, sizeof (MSMQ_SC_FORMAT_JOURNAL));
return lpszFormatName;
}
//
// Note: supported format names are
// DIRECT=OS:machinename[\private$]\queuename
// DIRECT=TCP:ipaddress[\private$]\queuename
// DIRECT=HTTP://machinename/queuename
// DIRECT=HTTPS://machinename/queuename
//
int scutil_ParseNonLocalDirectFormatName (WCHAR *a_lpszFormatName, WCHAR *&a_lpszHostName, WCHAR *&a_lpszQueueName, ScQueueParms *a_pqp) {
SVSUTIL_ASSERT (a_lpszFormatName && a_pqp);
SVSUTIL_ASSERT (! a_pqp->bIsIncoming);
a_lpszHostName = NULL;
a_lpszQueueName = NULL;
WCHAR *ptr, *ptr2;
if (wcsnicmp (a_lpszFormatName, MSMQ_SC_FORMAT_DIRECT_OS, SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_OS)) == 0) {
a_pqp->bFormatType = SCFILE_QP_FORMAT_OS;
ptr = &a_lpszFormatName[SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_OS)];
ptr2 = wcschr (ptr, L'\\');
} else if (wcsnicmp (a_lpszFormatName, MSMQ_SC_FORMAT_DIRECT_TCP, SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_TCP)) == 0) {
a_pqp->bFormatType = SCFILE_QP_FORMAT_TCP;
ptr = &a_lpszFormatName[SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_TCP)];
ptr2 = wcschr (ptr, L'\\');
} else if (wcsnicmp (a_lpszFormatName, MSMQ_SC_FORMAT_DIRECT_HTTP, SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_HTTP)) == 0) {
a_pqp->bFormatType = SCFILE_QP_FORMAT_HTTP;
ptr = &a_lpszFormatName[SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_HTTP)];
ptr2 = wcschr (ptr, L'/');
} else if (wcsnicmp (a_lpszFormatName, MSMQ_SC_FORMAT_DIRECT_HTTPS, SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_HTTPS)) == 0) {
a_pqp->bFormatType = SCFILE_QP_FORMAT_HTTPS;
ptr = &a_lpszFormatName[SVSUTIL_CONSTSTRLEN(MSMQ_SC_FORMAT_DIRECT_HTTPS)];
ptr2 = wcschr (ptr, L'/');
} else
return FALSE;
if (! ptr2)
return FALSE;
WCHAR *ptr3;
if (((a_pqp->bFormatType == SCFILE_QP_FORMAT_OS) || (a_pqp->bFormatType == SCFILE_QP_FORMAT_TCP)) &&
(wcsnicmp (ptr2 + 1, MSMQ_SC_PATHNAME_PRIVATE, SVSUTIL_CONSTSTRLEN(MSMQ_SC_PATHNAME_PRIVATE)) == 0)) {
ptr3 = ptr2 + 1 + SVSUTIL_CONSTSTRLEN(MSMQ_SC_PATHNAME_PRIVATE);
a_pqp->bIsPublic = FALSE;
} else {
ptr3 = ptr2;
a_pqp->bIsPublic = TRUE;
}
if (*ptr3 != *ptr2)
return FALSE;
++ptr3;
if (*ptr3 == '\0')
return FALSE;
WCHAR *ptr4 = wcschr (ptr3, L';');
int ccHostName = ptr2 - ptr;
if ((ccHostName == 1) && (*ptr == L'.')) {
ptr = gMachine->lpszHostName;
ccHostName = wcslen (ptr);
}
if (wcsnicmp(gMachine->lpszHostName, ptr, ccHostName) == 0) {
a_pqp->bIsIncoming = TRUE;
return FALSE;
}
a_lpszHostName = (WCHAR *)g_funcAlloc ((ccHostName + 1) * sizeof(WCHAR), g_pvAllocData);
if (! a_lpszHostName)
return FALSE;
memcpy (a_lpszHostName, ptr, ccHostName * sizeof(WCHAR));
a_lpszHostName[ccHostName] = L'\0';
if (scutil_IsLocalTCP (a_lpszHostName)) {
g_funcFree (a_lpszHostName, g_pvFreeData);
a_lpszHostName = NULL;
a_pqp->bIsIncoming = TRUE;
return FALSE;
}
int ccQueueName = ptr4 ? ptr4 - ptr3 : wcslen(ptr3);
a_lpszQueueName = (WCHAR *)g_funcAlloc ((ccQueueName + 1) * sizeof(WCHAR), g_pvAllocData);
if (! a_lpszQueueName) {
g_funcFree (a_lpszHostName, g_pvFreeData);
a_lpszHostName = NULL;
return FALSE;
}
memcpy (a_lpszQueueName, ptr3, ccQueueName * sizeof(WCHAR));
a_lpszQueueName[ccQueueName] = L'\0';
return TRUE;
}
int scutil_ParsePathName (WCHAR *a_lpszPathName, WCHAR *&a_lpszHostName, WCHAR *&a_lpszQueueName, ScQueueParms *a_pqp) {
SVSUTIL_ASSERT (a_lpszPathName && a_pqp);
a_lpszHostName = NULL;
a_lpszQueueName = NULL;
WCHAR chPathSeparator = ((a_pqp->bFormatType == SCFILE_QP_FORMAT_HTTP) || (a_pqp->bFormatType == SCFILE_QP_FORMAT_HTTPS)) ? L'/' : L'\\';
if (wcschr (a_lpszPathName, L';'))
return FALSE;
WCHAR *ptr = a_lpszPathName;
WCHAR *ptr2 = wcschr (ptr, chPathSeparator);
if (! ptr2)
return FALSE;
WCHAR *ptr3;
int bIsPublic;
if (wcsnicmp (ptr2 + 1, MSMQ_SC_PATHNAME_PRIVATE, SVSUTIL_CONSTSTRLEN(MSMQ_SC_PATHNAME_PRIVATE)) == 0) {
ptr3 = ptr2 + 1 + SVSUTIL_CONSTSTRLEN(MSMQ_SC_PATHNAME_PRIVATE);
bIsPublic = FALSE;
} else {
ptr3 = ptr2;
bIsPublic = TRUE;
}
if (*ptr3 != chPathSeparator)
return FALSE;
++ptr3;
if (*ptr3 == '\0')
return FALSE;
int ccHostName = ptr2 - ptr;
if ((ccHostName == 1) && (*ptr == L'.')) {
ptr = gMachine->lpszHostName;
ccHostName = wcslen (ptr);
}
int bIsIncoming = (wcsnicmp(gMachine->lpszHostName, ptr, ccHostName) == 0);
if (bIsIncoming && bIsPublic)
return FALSE;
a_lpszHostName = (WCHAR *)g_funcAlloc ((ccHostName + 1) * sizeof(WCHAR), g_pvAllocData);
if (! a_lpszHostName)
return FALSE;
memcpy (a_lpszHostName, ptr, ccHostName * sizeof(WCHAR));
a_lpszHostName[ccHostName] = L'\0';
int ccQueueName = wcslen(ptr3);
a_lpszQueueName = (WCHAR *)g_funcAlloc ((ccQueueName + 1) * sizeof(WCHAR), g_pvAllocData);
if (! a_lpszQueueName) {
g_funcFree (a_lpszHostName, g_pvFreeData);
a_lpszHostName = NULL;
return FALSE;
}
memcpy (a_lpszQueueName, ptr3, ccQueueName * sizeof(WCHAR));
a_lpszQueueName[ccQueueName] = L'\0';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -