UuidCreateSequential的奇怪行为

时间:2010-07-20 15:19:11

标签: c++ windows uuid

我的软件在我的公司上运行超过2 000台计算机,没有任何问题。

此软件有时会使用GUIDMSDN link)生成UUID(或UuidCreateSequential())。

通话通常会在每台计算机上返回RPC_S_OK。但在其中一个上,它总是返回RPC_S_UUID_LOCAL_ONLY

文件说明:

  

UuidCreateSequential函数   当时返回RPC_S_UUID_LOCAL_ONLY   原始计算机没有   以太网/令牌环(IEEE 802.x)   地址。

但是,此计算机似乎没有网络问题。它有一个具有有效和唯一MAC地址和IP地址的网卡,并且工作正常。

还有什么可能导致UuidCreateSequential()始终返回RPC_S_UUID_LOCAL_ONLY?你有没有经历过类似的情况?

我可以提供帮助,有问题的计算机运行带有Service Pack 3的更新的Windows XP。

3 个答案:

答案 0 :(得分:6)

我联系了Microsoft,当MAC地址的第一个字节高于或等于0x80时,似乎只在Windows XP上出现错误。

这已针对Windows Vista和Windows 7进行了修复。它不会在Windows XP中修复。

答案 1 :(得分:4)

这是Windows XP和Windows Server 2003中的一个错误。

MAC地址为48位,通常表示为:

00-01-02-0A-0B-0C
00:01:02:0a:0b:0c

前三个字节代表 Organziation ,其余三个字节是组织想要使用的任何编号方案。组织ID由IEEE发布。

对于所有公共MAC地址,第一个字节的第二低(第二个最低有效位)将为零。如果您想生成自己的本地 MAC地址,可以将该位设置为1:

00-01-02-0A-0B-0C
00000000-00000001-00000010-00001010-00001011-00001100
      ^
      |
      +- 0: Universal 
         1: Locally Administered

或者从维基百科中提取的图像:

enter image description here

Windows检查了错误的位

Windows XP和Windows Server 2003中的错误是它们检查错误的位。他们错误地检查了位:

我讨厌将雷蒙德扔在公共汽车下,但是here's an example of the incorrect information

  

最后48位是计算机网卡的唯一地址。如果计算机没有网卡,设置最高位并为其他网络使用随机数生成器47.没有有效的网卡将在其地址中设置最高位,所以没有从没有网卡的计算机生成的GUID可能会意外地与使用网卡的计算机生成的GUID冲突。

强调我的。更正是:

  

...设置第二个最低有效位...没有有效的网卡将设置第二个最低有效位。

测试

我在电脑上测试了这个。我的电脑的MAC地址为:

‎C8-60-00-12-34-56  (Ok, i changed the serialized number, but it is a Realtek)

如果我们遵循Windows XP规则,此MAC地址将"本地管理" ,而UuidCreateSequential将返回 RPC_S_UUID_LOCAL_ONLY

当我在Windows 7上运行UuidCreateSequential时,运行正常:

{FBE65AFC-2588-11E5-9F09-C86000123456}
{FBE65AFD-2588-11E5-9F09-C86000123456}
{FBE65AFE-2588-11E5-9F09-C86000123456}
{FBE65AFF-2588-11E5-9F09-C86000123456}

但是,如果我在具有相同(或类似)MAC地址的Windows XP计算机上运行它:

enter image description here

该功能失败:

  

0x720已分配仅在此计算机上有效的UUID。

修复

检查MAC地址错误位的错误记录在:

还在UuidCreateSequential中记录了以及:

有一个相关的修补程序,但我不相信它已被修复(即没有正式修复服务包)。

您有三种选择:

  • 将Windows XP设置中的MAC地址更改为不具有高位设置
  • 升级到Windows Vista或更新版
  • 如果函数返回 RPC_S_UUID_LOCAL_ONLY ,并且您在Windows Vista(dwMajor < 6)之前,则认为它实际上已成功( Dangerous!

答案 2 :(得分:1)

也许是一个安全问题,用户是否将呼叫作为管理员?否则,NIC驱动程序可能无法提供MAC地址。

只要UUID用于该机器的本地内容,那么接受此错误作为有效结果可能没问题。

如果UUID必须保证全球唯一(例如资产注册),那么询问另一个盒子(例如注册服务器)可能是个更好的主意。