检查Windows激活状态返回错误值

时间:2019-05-10 16:04:03

标签: c++ winapi activation

我正在为Windows 10构建一个桌面应用程序,用于检查Windows是否已激活。我正在使用在另一个线程上找到的方法来检查激活状态,该方法有效,但仅当在创建窗口的几秒钟内调用它时才有效。很奇怪,我知道。有谁知道是什么原因造成的,如果我有什么办法可以解决它?任何帮助表示赞赏。

bool isGenuineWindows()
{
    //WindowsAppId
    unsigned char uuid_bytes[] = {0x35, 0x35, 0x63, 0x39, 0x32, 0x37, 0x33, 0x34, 0x2d, 0x64, 0x36,
                                0x38, 0x32, 0x2d, 0x34, 0x64, 0x37, 0x31, 0x2d, 0x39, 0x38, 0x33,
                                0x65, 0x2d, 0x64, 0x36, 0x65, 0x63, 0x33, 0x66, 0x31, 0x36, 0x30,
                                0x35, 0x39, 0x66};

    GUID uuid;
    SL_GENUINE_STATE state;

    UuidFromStringA(uuid_bytes, &uuid);
    SLIsGenuineLocal(&uuid, &state, nullptr);
    return state == SL_GEN_STATE_IS_GENUINE;
}

int main(void)
{
      /*creates GUI and all that boring stuff*/
      MessageBox(NULL, "Some random message", "message", MB_ICONERROR);
      printf("%d", isGenuineWindows()); //works
      Sleep(5000); //wait a bit for the magic to wear off
      printf("%d", isGenuineWindows()); //always returns true regardless of activation state
      MessageBox(NULL, "Some random message", "message", MB_ICONERROR);
      printf("%d", isGenuineWindows()); //works again
}

1 个答案:

答案 0 :(得分:0)

第一个参数UuidFromStringA的类型是RPC_CSTR,它在rpcdce.h中定义:

typedef _Null_terminated_ unsigned char __RPC_FAR * RPC_CSTR;

这是一个以NULL终止的字符串,尽管未记录。 如果参数不是NULL终止的,则该函数将失败。您传递的字符串不是NULL终止的,这将导致不确定的行为(取决于uuid_bytes [36]的原始值)。

使用纯文本字符串而不是ASCII,这是默认的以NULL终止的字符串:

unsigned char uuid_bytes[] = "55c92734-d682-4d71-983e-d6ec3f16059f";