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.
182 lines
3.4 KiB
182 lines
3.4 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
Guid.cpp
|
|
|
|
Abstract:
|
|
|
|
Functions for converting strings to GUIDs.
|
|
|
|
Taken from \\index2\sdnt\ds\security\cryptoapi\common\unicode\guid.cpp
|
|
|
|
Notes:
|
|
|
|
Unicode only - Windows 2000 & XP
|
|
|
|
History:
|
|
|
|
01/02/2002 rparsons Created
|
|
|
|
--*/
|
|
#include "main.h"
|
|
|
|
static const BYTE GuidMap[] = { 3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-',
|
|
8, 9, '-', 10, 11, 12, 13, 14, 15 };
|
|
|
|
static const WCHAR wszDigits[] = L"0123456789ABCDEF";
|
|
|
|
static
|
|
BOOL
|
|
HexStringToDword(
|
|
IN LPCWSTR FAR& pwsz,
|
|
IN DWORD FAR& Value,
|
|
IN int cDigits,
|
|
IN WCHAR chDelim
|
|
)
|
|
{
|
|
int Count;
|
|
|
|
Value = 0;
|
|
for (Count = 0; Count < cDigits; Count++, pwsz++)
|
|
{
|
|
if (*pwsz >= '0' && *pwsz <= '9')
|
|
{
|
|
Value = (Value << 4) + *pwsz - '0';
|
|
}
|
|
else if (*pwsz >= 'A' && *pwsz <= 'F')
|
|
{
|
|
Value = (Value << 4) + *pwsz - 'A' + 10;
|
|
}
|
|
else if (*pwsz >= 'a' && *pwsz <= 'f')
|
|
{
|
|
Value = (Value << 4) + *pwsz - 'a' + 10;
|
|
}
|
|
else
|
|
{
|
|
return(FALSE);
|
|
}
|
|
}
|
|
|
|
if (chDelim != 0)
|
|
{
|
|
return *pwsz++ == chDelim;
|
|
}
|
|
else
|
|
{
|
|
return(TRUE);
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
StringToGuid(
|
|
IN LPCWSTR pwszIn,
|
|
OUT GUID* pgOut
|
|
)
|
|
{
|
|
if (!(pwszIn) || !(pgOut))
|
|
{
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(FALSE);
|
|
}
|
|
|
|
if (*pwszIn != '{') // only support v2 guids!
|
|
{
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(FALSE);
|
|
}
|
|
|
|
if (wcslen(pwszIn) != 38)
|
|
{
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
return(FALSE);
|
|
}
|
|
|
|
WCHAR *pwsz;
|
|
|
|
pwsz = (WCHAR *)&pwszIn[1]; // pass the first {
|
|
|
|
memset(pgOut, 0x00, sizeof(GUID));
|
|
|
|
DWORD dw;
|
|
|
|
if (!(HexStringToDword(pwsz, pgOut->Data1, sizeof(DWORD)*2, '-')))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(WORD)*2, '-')))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data2 = (WORD)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(WORD)*2, '-')))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data3 = (WORD)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data4[0] = (BYTE)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, '-')))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data4[1] = (BYTE)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data4[2] = (BYTE)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data4[3] = (BYTE)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data4[4] = (BYTE)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data4[5] = (BYTE)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data4[6] = (BYTE)dw;
|
|
|
|
if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
|
|
{
|
|
return(FALSE);
|
|
}
|
|
|
|
pgOut->Data4[7] = (BYTE)dw;
|
|
|
|
return(TRUE);
|
|
}
|
|
|