summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LibTSforge/Modifiers/KMSHostCharge.cs145
1 files changed, 91 insertions, 54 deletions
diff --git a/LibTSforge/Modifiers/KMSHostCharge.cs b/LibTSforge/Modifiers/KMSHostCharge.cs
index b10a864..94f4dfd 100644
--- a/LibTSforge/Modifiers/KMSHostCharge.cs
+++ b/LibTSforge/Modifiers/KMSHostCharge.cs
@@ -9,8 +9,6 @@ namespace LibTSforge.Modifiers
{
public static void Charge(PSVersion version, bool production, Guid actId)
{
- if (version == PSVersion.Vista) throw new NotSupportedException("This feature is not supported on Windows Vista/Server 2008.");
-
if (actId == Guid.Empty)
{
actId = SLApi.GetDefaultActivationID(SLApi.WINDOWS_APP_ID, true);
@@ -33,26 +31,59 @@ namespace LibTSforge.Modifiers
string key = string.Format("SPPSVC\\{0}", appId);
long ldapTimestamp = DateTime.Now.ToFileTime();
+ byte[] cmidGuids = new byte[] { };
+ byte[] reqCounts = new byte[] { };
+ byte[] kmsChargeData = new byte[] { };
+
BinaryWriter writer = new BinaryWriter(new MemoryStream());
- for (int i = 0; i < currClients; i++)
+ if (version == PSVersion.Vista)
{
- writer.Write(ldapTimestamp - (10 * (i + 1)));
- writer.Write(Guid.NewGuid().ToByteArray());
- }
+ writer.Write(new byte[44]);
+ writer.Seek(0, SeekOrigin.Begin);
+
+ writer.Write(totalClients);
+ writer.Write(43200);
+ writer.Write(32);
+
+ writer.Seek(20, SeekOrigin.Begin);
+ writer.Write((byte)currClients);
+
+ writer.Seek(32, SeekOrigin.Begin);
+ writer.Write((byte)currClients);
+
+ writer.Seek(0, SeekOrigin.End);
+
+ for (int i = 0; i < currClients; i++)
+ {
+ writer.Write(Guid.NewGuid().ToByteArray());
+ writer.Write(ldapTimestamp - (10 * (i + 1)));
+ }
+
+ kmsChargeData = writer.GetBytes();
+ }
+ else
+ {
+ for (int i = 0; i < currClients; i++)
+ {
+ writer.Write(ldapTimestamp - (10 * (i + 1)));
+ writer.Write(Guid.NewGuid().ToByteArray());
+ }
+
+ cmidGuids = writer.GetBytes();
- byte[] cmidGuids = writer.GetBytes();
+ writer = new BinaryWriter(new MemoryStream());
- writer = new BinaryWriter(new MemoryStream());
+ writer.Write(new byte[40]);
- writer.Write(new byte[40]);
+ writer.Seek(4, SeekOrigin.Begin);
+ writer.Write((byte)currClients);
- writer.Seek(4, SeekOrigin.Begin);
- writer.Write((byte)currClients);
+ writer.Seek(24, SeekOrigin.Begin);
+ writer.Write((byte)currClients);
- writer.Seek(24, SeekOrigin.Begin);
- writer.Write((byte)currClients);
- byte[] reqCounts = writer.GetBytes();
+ reqCounts = writer.GetBytes();
+ }
SPPUtils.KillSPP(version);
@@ -60,49 +91,53 @@ namespace LibTSforge.Modifiers
using (IPhysicalStore store = SPPUtils.GetStore(version, production))
{
- VariableBag kmsCountData = new VariableBag(version);
- kmsCountData.Blocks.AddRange(new CRCBlockModern[]
+ if (version != PSVersion.Vista)
{
- new CRCBlockModern
- {
- DataType = CRCBlockType.BINARY,
- KeyAsStr = "SppBindingLicenseData",
- Value = hwidBlock
- },
- new CRCBlockModern
- {
- DataType = CRCBlockType.UINT,
- Key = new byte[] { },
- ValueAsInt = (uint)totalClients
- },
- new CRCBlockModern
+ VariableBag kmsCountData = new VariableBag(version);
+ kmsCountData.Blocks.AddRange(new CRCBlockModern[]
{
- DataType = CRCBlockType.UINT,
- Key = new byte[] { },
- ValueAsInt = 1051200000
- },
- new CRCBlockModern
- {
- DataType = CRCBlockType.UINT,
- Key = new byte[] { },
- ValueAsInt = (uint)currClients
- },
- new CRCBlockModern
- {
- DataType = CRCBlockType.BINARY,
- Key = new byte[] { },
- Value = cmidGuids
- },
- new CRCBlockModern
- {
- DataType = CRCBlockType.BINARY,
- Key = new byte[] { },
- Value = reqCounts
- }
- });
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.BINARY,
+ KeyAsStr = "SppBindingLicenseData",
+ Value = hwidBlock
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.UINT,
+ Key = new byte[] { },
+ ValueAsInt = (uint)totalClients
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.UINT,
+ Key = new byte[] { },
+ ValueAsInt = 1051200000
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.UINT,
+ Key = new byte[] { },
+ ValueAsInt = (uint)currClients
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.BINARY,
+ Key = new byte[] { },
+ Value = cmidGuids
+ },
+ new CRCBlockModern
+ {
+ DataType = CRCBlockType.BINARY,
+ Key = new byte[] { },
+ Value = reqCounts
+ }
+ });
+
+ kmsChargeData = kmsCountData.Serialize();
+ }
- byte[] kmsChargeData = kmsCountData.Serialize();
- string countVal = string.Format("msft:spp/kms/host/2.0/store/counters/{0}", appId);
+ string countVal = version == PSVersion.Vista ? "C8F6FFF1-79CE-404C-B150-F97991273DF1" : string.Format("msft:spp/kms/host/2.0/store/counters/{0}", appId);
store.DeleteBlock(key, countVal);
store.AddBlock(new PSBlock
@@ -116,6 +151,8 @@ namespace LibTSforge.Modifiers
Logger.WriteLine(string.Format("Set charge count to {0} successfully.", currClients));
}
+
+ SPPUtils.RestartSPP(version);
}
}
}