DWORDBindingExpiration;// Expiration of the current status in minutes (e.g. when KMS activation or OOB grace expires).
GUIDAppID;// Can currently be Windows, Office2010 or Office2013 (see kms.c, table AppList).
GUIDActID;// Most detailed product list. One product key per ActID (see kms.c, table ExtendedProductList). Is ignored by KMS server.
GUIDKMSID;// This is actually what the KMS server uses to grant or refuse activation (see kms.c, table BasicProductList).
GUIDCMID;// Client machine id. Used by the KMS server for counting minimum clients.
DWORDN_Policy;// Minimum clients required for activation.
FILETIMEClientTime;// Current client time.
GUIDCMID_prev;// previous client machine id. All zeros, if it never changed.
WCHARWorkstationName[64];// Workstation name. FQDN if available, NetBIOS otherwise.
}/*__packed*/REQUEST;
typedefstruct{
VERSION_INFO;
DWORDPIDSize;// Size of PIDData in bytes.
WCHARKmsPID[PID_BUFFER_SIZE];// ePID (must include terminating zero)
GUIDCMID;// Client machine id. Must be the same as in request.
FILETIMEClientTime;// Current client time. Must be the same as in request.
DWORDCount;// Current activated machines. KMS server counts up to N_Policy << 1 then stops
DWORDVLActivationInterval;// Time in minutes when clients should retry activation if it was unsuccessful (default 2 hours)
DWORDVLRenewalInterval;// Time in minutes when clients should renew KMS activation (default 7 days)
}/*__packed*/RESPONSE;
#ifdef _DEBUG
typedefstruct{
VERSION_INFO;
DWORDPIDSize;
WCHARKmsPID[49];// Set this to the ePID length you want to debug
GUIDCMID;
FILETIMEClientTime;
DWORDCount;
DWORDVLActivationInterval;
DWORDVLRenewalInterval;
}__packedRESPONSE_DEBUG;
#endif
typedefstruct{
REQUESTRequestBase;// Base request
BYTEMAC[16];// Aes 160 bit CMAC
}/*__packed*/REQUEST_V4;
typedefstruct{
RESPONSEResponseBase;// Base response
BYTEMAC[16];// Aes 160 bit CMAC
}/*__packed*/RESPONSE_V4;
typedefstruct{
VERSION_INFO;// unencrypted version info
BYTEIV[16];// IV
REQUESTRequestBase;// Base Request
BYTEPad[4];// since this struct is fixed, we use fixed PKCS pad bytes
}/*__packed*/REQUEST_V5;
typedefREQUEST_V5REQUEST_V6;// v5 and v6 requests are identical
typedefstruct{
VERSION_INFO;
BYTEIV[16];
RESPONSEResponseBase;
BYTERandomXoredIVs[16];// If RequestIV was used for decryption: Random ^ decrypted Request IV ^ ResponseIV. If NULL IV was used for decryption: Random ^ decrypted Request IV
BYTEHash[32];// SHA256 of Random used in RandomXoredIVs
BYTEHwId[8];// HwId from the KMS server
BYTEXoredIVs[16];// If RequestIV was used for decryption: decrypted Request IV ^ ResponseIV. If NULL IV was used for decryption: decrypted Request IV.
BYTEHMAC[16];// V6 Hmac (low 16 bytes only), see kms.c CreateV6Hmac
//BYTE Pad[10]; // Pad is variable sized. So do not include in struct
}/*__packed*/RESPONSE_V6;
typedefstruct{// not used except for sizeof(). Fields are the same as RESPONSE_V6
VERSION_INFO;
BYTEIV[16];
RESPONSEResponseBase;
BYTERandomXoredIVs[16];
BYTEHash[32];
}/*__packed*/RESPONSE_V5;
#ifdef _DEBUG
typedefstruct{// Debug structure for direct casting of RPC data in debugger