Leaked source code of windows server 2003
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.
 
 
 
 
 
 

253 lines
5.7 KiB

/*++
Copyright (c) 1989-2000 Microsoft Corporation
Module Name:
guid.c
Abstract:
GUID-related utilities that run on win9x and nt4 as
well as win2k and whistler
Author:
vadimb created sometime in 2001
Revision History:
--*/
#include "sdbp.h"
#include "initguid.h"
#if defined(KERNEL_MODE) && defined(ALLOC_DATA_PRAGMA)
#pragma data_seg()
#endif // KERNEL_MODE && ALLOC_DATA_PRAGMA
const TCHAR g_szGuidFormat[] = TEXT("{%08lx-%04hx-%04hx-%02hx%02hx-%02hx%02hx%02hx%02hx%02hx%02hx}");
#if defined(KERNEL_MODE) && defined(ALLOC_PRAGMA)
#pragma alloc_text(PAGE, SdbpGUIDToUnicodeString)
#pragma alloc_text(PAGE, SdbpFreeUnicodeString)
#pragma alloc_text(PAGE, SdbGUIDToString)
#endif // KERNEL_MODE && ALLOC_PRAGMA
//
// GUID string buffer size (in chars) not including the term null char
//
#define GUID_STRING_SIZE 38
DEFINE_GUID(STATIC_NULL_GUID, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, \
0x0, 0x0, 0x0, 0x0);
BOOL
SDBAPI
SdbIsNullGUID(
IN GUID* pGuid
)
{
return pGuid == NULL ||
RtlEqualMemory(pGuid, &STATIC_NULL_GUID, sizeof(*pGuid));
}
#if defined(NT_MODE) || defined(KERNEL_MODE)
BOOL
SDBAPI
SdbGUIDFromStringN(
IN LPCWSTR pszGuid,
IN size_t Length,
OUT GUID* pGuid
)
{
UNICODE_STRING ustrGuid;
NTSTATUS Status;
ustrGuid.Length =
ustrGuid.MaximumLength = (USHORT)Length;
ustrGuid.Buffer = (LPWSTR)pszGuid;
Status = RtlGUIDFromString(&ustrGuid, pGuid);
return NT_SUCCESS(Status);
}
BOOL
SDBAPI
SdbGUIDFromString(
IN LPCWSTR lpszGuid,
OUT GUID* pGuid
)
/*++
Return: TRUE on success, FALSE otherwise.
Desc: Converts a string to a GUID.
--*/
{
UNICODE_STRING ustrGuid;
NTSTATUS status;
RtlInitUnicodeString(&ustrGuid, lpszGuid);
status = RtlGUIDFromString(&ustrGuid, pGuid);
return NT_SUCCESS(status);
}
#else // we do the same thing for both WIN32A and WIN32U
BOOL
SDBAPI
SdbGUIDFromStringN(
IN LPCTSTR pszGuid,
IN size_t Length,
OUT GUID* pGuid
)
{
TCHAR szGuid[64]; // more than enough
StringCchCopyN(szGuid, CHARCOUNT(szGuid), pszGuid, Length);
return SdbGUIDFromString(szGuid, pGuid);
}
BOOL
SdbGUIDFromString(
LPCTSTR lpszGuid,
GUID* pGuid)
{
int nFields;
DWORD rgData4[8];
DWORD dwData2;
DWORD dwData3;
INT i;
nFields = _stscanf(lpszGuid, g_szGuidFormat,
&pGuid->Data1, // type : long
&dwData2, // type : short
&dwData3, // type : short
&rgData4[0],// type : short all the way to the bottom
&rgData4[1],
&rgData4[2],
&rgData4[3],
&rgData4[4],
&rgData4[5],
&rgData4[6],
&rgData4[7]);
if (nFields == 11) {
pGuid->Data2 = (USHORT)dwData2;
pGuid->Data3 = (USHORT)dwData3;
for (i = 0; i < 8; ++i) {
pGuid->Data4[i] = (BYTE)rgData4[i];
}
}
return (nFields == 11);
}
#endif
#ifndef WIN32A_MODE
//
// Private Functions used internally
//
NTSTATUS
SdbpGUIDToUnicodeString(
IN GUID* pGuid,
OUT PUNICODE_STRING pUnicodeString
)
/*++
Return: BUGBUG: ?
Desc: BUGBUG: ?
--*/
{
pUnicodeString->Length = GUID_STRING_SIZE * sizeof(WCHAR);
pUnicodeString->MaximumLength = pUnicodeString->Length + sizeof(UNICODE_NULL);
pUnicodeString->Buffer = SdbAlloc(pUnicodeString->MaximumLength);
if (pUnicodeString->Buffer == NULL) {
DBGPRINT((sdlError,
"SdbpGUIDToUnicodeString",
"Failed to allocate %ld bytes for GUID\n",
(DWORD)pUnicodeString->MaximumLength));
return STATUS_NO_MEMORY;
}
StringCchPrintf(pUnicodeString->Buffer,
pUnicodeString->MaximumLength / sizeof(WCHAR),
g_szGuidFormat,
pGuid->Data1,
pGuid->Data2,
pGuid->Data3,
pGuid->Data4[0],
pGuid->Data4[1],
pGuid->Data4[2],
pGuid->Data4[3],
pGuid->Data4[4],
pGuid->Data4[5],
pGuid->Data4[6],
pGuid->Data4[7]);
return STATUS_SUCCESS;
}
VOID
SdbpFreeUnicodeString(
PUNICODE_STRING pUnicodeString
)
/*++
Return: BUGBUG: ?
Desc: BUGBUG: ?
--*/
{
if (pUnicodeString->Buffer != NULL) {
SdbFree(pUnicodeString->Buffer);
RtlZeroMemory(pUnicodeString, sizeof(*pUnicodeString));
}
}
#endif // WIN32A_MODE
BOOL
SDBAPI
SdbGUIDToString(
IN GUID* pGuid,
OUT LPTSTR pszGuid,
IN DWORD cchSize
)
{
HRESULT hr;
hr = StringCchPrintf(pszGuid,
cchSize,
g_szGuidFormat,
pGuid->Data1,
pGuid->Data2,
pGuid->Data3,
pGuid->Data4[0],
pGuid->Data4[1],
pGuid->Data4[2],
pGuid->Data4[3],
pGuid->Data4[4],
pGuid->Data4[5],
pGuid->Data4[6],
pGuid->Data4[7]);
if (FAILED(hr)) {
return FALSE;
} else {
return TRUE;
}
}