Answered by:
GUID PID format

Question
-
I know that we can get the values of properties of devices using the GUID-PID format. For example, we can get the Config Flag of a device by the following way:
"{a45c254e-df1c-4efd-8020-67d16a850e0} 12"
But the DevPKey for the corresponding property is 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0. How is this value converted to the GUID format "a45c254e-df1c-4efd-8020-67d16a850e0"? What is the general conversion logic?
Monday, April 9, 2012 1:47 PM
Answers
-
Greetings,
It's best to think of the elements as types rather than digits.
For instance, in Windows, the GUID type is defined as:
typedef struct _GUID
{
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;or // {266488C3-DDA7-421F-BAFB-B9096F525790}
DEFINE_GUID(<<name>>, 0x266488c3, 0xdda7, 0x421f, 0xba, 0xfb, 0xb9, 0x9, 0x6f, 0x52, 0x57, 0x90);Which is 4,2,2,1[8]
Registry format: {09313DB0-F837-4EDD-AF50-A8C12C65F0FA}
which is 4 bytes, 2 bytes, 2 bytes, 2 bytes, 6 bytes
So the bytes layout is really a function of the function using it. Another common layout is:
// {A5BD6EC6-9B92-4A4A-86FD-33949EE4F9CA}
static const GUID <<name>> =
{ 0xa5bd6ec6, 0x9b92, 0x4a4a, { 0x86, 0xfd, 0x33, 0x94, 0x9e, 0xe4, 0xf9, 0xca } };So depending on what your particular function calls for, you provide the needed format. OLE, Registry, const, etc.
Here is some more information: http://msdn.microsoft.com/en-us/library/dd354925.aspx
Let me know if this helps or hinders.
Daniel Whitaker WDK Support Team
- Marked as answer by Eric Hanson-MSFTModerator Monday, April 16, 2012 12:53 PM
Friday, April 13, 2012 9:27 PM
All replies
-
its_me_here,
The general conversion logic can be found here: http://en.wikipedia.org/wiki/Globally_Unique_Identifier . I believe you will want to look at the 4+2+2+8*1 format. I would give that a try.
Best Wishes - Eric
Monday, April 9, 2012 5:23 PMModerator -
Thank you Eric. So the conversion is like below, right?
Base string - 0x8c7ed206, 0x3f8a, 0x4827, 0xb3, 0xab, 0xae, 0x9e, 0x1f, 0xae, 0xfc, 0x6c
Converted String: 8C7ED206-3F8A-4827-B3AB-AE9E1FAEFC6C
ie. 8,4,4,4,12 format. First 8 digits, then the remaining 4 consectutive digits, then the reminaing 4 consecutive digits, then the remaining 4 consecutive digits and the remainign 12 consecutive digts.
I think there was a mistake in converted string in the question I asked . Instead of "{a45c254e-df1c-4efd-8020-67d16a850e0}, it should have been "{a45c254e-df1c-4efd-8020-67d146a850e0}.The 4 was missing in the last section. Right?
Tuesday, April 10, 2012 4:57 AM -
Greetings,
It's best to think of the elements as types rather than digits.
For instance, in Windows, the GUID type is defined as:
typedef struct _GUID
{
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[ 8 ];
} GUID;or // {266488C3-DDA7-421F-BAFB-B9096F525790}
DEFINE_GUID(<<name>>, 0x266488c3, 0xdda7, 0x421f, 0xba, 0xfb, 0xb9, 0x9, 0x6f, 0x52, 0x57, 0x90);Which is 4,2,2,1[8]
Registry format: {09313DB0-F837-4EDD-AF50-A8C12C65F0FA}
which is 4 bytes, 2 bytes, 2 bytes, 2 bytes, 6 bytes
So the bytes layout is really a function of the function using it. Another common layout is:
// {A5BD6EC6-9B92-4A4A-86FD-33949EE4F9CA}
static const GUID <<name>> =
{ 0xa5bd6ec6, 0x9b92, 0x4a4a, { 0x86, 0xfd, 0x33, 0x94, 0x9e, 0xe4, 0xf9, 0xca } };So depending on what your particular function calls for, you provide the needed format. OLE, Registry, const, etc.
Here is some more information: http://msdn.microsoft.com/en-us/library/dd354925.aspx
Let me know if this helps or hinders.
Daniel Whitaker WDK Support Team
- Marked as answer by Eric Hanson-MSFTModerator Monday, April 16, 2012 12:53 PM
Friday, April 13, 2012 9:27 PM -
Thank you Emberstone ! That was well explained !Monday, April 16, 2012 4:47 AM