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.

182 lines
3.4 KiB

  1. /*++
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4. Guid.cpp
  5. Abstract:
  6. Functions for converting strings to GUIDs.
  7. Taken from \\index2\sdnt\ds\security\cryptoapi\common\unicode\guid.cpp
  8. Notes:
  9. Unicode only - Windows 2000, XP & .NET Server
  10. History:
  11. 01/02/2002 rparsons Created
  12. --*/
  13. #include "main.h"
  14. static const BYTE GuidMap[] = { 3, 2, 1, 0, '-', 5, 4, '-', 7, 6, '-',
  15. 8, 9, '-', 10, 11, 12, 13, 14, 15 };
  16. static const WCHAR wszDigits[] = L"0123456789ABCDEF";
  17. static
  18. BOOL
  19. HexStringToDword(
  20. IN LPCWSTR FAR& pwsz,
  21. IN DWORD FAR& Value,
  22. IN int cDigits,
  23. IN WCHAR chDelim
  24. )
  25. {
  26. int Count;
  27. Value = 0;
  28. for (Count = 0; Count < cDigits; Count++, pwsz++)
  29. {
  30. if (*pwsz >= '0' && *pwsz <= '9')
  31. {
  32. Value = (Value << 4) + *pwsz - '0';
  33. }
  34. else if (*pwsz >= 'A' && *pwsz <= 'F')
  35. {
  36. Value = (Value << 4) + *pwsz - 'A' + 10;
  37. }
  38. else if (*pwsz >= 'a' && *pwsz <= 'f')
  39. {
  40. Value = (Value << 4) + *pwsz - 'a' + 10;
  41. }
  42. else
  43. {
  44. return(FALSE);
  45. }
  46. }
  47. if (chDelim != 0)
  48. {
  49. return *pwsz++ == chDelim;
  50. }
  51. else
  52. {
  53. return(TRUE);
  54. }
  55. }
  56. BOOL
  57. StringToGuid(
  58. IN LPCWSTR pwszIn,
  59. OUT GUID* pgOut
  60. )
  61. {
  62. if (!(pwszIn) || !(pgOut))
  63. {
  64. SetLastError(ERROR_INVALID_PARAMETER);
  65. return(FALSE);
  66. }
  67. if (*pwszIn != '{') // only support v2 guids!
  68. {
  69. SetLastError(ERROR_INVALID_PARAMETER);
  70. return(FALSE);
  71. }
  72. if (wcslen(pwszIn) != 38)
  73. {
  74. SetLastError(ERROR_INVALID_PARAMETER);
  75. return(FALSE);
  76. }
  77. WCHAR *pwsz;
  78. pwsz = (WCHAR *)&pwszIn[1]; // pass the first {
  79. memset(pgOut, 0x00, sizeof(GUID));
  80. DWORD dw;
  81. if (!(HexStringToDword(pwsz, pgOut->Data1, sizeof(DWORD)*2, '-')))
  82. {
  83. return(FALSE);
  84. }
  85. if (!(HexStringToDword(pwsz, dw, sizeof(WORD)*2, '-')))
  86. {
  87. return(FALSE);
  88. }
  89. pgOut->Data2 = (WORD)dw;
  90. if (!(HexStringToDword(pwsz, dw, sizeof(WORD)*2, '-')))
  91. {
  92. return(FALSE);
  93. }
  94. pgOut->Data3 = (WORD)dw;
  95. if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
  96. {
  97. return(FALSE);
  98. }
  99. pgOut->Data4[0] = (BYTE)dw;
  100. if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, '-')))
  101. {
  102. return(FALSE);
  103. }
  104. pgOut->Data4[1] = (BYTE)dw;
  105. if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
  106. {
  107. return(FALSE);
  108. }
  109. pgOut->Data4[2] = (BYTE)dw;
  110. if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
  111. {
  112. return(FALSE);
  113. }
  114. pgOut->Data4[3] = (BYTE)dw;
  115. if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
  116. {
  117. return(FALSE);
  118. }
  119. pgOut->Data4[4] = (BYTE)dw;
  120. if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
  121. {
  122. return(FALSE);
  123. }
  124. pgOut->Data4[5] = (BYTE)dw;
  125. if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
  126. {
  127. return(FALSE);
  128. }
  129. pgOut->Data4[6] = (BYTE)dw;
  130. if (!(HexStringToDword(pwsz, dw, sizeof(BYTE)*2, 0)))
  131. {
  132. return(FALSE);
  133. }
  134. pgOut->Data4[7] = (BYTE)dw;
  135. return(TRUE);
  136. }