获取XP系统安装序列号

int KeyDecoder::DecodeProductKey(KeyDecoder::Key key, char* pKey) {  byte* pEncodedPID = GetRegistryDigitalProductId(key);  int keyLen = 0;  if(pEncodedPID)  {   char* pDecodedPID = DecodeProductKey(pEncodedPID);   if(pDecodedPID)   {    keyLen = (int)::strlen(pDecodedPID);    if(pKey)    {     ::strcpy(pKey, pDecodedPID);    }    delete[] pDecodedPID;   }  }  return keyLen + 1; }

char* KeyDecoder::DecodeProductKey(byte* digitalProductId) {  // Offset of first byte of encoded product key in  // 'DigitalProductIdxxx" REG_BINARY value. Offset = 34H.  const int keyStartIndex = 52;  // Offset of last byte of encoded product key in  // 'DigitalProductIdxxx" REG_BINARY value. Offset = 43H.  const int keyEndIndex = keyStartIndex + 15;  // Possible alpha-numeric characters in product key.  char digits[] =  {   'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R',   'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',  };  // Length of decoded product key  const int decodeLength = 29;  // Length of decoded product key in byte-form.  // Each byte represents 2 chars.  const int decodeStringLength = 15;  // Array of containing the decoded product key.  char* pDecodedChars = new char[decodeLength + 1];  ::memset(pDecodedChars, 0, decodeLength + 1);  // Extract byte 52 to 67 inclusive.  byte hexPid[keyEndIndex - keyStartIndex + 1];  for (int i = keyStartIndex; i <= keyEndIndex; i++)  {   hexPid[i - keyStartIndex] = digitalProductId[i];  }  for (int i = decodeLength - 1; i >= 0; i--)  {   // Every sixth char is a separator.   if ((i + 1) % 6 == 0)   {    *(pDecodedChars + i) = '-';   }   else   {    // Do the actual decoding.    int digitMapIndex = 0;    for (int j = decodeStringLength - 1; j >= 0; j--)    {     int byteValue = (digitMapIndex << 8) | hexPid[j];     hexPid[j] = (byte)(byteValue / 24);     digitMapIndex = byteValue % 24;     *(pDecodedChars + i) = digits[digitMapIndex];    }   }  }  return pDecodedChars; }

byte* KeyDecoder::GetRegistryDigitalProductId(KeyDecoder::Key key) {  HKEY hKey = 0;  LONG lResult = 0L;  const char* pPIDName = "DigitalProductId";  byte* pPID = 0;  switch(key)  {   case KeyDecoder::Key::XP:    lResult = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,     "SOFTWARE//Microsoft//Windows NT//CurrentVersion",     0, KEY_QUERY_VALUE, &hKey);    break;   case KeyDecoder::Key::Office10:    break;   case KeyDecoder::Key::Office11:    break;  }  if(lResult == ERROR_SUCCESS)  {   DWORD cbData = 0;   DWORD dwType = 0;   lResult = ::RegQueryValueEx(hKey, pPIDName, 0, &dwType, 0, &cbData);   if(lResult == ERROR_SUCCESS)   {    pPID = new byte[cbData];    lResult = ::RegQueryValueEx(hKey, pPIDName, 0, &dwType, pPID, &cbData);    if(lResult != ERROR_SUCCESS)    {     delete[] pPID;     pPID = 0;    }   }  }  if(hKey)  {   ::RegCloseKey(hKey);  }  return pPID; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值