//---------------------------------------------------------------------------
/*
	010 Editor Script To format a Microsoft GUID
	2010/08/29 v0.0.1

	Source code put in public domain by Didier Stevens, no Copyright
	https://DidierStevens.com
	Use at your own risk

	History:
		2010/08/11: start development with 010 Editor v3.1.2
		2010/08/29: added CopyStringToClipboard
	Todo:

*/
//---------------------------------------------------------------------------

void ReadGUID123(int64 iPosition, int32 &iData1, int16 &iData2, int16 &iData3)
{
    iData1 = ReadUInt(iPosition);
    iPosition += 4;
    iData2 = ReadUShort(iPosition);
    iPosition += 2;
    iData3 = ReadUShort(iPosition);
    iPosition += 2;
}

void ReadGUID4(int64 iPosition, int16 &iData4a, int16 &iData4b, int32 &iData4c)
{
    iData4a = ReadUShort(iPosition);
    iPosition += 2;
    iData4b = ReadUShort(iPosition);
    iPosition += 2;
    iData4c = ReadUInt(iPosition);
    iPosition += 4;
}

string FormatGUID(int64 iPosition)
{
    string sGUID;
    int32 iData1;
    int16 iData2;
    int16 iData3;
    int16 iData4a;
    int16 iData4b;
    int32 iData4c;
    int iStartedAsBigEndian;

    iStartedAsBigEndian = IsBigEndian();
    LittleEndian();
    ReadGUID123(iPosition, iData1, iData2, iData3);
    BigEndian();
    ReadGUID4(iPosition + 8, iData4a, iData4b, iData4c);
    if (!iStartedAsBigEndian)
        LittleEndian();
    SPrintf(sGUID, "{%08X-%04X-%04X-%04X-%04X%08X}", iData1, iData2, iData3, iData4a, iData4b, iData4c);

    return sGUID;
}

string GUID = FormatGUID(GetCursorPos());
CopyStringToClipboard(GUID);
Printf("GUID = %s\n", GUID);
