Add kmsc support for vista
This commit is contained in:
parent
74cce5e941
commit
4c7c58e62d
@ -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,76 +31,113 @@ 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();
|
||||
|
||||
writer = new BinaryWriter(new MemoryStream());
|
||||
|
||||
writer.Write(new byte[40]);
|
||||
|
||||
writer.Seek(4, SeekOrigin.Begin);
|
||||
writer.Write((byte)currClients);
|
||||
|
||||
writer.Seek(24, SeekOrigin.Begin);
|
||||
writer.Write((byte)currClients);
|
||||
|
||||
reqCounts = writer.GetBytes();
|
||||
}
|
||||
|
||||
byte[] cmidGuids = writer.GetBytes();
|
||||
|
||||
writer = new BinaryWriter(new MemoryStream());
|
||||
|
||||
writer.Write(new byte[40]);
|
||||
|
||||
writer.Seek(4, SeekOrigin.Begin);
|
||||
writer.Write((byte)currClients);
|
||||
|
||||
writer.Seek(24, SeekOrigin.Begin);
|
||||
writer.Write((byte)currClients);
|
||||
byte[] reqCounts = writer.GetBytes();
|
||||
|
||||
SPPUtils.KillSPP(version);
|
||||
|
||||
Logger.WriteLine("Writing TrustedStore data...");
|
||||
|
||||
using (IPhysicalStore store = SPPUtils.GetStore(version, production))
|
||||
{
|
||||
VariableBag kmsCountData = new VariableBag(version);
|
||||
kmsCountData.Blocks.AddRange(new CRCBlockModern[]
|
||||
if (version != PSVersion.Vista)
|
||||
{
|
||||
new CRCBlockModern
|
||||
VariableBag kmsCountData = new VariableBag(version);
|
||||
kmsCountData.Blocks.AddRange(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
|
||||
}
|
||||
});
|
||||
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
|
||||
}
|
||||
});
|
||||
|
||||
byte[] kmsChargeData = kmsCountData.Serialize();
|
||||
string countVal = string.Format("msft:spp/kms/host/2.0/store/counters/{0}", appId);
|
||||
kmsChargeData = kmsCountData.Serialize();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user