⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scutil.cxx

📁 Windows CE 6.0 Server 源码
💻 CXX
📖 第 1 页 / 共 4 页
字号:
//
// 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 + -