159 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| namespace LibTSforge.Modifiers
 | |
| {
 | |
|     using System;
 | |
|     using System.IO;
 | |
|     using LibTSforge.PhysicalStore;
 | |
|     using LibTSforge.SPP;
 | |
| 
 | |
|     public static class KMSHostCharge
 | |
|     {
 | |
|         public static void Charge(PSVersion version, bool production, Guid actId)
 | |
|         {
 | |
|             if (actId == Guid.Empty)
 | |
|             {
 | |
|                 actId = SLApi.GetDefaultActivationID(SLApi.WINDOWS_APP_ID, true);
 | |
| 
 | |
|                 if (actId == Guid.Empty)
 | |
|                 {
 | |
|                     throw new NotSupportedException("No applicable activation IDs found.");
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (SLApi.GetPKeyChannel(SLApi.GetInstalledPkeyID(actId)) != "Volume:CSVLK")
 | |
|             {
 | |
|                 throw new NotSupportedException("Non-Volume:CSVLK product key installed.");
 | |
|             }
 | |
| 
 | |
|             Guid appId = SLApi.GetAppId(actId);
 | |
|             int totalClients = 50;
 | |
|             int currClients = 25;
 | |
|             byte[] hwidBlock = Constants.UniversalHWIDBlock;
 | |
|             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());
 | |
| 
 | |
|             if (version == PSVersion.Vista)
 | |
|             {
 | |
|                 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();
 | |
|             }
 | |
| 
 | |
|             SPPUtils.KillSPP(version);
 | |
| 
 | |
|             Logger.WriteLine("Writing TrustedStore data...");
 | |
| 
 | |
|             using (IPhysicalStore store = SPPUtils.GetStore(version, production))
 | |
|             {
 | |
|                 if (version != PSVersion.Vista)
 | |
|                 {
 | |
|                     VariableBag kmsCountData = new VariableBag(version);
 | |
|                     kmsCountData.Blocks.AddRange(new CRCBlockModern[]
 | |
|                     {
 | |
|                         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();
 | |
|                 }
 | |
| 
 | |
|                 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
 | |
|                 {
 | |
|                     Type = BlockType.NAMED,
 | |
|                     Flags = (version == PSVersion.WinModern) ? (uint)0x400 : 0,
 | |
|                     KeyAsStr = key,
 | |
|                     ValueAsStr = countVal,
 | |
|                     Data = kmsChargeData
 | |
|                 });
 | |
| 
 | |
|                 Logger.WriteLine(string.Format("Set charge count to {0} successfully.", currClients));
 | |
|             }
 | |
| 
 | |
|             SPPUtils.RestartSPP(version);
 | |
|         }
 | |
|     }
 | |
| }
 |