|
|
/*++
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 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 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; }
swprintf(pUnicodeString->Buffer, 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 ) { _stprintf(pszGuid, 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 TRUE; }
|