# encoding: ascii
# api: powershell
# title: product key on c++
# description: I found it [here](https://github.com/gregzakharov/X/blob/master/ProductKey/source.cpp) and it works.
# version: 0.1
# author: bO_obleak
# license: CC0
# x-poshcode-id: 4875
# x-archived: 2014-02-07T23:47:41
# x-published: 2014-02-04T05:51:00
#
#
#include <windows.h>
#include <iostream>

using namespace std;

#pragma comment (lib, "advapi32.lib")

void main() {
  HKEY  Registry;
  BYTE *DigitalProductId = 0;
  DWORD RawLength;
  BYTE  raw[15];
  char  key[30];
  
  const char *key_map[] = {
    "B","C","D","F","G","H","J","K","M","P","Q","R",
    "T","V","W","X","Y","2","3","4","6","7","8","9",
  };
  
  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                   "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
                   0,
                   KEY_QUERY_VALUE,
                   &Registry) == ERROR_SUCCESS) {
    RawLength = 164;
    DigitalProductId = new byte[RawLength]; //allocate memory
    memset(DigitalProductId, 0, RawLength); //memory initialization
    
    if (RegQueryValueEx(Registry,
                        "DigitalProductId",
                        NULL,
                        NULL,
                        DigitalProductId,
                        &RawLength) == ERROR_SUCCESS) {
      memcpy(raw, DigitalProductId + 52, 15); //raw key
      if (DigitalProductId) delete []DigitalProductId; //release memory
      RegCloseKey(Registry);
    }
  }
  
  memset(key, 0, sizeof(key));
  for (int i = 24; i >= 0; i--) {
    int k = 0;
    for (int j = 14; j >= 0; j--) {
      k = (k * 256) ^ raw[j];
      raw[j] = k / 24;
      k %= 24;
    }
    
    strcat_s(key, key_map[k]);
    if (!(i % 5) && i) strcat_s(key, "-");
  }
  
  cout << _strrev(key) << endl;
}
