uuid-win.cpp revision a7a2dfae0fe088f875fe44119084c8329fdc60ac
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee/* $Id$ */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee/** @file
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * IPRT - UUID, Windows implementation.
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht/*
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * Copyright (C) 2006-2007 Sun Microsystems, Inc.
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee *
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * This file is part of VirtualBox Open Source Edition (OSE), as
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * available from http://www.virtualbox.org. This file is free software;
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * you can redistribute it and/or modify it under the terms of the GNU
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * General Public License (GPL) as published by the Free Software
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * Foundation, in version 2 as it comes in the "COPYING" file of the
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee *
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * The contents of this file may alternatively be used under the terms
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * of the Common Development and Distribution License Version 1.0
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * VirtualBox OSE distribution, in which case the provisions of the
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * CDDL are applicable instead of those of the GPL.
06bbe1e05e4f6fd0773ee85a50c0de7adfc4fa06edp *
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * You may elect to license modified versions of this file under the
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * terms and conditions of either the GPL or the CDDL or both.
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee *
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * Clara, CA 95054 USA or visit http://www.sun.com if you need
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * additional information or have any questions.
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee/*******************************************************************************
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee* Header Files *
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee*******************************************************************************/
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee#define LOG_GROUP RTLOGGROUP_UUID
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee#include <Windows.h>
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee#include <iprt/uuid.h>
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee#include <iprt/assert.h>
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee#include <iprt/string.h>
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee#include <iprt/err.h>
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlcleeRTDECL(int) RTUuidClear(PRTUUID pUuid)
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee{
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee /* check params */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee AssertPtrReturn(pUuid, VERR_INVALID_POINTER);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee return RTErrConvertFromWin32(UuidCreateNil((UUID *)pUuid));
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee}
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlcleeRTDECL(bool) RTUuidIsNull(PCRTUUID pUuid)
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee{
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee /* check params */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee AssertPtrReturn(pUuid, true);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht RPC_STATUS status;
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee return !!UuidIsNil((UUID *)pUuid, &status);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee}
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
843e19887f64dde75055cf8842fc4db2171eff45johnlevRTDECL(int) RTUuidCompare(PCRTUUID pUuid1, PCRTUUID pUuid2)
06bbe1e05e4f6fd0773ee85a50c0de7adfc4fa06edp{
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /*
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht * Special cases.
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht if (pUuid1 == pUuid2)
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht return 0;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht if (!pUuid1)
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht return RTUuidIsNull(pUuid2) ? 0 : -1;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht if (!pUuid2)
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht return RTUuidIsNull(pUuid1) ? 0 : 1;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertPtrReturn(pUuid1, -1);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertPtrReturn(pUuid2, 1);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /*
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht * Hand the rest to the Windows API.
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht RPC_STATUS status;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht return UuidCompare((UUID *)pUuid1, (UUID *)pUuid2, &status);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht}
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlcleeRTDECL(int) RTUuidCompareStr(PCRTUUID pUuid1, const char *pszString2)
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee{
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee /* check params */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee AssertPtrReturn(pUuid1, -1);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertPtrReturn(pszString2, 1);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee /*
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * Try convert the string to a UUID and then compare the two.
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht RTUUID Uuid2;
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee int rc = RTUuidFromStr(&Uuid2, pszString2);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertRCReturn(rc, 1);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht return RTUuidCompare(pUuid1, &Uuid2);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee}
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlcleeRTDECL(int) RTUuidCompare2Strs(const char *pszString1, const char *pszString2)
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht{
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee RTUUID Uuid1;
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee RTUUID Uuid2;
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee int rc;
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee /* check params */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertPtrReturn(pszString1, -1);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertPtrReturn(pszString2, 1);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /*
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * Try convert the strings to UUIDs and then compare them.
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee rc = RTUuidFromStr(&Uuid1, pszString1);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee AssertRCReturn(rc, -1);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee rc = RTUuidFromStr(&Uuid2, pszString2);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee AssertRCReturn(rc, 1);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee return RTUuidCompare(&Uuid1, &Uuid2);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee}
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlcleeRTDECL(int) RTUuidToStr(PCRTUUID pUuid, char *pszString, size_t cchString)
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee{
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /* check params */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee AssertPtrReturn(pUuid, VERR_INVALID_POINTER);
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee AssertPtrReturn(pszString, VERR_INVALID_POINTER);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertReturn(cchString >= RTUUID_STR_LENGTH, VERR_INVALID_PARAMETER);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /*
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * Try convert it.
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee *
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * The API allocates a new string buffer for us, so we can do our own
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee * buffer overflow handling.
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee RPC_STATUS Status;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht unsigned char *pszTmpStr = NULL;
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee#ifdef RPC_UNICODE_SUPPORTED
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /* always use ASCII version! */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht Status = UuidToStringA((UUID *)pUuid, &pszTmpStr);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht#else
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee Status = UuidToString((UUID *)pUuid, &pszTmpStr);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht#endif
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht if (Status != RPC_S_OK)
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht return RTErrConvertFromWin32(Status);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /* copy it. */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht int rc = VINF_SUCCESS;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht size_t cchTmpStr = strlen((char *)pszTmpStr);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht if (cchTmpStr < cchString)
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht memcpy(pszString, pszTmpStr, cchTmpStr + 1);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht else
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht {
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertFailed();
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht rc = ERROR_BUFFER_OVERFLOW;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht }
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /* free buffer */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht#ifdef RPC_UNICODE_SUPPORTED
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /* always use ASCII version! */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht RpcStringFreeA(&pszTmpStr);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht#else
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht RpcStringFree(&pszTmpStr);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht#endif
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /* all done */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht return rc;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht}
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlcleeRTDECL(int) RTUuidFromStr(PRTUUID pUuid, const char *pszString)
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee{
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee /* check params */
3ccda6479cf240cd732ac4b7a8a82fcc1716496dlclee AssertPtrReturn(pUuid, VERR_INVALID_POINTER);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht AssertPtrReturn(pszString, VERR_INVALID_POINTER);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht RPC_STATUS rc;
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht#ifdef RPC_UNICODE_SUPPORTED
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht /* always use ASCII version! */
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht rc = UuidFromStringA((unsigned char *)pszString, (UUID *)pUuid);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht#else
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht rc = UuidFromString((unsigned char *)pszString, (UUID *)pUuid);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht#endif
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht return RTErrConvertFromWin32(rc);
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht}
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht
e8fb11a1575b42dcd5c49341c588d9f6cd636135shidokht