Add kmsc support for vista
This commit is contained in:
		| @@ -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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user