From 9099d5aa699d1c6063dc782d1ad2afafa585b2ed Mon Sep 17 00:00:00 2001 From: Wind4 Date: Mon, 15 Aug 2016 18:35:59 +0800 Subject: [PATCH] vlmcsd-svn998-2016-08-11-Hotbird64 --- GNUmakefile | 19 +- floppy144.vfd | Bin 1474560 -> 1474560 bytes kms.c | 345 +++-- kms.h | 1 + libkms.c | 102 +- libkms.h | 8 +- make_dragonfly | 2 + make_freebsd | 1 + make_hurd | 1 + make_kfreebsd | 1 + make_linux | 30 +- make_lxss | 3507 ------------------------------------------ make_multilib_linux | 1 + make_netbsd | 1 + make_openbsd | 1 + make_osx | 1 + make_solaris | 1 + make_windows | 7 +- msrpc-client.c | 4 +- msrpc-client.h | 1 + msrpc-server.c | 35 +- network.c | 2 +- network.h | 2 +- output.c | 10 +- output.h | 2 +- rpc.c | 167 +- rpc.h | 133 ++ shared_globals.c | 4 + shared_globals.h | 4 +- types.h | 2 - vlmcs.1 | 8 +- vlmcs.1.dos.txt | 183 ++- vlmcs.1.html | 26 +- vlmcs.1.pdf | Bin 25770 -> 26351 bytes vlmcs.1.unix.txt | 183 ++- vlmcs.c | 64 +- vlmcs.h | 8 + vlmcsd-floppy.7.html | 2 +- vlmcsd-floppy.7.pdf | Bin 35003 -> 35003 bytes vlmcsd.7.html | 2 +- vlmcsd.7.pdf | Bin 17301 -> 17301 bytes vlmcsd.8 | 9 +- vlmcsd.8.dos.txt | 37 +- vlmcsd.8.html | 42 +- vlmcsd.8.pdf | Bin 38264 -> 38913 bytes vlmcsd.8.unix.txt | 37 +- vlmcsd.c | 13 +- vlmcsd.ini.5.html | 2 +- vlmcsd.ini.5.pdf | Bin 20852 -> 20852 bytes vlmcsdmulti.1.html | 2 +- vlmcsdmulti.1.pdf | Bin 10042 -> 10042 bytes 51 files changed, 966 insertions(+), 4047 deletions(-) delete mode 100755 make_lxss diff --git a/GNUmakefile b/GNUmakefile index 3b2e3db..0d1b71b 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -313,8 +313,8 @@ VLMCS_OBJS = $(VLMCS_SRCS:.c=.o) MULTI_SRCS = vlmcsd.c vlmcs.c vlmcsdmulti.c $(SRCS) MULTI_OBJS = $(SRCS:.c=.o) vlmcsd-m.o vlmcs-m.o vlmcsdmulti-m.o -DLL_SRCS = libkms.c $(SRCS) -DLL_OBJS = $(DLL_SRCS:.c=.o) +DLL_SRCS = libkms.c vlmcs.c $(SRCS) +DLL_OBJS = $(DLL_SRCS:.c=-l.o) PDFDOCS = vlmcs.1.pdf vlmcsd.7.pdf vlmcsd.8.pdf vlmcsdmulti.1.pdf vlmcsd.ini.5.pdf vlmcsd-floppy.7.pdf HTMLDOCS = $(PDFDOCS:.pdf=.html) @@ -456,6 +456,21 @@ endif endif endif +%-l.o: %.c + ifeq ($(VERBOSE),1) + $(CC) -x$(COMPILER_LANGUAGE) $(PLATFORMFLAGS) $(BASECFLAGS) $(CFLAGS) $(PLATFORMFLAGS) -fvisibility=hidden -c -DIS_LIBRARY=1 $(LIBRARY_CFLAGS) -UNO_SOCKETS -UUSE_MSRPC -o $@ -c $< + ifeq ($(DEPENDENCIES),1) + $(CC) -x$(COMPILER_LANGUAGE) $(PLATFORMFLAGS) $(BASECFLAGS) $(CFLAGS) $(PLATFORMFLAGS) $(SERVERLDFLAGS) -fvisibility=hidden -c -DIS_LIBRARY=1 $(LIBRARY_CFLAGS) -UNO_SOCKETS -UUSE_MSRPC -MM -MF $*.d $< + endif + else + @echo "$(COMPILER) CC $@ <- $<" + @$(CC) -x$(COMPILER_LANGUAGE) $(PLATFORMFLAGS) $(BASECFLAGS) $(CFLAGS) $(PLATFORMFLAGS) $(SERVERLDFLAGS) -fvisibility=hidden -c -DIS_LIBRARY=1 $(LIBRARY_CFLAGS) -UNO_SOCKETS -UUSE_MSRPC -o $@ -c $< + ifeq ($(DEPENDENCIES),1) + @echo "$(COMPILER) DEP $*.d <- $<" + @$(CC) -x$(COMPILER_LANGUAGE) $(PLATFORMFLAGS) $(BASECFLAGS) $(CFLAGS) $(PLATFORMFLAGS) $(SERVERLDFLAGS) -fvisibility=hidden -c -DIS_LIBRARY=1 $(LIBRARY_CFLAGS) -UNO_SOCKETS -UUSE_MSRPC -MM -MF $*.d $< + endif + endif + ifdef CAT BUILDCOMMAND = cat $^ | $(CC) -x$(COMPILER_LANGUAGE) -o $@ - diff --git a/floppy144.vfd b/floppy144.vfd index 4c0f330d99489303ded1893138a0d5f9b683a94f..6d26dee282075568021ddcbf6c47f3645c65f443 100644 GIT binary patch delta 79306 zcmZo@h-zqv+Tbh1dY^0EfBwmVLaLj~g{}!Ab5&+DGI4uO7E!YUQ6Xwp0yT}?p4^@c z3?RCceO1xqd1@vgxhrZ`JRmWcT(gvVyOcU(yOcUpyOcU}yOcUhyOcU>yOcUxyOcV6 zyOcUdyOcU-yOcUtyOcV2yOcUlyOcU_yOcU#yOcVAyOg>>yOg?MyOg@nb}4n?_YU=j zO4~heMwxeNM4Es4pT6SPE0F^K2PHp?{=J!bY{AkQkH0PJ=Q5DqA^ERFvu5vc-|0=B z&ueCO@Lgn`bt1xSot@PR#VIqd1Z|A?HRJVzPUnSvz6DR%_?#0eCrApi+>Oz+aIsvb zbaLTGIhnSc*-}SErnJ4@EcDO9_^rr-N6$6%rqsWA(_fm|xaHucYYKe^PaCJ~2ztch z{E+QnYQY)|avdRp|jf#c4Ppj$21ejDm?ygGSlf#zAsoqIH<&3c=| z)3;Z{xbAkkPDX&aNn&dMsk(}_zxN!n@Oit~#CB5kqlVMRc(uU)aNyEug&bWC|$5Ee(HQ`LrV(wMh^W_Bm zR3D3nM3t^+Ty5Swd!~Zt=_{*E(@e7ZmVM!mJg0y5{mR+m z|Lbgmd0zLg6N*U_e5iRtx_*n>2{i|a$LqiMW=z=m`t|06ZSEg$_!#bN`yBaFcS6Uk zJF*pDTqXq-2_?*8G^i`!5%p~}eyf*sAhszYIA~40=bf4cS80doM-;Z?D$V@S>V8Z) zDpI`8srf*?O-AWYx4&5qYp(n~_{vA(UuX=od$n}fi_E}u=5O}Ww*9l+_sQ00_6kS| zSG>*nd9%_XMf!K$y-UAS2Zi!E^j#Pvch}8ts_|y>|d|9 zvYjs5bL?+i@1jFF>NdGw3VsxA(p|K**w*!<*`i%@b`-vzMfL;5gR?g!KWCW!XzJ?oQ>w&v6s0e5 zb6cNh$LjQx?P%ZqU(caF_}>$HtT1I$tEtv zv!RclsmRRzKjT7kcoV~vS++6ztaW_ZE3SQfBl?7CN9>;Z# zK4GSka#LJIW52KCAET2S1!F_?wx2k5#Is*|FJHrxg^?E?%sy1baIt(={*ER54;n89 zbjWK8LHS$z4))`qPBvZX3~-QjI3?HlQv)Y#`idIj{27jAHByAZ?e;9({`raDBdI-eWlWrm zB&vN%Htt(~kk{<5}2bpU{sS@i tqpf{n3Pv&x8Hweq{IrX4>vb_ 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 L@zk}u8l4oHpxw(ED!k%tvw_Frjk)!gy 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

EJy3H& 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 KvoB*4s{#N$rXOJd delta 78519 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

MSd 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 diff --git a/kms.c b/kms.c index 3287013..fa242b5 100644 --- a/kms.c +++ b/kms.c @@ -42,12 +42,13 @@ const KmsIdList ProductList[] = { /* 013 */ { { 0x8665cb71, 0x468c, 0x4aa3, { 0xa3, 0x37, 0xcb, 0x9b, 0xc9, 0xd5, 0xea, 0xac } } /*"8665cb71-468c-4aa3-a337-cb9bc9d5eaac"*/, "Windows 2012", EPID_WINDOWS, 5, 5 }, /* 014 */ { { 0x8456EFD3, 0x0C04, 0x4089, { 0x87, 0x40, 0x5b, 0x72, 0x38, 0x53, 0x5a, 0x65 } } /*"8456EFD3-0C04-4089-8740-5B7238535A65"*/, "Windows 2012 R2", EPID_WINDOWS, 6, 5 }, /* 015 */ { { 0xe85af946, 0x2e25, 0x47b7, { 0x83, 0xe1, 0xbe, 0xbc, 0xeb, 0xea, 0xc6, 0x11 } } /*"e85af946-2e25-47b7-83e1-bebcebeac611"*/, "Office 2010", EPID_OFFICE2010, 4, 5 }, - /* 016 */ { { 0xe6a6f1bf, 0x9d40, 0x40c3, { 0xaa, 0x9f, 0xc7, 0x7b, 0xa2, 0x15, 0x78, 0xc0 } } /*"e6a6f1bf-9d40-40c3-aa9f-c77ba21578c0"*/, "Office 2013", EPID_OFFICE2013, 6, 5 }, + /* 016 */ { { 0xe6a6f1bf, 0x9d40, 0x40c3, { 0xaa, 0x9f, 0xc7, 0x7b, 0xa2, 0x15, 0x78, 0xc0 } } /*"e6a6f1bf-9d40-40c3-aa9f-c77ba21578c0"*/, "Office 2013+", EPID_OFFICE2013, 6, 5 }, /* 017 */ { { 0x6d5f5270, 0x31ac, 0x433e, { 0xb9, 0x0a, 0x39, 0x89, 0x29, 0x23, 0xc6, 0x57 } } /*"6d5f5270-31ac-433e-b90a-39892923c657"*/, "Windows Server Preview", EPID_WINDOWS, 6, 5 }, /* 018 */ { { 0x85b5f61b, 0x320b, 0x4be3, { 0x81, 0x4a, 0xb7, 0x6b, 0x2b, 0xfa, 0xfc, 0x82 } } /*"85b5f61b-320b-4be3-814a-b76b2bfafc82"*/, "Office 2016", EPID_OFFICE2013, 6, 5 }, /* 019 */ { { 0x58e2134f, 0x8e11, 0x4d17, { 0x9c, 0xb2, 0x91, 0x06, 0x9c, 0x15, 0x11, 0x48 } } /*"58e2134f-8e11-4d17-9cb2-91069c151148"*/, "Windows 10 VL", EPID_WINDOWS, 6, 25 }, /* 020 */ { { 0xe1c51358, 0xfe3e, 0x4203, { 0xa4, 0xa2, 0x3b, 0x6b, 0x20, 0xc9, 0x73, 0x4e } } /*"e1c51358-fe3e-4203-a4a2-3b6b20c9734e"*/, "Windows 10 Retail", EPID_WINDOWS, 6, 25 }, - /* 021 */ { { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, NULL, NULL, 0, 0 } + /* 021 */ { { 0x6e9fc069, 0x257d, 0x4bc4, { 0xb4, 0xa7, 0x75, 0x05, 0x14, 0xd3, 0x27, 0x43 } } /*"6e9fc069-257d-4bc4-b4a7-750514d32743"*/, "Windows 2016", EPID_WINDOWS, 6, 5 }, + /* 022 */ { { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, NULL, NULL, 0, 0 } }; #endif @@ -64,174 +65,201 @@ const KmsIdList AppList[] = { #ifndef NO_EXTENDED_PRODUCT_LIST const KmsIdList ExtendedProductList [] = { + // Windows 10 (Retail) + { { 0x58e97c99, 0xf377, 0x4ef1, { 0x81, 0xd5, 0x4a, 0xd5, 0x52, 0x2b, 0x5f, 0xd8, } } /*58e97c99-f377-4ef1-81d5-4ad5522b5fd8*/, "Windows 10 Home", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_RETAIL }, + { { 0xa9107544, 0xf4a0, 0x4053, { 0xa9, 0x6a, 0x14, 0x79, 0xab, 0xde, 0xf9, 0x12, } } /*a9107544-f4a0-4053-a96a-1479abdef912*/, "Windows 10 Home Country Specific", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_RETAIL }, + { { 0x7b9e1751, 0xa8da, 0x4f75, { 0x95, 0x60, 0x5f, 0xad, 0xfe, 0x3d, 0x8e, 0x38, } } /*7b9e1751-a8da-4f75-9560-5fadfe3d8e38*/, "Windows 10 Home N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_RETAIL }, + { { 0xcd918a57, 0xa41b, 0x4c82, { 0x8d, 0xce, 0x1a, 0x53, 0x8e, 0x22, 0x1a, 0x83, } } /*cd918a57-a41b-4c82-8dce-1a538e221a83*/, "Windows 10 Home Single Language", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_RETAIL }, - // Windows Server + // Windows 10 (Volume) + { { 0xe0c42288, 0x980c, 0x4788, { 0xa0, 0x14, 0xc0, 0x80, 0xd2, 0xe1, 0x92, 0x6e, } } /*e0c42288-980c-4788-a014-c080d2e1926e*/, "Windows 10 Education", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x3c102355, 0xd027, 0x42c6, { 0xad, 0x23, 0x2e, 0x7e, 0xf8, 0xa0, 0x25, 0x85, } } /*3c102355-d027-42c6-ad23-2e7ef8a02585*/, "Windows 10 Education N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x73111121, 0x5638, 0x40f6, { 0xbc, 0x11, 0xf1, 0xd7, 0xb0, 0xd6, 0x43, 0x00, } } /*73111121-5638-40f6-bc11-f1d7b0d64300*/, "Windows 10 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x7b51a46c, 0x0c04, 0x4e8f, { 0x9a, 0xf4, 0x84, 0x96, 0xcc, 0xa9, 0x0d, 0x5e, } } /*7b51a46c-0c04-4e8f-9af4-8496cca90d5e*/, "Windows 10 Enterprise 2015 LTSB", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x87b838b7, 0x41b6, 0x4590, { 0x83, 0x18, 0x57, 0x97, 0x95, 0x1d, 0x85, 0x29, } } /*87b838b7-41b6-4590-8318-5797951d8529*/, "Windows 10 Enterprise 2015 LTSB N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x2d5a5a60, 0x3040, 0x48bf, { 0xbe, 0xb0, 0xfc, 0xd7, 0x70, 0xc2, 0x0c, 0xe0, } } /*2d5a5a60-3040-48bf-beb0-fcd770c20ce0*/, "Windows 10 Enterprise 2016 LTSB", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x9f776d83, 0x7156, 0x45b2, { 0x8a, 0x5c, 0x35, 0x9b, 0x9c, 0x9f, 0x22, 0xa3, } } /*9f776d83-7156-45b2-8a5c-359b9c9f22a3*/, "Windows 10 Enterprise 2016 LTSB N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0xe272e3e2, 0x732f, 0x4c65, { 0xa8, 0xf0, 0x48, 0x47, 0x47, 0xd0, 0xd9, 0x47, } } /*e272e3e2-732f-4c65-a8f0-484747d0d947*/, "Windows 10 Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x2de67392, 0xb7a7, 0x462a, { 0xb1, 0xca, 0x10, 0x8d, 0xd1, 0x89, 0xf5, 0x88, } } /*2de67392-b7a7-462a-b1ca-108dd189f588*/, "Windows 10 Professional", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x3f1afc82, 0xf8ac, 0x4f6c, { 0x80, 0x05, 0x1d, 0x23, 0x3e, 0x60, 0x6e, 0xee, } } /*3f1afc82-f8ac-4f6c-8005-1d233e606eee*/, "Windows 10 Professional Education", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0x5300b18c, 0x2e33, 0x4dc2, { 0x82, 0x91, 0x47, 0xff, 0xce, 0xc7, 0x46, 0xdd, } } /*5300b18c-2e33-4dc2-8291-47ffcec746dd*/, "Windows 10 Professional Education N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, + { { 0xa80b5abf, 0x75ad, 0x428b, { 0xb0, 0x5d, 0xa4, 0x7d, 0x2d, 0xff, 0xee, 0xbf, } } /*a80b5abf-75ad-428b-b05d-a47d2dffeebf*/, "Windows 10 Professional N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, - { { 0xad2542d4, 0x9154, 0x4c6d, { 0x8a, 0x44, 0x30, 0xf1, 0x1e, 0xe9, 0x69, 0x89, } } /*ad2542d4-9154-4c6d-8a44-30f11ee96989*/, "Windows Server 2008 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008A }, - { { 0x2401e3d0, 0xc50a, 0x4b58, { 0x87, 0xb2, 0x7e, 0x79, 0x4b, 0x7d, 0x26, 0x07, } } /*2401e3d0-c50a-4b58-87b2-7e794b7d2607*/, "Windows Server 2008 Standard V", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008A }, - { { 0x68b6e220, 0xcf09, 0x466b, { 0x92, 0xd3, 0x45, 0xcd, 0x96, 0x4b, 0x95, 0x09, } } /*68b6e220-cf09-466b-92d3-45cd964b9509*/, "Windows Server 2008 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008C }, - { { 0xfd09ef77, 0x5647, 0x4eff, { 0x80, 0x9c, 0xaf, 0x2b, 0x64, 0x65, 0x9a, 0x45, } } /*fd09ef77-5647-4eff-809c-af2b64659a45*/, "Windows Server 2008 Datacenter V", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008C }, - { { 0xc1af4d90, 0xd1bc, 0x44ca, { 0x85, 0xd4, 0x00, 0x3b, 0xa3, 0x3d, 0xb3, 0xb9, } } /*c1af4d90-d1bc-44ca-85d4-003ba33db3b9*/, "Windows Server 2008 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008B }, - { { 0x8198490a, 0xadd0, 0x47b2, { 0xb3, 0xba, 0x31, 0x6b, 0x12, 0xd6, 0x47, 0xb4, } } /*8198490a-add0-47b2-b3ba-316b12d647b4*/, "Windows Server 2008 Enterprise V", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008B }, - { { 0xddfa9f7c, 0xf09e, 0x40b9, { 0x8c, 0x1a, 0xbe, 0x87, 0x7a, 0x9a, 0x7f, 0x4b, } } /*ddfa9f7c-f09e-40b9-8c1a-be877a9a7f4b*/, "Windows Server 2008 Web", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008A }, - { { 0x7afb1156, 0x2c1d, 0x40fc, { 0xb2, 0x60, 0xaa, 0xb7, 0x44, 0x2b, 0x62, 0xfe, } } /*7afb1156-2c1d-40fc-b260-aab7442b62fe*/, "Windows Server 2008 Compute Cluster", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008C }, - { { 0x68531fb9, 0x5511, 0x4989, { 0x97, 0xbe, 0xd1, 0x1a, 0x0f, 0x55, 0x63, 0x3f, } } /*68531fb9-5511-4989-97be-d11a0f55633f*/, "Windows Server 2008 R2 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2A }, - { { 0x7482e61b, 0xc589, 0x4b7f, { 0x8e, 0xcc, 0x46, 0xd4, 0x55, 0xac, 0x3b, 0x87, } } /*7482e61b-c589-4b7f-8ecc-46d455ac3b87*/, "Windows Server 2008 R2 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2C }, - { { 0x620e2b3d, 0x09e7, 0x42fd, { 0x80, 0x2a, 0x17, 0xa1, 0x36, 0x52, 0xfe, 0x7a, } } /*620e2b3d-09e7-42fd-802a-17a13652fe7a*/, "Windows Server 2008 R2 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2B }, - { { 0xa78b8bd9, 0x8017, 0x4df5, { 0xb8, 0x6a, 0x09, 0xf7, 0x56, 0xaf, 0xfa, 0x7c, } } /*a78b8bd9-8017-4df5-b86a-09f756affa7c*/, "Windows Server 2008 R2 Web", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2A }, - { { 0xcda18cf3, 0xc196, 0x46ad, { 0xb2, 0x89, 0x60, 0xc0, 0x72, 0x86, 0x99, 0x94, } } /*cda18cf3-c196-46ad-b289-60c072869994*/, "Windows Server 2008 R2 Compute Cluster", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2C }, - { { 0xd3643d60, 0x0c42, 0x412d, { 0xa7, 0xd6, 0x52, 0xe6, 0x63, 0x53, 0x27, 0xf6, } } /*d3643d60-0c42-412d-a7d6-52e6635327f6*/, "Windows Server 2012 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012 }, - { { 0xf0f5ec41, 0x0d55, 0x4732, { 0xaf, 0x02, 0x44, 0x0a, 0x44, 0xa3, 0xcf, 0x0f, } } /*f0f5ec41-0d55-4732-af02-440a44a3cf0f*/, "Windows Server 2012 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012 }, - { { 0x95fd1c83, 0x7df5, 0x494a, { 0xbe, 0x8b, 0x13, 0x00, 0xe1, 0xc9, 0xd1, 0xcd, } } /*95fd1c83-7df5-494a-be8b-1300e1c9d1cd*/, "Windows Server 2012 MultiPoint Premium", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012 }, - { { 0x7d5486c7, 0xe120, 0x4771, { 0xb7, 0xf1, 0x7b, 0x56, 0xc6, 0xd3, 0x17, 0x0c, } } /*7d5486c7-e120-4771-b7f1-7b56c6d3170c*/, "Windows Server 2012 MultiPoint Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012 }, - { { 0x00091344, 0x1ea4, 0x4f37, { 0xb7, 0x89, 0x01, 0x75, 0x0b, 0xa6, 0x98, 0x8c, } } /*00091344-1ea4-4f37-b789-01750ba6988c*/, "Windows Server 2012 R2 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012R2 }, - { { 0xb3ca044e, 0xa358, 0x4d68, { 0x98, 0x83, 0xaa, 0xa2, 0x94, 0x1a, 0xca, 0x99, } } /*b3ca044e-a358-4d68-9883-aaa2941aca99*/, "Windows Server 2012 R2 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012R2 }, - { { 0xb743a2be, 0x68d4, 0x4dd3, { 0xaf, 0x32, 0x92, 0x42, 0x5b, 0x7b, 0xb6, 0x23, } } /*b743a2be-68d4-4dd3-af32-92425b7bb623*/, "Windows Server 2012 R2 Cloud Storage", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012R2 }, - { { 0x21db6ba4, 0x9a7b, 0x4a14, { 0x9e, 0x29, 0x64, 0xa6, 0x0c, 0x59, 0x30, 0x1d, } } /*21db6ba4-9a7b-4a14-9e29-64a60c59301d*/, "Windows Server 2012 R2 Essentials", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012R2 }, - { { 0xba947c44, 0xd19d, 0x4786, { 0xb6, 0xae, 0x22, 0x77, 0x0b, 0xc9, 0x4c, 0x54, } } /*ba947c44-d19d-4786-b6ae-22770bc94c54*/, "Windows Server 2016 Datacenter Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_SRV_BETA }, + // Windows 7 + { { 0x0ab82d54, 0x47f4, 0x4acb, { 0x81, 0x8c, 0xcc, 0x5b, 0xf0, 0xec, 0xb6, 0x49, } } /*0ab82d54-47f4-4acb-818c-cc5bf0ecb649*/, "Windows 7 Embedded Industry", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + { { 0xae2ee509, 0x1b34, 0x41c0, { 0xac, 0xb7, 0x6d, 0x46, 0x50, 0x16, 0x89, 0x15, } } /*ae2ee509-1b34-41c0-acb7-6d4650168915*/, "Windows 7 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + { { 0x46bbed08, 0x9c7b, 0x48fc, { 0xa6, 0x14, 0x95, 0x25, 0x05, 0x73, 0xf4, 0xea, } } /*46bbed08-9c7b-48fc-a614-95250573f4ea*/, "Windows 7 Enterprise E", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + { { 0x1cb6d605, 0x11b3, 0x4e14, { 0xbb, 0x30, 0xda, 0x91, 0xc8, 0xe3, 0x98, 0x3a, } } /*1cb6d605-11b3-4e14-bb30-da91c8e3983a*/, "Windows 7 Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + { { 0xb92e9980, 0xb9d5, 0x4821, { 0x9c, 0x94, 0x14, 0x0f, 0x63, 0x2f, 0x63, 0x12, } } /*b92e9980-b9d5-4821-9c94-140f632f6312*/, "Windows 7 Professional", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + { { 0x5a041529, 0xfef8, 0x4d07, { 0xb0, 0x6f, 0xb5, 0x9b, 0x57, 0x3b, 0x32, 0xd2, } } /*5a041529-fef8-4d07-b06f-b59b573b32d2*/, "Windows 7 Professional E", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + { { 0x54a09a0d, 0xd57b, 0x4c10, { 0x8b, 0x69, 0xa8, 0x42, 0xd6, 0x59, 0x0a, 0xd5, } } /*54a09a0d-d57b-4c10-8b69-a842d6590ad5*/, "Windows 7 Professional N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + { { 0xdb537896, 0x376f, 0x48ae, { 0xa4, 0x92, 0x53, 0xd0, 0x54, 0x77, 0x73, 0xd0, } } /*db537896-376f-48ae-a492-53d0547773d0*/, "Windows Embedded POSReady 7", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + { { 0xaa6dd3aa, 0xc2b4, 0x40e2, { 0xa5, 0x44, 0xa6, 0xbb, 0xb3, 0xf5, 0xc3, 0x95, } } /*aa6dd3aa-c2b4-40e2-a544-a6bbb3f5c395*/, "Windows ThinPC", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + // Windows 8 (Retail) + { { 0xc04ed6bf, 0x55c8, 0x4b47, { 0x9f, 0x8e, 0x5a, 0x1f, 0x31, 0xce, 0xee, 0x60, } } /*c04ed6bf-55c8-4b47-9f8e-5a1f31ceee60*/, "Windows 8 Core", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, + { { 0x9d5584a2, 0x2d85, 0x419a, { 0x98, 0x2c, 0xa0, 0x08, 0x88, 0xbb, 0x9d, 0xdf, } } /*9d5584a2-2d85-419a-982c-a00888bb9ddf*/, "Windows 8 Core Country Specific", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, + { { 0x197390a0, 0x65f6, 0x4a95, { 0xbd, 0xc4, 0x55, 0xd5, 0x8a, 0x3b, 0x02, 0x53, } } /*197390a0-65f6-4a95-bdc4-55d58a3b0253*/, "Windows 8 Core N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, + { { 0x8860fcd4, 0xa77b, 0x4a20, { 0x90, 0x45, 0xa1, 0x50, 0xff, 0x11, 0xd6, 0x09, } } /*8860fcd4-a77b-4a20-9045-a150ff11d609*/, "Windows 8 Core Single Language", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, + { { 0xa00018a3, 0xf20f, 0x4632, { 0xbf, 0x7c, 0x8d, 0xaa, 0x53, 0x51, 0xc9, 0x14, } } /*a00018a3-f20f-4632-bf7c-8daa5351c914*/, "Windows 8 Professional WMC", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, - // Windows 10 Preview -# ifdef INCLUDE_BETAS - { { 0x6496e59d, 0x89dc, 0x49eb, { 0xa3, 0x53, 0x09, 0xce, 0xb9, 0x40, 0x48, 0x45, } } /*6496e59d-89dc-49eb-a353-09ceb9404845*/, "Windows 10 Core Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, - { { 0xa4383e6b, 0xdada, 0x423d, { 0xa4, 0x3d, 0xf2, 0x56, 0x78, 0x42, 0x96, 0x76, } } /*a4383e6b-dada-423d-a43d-f25678429676*/, "Windows 10 Professional Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, - { { 0xcf59a07b, 0x1a2a, 0x4be0, { 0xbf, 0xe0, 0x42, 0x3b, 0x58, 0x23, 0xe6, 0x63, } } /*cf59a07b-1a2a-4be0-bfe0-423b5823e663*/, "Windows 10 Professional WMC Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, - { { 0xcde952c7, 0x2f96, 0x4d9d, { 0x8f, 0x2b, 0x2d, 0x34, 0x9f, 0x64, 0xfc, 0x51, } } /*cde952c7-2f96-4d9d-8f2b-2d349f64fc51*/, "Windows 10 Enterprise Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, -# endif + // Windows 8 (Volume) + { { 0x10018baf, 0xce21, 0x4060, { 0x80, 0xbd, 0x47, 0xfe, 0x74, 0xed, 0x4d, 0xab, } } /*10018baf-ce21-4060-80bd-47fe74ed4dab*/, "Windows 8 Embedded Industry", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, + { { 0x18db1848, 0x12e0, 0x4167, { 0xb9, 0xd7, 0xda, 0x7f, 0xcd, 0xa5, 0x07, 0xdb, } } /*18db1848-12e0-4167-b9d7-da7fcda507db*/, "Windows 8 Embedded Industry E", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, + { { 0x458e1bec, 0x837a, 0x45f6, { 0xb9, 0xd5, 0x92, 0x5e, 0xd5, 0xd2, 0x99, 0xde, } } /*458e1bec-837a-45f6-b9d5-925ed5d299de*/, "Windows 8 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, + { { 0xe14997e7, 0x800a, 0x4cf7, { 0xad, 0x10, 0xde, 0x4b, 0x45, 0xb5, 0x78, 0xdb, } } /*e14997e7-800a-4cf7-ad10-de4b45b578db*/, "Windows 8 Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, + { { 0xa98bcd6d, 0x5343, 0x4603, { 0x8a, 0xfe, 0x59, 0x08, 0xe4, 0x61, 0x11, 0x12, } } /*a98bcd6d-5343-4603-8afe-5908e4611112*/, "Windows 8 Professional", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, + { { 0xebf245c1, 0x29a8, 0x4daf, { 0x9c, 0xb1, 0x38, 0xdf, 0xc6, 0x08, 0xa8, 0xc8, } } /*ebf245c1-29a8-4daf-9cb1-38dfc608a8c8*/, "Windows 8 Professional N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, + // Windows 8.1 (Retail) + { { 0xfe1c3238, 0x432a, 0x43a1, { 0x8e, 0x25, 0x97, 0xe7, 0xd1, 0xef, 0x10, 0xf3, } } /*fe1c3238-432a-43a1-8e25-97e7d1ef10f3*/, "Windows 8.1 Core", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, + { { 0xffee456a, 0xcd87, 0x4390, { 0x8e, 0x07, 0x16, 0x14, 0x6c, 0x67, 0x2f, 0xd0, } } /*ffee456a-cd87-4390-8e07-16146c672fd0*/, "Windows 8.1 Core ARM", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, + { { 0xdb78b74f, 0xef1c, 0x4892, { 0xab, 0xfe, 0x1e, 0x66, 0xb8, 0x23, 0x1d, 0xf6, } } /*db78b74f-ef1c-4892-abfe-1e66b8231df6*/, "Windows 8.1 Core Country Specific", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, + { { 0x78558a64, 0xdc19, 0x43fe, { 0xa0, 0xd0, 0x80, 0x75, 0xb2, 0xa3, 0x70, 0xa3, } } /*78558a64-dc19-43fe-a0d0-8075b2a370a3*/, "Windows 8.1 Core N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, + { { 0xc72c6a1d, 0xf252, 0x4e7e, { 0xbd, 0xd1, 0x3f, 0xca, 0x34, 0x2a, 0xcb, 0x35, } } /*c72c6a1d-f252-4e7e-bdd1-3fca342acb35*/, "Windows 8.1 Core Single Language", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, + { { 0xe58d87b5, 0x8126, 0x4580, { 0x80, 0xfb, 0x86, 0x1b, 0x22, 0xf7, 0x92, 0x96, } } /*e58d87b5-8126-4580-80fb-861b22f79296*/, "Windows 8.1 Professional Student", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, + { { 0xcab491c7, 0xa918, 0x4f60, { 0xb5, 0x02, 0xda, 0xb7, 0x5e, 0x33, 0x4f, 0x40, } } /*cab491c7-a918-4f60-b502-dab75e334f40*/, "Windows 8.1 Professional Student N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, + { { 0x096ce63d, 0x4fac, 0x48a9, { 0x82, 0xa9, 0x61, 0xae, 0x9e, 0x80, 0x0e, 0x5f, } } /*096ce63d-4fac-48a9-82a9-61ae9e800e5f*/, "Windows 8.1 Professional WMC", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - // Windows 10 + // Windows 8.1 (Volume) + { { 0xe9942b32, 0x2e55, 0x4197, { 0xb0, 0xbd, 0x5f, 0xf5, 0x8c, 0xba, 0x88, 0x60, } } /*e9942b32-2e55-4197-b0bd-5ff58cba8860*/, "Windows 8.1 Core Connected", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0xba998212, 0x460a, 0x44db, { 0xbf, 0xb5, 0x71, 0xbf, 0x09, 0xd1, 0xc6, 0x8b, } } /*ba998212-460a-44db-bfb5-71bf09d1c68b*/, "Windows 8.1 Core Connected Country Specific", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0xc6ddecd6, 0x2354, 0x4c19, { 0x90, 0x9b, 0x30, 0x6a, 0x30, 0x58, 0x48, 0x4e, } } /*c6ddecd6-2354-4c19-909b-306a3058484e*/, "Windows 8.1 Core Connected N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0xb8f5e3a3, 0xed33, 0x4608, { 0x81, 0xe1, 0x37, 0xd6, 0xc9, 0xdc, 0xfd, 0x9c, } } /*b8f5e3a3-ed33-4608-81e1-37d6c9dcfd9c*/, "Windows 8.1 Core Connected Single Language", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0x81671aaf, 0x79d1, 0x4eb1, { 0xb0, 0x04, 0x8c, 0xbb, 0xe1, 0x73, 0xaf, 0xea, } } /*81671aaf-79d1-4eb1-b004-8cbbe173afea*/, "Windows 8.1 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0x113e705c, 0xfa49, 0x48a4, { 0xbe, 0xea, 0x7d, 0xd8, 0x79, 0xb4, 0x6b, 0x14, } } /*113e705c-fa49-48a4-beea-7dd879b46b14*/, "Windows 8.1 Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0xc06b6981, 0xd7fd, 0x4a35, { 0xb7, 0xb4, 0x05, 0x47, 0x42, 0xb7, 0xaf, 0x67, } } /*c06b6981-d7fd-4a35-b7b4-054742b7af67*/, "Windows 8.1 Professional", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0x7476d79f, 0x8e48, 0x49b4, { 0xab, 0x63, 0x4d, 0x0b, 0x81, 0x3a, 0x16, 0xe4, } } /*7476d79f-8e48-49b4-ab63-4d0b813a16e4*/, "Windows 8.1 Professional N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0xf7e88590, 0xdfc7, 0x4c78, { 0xbc, 0xcb, 0x6f, 0x38, 0x65, 0xb9, 0x9d, 0x1a, } } /*f7e88590-dfc7-4c78-bccb-6f3865b99d1a*/, "Windows Embedded Industry A 8.1", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + { { 0xcd4e2d9f, 0x5059, 0x4a50, { 0xa9, 0x2d, 0x05, 0xd5, 0xbb, 0x12, 0x67, 0xc7, } } /*cd4e2d9f-5059-4a50-a92d-05d5bb1267c7*/, "Windows Embedded Industry E 8.1", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0x73111121, 0x5638, 0x40f6, { 0xbc, 0x11, 0xf1, 0xd7, 0xb0, 0xd6, 0x43, 0x00, } } /*73111121-5638-40f6-bc11-f1d7b0d64300*/, "Windows 10 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, - { { 0xe272e3e2, 0x732f, 0x4c65, { 0xa8, 0xf0, 0x48, 0x47, 0x47, 0xd0, 0xd9, 0x47, } } /*e272e3e2-732f-4c65-a8f0-484747d0d947*/, "Windows 10 Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL}, - { { 0x7b51a46c, 0x0c04, 0x4e8f, { 0x9a, 0xf4, 0x84, 0x96, 0xcc, 0xa9, 0x0d, 0x5e, } } /*7b51a46c-0c04-4e8f-9af4-8496cca90d5e*/, "Windows 10 Enterprise LTSB", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL}, - { { 0x87b838b7, 0x41b6, 0x4590, { 0x83, 0x18, 0x57, 0x97, 0x95, 0x1d, 0x85, 0x29, } } /*87b838b7-41b6-4590-8318-5797951d8529*/, "Windows 10 Enterprise LTSB N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL}, - { { 0xe0c42288, 0x980c, 0x4788, { 0xa0, 0x14, 0xc0, 0x80, 0xd2, 0xe1, 0x92, 0x6e, } } /*e0c42288-980c-4788-a014-c080d2e1926e*/, "Windows 10 Education", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL}, - { { 0x3c102355, 0xd027, 0x42c6, { 0xad, 0x23, 0x2e, 0x7e, 0xf8, 0xa0, 0x25, 0x85, } } /*3c102355-d027-42c6-ad23-2e7ef8a02585*/, "Windows 10 Education N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL}, - { { 0x2de67392, 0xb7a7, 0x462a, { 0xb1, 0xca, 0x10, 0x8d, 0xd1, 0x89, 0xf5, 0x88, } } /*2de67392-b7a7-462a-b1ca-108dd189f588*/, "Windows 10 Professional", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL }, - { { 0xa80b5abf, 0x75ad, 0x428b, { 0xb0, 0x5d, 0xa4, 0x7d, 0x2d, 0xff, 0xee, 0xbf, } } /*a80b5abf-76ad-428b-b05d-a47d2dffeebf*/, "Windows 10 Professional N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_VL}, - { { 0x58e97c99, 0xf377, 0x4ef1, { 0x81, 0xd5, 0x4a, 0xd5, 0x52, 0x2b, 0x5f, 0xd8, } } /*58e97c99-f377-4ef1-81d5-4ad5522b5fd8*/, "Windows 10 Home", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_RETAIL}, - { { 0x7b9e1751, 0xa8da, 0x4f75, { 0x95, 0x60, 0x5f, 0xad, 0xfe, 0x3d, 0x8e, 0x38, } } /*7b9e1751-a8da-4f75-9560-5fadfe3d8e38*/, "Windows 10 Home N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_RETAIL}, - { { 0xcd918a57, 0xa41b, 0x4c82, { 0x8d, 0xce, 0x1a, 0x53, 0x8e, 0x22, 0x1a, 0x83, } } /*cd918a57-a41b-4c82-8dce-1a538e221a83*/, "Windows 10 Home Single Language", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_RETAIL}, - { { 0xa9107544, 0xf4a0, 0x4053, { 0xa9, 0x6a, 0x14, 0x79, 0xab, 0xde, 0xf9, 0x12, } } /*a9107544-f4a0-4053-a96a-1479abdef912*/, "Windows 10 Home Country Specific", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN10_RETAIL}, + // Windows Preview + # ifdef INCLUDE_BETAS + { { 0xcde952c7, 0x2f96, 0x4d9d, { 0x8f, 0x2b, 0x2d, 0x34, 0x9f, 0x64, 0xfc, 0x51, } } /*cde952c7-2f96-4d9d-8f2b-2d349f64fc51*/, "Windows 10 Enterprise Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, + { { 0xa4383e6b, 0xdada, 0x423d, { 0xa4, 0x3d, 0xf2, 0x56, 0x78, 0x42, 0x96, 0x76, } } /*a4383e6b-dada-423d-a43d-f25678429676*/, "Windows 10 Professional Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, + { { 0xcf59a07b, 0x1a2a, 0x4be0, { 0xbf, 0xe0, 0x42, 0x3b, 0x58, 0x23, 0xe6, 0x63, } } /*cf59a07b-1a2a-4be0-bfe0-423b5823e663*/, "Windows 10 Professional WMC Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, + { { 0x2b9c337f, 0x7a1d, 0x4271, { 0x90, 0xa3, 0xc6, 0x85, 0x5a, 0x2b, 0x8a, 0x1c, } } /*2b9c337f-7a1d-4271-90a3-c6855a2b8a1c*/, "Windows 8.x Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, + { { 0x631ead72, 0xa8ab, 0x4df8, { 0xbb, 0xdf, 0x37, 0x20, 0x29, 0x98, 0x9b, 0xdd, } } /*631ead72-a8ab-4df8-bbdf-372029989bdd*/, "Windows 8.x Preview ARM", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, + # endif // INCLUDE_BETAS + // Windows Server 2008 A (Web and Standard) + { { 0xad2542d4, 0x9154, 0x4c6d, { 0x8a, 0x44, 0x30, 0xf1, 0x1e, 0xe9, 0x69, 0x89, } } /*ad2542d4-9154-4c6d-8a44-30f11ee96989*/, "Windows Server 2008 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008A }, + { { 0x2401e3d0, 0xc50a, 0x4b58, { 0x87, 0xb2, 0x7e, 0x79, 0x4b, 0x7d, 0x26, 0x07, } } /*2401e3d0-c50a-4b58-87b2-7e794b7d2607*/, "Windows Server 2008 Standard without Hyper-V", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008A }, + { { 0xddfa9f7c, 0xf09e, 0x40b9, { 0x8c, 0x1a, 0xbe, 0x87, 0x7a, 0x9a, 0x7f, 0x4b, } } /*ddfa9f7c-f09e-40b9-8c1a-be877a9a7f4b*/, "Windows Server 2008 Web", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008A }, - // Windows 8.x + // Windows Server 2008 B (Enterprise) + { { 0xc1af4d90, 0xd1bc, 0x44ca, { 0x85, 0xd4, 0x00, 0x3b, 0xa3, 0x3d, 0xb3, 0xb9, } } /*c1af4d90-d1bc-44ca-85d4-003ba33db3b9*/, "Windows Server 2008 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008B }, + { { 0x8198490a, 0xadd0, 0x47b2, { 0xb3, 0xba, 0x31, 0x6b, 0x12, 0xd6, 0x47, 0xb4, } } /*8198490a-add0-47b2-b3ba-316b12d647b4*/, "Windows Server 2008 Enterprise without Hyper-V", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008B }, -# ifdef INCLUDE_BETAS - { { 0x2B9C337F, 0x7A1D, 0x4271, { 0x90, 0xA3, 0xC6, 0x85, 0x5A, 0x2B, 0x8A, 0x1C, } } /*2B9C337F-7A1D-4271-90A3-C6855A2B8A1C*/, "Windows 8.x Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, - { { 0x631EAD72, 0xA8AB, 0x4DF8, { 0xBB, 0xDF, 0x37, 0x20, 0x29, 0x98, 0x9B, 0xDD, } } /*631EAD72-A8AB-4DF8-BBDF-372029989BDD*/, "Windows 8.x Preview ARM", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_BETA }, -# endif - { { 0x81671aaf, 0x79d1, 0x4eb1, { 0xb0, 0x04, 0x8c, 0xbb, 0xe1, 0x73, 0xaf, 0xea, } } /*81671aaf-79d1-4eb1-b004-8cbbe173afea*/, "Windows 8.1 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0x113e705c, 0xfa49, 0x48a4, { 0xbe, 0xea, 0x7d, 0xd8, 0x79, 0xb4, 0x6b, 0x14, } } /*113e705c-fa49-48a4-beea-7dd879b46b14*/, "Windows 8.1 Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0x096ce63d, 0x4fac, 0x48a9, { 0x82, 0xa9, 0x61, 0xae, 0x9e, 0x80, 0x0e, 0x5f, } } /*096ce63d-4fac-48a9-82a9-61ae9e800e5f*/, "Windows 8.1 Professional WMC", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - { { 0xc06b6981, 0xd7fd, 0x4a35, { 0xb7, 0xb4, 0x05, 0x47, 0x42, 0xb7, 0xaf, 0x67, } } /*c06b6981-d7fd-4a35-b7b4-054742b7af67*/, "Windows 8.1 Professional", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0x7476d79f, 0x8e48, 0x49b4, { 0xab, 0x63, 0x4d, 0x0b, 0x81, 0x3a, 0x16, 0xe4, } } /*7476d79f-8e48-49b4-ab63-4d0b813a16e4*/, "Windows 8.1 Professional N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0xfe1c3238, 0x432a, 0x43a1, { 0x8e, 0x25, 0x97, 0xe7, 0xd1, 0xef, 0x10, 0xf3, } } /*fe1c3238-432a-43a1-8e25-97e7d1ef10f3*/, "Windows 8.1 Core", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - { { 0x78558a64, 0xdc19, 0x43fe, { 0xa0, 0xd0, 0x80, 0x75, 0xb2, 0xa3, 0x70, 0xa3, } } /*78558a64-dc19-43fe-a0d0-8075b2a370a3*/, "Windows 8.1 Core N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - { { 0xffee456a, 0xcd87, 0x4390, { 0x8e, 0x07, 0x16, 0x14, 0x6c, 0x67, 0x2f, 0xd0, } } /*ffee456a-cd87-4390-8e07-16146c672fd0*/, "Windows 8.1 Core ARM", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - { { 0xc72c6a1d, 0xf252, 0x4e7e, { 0xbd, 0xd1, 0x3f, 0xca, 0x34, 0x2a, 0xcb, 0x35, } } /*c72c6a1d-f252-4e7e-bdd1-3fca342acb35*/, "Windows 8.1 Core Single Language", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - { { 0xdb78b74f, 0xef1c, 0x4892, { 0xab, 0xfe, 0x1e, 0x66, 0xb8, 0x23, 0x1d, 0xf6, } } /*db78b74f-ef1c-4892-abfe-1e66b8231df6*/, "Windows 8.1 Core Country Specific", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - { { 0xe9942b32, 0x2e55, 0x4197, { 0xb0, 0xbd, 0x5f, 0xf5, 0x8c, 0xba, 0x88, 0x60, } } /*e9942b32-2e55-4197-b0bd-5ff58cba8860*/, "Windows 8.1 Core Connected", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0xc6ddecd6, 0x2354, 0x4c19, { 0x90, 0x9b, 0x30, 0x6a, 0x30, 0x58, 0x48, 0x4e, } } /*c6ddecd6-2354-4c19-909b-306a3058484e*/, "Windows 8.1 Core Connected N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0xb8f5e3a3, 0xed33, 0x4608, { 0x81, 0xe1, 0x37, 0xd6, 0xc9, 0xdc, 0xfd, 0x9c, } } /*b8f5e3a3-ed33-4608-81e1-37d6c9dcfd9c*/, "Windows 8.1 Core Connected Single Language", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0xba998212, 0x460a, 0x44db, { 0xbf, 0xb5, 0x71, 0xbf, 0x09, 0xd1, 0xc6, 0x8b, } } /*ba998212-460a-44db-bfb5-71bf09d1c68b*/, "Windows 8.1 Core Connected Country Specific", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0xe58d87b5, 0x8126, 0x4580, { 0x80, 0xfb, 0x86, 0x1b, 0x22, 0xf7, 0x92, 0x96, } } /*e58d87b5-8126-4580-80fb-861b22f79296*/, "Windows 8.1 Professional Student", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - { { 0xcab491c7, 0xa918, 0x4f60, { 0xb5, 0x02, 0xda, 0xb7, 0x5e, 0x33, 0x4f, 0x40, } } /*cab491c7-a918-4f60-b502-dab75e334f40*/, "Windows 8.1 Professional Student N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_RETAIL }, - { { 0xa00018a3, 0xf20f, 0x4632, { 0xbf, 0x7c, 0x8d, 0xaa, 0x53, 0x51, 0xc9, 0x14, } } /*a00018a3-f20f-4632-bf7c-8daa5351c914*/, "Windows 8 Professional WMC", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, - { { 0xa98bcd6d, 0x5343, 0x4603, { 0x8a, 0xfe, 0x59, 0x08, 0xe4, 0x61, 0x11, 0x12, } } /*a98bcd6d-5343-4603-8afe-5908e4611112*/, "Windows 8 Professional", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, - { { 0xebf245c1, 0x29a8, 0x4daf, { 0x9c, 0xb1, 0x38, 0xdf, 0xc6, 0x08, 0xa8, 0xc8, } } /*ebf245c1-29a8-4daf-9cb1-38dfc608a8c8*/, "Windows 8 Professional N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, - { { 0x458e1bec, 0x837a, 0x45f6, { 0xb9, 0xd5, 0x92, 0x5e, 0xd5, 0xd2, 0x99, 0xde, } } /*458e1bec-837a-45f6-b9d5-925ed5d299de*/, "Windows 8 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, - { { 0xe14997e7, 0x800a, 0x4cf7, { 0xad, 0x10, 0xde, 0x4b, 0x45, 0xb5, 0x78, 0xdb, } } /*e14997e7-800a-4cf7-ad10-de4b45b578db*/, "Windows 8 Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_VL }, - { { 0xc04ed6bf, 0x55c8, 0x4b47, { 0x9f, 0x8e, 0x5a, 0x1f, 0x31, 0xce, 0xee, 0x60, } } /*c04ed6bf-55c8-4b47-9f8e-5a1f31ceee60*/, "Windows 8 Core", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, - { { 0x197390a0, 0x65f6, 0x4a95, { 0xbd, 0xc4, 0x55, 0xd5, 0x8a, 0x3b, 0x02, 0x53, } } /*197390a0-65f6-4a95-bdc4-55d58a3b0253*/, "Windows 8 Core N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, - { { 0x9d5584a2, 0x2d85, 0x419a, { 0x98, 0x2c, 0xa0, 0x08, 0x88, 0xbb, 0x9d, 0xdf, } } /*9d5584a2-2d85-419a-982c-a00888bb9ddf*/, "Windows 8 Core Country Specific", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, - { { 0x8860fcd4, 0xa77b, 0x4a20, { 0x90, 0x45, 0xa1, 0x50, 0xff, 0x11, 0xd6, 0x09, } } /*8860fcd4-a77b-4a20-9045-a150ff11d609*/, "Windows 8 Core Single Language", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN8_RETAIL }, + // Windows Server 2008 C (Datacenter) + { { 0x7afb1156, 0x2c1d, 0x40fc, { 0xb2, 0x60, 0xaa, 0xb7, 0x44, 0x2b, 0x62, 0xfe, } } /*7afb1156-2c1d-40fc-b260-aab7442b62fe*/, "Windows Server 2008 Compute Cluster", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008C }, + { { 0x68b6e220, 0xcf09, 0x466b, { 0x92, 0xd3, 0x45, 0xcd, 0x96, 0x4b, 0x95, 0x09, } } /*68b6e220-cf09-466b-92d3-45cd964b9509*/, "Windows Server 2008 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008C }, + { { 0xfd09ef77, 0x5647, 0x4eff, { 0x80, 0x9c, 0xaf, 0x2b, 0x64, 0x65, 0x9a, 0x45, } } /*fd09ef77-5647-4eff-809c-af2b64659a45*/, "Windows Server 2008 Datacenter without Hyper-V", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008C }, + { { 0x01ef176b, 0x3e0d, 0x422a, { 0xb4, 0xf8, 0x4e, 0xa8, 0x80, 0x03, 0x5e, 0x8f, } } /*01ef176b-3e0d-422a-b4f8-4ea880035e8f*/, "Windows Server 2008 for Itanium", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008C }, + // Windows Server 2008 R2 A (Web and Standard) + { { 0xf772515c, 0x0e87, 0x48d5, { 0xa6, 0x76, 0xe6, 0x96, 0x2c, 0x3e, 0x11, 0x95, } } /*f772515c-0e87-48d5-a676-e6962c3e1195*/, "Windows MultiPoint Server 2010", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2A }, + { { 0x68531fb9, 0x5511, 0x4989, { 0x97, 0xbe, 0xd1, 0x1a, 0x0f, 0x55, 0x63, 0x3f, } } /*68531fb9-5511-4989-97be-d11a0f55633f*/, "Windows Server 2008 R2 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2A }, + { { 0xa78b8bd9, 0x8017, 0x4df5, { 0xb8, 0x6a, 0x09, 0xf7, 0x56, 0xaf, 0xfa, 0x7c, } } /*a78b8bd9-8017-4df5-b86a-09f756affa7c*/, "Windows Server 2008 R2 Web", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2A }, - // Windows 7 + // Windows Server 2008 R2 B (Enterprise) + { { 0x620e2b3d, 0x09e7, 0x42fd, { 0x80, 0x2a, 0x17, 0xa1, 0x36, 0x52, 0xfe, 0x7a, } } /*620e2b3d-09e7-42fd-802a-17a13652fe7a*/, "Windows Server 2008 R2 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2B }, - { { 0xae2ee509, 0x1b34, 0x41c0, { 0xac, 0xb7, 0x6d, 0x46, 0x50, 0x16, 0x89, 0x15, } } /*ae2ee509-1b34-41c0-acb7-6d4650168915*/, "Windows 7 Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, - { { 0x1cb6d605, 0x11b3, 0x4e14, { 0xbb, 0x30, 0xda, 0x91, 0xc8, 0xe3, 0x98, 0x3a, } } /*1cb6d605-11b3-4e14-bb30-da91c8e3983a*/, "Windows 7 Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, - { { 0xb92e9980, 0xb9d5, 0x4821, { 0x9c, 0x94, 0x14, 0x0f, 0x63, 0x2f, 0x63, 0x12, } } /*b92e9980-b9d5-4821-9c94-140f632f6312*/, "Windows 7 Professional", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, - { { 0x54a09a0d, 0xd57b, 0x4c10, { 0x8b, 0x69, 0xa8, 0x42, 0xd6, 0x59, 0x0a, 0xd5, } } /*54a09a0d-d57b-4c10-8b69-a842d6590ad5*/, "Windows 7 Professional N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, + // Windows Server 2008 R2 C (Datacenter) + { { 0xcda18cf3, 0xc196, 0x46ad, { 0xb2, 0x89, 0x60, 0xc0, 0x72, 0x86, 0x99, 0x94, } } /*cda18cf3-c196-46ad-b289-60c072869994*/, "Windows Server 2008 R2 Compute Cluster", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2C }, + { { 0x7482e61b, 0xc589, 0x4b7f, { 0x8e, 0xcc, 0x46, 0xd4, 0x55, 0xac, 0x3b, 0x87, } } /*7482e61b-c589-4b7f-8ecc-46d455ac3b87*/, "Windows Server 2008 R2 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2C }, + { { 0x8a26851c, 0x1c7e, 0x48d3, { 0xa6, 0x87, 0xfb, 0xca, 0x9b, 0x9a, 0xc1, 0x6b, } } /*8a26851c-1c7e-48d3-a687-fbca9b9ac16b*/, "Windows Server 2008 R2 for Itanium Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2008R2C }, + // Windows Server 2012 + { { 0xd3643d60, 0x0c42, 0x412d, { 0xa7, 0xd6, 0x52, 0xe6, 0x63, 0x53, 0x27, 0xf6, } } /*d3643d60-0c42-412d-a7d6-52e6635327f6*/, "Windows Server 2012 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012 }, + { { 0x95fd1c83, 0x7df5, 0x494a, { 0xbe, 0x8b, 0x13, 0x00, 0xe1, 0xc9, 0xd1, 0xcd, } } /*95fd1c83-7df5-494a-be8b-1300e1c9d1cd*/, "Windows Server 2012 MultiPoint Premium", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012 }, + { { 0x7d5486c7, 0xe120, 0x4771, { 0xb7, 0xf1, 0x7b, 0x56, 0xc6, 0xd3, 0x17, 0x0c, } } /*7d5486c7-e120-4771-b7f1-7b56c6d3170c*/, "Windows Server 2012 MultiPoint Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012 }, + { { 0xf0f5ec41, 0x0d55, 0x4732, { 0xaf, 0x02, 0x44, 0x0a, 0x44, 0xa3, 0xcf, 0x0f, } } /*f0f5ec41-0d55-4732-af02-440a44a3cf0f*/, "Windows Server 2012 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012 }, - // Windows Vista + // Windows Server 2012 R2 + { { 0xb743a2be, 0x68d4, 0x4dd3, { 0xaf, 0x32, 0x92, 0x42, 0x5b, 0x7b, 0xb6, 0x23, } } /*b743a2be-68d4-4dd3-af32-92425b7bb623*/, "Windows Server 2012 R2 Cloud Storage", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012R2 }, + { { 0x00091344, 0x1ea4, 0x4f37, { 0xb7, 0x89, 0x01, 0x75, 0x0b, 0xa6, 0x98, 0x8c, } } /*00091344-1ea4-4f37-b789-01750ba6988c*/, "Windows Server 2012 R2 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012R2 }, + { { 0x21db6ba4, 0x9a7b, 0x4a14, { 0x9e, 0x29, 0x64, 0xa6, 0x0c, 0x59, 0x30, 0x1d, } } /*21db6ba4-9a7b-4a14-9e29-64a60c59301d*/, "Windows Server 2012 R2 Essentials", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012R2 }, + { { 0xb3ca044e, 0xa358, 0x4d68, { 0x98, 0x83, 0xaa, 0xa2, 0x94, 0x1a, 0xca, 0x99, } } /*b3ca044e-a358-4d68-9883-aaa2941aca99*/, "Windows Server 2012 R2 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2012R2 }, - { { 0xcfd8ff08, 0xc0d7, 0x452b, { 0x9f, 0x60, 0xef, 0x5c, 0x70, 0xc3, 0x20, 0x94, } } /*cfd8ff08-c0d7-452b-9f60-ef5c70c32094*/, "Windows Vista Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_VISTA }, - { { 0xd4f54950, 0x26f2, 0x4fb4, { 0xba, 0x21, 0xff, 0xab, 0x16, 0xaf, 0xca, 0xde, } } /*d4f54950-26f2-4fb4-ba21-ffab16afcade*/, "Windows Vista Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_VISTA }, - { { 0x4f3d1606, 0x3fea, 0x4c01, { 0xbe, 0x3c, 0x8d, 0x67, 0x1c, 0x40, 0x1e, 0x3b, } } /*4f3d1606-3fea-4c01-be3c-8d671c401e3b*/, "Windows Vista Business", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_VISTA }, - { { 0x2c682dc2, 0x8b68, 0x4f63, { 0xa1, 0x65, 0xae, 0x29, 0x1d, 0x4c, 0xf1, 0x38, } } /*2c682dc2-8b68-4f63-a165-ae291d4cf138*/, "Windows Vista Business N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_VISTA }, + // Windows Server 2016 + { { 0x7b4433f4, 0xb1e7, 0x4788, { 0x89, 0x5a, 0xc4, 0x53, 0x78, 0xd3, 0x82, 0x53, } } /*7b4433f4-b1e7-4788-895a-c45378d38253*/, "Windows Server 2016 Azure Core", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2016 }, + { { 0x3dbf341b, 0x5f6c, 0x4fa7, { 0xb9, 0x36, 0x69, 0x9d, 0xce, 0x9e, 0x26, 0x3f, } } /*3dbf341b-5f6c-4fa7-b936-699dce9e263f*/, "Windows Server 2016 Cloud Storage", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2016 }, + { { 0x21c56779, 0xb449, 0x4d20, { 0xad, 0xfc, 0xee, 0xce, 0x0e, 0x1a, 0xd7, 0x4b, } } /*21c56779-b449-4d20-adfc-eece0e1ad74b*/, "Windows Server 2016 Datacenter", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2016 }, + { { 0x2b5a1b0f, 0xa5ab, 0x4c54, { 0xac, 0x2f, 0xa6, 0xd9, 0x48, 0x24, 0xa2, 0x83, } } /*2b5a1b0f-a5ab-4c54-ac2f-a6d94824a283*/, "Windows Server 2016 Essentials", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2016 }, + { { 0x8c1c5410, 0x9f39, 0x4805, { 0x8c, 0x9d, 0x63, 0xa0, 0x77, 0x06, 0x35, 0x8f, } } /*8c1c5410-9f39-4805-8c9d-63a07706358f*/, "Windows Server 2016 Standard", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN2016 }, + // Windows Server Preview + # ifdef INCLUDE_BETAS + { { 0xba947c44, 0xd19d, 0x4786, { 0xb6, 0xae, 0x22, 0x77, 0x0b, 0xc9, 0x4c, 0x54, } } /*ba947c44-d19d-4786-b6ae-22770bc94c54*/, "Windows Server 2016 Datacenter Preview", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN_SRV_BETA }, + # endif // INCLUDE_BETAS - // Windows Embedded + // Windows Vista + { { 0x4f3d1606, 0x3fea, 0x4c01, { 0xbe, 0x3c, 0x8d, 0x67, 0x1c, 0x40, 0x1e, 0x3b, } } /*4f3d1606-3fea-4c01-be3c-8d671c401e3b*/, "Windows Vista Business", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_VISTA }, + { { 0x2c682dc2, 0x8b68, 0x4f63, { 0xa1, 0x65, 0xae, 0x29, 0x1d, 0x4c, 0xf1, 0x38, } } /*2c682dc2-8b68-4f63-a165-ae291d4cf138*/, "Windows Vista Business N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_VISTA }, + { { 0xcfd8ff08, 0xc0d7, 0x452b, { 0x9f, 0x60, 0xef, 0x5c, 0x70, 0xc3, 0x20, 0x94, } } /*cfd8ff08-c0d7-452b-9f60-ef5c70c32094*/, "Windows Vista Enterprise", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_VISTA }, + { { 0xd4f54950, 0x26f2, 0x4fb4, { 0xba, 0x21, 0xff, 0xab, 0x16, 0xaf, 0xca, 0xde, } } /*d4f54950-26f2-4fb4-ba21-ffab16afcade*/, "Windows Vista Enterprise N", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_VISTA }, - { { 0xaa6dd3aa, 0xc2b4, 0x40e2, { 0xa5, 0x44, 0xa6, 0xbb, 0xb3, 0xf5, 0xc3, 0x95, } } /*aa6dd3aa-c2b4-40e2-a544-a6bbb3f5c395*/, "Windows ThinPC", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, - { { 0xdb537896, 0x376f, 0x48ae, { 0xa4, 0x92, 0x53, 0xd0, 0x54, 0x77, 0x73, 0xd0, } } /*db537896-376f-48ae-a492-53d0547773d0*/, "Windows Embedded POSReady 7", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN7 }, - { { 0x0ab82d54, 0x47f4, 0x4acb, { 0x81, 0x8c, 0xcc, 0x5b, 0xf0, 0xec, 0xb6, 0x49, } } /*0ab82d54-47f4-4acb-818c-cc5bf0ecb649*/, "Windows Embedded Industry 8.1", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0xcd4e2d9f, 0x5059, 0x4a50, { 0xa9, 0x2d, 0x05, 0xd5, 0xbb, 0x12, 0x67, 0xc7, } } /*cd4e2d9f-5059-4a50-a92d-05d5bb1267c7*/, "Windows Embedded Industry E 8.1", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, - { { 0xf7e88590, 0xdfc7, 0x4c78, { 0xbc, 0xcb, 0x6f, 0x38, 0x65, 0xb9, 0x9d, 0x1a, } } /*f7e88590-dfc7-4c78-bccb-6f3865b99d1a*/, "Windows Embedded Industry A 8.1", EPID_WINDOWS, APP_ID_WINDOWS, KMS_ID_WIN81_VL }, + // Office 2010 + { { 0x8ce7e872, 0x188c, 0x4b98, { 0x9d, 0x90, 0xf8, 0xf9, 0x0b, 0x7a, 0xad, 0x02, } } /*8ce7e872-188c-4b98-9d90-f8f90b7aad02*/, "Office Access 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xcee5d470, 0x6e3b, 0x4fcc, { 0x8c, 0x2b, 0xd1, 0x74, 0x28, 0x56, 0x8a, 0x9f, } } /*cee5d470-6e3b-4fcc-8c2b-d17428568a9f*/, "Office Excel 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x8947d0b8, 0xc33b, 0x43e1, { 0x8c, 0x56, 0x9b, 0x67, 0x4c, 0x05, 0x28, 0x32, } } /*8947d0b8-c33b-43e1-8c56-9b674c052832*/, "Office Groove 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xca6b6639, 0x4ad6, 0x40ae, { 0xa5, 0x75, 0x14, 0xde, 0xe0, 0x7f, 0x64, 0x30, } } /*ca6b6639-4ad6-40ae-a575-14dee07f6430*/, "Office InfoPath 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x09ed9640, 0xf020, 0x400a, { 0xac, 0xd8, 0xd7, 0xd8, 0x67, 0xdf, 0xd9, 0xc2, } } /*09ed9640-f020-400a-acd8-d7d867dfd9c2*/, "Office Mondo 1 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xef3d4e49, 0xa53d, 0x4d81, { 0xa2, 0xb1, 0x2c, 0xa6, 0xc2, 0x55, 0x6b, 0x2c, } } /*ef3d4e49-a53d-4d81-a2b1-2ca6c2556b2c*/, "Office Mondo 2 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xab586f5c, 0x5256, 0x4632, { 0x96, 0x2f, 0xfe, 0xfd, 0x8b, 0x49, 0xe6, 0xf4, } } /*ab586f5c-5256-4632-962f-fefd8b49e6f4*/, "Office OneNote 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xecb7c192, 0x73ab, 0x4ded, { 0xac, 0xf4, 0x23, 0x99, 0xb0, 0x95, 0xd0, 0xcc, } } /*ecb7c192-73ab-4ded-acf4-2399b095d0cc*/, "Office OutLook 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x45593b1d, 0xdfb1, 0x4e91, { 0xbb, 0xfb, 0x2d, 0x5d, 0x0c, 0xe2, 0x22, 0x7a, } } /*45593b1d-dfb1-4e91-bbfb-2d5d0ce2227a*/, "Office PowerPoint 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x6f327760, 0x8c5c, 0x417c, { 0x9b, 0x61, 0x83, 0x6a, 0x98, 0x28, 0x7e, 0x0c, } } /*6f327760-8c5c-417c-9b61-836a98287e0c*/, "Office Professional Plus 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xdf133ff7, 0xbf14, 0x4f95, { 0xaf, 0xe3, 0x7b, 0x48, 0xe7, 0xe3, 0x31, 0xef, } } /*df133ff7-bf14-4f95-afe3-7b48e7e331ef*/, "Office Project Pro 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x5dc7bf61, 0x5ec9, 0x4996, { 0x9c, 0xcb, 0xdf, 0x80, 0x6a, 0x2d, 0x0e, 0xfe, } } /*5dc7bf61-5ec9-4996-9ccb-df806a2d0efe*/, "Office Project Standard 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xb50c4f75, 0x599b, 0x43e8, { 0x8d, 0xcd, 0x10, 0x81, 0xa7, 0x96, 0x72, 0x41, } } /*b50c4f75-599b-43e8-8dcd-1081a7967241*/, "Office Publisher 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xea509e87, 0x07a1, 0x4a45, { 0x9e, 0xdc, 0xeb, 0xa5, 0xa3, 0x9f, 0x36, 0xaf, } } /*ea509e87-07a1-4a45-9edc-eba5a39f36af*/, "Office Small Business Basics 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x9da2a678, 0xfb6b, 0x4e67, { 0xab, 0x84, 0x60, 0xdd, 0x6a, 0x9c, 0x81, 0x9a, } } /*9da2a678-fb6b-4e67-ab84-60dd6a9c819a*/, "Office Standard 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x92236105, 0xbb67, 0x494f, { 0x94, 0xc7, 0x7f, 0x7a, 0x60, 0x79, 0x29, 0xbd, } } /*92236105-bb67-494f-94c7-7f7a607929bd*/, "Office Visio Premium 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0xe558389c, 0x83c3, 0x4b29, { 0xad, 0xfe, 0x5e, 0x4d, 0x7f, 0x46, 0xc3, 0x58, } } /*e558389c-83c3-4b29-adfe-5e4d7f46c358*/, "Office Visio Pro 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x9ed833ff, 0x4f92, 0x4f36, { 0xb3, 0x70, 0x86, 0x83, 0xa4, 0xf1, 0x32, 0x75, } } /*9ed833ff-4f92-4f36-b370-8683a4f13275*/, "Office Visio Standard 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, + { { 0x2d0882e7, 0xa4e7, 0x423b, { 0x8c, 0xcc, 0x70, 0xd9, 0x1e, 0x01, 0x58, 0xb1, } } /*2d0882e7-a4e7-423b-8ccc-70d91e0158b1*/, "Office Word 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - // Office 2010 + // Office 2013 + { { 0x6ee7622c, 0x18d8, 0x4005, { 0x9f, 0xb7, 0x92, 0xdb, 0x64, 0x4a, 0x27, 0x9b, } } /*6ee7622c-18d8-4005-9fb7-92db644a279b*/, "Office Access 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xf7461d52, 0x7c2b, 0x43b2, { 0x87, 0x44, 0xea, 0x95, 0x8e, 0x0b, 0xd0, 0x9a, } } /*f7461d52-7c2b-43b2-8744-ea958e0bd09a*/, "Office Excel 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xa30b8040, 0xd68a, 0x423f, { 0xb0, 0xb5, 0x9c, 0xe2, 0x92, 0xea, 0x5a, 0x8f, } } /*a30b8040-d68a-423f-b0b5-9ce292ea5a8f*/, "Office InfoPath 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0x1b9f11e3, 0xc85c, 0x4e1b, { 0xbb, 0x29, 0x87, 0x9a, 0xd2, 0xc9, 0x09, 0xe3, } } /*1b9f11e3-c85c-4e1b-bb29-879ad2c909e3*/, "Office Lync 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xdc981c6b, 0xfc8e, 0x420f, { 0xaa, 0x43, 0xf8, 0xf3, 0x3e, 0x5c, 0x09, 0x23, } } /*dc981c6b-fc8e-420f-aa43-f8f33e5c0923*/, "Office Mondo 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xefe1f3e6, 0xaea2, 0x4144, { 0xa2, 0x08, 0x32, 0xaa, 0x87, 0x2b, 0x65, 0x45, } } /*efe1f3e6-aea2-4144-a208-32aa872b6545*/, "Office OneNote 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0x771c3afa, 0x50c5, 0x443f, { 0xb1, 0x51, 0xff, 0x25, 0x46, 0xd8, 0x63, 0xa0, } } /*771c3afa-50c5-443f-b151-ff2546d863a0*/, "Office OutLook 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0x8c762649, 0x97d1, 0x4953, { 0xad, 0x27, 0xb7, 0xe2, 0xc2, 0x5b, 0x97, 0x2e, } } /*8c762649-97d1-4953-ad27-b7e2c25b972e*/, "Office PowerPoint 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xb322da9c, 0xa2e2, 0x4058, { 0x9e, 0x4e, 0xf5, 0x9a, 0x69, 0x70, 0xbd, 0x69, } } /*b322da9c-a2e2-4058-9e4e-f59a6970bd69*/, "Office Professional Plus 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0x4a5d124a, 0xe620, 0x44ba, { 0xb6, 0xff, 0x65, 0x89, 0x61, 0xb3, 0x3b, 0x9a, } } /*4a5d124a-e620-44ba-b6ff-658961b33b9a*/, "Office Project Pro 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0x427a28d1, 0xd17c, 0x4abf, { 0xb7, 0x17, 0x32, 0xc7, 0x80, 0xba, 0x6f, 0x07, } } /*427a28d1-d17c-4abf-b717-32c780ba6f07*/, "Office Project Standard 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0x00c79ff1, 0x6850, 0x443d, { 0xbf, 0x61, 0x71, 0xcd, 0xe0, 0xde, 0x30, 0x5f, } } /*00c79ff1-6850-443d-bf61-71cde0de305f*/, "Office Publisher 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xb13afb38, 0xcd79, 0x4ae5, { 0x9f, 0x7f, 0xee, 0xd0, 0x58, 0xd7, 0x50, 0xca, } } /*b13afb38-cd79-4ae5-9f7f-eed058d750ca*/, "Office Standard 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xe13ac10e, 0x75d0, 0x4aff, { 0xa0, 0xcd, 0x76, 0x49, 0x82, 0xcf, 0x54, 0x1c, } } /*e13ac10e-75d0-4aff-a0cd-764982cf541c*/, "Office Visio Pro 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xac4efaf0, 0xf81f, 0x4f61, { 0xbd, 0xf7, 0xea, 0x32, 0xb0, 0x2a, 0xb1, 0x17, } } /*ac4efaf0-f81f-4f61-bdf7-ea32b02ab117*/, "Office Visio Standard 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, + { { 0xd9f5b1c6, 0x5386, 0x495a, { 0x88, 0xf9, 0x9a, 0xd6, 0xb4, 0x1a, 0xc9, 0xb3, } } /*d9f5b1c6-5386-495a-88f9-9ad6b41ac9b3*/, "Office Word 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0x8ce7e872, 0x188c, 0x4b98, { 0x9d, 0x90, 0xf8, 0xf9, 0x0b, 0x7a, 0xad, 0x02, } } /*8ce7e872-188c-4b98-9d90-f8f90b7aad02*/, "Office Access 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xcee5d470, 0x6e3b, 0x4fcc, { 0x8c, 0x2b, 0xd1, 0x74, 0x28, 0x56, 0x8a, 0x9f, } } /*cee5d470-6e3b-4fcc-8c2b-d17428568a9f*/, "Office Excel 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x8947d0b8, 0xc33b, 0x43e1, { 0x8c, 0x56, 0x9b, 0x67, 0x4c, 0x05, 0x28, 0x32, } } /*8947d0b8-c33b-43e1-8c56-9b674c052832*/, "Office Groove 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xca6b6639, 0x4ad6, 0x40ae, { 0xa5, 0x75, 0x14, 0xde, 0xe0, 0x7f, 0x64, 0x30, } } /*ca6b6639-4ad6-40ae-a575-14dee07f6430*/, "Office InfoPath 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x09ed9640, 0xf020, 0x400a, { 0xac, 0xd8, 0xd7, 0xd8, 0x67, 0xdf, 0xd9, 0xc2, } } /*09ed9640-f020-400a-acd8-d7d867dfd9c2*/, "Office Mondo 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xef3d4e49, 0xa53d, 0x4d81, { 0xa2, 0xb1, 0x2c, 0xa6, 0xc2, 0x55, 0x6b, 0x2c, } } /*ef3d4e49-a53d-4d81-a2b1-2ca6c2556b2c*/, "Office Mondo 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xab586f5c, 0x5256, 0x4632, { 0x96, 0x2f, 0xfe, 0xfd, 0x8b, 0x49, 0xe6, 0xf4, } } /*ab586f5c-5256-4632-962f-fefd8b49e6f4*/, "Office OneNote 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xecb7c192, 0x73ab, 0x4ded, { 0xac, 0xf4, 0x23, 0x99, 0xb0, 0x95, 0xd0, 0xcc, } } /*ecb7c192-73ab-4ded-acf4-2399b095d0cc*/, "Office OutLook 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x45593b1d, 0xdfb1, 0x4e91, { 0xbb, 0xfb, 0x2d, 0x5d, 0x0c, 0xe2, 0x22, 0x7a, } } /*45593b1d-dfb1-4e91-bbfb-2d5d0ce2227a*/, "Office PowerPoint 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xdf133ff7, 0xbf14, 0x4f95, { 0xaf, 0xe3, 0x7b, 0x48, 0xe7, 0xe3, 0x31, 0xef, } } /*df133ff7-bf14-4f95-afe3-7b48e7e331ef*/, "Office Project Pro 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x5dc7bf61, 0x5ec9, 0x4996, { 0x9c, 0xcb, 0xdf, 0x80, 0x6a, 0x2d, 0x0e, 0xfe, } } /*5dc7bf61-5ec9-4996-9ccb-df806a2d0efe*/, "Office Project Standard 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xb50c4f75, 0x599b, 0x43e8, { 0x8d, 0xcd, 0x10, 0x81, 0xa7, 0x96, 0x72, 0x41, } } /*b50c4f75-599b-43e8-8dcd-1081a7967241*/, "Office Publisher 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x92236105, 0xbb67, 0x494f, { 0x94, 0xc7, 0x7f, 0x7a, 0x60, 0x79, 0x29, 0xbd, } } /*92236105-bb67-494f-94c7-7f7a607929bd*/, "Office Visio Premium 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xe558389c, 0x83c3, 0x4b29, { 0xad, 0xfe, 0x5e, 0x4d, 0x7f, 0x46, 0xc3, 0x58, } } /*e558389c-83c3-4b29-adfe-5e4d7f46c358*/, "Office Visio Pro 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x9ed833ff, 0x4f92, 0x4f36, { 0xb3, 0x70, 0x86, 0x83, 0xa4, 0xf1, 0x32, 0x75, } } /*9ed833ff-4f92-4f36-b370-8683a4f13275*/, "Office Visio Standard 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x2d0882e7, 0xa4e7, 0x423b, { 0x8c, 0xcc, 0x70, 0xd9, 0x1e, 0x01, 0x58, 0xb1, } } /*2d0882e7-a4e7-423b-8ccc-70d91e0158b1*/, "Office Word 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x6f327760, 0x8c5c, 0x417c, { 0x9b, 0x61, 0x83, 0x6a, 0x98, 0x28, 0x7e, 0x0c, } } /*6f327760-8c5c-417c-9b61-836a98287e0c*/, "Office Professional Plus 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0x9da2a678, 0xfb6b, 0x4e67, { 0xab, 0x84, 0x60, 0xdd, 0x6a, 0x9c, 0x81, 0x9a, } } /*9da2a678-fb6b-4e67-ab84-60dd6a9c819a*/, "Office Standard 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - { { 0xea509e87, 0x07a1, 0x4a45, { 0x9e, 0xdc, 0xeb, 0xa5, 0xa3, 0x9f, 0x36, 0xaf, } } /*ea509e87-07a1-4a45-9edc-eba5a39f36af*/, "Office Small Business Basics 2010", EPID_OFFICE2010, APP_ID_OFFICE2010, KMS_ID_OFFICE2010 }, - - // Office 2013 - - { { 0x6ee7622c, 0x18d8, 0x4005, { 0x9f, 0xb7, 0x92, 0xdb, 0x64, 0x4a, 0x27, 0x9b, } } /*6ee7622c-18d8-4005-9fb7-92db644a279b*/, "Office Access 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xf7461d52, 0x7c2b, 0x43b2, { 0x87, 0x44, 0xea, 0x95, 0x8e, 0x0b, 0xd0, 0x9a, } } /*f7461d52-7c2b-43b2-8744-ea958e0bd09a*/, "Office Excel 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xa30b8040, 0xd68a, 0x423f, { 0xb0, 0xb5, 0x9c, 0xe2, 0x92, 0xea, 0x5a, 0x8f, } } /*a30b8040-d68a-423f-b0b5-9ce292ea5a8f*/, "Office InfoPath 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0x1b9f11e3, 0xc85c, 0x4e1b, { 0xbb, 0x29, 0x87, 0x9a, 0xd2, 0xc9, 0x09, 0xe3, } } /*1b9f11e3-c85c-4e1b-bb29-879ad2c909e3*/, "Office Lync 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xdc981c6b, 0xfc8e, 0x420f, { 0xaa, 0x43, 0xf8, 0xf3, 0x3e, 0x5c, 0x09, 0x23, } } /*dc981c6b-fc8e-420f-aa43-f8f33e5c0923*/, "Office Mondo 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xefe1f3e6, 0xaea2, 0x4144, { 0xa2, 0x08, 0x32, 0xaa, 0x87, 0x2b, 0x65, 0x45, } } /*efe1f3e6-aea2-4144-a208-32aa872b6545*/, "Office OneNote 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0x771c3afa, 0x50c5, 0x443f, { 0xb1, 0x51, 0xff, 0x25, 0x46, 0xd8, 0x63, 0xa0, } } /*771c3afa-50c5-443f-b151-ff2546d863a0*/, "Office OutLook 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0x8c762649, 0x97d1, 0x4953, { 0xad, 0x27, 0xb7, 0xe2, 0xc2, 0x5b, 0x97, 0x2e, } } /*8c762649-97d1-4953-ad27-b7e2c25b972e*/, "Office PowerPoint 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0x4a5d124a, 0xe620, 0x44ba, { 0xb6, 0xff, 0x65, 0x89, 0x61, 0xb3, 0x3b, 0x9a, } } /*4a5d124a-e620-44ba-b6ff-658961b33b9a*/, "Office Project Pro 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0x427a28d1, 0xd17c, 0x4abf, { 0xb7, 0x17, 0x32, 0xc7, 0x80, 0xba, 0x6f, 0x07, } } /*427a28d1-d17c-4abf-b717-32c780ba6f07*/, "Office Project Standard 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0x00c79ff1, 0x6850, 0x443d, { 0xbf, 0x61, 0x71, 0xcd, 0xe0, 0xde, 0x30, 0x5f, } } /*00c79ff1-6850-443d-bf61-71cde0de305f*/, "Office Publisher 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xac4efaf0, 0xf81f, 0x4f61, { 0xbd, 0xf7, 0xea, 0x32, 0xb0, 0x2a, 0xb1, 0x17, } } /*ac4efaf0-f81f-4f61-bdf7-ea32b02ab117*/, "Office Visio Standard 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xe13ac10e, 0x75d0, 0x4aff, { 0xa0, 0xcd, 0x76, 0x49, 0x82, 0xcf, 0x54, 0x1c, } } /*e13ac10e-75d0-4aff-a0cd-764982cf541c*/, "Office Visio Pro 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xd9f5b1c6, 0x5386, 0x495a, { 0x88, 0xf9, 0x9a, 0xd6, 0xb4, 0x1a, 0xc9, 0xb3, } } /*d9f5b1c6-5386-495a-88f9-9ad6b41ac9b3*/, "Office Word 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xb322da9c, 0xa2e2, 0x4058, { 0x9e, 0x4e, 0xf5, 0x9a, 0x69, 0x70, 0xbd, 0x69, } } /*b322da9c-a2e2-4058-9e4e-f59a6970bd69*/, "Office Professional Plus 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - { { 0xb13afb38, 0xcd79, 0x4ae5, { 0x9f, 0x7f, 0xee, 0xd0, 0x58, 0xd7, 0x50, 0xca, } } /*b13afb38-cd79-4ae5-9f7f-eed058d750ca*/, "Office Standard 2013", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2013 }, - - // Office 2016 - - { { 0xd450596f, 0x894d, 0x49e0, { 0x96, 0x6a, 0xfd, 0x39, 0xed, 0x4c, 0x4c, 0x64, } } /*d450596f-894d-49e0-966a-fd39ed4c4c64*/, "Office Professional Plus 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0x4f414197, 0x0fc2, 0x4c01, { 0xb6, 0x8a, 0x86, 0xcb, 0xb9, 0xac, 0x25, 0x4c, } } /*4f414197-0fc2-4c01-b68a-86cbb9ac254c*/, "Office Project Pro 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0x6bf301c1, 0xb94a, 0x43e9, { 0xba, 0x31, 0xd4, 0x94, 0x59, 0x8c, 0x47, 0xfb, } } /*6bf301c1-b94a-43e9-ba31-d494598c47fb*/, "Office Visio Pro 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0x041a06cb, 0xc5b8, 0x4772, { 0x80, 0x9f, 0x41, 0x6d, 0x03, 0xd1, 0x66, 0x54, } } /*041a06cb-c5b8-4772-809f-416d03d16654*/, "Office Publisher 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0x67c0fc0c, 0xdeba, 0x401b, { 0xbf, 0x8b, 0x9c, 0x8a, 0xd8, 0x39, 0x58, 0x04, } } /*67c0fc0c-deba-401b-bf8b-9c8ad8395804*/, "Office Access 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0x83e04ee1, 0xfa8d, 0x436d, { 0x89, 0x94, 0xd3, 0x1a, 0x86, 0x2c, 0xab, 0x77, } } /*83e04ee1-fa8d-436d-8994-d31a862cab77*/, "Office Skype for Business 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0x9caabccb, 0x61b1, 0x4b4b, { 0x8b, 0xec, 0xd1, 0x0a, 0x3c, 0x3a, 0xc2, 0xce, } } /*9caabccb-61b1-4b4b-8bec-d10a3c3ac2ce*/, "Office Mondo 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xaa2a7821, 0x1827, 0x4c2c, { 0x8f, 0x1d, 0x45, 0x13, 0xa3, 0x4d, 0xda, 0x97, } } /*aa2a7821-1827-4c2c-8f1d-4513a34dda97*/, "Office Visio Standard 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xbb11badf, 0xd8aa, 0x470e, { 0x93, 0x11, 0x20, 0xea, 0xf8, 0x0f, 0xe5, 0xcc, } } /*bb11badf-d8aa-470e-9311-20eaf80fe5cc*/, "Office Word 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xc3e65d36, 0x141f, 0x4d2f, { 0xa3, 0x03, 0xa8, 0x42, 0xee, 0x75, 0x6a, 0x29, } } /*c3e65d36-141f-4d2f-a303-a842ee756a29*/, "Office Excel 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xd70b1bba, 0xb893, 0x4544, { 0x96, 0xe2, 0xb7, 0xa3, 0x18, 0x09, 0x1c, 0x33, } } /*d70b1bba-b893-4544-96e2-b7a318091c33*/, "Office Powerpoint 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xd8cace59, 0x33d2, 0x4ac7, { 0x9b, 0x1b, 0x9b, 0x72, 0x33, 0x9c, 0x51, 0xc8, } } /*d8cace59-33d2-4ac7-9b1b-9b72339c51c8*/, "Office OneNote 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xda7ddabc, 0x3fbe, 0x4447, { 0x9e, 0x01, 0x6a, 0xb7, 0x44, 0x0b, 0x4c, 0xd4, } } /*da7ddabc-3fbe-4447-9e01-6ab7440b4cd4*/, "Office Project Standard 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xdedfa23d, 0x6ed1, 0x45a6, { 0x85, 0xdc, 0x63, 0xca, 0xe0, 0x54, 0x6d, 0xe6, } } /*dedfa23d-6ed1-45a6-85dc-63cae0546de6*/, "Office Standard 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xe914ea6e, 0xa5fa, 0x4439, { 0xa3, 0x94, 0xa9, 0xbb, 0x32, 0x93, 0xca, 0x09, } } /*e914ea6e-a5fa-4439-a394-a9bb3293ca09*/, "Office Mondo R 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, - { { 0xec9d9265, 0x9d1e, 0x4ed0, { 0x83, 0x8a, 0xcd, 0xc2, 0x0f, 0x25, 0x51, 0xa1, } } /*ec9d9265-9d1e-4ed0-838a-cdc20f2551a1*/, "Office Outlook 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + // Office 2016 + { { 0x67c0fc0c, 0xdeba, 0x401b, { 0xbf, 0x8b, 0x9c, 0x8a, 0xd8, 0x39, 0x58, 0x04, } } /*67c0fc0c-deba-401b-bf8b-9c8ad8395804*/, "Office Access 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xc3e65d36, 0x141f, 0x4d2f, { 0xa3, 0x03, 0xa8, 0x42, 0xee, 0x75, 0x6a, 0x29, } } /*c3e65d36-141f-4d2f-a303-a842ee756a29*/, "Office Excel 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0x9caabccb, 0x61b1, 0x4b4b, { 0x8b, 0xec, 0xd1, 0x0a, 0x3c, 0x3a, 0xc2, 0xce, } } /*9caabccb-61b1-4b4b-8bec-d10a3c3ac2ce*/, "Office Mondo 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xe914ea6e, 0xa5fa, 0x4439, { 0xa3, 0x94, 0xa9, 0xbb, 0x32, 0x93, 0xca, 0x09, } } /*e914ea6e-a5fa-4439-a394-a9bb3293ca09*/, "Office Mondo R 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xd8cace59, 0x33d2, 0x4ac7, { 0x9b, 0x1b, 0x9b, 0x72, 0x33, 0x9c, 0x51, 0xc8, } } /*d8cace59-33d2-4ac7-9b1b-9b72339c51c8*/, "Office OneNote 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xec9d9265, 0x9d1e, 0x4ed0, { 0x83, 0x8a, 0xcd, 0xc2, 0x0f, 0x25, 0x51, 0xa1, } } /*ec9d9265-9d1e-4ed0-838a-cdc20f2551a1*/, "Office Outlook 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xd70b1bba, 0xb893, 0x4544, { 0x96, 0xe2, 0xb7, 0xa3, 0x18, 0x09, 0x1c, 0x33, } } /*d70b1bba-b893-4544-96e2-b7a318091c33*/, "Office Powerpoint 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xd450596f, 0x894d, 0x49e0, { 0x96, 0x6a, 0xfd, 0x39, 0xed, 0x4c, 0x4c, 0x64, } } /*d450596f-894d-49e0-966a-fd39ed4c4c64*/, "Office Professional Plus 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0x4f414197, 0x0fc2, 0x4c01, { 0xb6, 0x8a, 0x86, 0xcb, 0xb9, 0xac, 0x25, 0x4c, } } /*4f414197-0fc2-4c01-b68a-86cbb9ac254c*/, "Office Project Pro 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0x829b8110, 0x0e6f, 0x4349, { 0xbc, 0xa4, 0x42, 0x80, 0x35, 0x77, 0x78, 0x8d, } } /*829b8110-0e6f-4349-bca4-42803577788d*/, "Office Project Pro 2016 XC2R", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xda7ddabc, 0x3fbe, 0x4447, { 0x9e, 0x01, 0x6a, 0xb7, 0x44, 0x0b, 0x4c, 0xd4, } } /*da7ddabc-3fbe-4447-9e01-6ab7440b4cd4*/, "Office Project Standard 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xcbbaca45, 0x556a, 0x4416, { 0xad, 0x03, 0xbd, 0xa5, 0x98, 0xea, 0xa7, 0xc8, } } /*cbbaca45-556a-4416-ad03-bda598eaa7c8*/, "Office Project Standard 2016 XC2R", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0x041a06cb, 0xc5b8, 0x4772, { 0x80, 0x9f, 0x41, 0x6d, 0x03, 0xd1, 0x66, 0x54, } } /*041a06cb-c5b8-4772-809f-416d03d16654*/, "Office Publisher 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0x83e04ee1, 0xfa8d, 0x436d, { 0x89, 0x94, 0xd3, 0x1a, 0x86, 0x2c, 0xab, 0x77, } } /*83e04ee1-fa8d-436d-8994-d31a862cab77*/, "Office Skype for Business 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xdedfa23d, 0x6ed1, 0x45a6, { 0x85, 0xdc, 0x63, 0xca, 0xe0, 0x54, 0x6d, 0xe6, } } /*dedfa23d-6ed1-45a6-85dc-63cae0546de6*/, "Office Standard 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0x6bf301c1, 0xb94a, 0x43e9, { 0xba, 0x31, 0xd4, 0x94, 0x59, 0x8c, 0x47, 0xfb, } } /*6bf301c1-b94a-43e9-ba31-d494598c47fb*/, "Office Visio Pro 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xb234abe3, 0x0857, 0x4f9c, { 0xb0, 0x5a, 0x4d, 0xc3, 0x14, 0xf8, 0x55, 0x57, } } /*b234abe3-0857-4f9c-b05a-4dc314f85557*/, "Office Visio Pro 2016 XC2R", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xaa2a7821, 0x1827, 0x4c2c, { 0x8f, 0x1d, 0x45, 0x13, 0xa3, 0x4d, 0xda, 0x97, } } /*aa2a7821-1827-4c2c-8f1d-4513a34dda97*/, "Office Visio Standard 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0x361fe620, 0x64f4, 0x41b5, { 0xba, 0x77, 0x84, 0xf8, 0xe0, 0x79, 0xb1, 0xf7, } } /*361fe620-64f4-41b5-ba77-84f8e079b1f7*/, "Office Visio Standard 2016 XC2R", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, + { { 0xbb11badf, 0xd8aa, 0x470e, { 0x93, 0x11, 0x20, 0xea, 0xf8, 0x0f, 0xe5, 0xcc, } } /*bb11badf-d8aa-470e-9311-20eaf80fe5cc*/, "Office Word 2016", EPID_OFFICE2013, APP_ID_OFFICE2013, KMS_ID_OFFICE2016 }, // End marker (necessity should be removed when time permits) @@ -260,7 +288,7 @@ static const struct KMSHostOS { uint16_t Type; uint16_t Build; } HostOS[] = { 55041, 7601 }, // Windows Server 2008 R2 SP1 { 5426, 9200 }, // Windows Server 2012 { 6401, 9600 }, // Windows Server 2012 R2 - //{ 3612, 10240}, // Windows Server 2016 + { 3612, 14393 }, // Windows Server 2016 }; // GroupID and PIDRange @@ -380,9 +408,9 @@ static int getRandomServerType() else { // return 9200/9600 if NDR64 is in use, otherwise 6002/7601 - return (rand() % 2) + (UseRpcNDR64 ? 2 : 0); - // if (UseRpcNDR64) return (rand() % 3) + 2; - // return (rand() % 2); + // return (rand() % 2) + (UseRpcNDR64 ? 2 : 0); + if (UseRpcNDR64) return (rand() % 3) + 2; + return (rand() % 2); } # endif // USE_MSRPC } @@ -409,7 +437,7 @@ static void generateRandomPid(const int index, char *const szPid, int serverType else if (index == 1) clientApp = 2; else - clientApp = serverType == 3 /*change if HostOS changes*/ ? 1 : 0; + clientApp = serverType >= 3 /*change if HostOS changes*/ ? 1 : 0; strcat(szPid, itoc(numberBuffer, pkeyconfig[clientApp].GroupID, 5)); strcat(szPid, "-"); @@ -427,7 +455,7 @@ static void generateRandomPid(const int index, char *const szPid, int serverType strcat(szPid, itoc(numberBuffer, HostOS[serverType].Build, 0)); strcat(szPid, ".0000-"); -# define minTime ((time_t)1382029200) // Release Date Win 2012R2 + time_t minTime = serverType==4 ? ((time_t)1470175200) /* Release Date Win 2016 */ : ((time_t)1382029200); // Release Date Win 2012R2 time_t maxTime, kmsTime; time(&maxTime); @@ -436,7 +464,6 @@ static void generateRandomPid(const int index, char *const szPid, int serverType maxTime = (time_t)BUILD_TIME; kmsTime = (rand32() % (maxTime - minTime)) + minTime; -# undef minTime struct tm *pidTime; pidTime = gmtime(&kmsTime); @@ -526,7 +553,7 @@ static void logRequest(const REQUEST *const baseRequest) static void getEpidFromString(RESPONSE *const Response, const char *const pid) { size_t length = utf8_to_ucs2(Response->KmsPID, pid, PID_BUFFER_SIZE, PID_BUFFER_SIZE * 3); - Response->PIDSize = LE32(((unsigned int )length + 1) << 1); + Response->PIDSize = LE32(((unsigned int)length + 1) << 1); } @@ -656,10 +683,12 @@ static BOOL __stdcall CreateResponseBaseCallback(const REQUEST *const baseReques memcpy(&baseResponse->CMID, &baseRequest->CMID, sizeof(GUID)); memcpy(&baseResponse->ClientTime, &baseRequest->ClientTime, sizeof(FILETIME)); - baseResponse->Count = LE32(LE32(baseRequest->N_Policy) << 1); + baseResponse->Count = index == 1 || index == 2 ? LE32(10) : LE32(50); baseResponse->VLActivationInterval = LE32(VLActivationInterval); baseResponse->VLRenewalInterval = LE32(VLRenewalInterval); + if (LE32(baseRequest->N_Policy) > LE32(baseResponse->Count)) baseResponse->Count = LE32(LE32(baseRequest->N_Policy) << 1); + #ifndef NO_LOG logResponse(baseResponse, hwId, EpidSource); #endif // NO_LOG diff --git a/kms.h b/kms.h index c4542e9..8202daf 100644 --- a/kms.h +++ b/kms.h @@ -252,6 +252,7 @@ typedef struct #define KMS_ID_OFFICE2016 18 #define KMS_ID_WIN10_VL 19 #define KMS_ID_WIN10_RETAIL 20 +#define KMS_ID_WIN2016 21 #define PWINGUID &AppList[APP_ID_WINDOWS].guid #define POFFICE2010GUID &AppList[APP_ID_OFFICE2010].guid diff --git a/libkms.c b/libkms.c index 37ba157..bc1148c 100644 --- a/libkms.c +++ b/libkms.c @@ -13,7 +13,7 @@ #define EXTERNAL dllexport -#define DLLVERSION 0x30001 +#define DLLVERSION 0x30002 #include "libkms.h" #include "shared_globals.h" @@ -28,23 +28,74 @@ #include #endif // WIN32 -#ifdef IS_LIBRARY -char ErrorMessage[MESSAGE_BUFFER_SIZE]; -#endif // IS_LIBRARY - static int_fast8_t IsServerStarted = FALSE; +#ifdef _WIN32 +#ifndef USE_MSRPC -EXTERNC __declspec(EXTERNAL) DWORD __cdecl SendActivationRequest -( - const char* const hostname, - const int port, - RESPONSE* baseResponse, - const REQUEST* const baseRequest, - RESPONSE_RESULT* result, BYTE *hwid -) +static int_fast8_t SocketsInitialized = FALSE; +WSADATA wsadata; + +static int initializeWinSockets() { - return !0; // not yet implemented + if (SocketsInitialized) return 0; + SocketsInitialized = TRUE; + return WSAStartup(0x0202, &wsadata); +} + +#endif // USE_MSRPC +#endif // _WIN32 + +EXTERNC __declspec(EXTERNAL) char* __cdecl GetErrorMessage() +{ + return ErrorMessage; +} + +EXTERNC __declspec(EXTERNAL) SOCKET __cdecl ConnectToServer(const char* host, const char* port, const int addressFamily) +{ + SOCKET sock; + *ErrorMessage = 0; + +# if defined(_WIN32) && !defined(USE_MSRPC) + initializeWinSockets(); +# endif // defined(_WIN32) && !defined(USE_MSRPC) + + size_t adrlen = strlen(host) + 16; + char* RemoteAddr = (char*)alloca(adrlen); + snprintf(RemoteAddr, adrlen, "[%s]:%s", host, port); + sock = connectToAddress(RemoteAddr, addressFamily, FALSE); + + if (sock == INVALID_RPCCTX) + { + printerrorf("Fatal: Could not connect to %s\n", RemoteAddr); + return sock; + } + + return sock; +} + +EXTERNC __declspec(EXTERNAL) RpcStatus __cdecl BindRpc(const SOCKET sock, const int_fast8_t useMultiplexedRpc) +{ + *ErrorMessage = 0; + UseMultiplexedRpc = useMultiplexedRpc; + return rpcBindClient(sock, FALSE); +} + +EXTERNC __declspec(EXTERNAL) void __cdecl CloseConnection(const SOCKET sock) +{ + socketclose(sock); +} + + +EXTERNC __declspec(EXTERNAL) DWORD __cdecl SendKMSRequest(const SOCKET sock, RESPONSE* baseResponse, REQUEST* baseRequest, RESPONSE_RESULT* result, BYTE *hwid) +{ + *ErrorMessage = 0; + return SendActivationRequest(sock, baseResponse, baseRequest, result, hwid); +} + +EXTERNC __declspec(EXTERNAL) int_fast8_t __cdecl IsDisconnected(const SOCKET sock) +{ + return isDisconnected(sock); } @@ -56,16 +107,8 @@ EXTERNC __declspec(EXTERNAL) DWORD __cdecl StartKmsServer(const int port, Reques if (IsServerStarted) return !0; # ifdef _WIN32 -# ifndef USE_MSRPC - // Windows Sockets must be initialized - WSADATA wsadata; - int error; - - if ((error = WSAStartup(0x0202, &wsadata))) - { - return error; - } -# endif // USE_MSRPC + int error = initializeWinSockets(); + if (error) return error; # endif // _WIN32 CreateResponseBase = requestCallback; @@ -113,15 +156,8 @@ EXTERNC __declspec(EXTERNAL) DWORD __cdecl StartKmsServer(const int port, Reques int error; # ifdef _WIN32 -# ifndef USE_MSRPC - // Windows Sockets must be initialized - WSADATA wsadata; - - if ((error = WSAStartup(0x0202, &wsadata))) - { - return error; - } -# endif // USE_MSRPC + error = initializeWinSockets(); + if (error) return error; # endif // _WIN32 defaultport = vlmcsd_malloc(16); diff --git a/libkms.h b/libkms.h index 1281ce5..6babaa7 100644 --- a/libkms.h +++ b/libkms.h @@ -8,6 +8,7 @@ #include "types.h" #include "kms.h" #include "rpc.h" +#include "vlmcs.h" #ifndef EXTERNC #ifdef __cplusplus @@ -17,11 +18,16 @@ #endif #endif -EXTERNC __declspec(EXTERNAL) DWORD __cdecl SendActivationRequest(const char* const hostname, const int port, RESPONSE* baseResponse, const REQUEST* const baseRequest, RESPONSE_RESULT* result, BYTE *hwid); +EXTERNC __declspec(EXTERNAL) DWORD __cdecl SendKMSRequest(const SOCKET sock, RESPONSE* baseResponse, REQUEST* baseRequest, RESPONSE_RESULT* result, BYTE *hwid); EXTERNC __declspec(EXTERNAL) DWORD __cdecl StartKmsServer(const int port, RequestCallback_t requestCallback); EXTERNC __declspec(EXTERNAL) DWORD __cdecl StopKmsServer(); EXTERNC __declspec(EXTERNAL) int __cdecl GetLibKmsVersion(); EXTERNC __declspec(EXTERNAL) const char* const __cdecl GetEmulatorVersion(); +EXTERNC __declspec(EXTERNAL) SOCKET __cdecl ConnectToServer(const char* host, const char* port, const int addressFamily); +EXTERNC __declspec(EXTERNAL) char* __cdecl GetErrorMessage(); +EXTERNC __declspec(EXTERNAL) void __cdecl CloseConnection(const SOCKET sock); +EXTERNC __declspec(EXTERNAL) RpcStatus __cdecl BindRpc(const SOCKET sock, const int_fast8_t useMultiplexedRpc); +EXTERNC __declspec(EXTERNAL) int_fast8_t __cdecl IsDisconnected(const SOCKET sock); //EXTERN_C __declspec(EXTERNAL) unsigned int __cdecl GetRandom32(); diff --git a/make_dragonfly b/make_dragonfly index b1147b0..5cb28a5 100755 --- a/make_dragonfly +++ b/make_dragonfly @@ -1,5 +1,7 @@ #!/usr/local/bin/bash +export VLMCSD_VERSION="svn`svnversion`" + export VERBOSE=3 export DNS_PARSER=OS diff --git a/make_freebsd b/make_freebsd index 318e3e0..5a00dc5 100755 --- a/make_freebsd +++ b/make_freebsd @@ -1,5 +1,6 @@ #!/usr/local/bin/bash +export VLMCSD_VERSION="svn`svnversion`" export VERBOSE=3 export DNS_PARSER=OS diff --git a/make_hurd b/make_hurd index acbd68c..8af05ef 100755 --- a/make_hurd +++ b/make_hurd @@ -1,5 +1,6 @@ #!/bin/bash +export VLMCSD_VERSION="svn`svnversion`" export VERBOSE=3 export DNS_PARSER=OS diff --git a/make_kfreebsd b/make_kfreebsd index 5ecdbf2..4254b03 100755 --- a/make_kfreebsd +++ b/make_kfreebsd @@ -1,5 +1,6 @@ #!/bin/bash +export VLMCSD_VERSION="svn`svnversion`" export VERBOSE=3 export DNS_PARSER=OS diff --git a/make_linux b/make_linux index bf6bea5..fa430c0 100755 --- a/make_linux +++ b/make_linux @@ -1,6 +1,6 @@ #!/bin/bash -#export VLMCSD_VERSION="svn`svnversion | sed -e 's/:.*//; s/[^0-9]*$//; s/^$/0/'`" +export VLMCSD_VERSION="svn`svnversion`" export VERBOSE=3 export DNS_PARSER=internal @@ -88,15 +88,15 @@ if [ $? != 0 ]; then exit $? fi -export CFLAGS="$CFLAGS -flto=jobserver -fvisibility=hidden" +export CFLAGS="$CFLAGS -flto=jobserver -fvisibility=hidden -DIS_LIBRARY" export LDFLAGS="$LDFLAGS -static-libgcc" -make $MAKEFLAGS CRYPTO=windows FEATURES=minimum $DLL_NAME - -if [ $? != 0 ]; then - echo Error creating $DLL_NAME - exit $? -fi +#make $MAKEFLAGS CRYPTO=windows FEATURES=minimum $DLL_NAME CAT=2 +# +#if [ $? != 0 ]; then +# echo Error creating $DLL_NAME +# exit $? +#fi @@ -148,15 +148,15 @@ if [ $? != 0 ]; then exit $? fi -export CFLAGS="$CFLAGS -flto=jobserver -fvisibility=hidden" +export CFLAGS="$CFLAGS -flto=jobserver -fvisibility=hidden -DIS_LIBRARY" export LDFLAGS="$LDFLAGS -static-libgcc" -make $MAKEFLAGS CRYPTO=windows FEATURES=minimum $DLL_NAME - -if [ $? != 0 ]; then - echo Error creating $DLL_NAME - exit $? -fi +#make $MAKEFLAGS CRYPTO=windows FEATURES=minimum $DLL_NAME CAT=2 +# +#if [ $? != 0 ]; then +# echo Error creating $DLL_NAME +# exit $? +#fi diff --git a/make_lxss b/make_lxss deleted file mode 100755 index e4d0dfc..0000000 --- a/make_lxss +++ /dev/null @@ -1,3507 +0,0 @@ -#!/bin/bash - -#export VLMCSD_VERSION="svn`svnversion | sed -e 's/:.*//; s/[^0-9]*$//; s/^$/0/'`" - -export VERBOSE=3 -export DNS_PARSER=internal - -MAKEFLAGS="-j`nproc` -B" -REUSEOBJFLAGS="-j" -SMALLCC="-pipe -fno-common -fno-exceptions -fno-stack-protector -fno-unwind-tables -fno-asynchronous-unwind-tables -fmerge-all-constants" -SMALLLD="-pipe -Wl,--hash-style=sysv -Wl,-z,norelro -Wl,--build-id=none" -SMALL="$SMALLCC $SMALLLD" - - -rm -f vlmcs vlmcsdmulti vlmcsd 2>/dev/null -rm -fr binaries - -mkdir -p binaries/Linux/intel/glibc -mkdir -p binaries/Linux/intel/uclibc -mkdir -p binaries/Linux/intel/static -mkdir -p binaries/Linux/intel/musl - -mkdir -p binaries/Linux/sparc32/glibc -mkdir -p binaries/Linux/s390/glibc - -mkdir -p binaries/Android/arm/bionic -mkdir -p binaries/Android/arm/static -mkdir -p binaries/Android/intel/bionic -mkdir -p binaries/Android/intel/static -mkdir -p binaries/Android/mips/bionic -mkdir -p binaries/Android/mips/static - -mkdir -p binaries/Linux/arm/little-endian/glibc -mkdir -p binaries/Linux/arm/little-endian/musl -mkdir -p binaries/Linux/arm/little-endian/uclibc -mkdir -p binaries/Linux/arm/little-endian/static -mkdir -p binaries/Linux/arm/big-endian/uclibc -mkdir -p binaries/Linux/arm/big-endian/static - -mkdir -p binaries/Linux/mips/little-endian/glibc -mkdir -p binaries/Linux/mips/little-endian/uclibc -mkdir -p binaries/Linux/mips/little-endian/static -mkdir -p binaries/Linux/mips/little-endian/musl -mkdir -p binaries/Linux/mips/big-endian/uclibc -mkdir -p binaries/Linux/mips/big-endian/static -mkdir -p binaries/Linux/mips/big-endian/glibc -mkdir -p binaries/Linux/mips/big-endian/musl - -mkdir -p binaries/Linux/ppc/little-endian/glibc -mkdir -p binaries/Linux/ppc/big-endian/glibc -mkdir -p binaries/Linux/ppc/big-endian/uclibc -mkdir -p binaries/Linux/ppc/big-endian/static - -mkdir -p binaries/MacOSX/intel -mkdir -p binaries/MacOSX/ppc -mkdir -p binaries/iOS/arm - -mkdir -p binaries/FreeBSD/intel -mkdir -p binaries/NetBSD/intel -mkdir -p binaries/OpenBSD/intel -mkdir -p binaries/DragonFly/intel -mkdir -p binaries/Solaris/intel -mkdir -p binaries/Windows/intel -mkdir -p binaries/Minix/intel - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -export STAGING_DIR=. - -# Windows 32-bit using MingW32-w64 toolchain on Ubuntu Linux -export CLIENT_NAME=binaries/Windows/intel/vlmcs-Windows-x86.exe -export PROGRAM_NAME=binaries/Windows/intel/vlmcsd-Windows-x86.exe -export MULTI_NAME=binaries/Windows/intel/vlmcsdmulti-Windows-x86.exe -export DLL_NAME=binaries/Windows/intel/libkms32.dll -export THREADS=1 -export CFLAGS="$SMALLCC" -export CC=i686-w64-mingw32-gcc -export PLATFORMFLAGS="-march=i686 -mtune=generic -fwhole-program -pipe" -export LDFLAGS="-lws2_32 -Wl,--gc-sections,--force-exe-suffix,--large-address-aware,--nxcompat,--dynamicbase,--tsaware" -export FEATURES=full - -make $MAKEFLAGS CAT=2 all $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME - exit $? -fi - -export CFLAGS="$CFLAGS -flto=jobserver -fvisibility=hidden" -export LDFLAGS="$LDFLAGS -static-libgcc" - -make $MAKEFLAGS FEATURES=minimum $DLL_NAME - -if [ $? != 0 ]; then - echo Error creating $DLL_NAME - exit $? -fi - - - -# Windows 32-bit using MingW32-w64 toolchain on Ubuntu Linux using MS RPC -export CLIENT_NAME=binaries/Windows/intel/vlmcs-Windows-msrpc-x86.exe -export PROGRAM_NAME=binaries/Windows/intel/vlmcsd-Windows-msrpc-x86.exe -export MULTI_NAME=binaries/Windows/intel/vlmcsdmulti-Windows-msrpc-x86.exe -export THREADS=1 -export CFLAGS="-pipe -fno-common -fno-exceptions -fno-stack-protector -fno-unwind-tables -fmerge-all-constants -Wno-unused-variable -Wno-missing-braces" -export CC=i686-w64-mingw32-gcc -export PLATFORMFLAGS="-march=i686 -mtune=generic -pipe" -export LDFLAGS="-Wl,--gc-sections,--force-exe-suffix,--large-address-aware,--nxcompat,--dynamicbase,--tsaware -fwhole-program" -export FEATURES=full - -make $MAKEFLAGS CAT=2 MSRPC=1 all - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -make $MAKEFLAGS MSRPC=1 $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - -# Windows 64-bit using MingW32-w64 toolchain on Ubuntu Linux -export CLIENT_NAME=binaries/Windows/intel/vlmcs-Windows-x64.exe -export PROGRAM_NAME=binaries/Windows/intel/vlmcsd-Windows-x64.exe -export MULTI_NAME=binaries/Windows/intel/vlmcsdmulti-Windows-x64.exe -export DLL_NAME=binaries/Windows/intel/libkms64.dll -export THREADS=1 -export CFLAGS="$SMALLCC" -export CC=x86_64-w64-mingw32-gcc -export PLATFORMFLAGS="-march=nocona -mtune=generic -fwhole-program -pipe" -export LDFLAGS="-lws2_32 -Wl,--gc-sections,--force-exe-suffix,--nxcompat,--dynamicbase,--tsaware" - -make $MAKEFLAGS CAT=2 all $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME - exit $? -fi - -export CFLAGS="$CFLAGS -flto=jobserver -fvisibility=hidden" -export LDFLAGS="$LDFLAGS -static-libgcc" - -make $MAKEFLAGS FEATURES=minimum $DLL_NAME - -if [ $? != 0 ]; then - echo Error creating $DLL_NAME - exit $? -fi - - - - -# Windows 64-bit using MingW32-w64 toolchain on Ubuntu Linux using MS RPC -export CLIENT_NAME=binaries/Windows/intel/vlmcs-Windows-msrpc-x64.exe -export PROGRAM_NAME=binaries/Windows/intel/vlmcsd-Windows-msrpc-x64.exe -export MULTI_NAME=binaries/Windows/intel/vlmcsdmulti-Windows-msrpc-x64.exe -export THREADS=1 -export CFLAGS="-pipe -fno-common -fno-exceptions -fno-stack-protector -fno-unwind-tables -fmerge-all-constants -Wno-unused-variable -Wno-missing-braces" -export CC=x86_64-w64-mingw32-gcc -export PLATFORMFLAGS="-march=nocona -mtune=generic -pipe" -export LDFLAGS="-Wl,--gc-sections,--force-exe-suffix,--nxcompat,--dynamicbase,--tsaware -fwhole-program" - -make $MAKEFLAGS CAT=2 MSRPC=1 all - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -make $MAKEFLAGS MSRPC=1 $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux mips32el with uClibc 0.9.33.2 using gcc 4.9 from OpenWRT toolchain -export CLIENT_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcs-mips32el-openwrt-uclib -export PROGRAM_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcsd-mips32el-openwrt-uclibc -export CC=/opt/toolchains/mipsel-openwrt-linux-uclibc/toolchain-mipsel_mips32_gcc-4.9-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc -export CFLAGS="$SMALLCC -DNO_LIMIT" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export CLIENT_NAME=binaries/Linux/mips/little-endian/static/vlmcs-mips32el-openwrt-uclib-static -export PROGRAM_NAME=binaries/Linux/mips/little-endian/static/vlmcsd-mips32el-openwrt-uclibc-static -export MULTI_NAME=binaries/Linux/mips/little-endian/static/vlmcsdmulti-mips32el-openwrt-uclibc-static -export LDFLAGS="$LDFLAGS -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcsdmulti-mips32el-openwrt-uclibc -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux mips16el with uClibc 0.9.33.2 using gcc 4.9 from OpenWRT toolchain with statically linked libgcc for Asus routers, e.g. Asus RT-N66U -export CLIENT_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcs-mips16el-asus-rt-n66u-uclibc -export PROGRAM_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcsd-mips16el-asus-rt-n66u-uclibc -export CC=/opt/toolchains/mipsel-openwrt-linux-uclibc/toolchain-mipsel_mips32_gcc-4.9-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc -export CFLAGS="$SMALLCC -static-libgcc -DNO_LIMIT" -export PLATFORMFLAGS="-mips32 -mips16 -flto=jobserver -fwhole-program" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export CLIENT_NAME=binaries/Linux/mips/little-endian/static/vlmcs-mips16el-asus-rt-n66u-uclibc-static -export PROGRAM_NAME=binaries/Linux/mips/little-endian/static/vlmcsd-mips16el-asus-rt-n66u-uclibc-static -export MULTI_NAME=binaries/Linux/mips/little-endian/static/vlmcsdmulti-mips16el-asus-rt-n66u-uclibc-static -export LDFLAGS="$LDFLAGS -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcsdmulti-mips16el-asus-rt-n66u-uclibc -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - - - -# Linux mips16el with uClibc 0.9.33.2 using gcc 4.8 from OpenWRT toolchain -export CLIENT_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcs-mips16el-openwrt-uclibc -export PROGRAM_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcsd-mips16el-openwrt-uclibc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips16" -export LDFLAGS="$SMALLLD" - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export CLIENT_NAME=binaries/Linux/mips/little-endian/static/vlmcs-mips16el-openwrt-uclib-static -export PROGRAM_NAME=binaries/Linux/mips/little-endian/static/vlmcsd-mips16el-openwrt-uclibc-static -export MULTI_NAME=binaries/Linux/mips/little-endian/static/vlmcsdmulti-mips16el-openwrt-uclibc-static -export LDFLAGS="$LDFLAGS -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcsdmulti-mips16el-openwrt-uclibc -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux mips16el eglibc 2.19 using gcc 4.8 from OpenWRT toolchain -export CLIENT_NAME=binaries/Linux/mips/little-endian/glibc/vlmcs-mips16el-openwrt-glibc -export PROGRAM_NAME=binaries/Linux/mips/little-endian/glibc/vlmcsd-mips16el-openwrt-glibc -export MULTI_NAME=binaries/Linux/mips/little-endian/glibc/vlmcsdmulti-mips16el-openwrt-glibc -export CC=/opt/toolchains/mipsel_74kc+dsp2_gcc-4.9-linaro_eglibc-2.19-mips16/bin/mipsel-openwrt-linux-gnu-gcc-4.9.2 -#export CC=~/openwrt/staging_dir/toolchain-mipsel_mips32_gcc-4.8-linaro_eglibc-2.19/bin/mipsel-openwrt-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=mips32 -mips16" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# PowerPC 64-bit big-endian glibc. -export CLIENT_NAME=binaries/Linux/ppc/big-endian/glibc/vlmcs-ppc64-glibc -export PROGRAM_NAME=binaries/Linux/ppc/big-endian/glibc/vlmcsd-ppc64-glibc -export MULTI_NAME=binaries/Linux/ppc/big-endian/glibc/vlmcsdmulti-ppc64-glibc -export CC=/opt/toolchains/ppc64-glibc2.19-gcc-4.9.1/bin/powerpc64-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# PowerPC 64-bit little-endian glibc. -export CLIENT_NAME=binaries/Linux/ppc/little-endian/glibc/vlmcs-ppc64el-glibc -export PROGRAM_NAME=binaries/Linux/ppc/little-endian/glibc/vlmcsd-ppc64el-glibc -export MULTI_NAME=binaries/Linux/ppc/little-endian/glibc/vlmcsdmulti-ppc64el-glibc -export CC=/opt/toolchains/ppc64el-glibc2.20-gcc-4.9.1/bin/powerpc64le-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# PowerPC glibc. Compiles with gcc 4.8 from OpenWRT toolchain but uses libs from an old DM500 toolchain to be compatible with glibc 2.3 -export CLIENT_NAME=binaries/Linux/ppc/big-endian/glibc/vlmcs-ppc-glibc -export PROGRAM_NAME=binaries/Linux/ppc/big-endian/glibc/vlmcsd-ppc-glibc -export MULTI_NAME=binaries/Linux/ppc/big-endian/glibc/vlmcsdmulti-ppc-glibc -export CC=~/openwrt/staging_dir/toolchain-powerpc_405_gcc-4.8-linaro_eglibc-2.19/bin/powerpc-openwrt-linux-gnu-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program --sysroot=/opt/simplebuild/toolchains/powerpc -L/opt/simplebuild/toolchains/powerpc/lib -L/opt/simplebuild/toolchains/powerpc/usr/lib" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Mips 32 glibc compiled with gcc 4.9.2 from OpenWRT toolchain -export CLIENT_NAME=binaries/Linux/mips/big-endian/glibc/vlmcs-mips32-openwrt-glibc -export PROGRAM_NAME=binaries/Linux/mips/big-endian/glibc/vlmcsd-mips32-openwrt-glibc -export MULTI_NAME=binaries/Linux/mips/big-endian/glibc/vlmcsdmulti-mips32-openwrt-glibc -export CC=/opt/toolchains/mips_34kc_gcc-4.9-linaro_eglibc-2.19-mips16/bin/mips-openwrt-linux-gcc -#export CC=~/openwrt/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_eglibc-2.19/bin/mips-openwrt-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips32" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - - -# Mips 32 glibc compiled with gcc 4.9.2 from OpenWRT toolchain -export CLIENT_NAME=binaries/Linux/mips/big-endian/glibc/vlmcs-mips16-openwrt-glibc -export PROGRAM_NAME=binaries/Linux/mips/big-endian/glibc/vlmcsd-mips16-openwrt-glibc -export MULTI_NAME=binaries/Linux/mips/big-endian/glibc/vlmcsdmulti-mips16-openwrt-glibc -export CC=/opt/toolchains/mips_34kc_gcc-4.9-linaro_eglibc-2.19-mips16/bin/mips-openwrt-linux-gcc -#export CC=~/openwrt/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_eglibc-2.19/bin/mips-openwrt-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips32 -mips16" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - - -# mips32el glibc 2.19 compiled with gcc 4.8 from OpenWRT toolchain -export CLIENT_NAME=binaries/Linux/mips/little-endian/glibc/vlmcs-mips32el-openwrt-glibc -export PROGRAM_NAME=binaries/Linux/mips/little-endian/glibc/vlmcsd-mips32el-openwrt-glibc -export MULTI_NAME=binaries/Linux/mips/little-endian/glibc/vlmcsdmulti-mips32el-openwrt-glibc -export CC=/opt/toolchains/mipsel_74kc+dsp2_gcc-4.9-linaro_eglibc-2.19-mips16/bin/mipsel-openwrt-linux-gnu-gcc-4.9.2 -#export CC=~/openwrt/staging_dir/toolchain-mipsel_mips32_gcc-4.8-linaro_eglibc-2.19/bin/mipsel-openwrt-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips32" -export LDFLAGS="$SMALLLD" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -## mips1el uclibc with old tomato toolchain gcc 3.2.3 with Broadcom extensions uClibc 0.9.19 -#export CLIENT_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcs-mips1el-tomato-uclibc -#export PROGRAM_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcsd-mips1el-tomato-uclibc -#export MULTI_NAME=binaries/Linux/mips/little-endian/uclibc/vlmcsdmulti-mips1el-tomato-uclibc -#export CC=/opt/brcm/hndtools-mipsel-uclibc/bin/mipsel-uclibc-gcc -#export CFLAGS="-DNO_BUILTIN -pipe -fno-common -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -fmerge-all-constants" -#export PLATFORMFLAGS="" -#export LDFLAGS="-pipe -Wl,-z,norelro" -#export THREADS=0 -##export TERMINAL_WIDTH=80 -# -#make NO_DNS=1 CAT=2 $MAKEFLAGS $CLIENT_NAME $PROGRAM_NAME $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#export CLIENT_NAME=binaries/Linux/mips/little-endian/static/vlmcs-mips1el-tomato-uclibc-static -#export PROGRAM_NAME=binaries/Linux/mips/little-endian/static/vlmcsd-mips1el-tomato-uclibc-static -#export MULTI_NAME=binaries/Linux/mips/little-endian/static/vlmcsdmulti-mips1el-tomato-uclibc-static -#export LDFLAGS="$LDFLAGS -static" -# -#make NO_DNS=1 $REUSEOBJFLAGS $CLIENT_NAME $PROGRAM_NAME $MULTI_NAME CAT=2 -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME -# exit $? -#fi - - - - -#Android gcc 4.8 with API Level 3 (Android 1.5 cupcake) armv7 - -export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android15-armv7 -export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android15-armv7 -export CC=/opt/toolchains/armelv7-android-3/bin/arm-linux-androideabi-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-fuse-ld=bfd -flto=jobserver -fwhole-program -march=armv7 -mthumb" -export THREADS=0 -export LDFLAGS="$SMALLLD" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -#export CLIENT_NAME=binaries/Android/arm/static/vlmcs-android15-armv7-static -#export PROGRAM_NAME=binaries/Android/arm/static/vlmcsd-android15-armv7-static -#export MULTI_NAME=binaries/Android/arm/static/vlmcsdmulti-android15-armv7-static -#export LDFLAGS="$LDFLAGS -static" -# -#make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - -export LDFLAGS="$SMALLLD" -export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android15-armv7 - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Android gcc 4.8 with API Level 3 (Android 1.5 cupcake) armv5 - -export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android15-armv5 -export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android15-armv5 -export CC=/opt/toolchains/armelv7-android-3/bin/arm-linux-androideabi-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-fuse-ld=bfd -flto=jobserver -fwhole-program -march=armv5te -mthumb" -export THREADS=0 -export LDFLAGS="$SMALLLD" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -#export CLIENT_NAME=binaries/Android/arm/static/vlmcs-android15-armv5-static -#export PROGRAM_NAME=binaries/Android/arm/static/vlmcsd-android15-armv5-static -#export MULTI_NAME=binaries/Android/arm/static/vlmcsdmulti-android15-armv5-static -#export LDFLAGS="$LDFLAGS -static" - -#make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -export LDFLAGS="$SMALLLD" -export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android15-armv5 - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - -#Android gcc 4.8 with API Level 16 (Android 4.1 Jelly Bean) armv7 - -export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android41-armv7 -export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android41-armv7 -export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android41-armv7 -export CC=/opt/toolchains/armelv7-android-16/bin/arm-linux-androideabi-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv7 -mthumb -fPIE -pie" -export THREADS=0 -export LDFLAGS="$SMALLLD -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -##Android gcc 4.8 with API Level 21 (Android 5.0 Lollipop) armv7 -# -#export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android50-armv7 -#export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android50-armv7 -#export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android50-armv7 -#export CC=/opt/toolchains/armelv7-android-21/bin/arm-linux-androideabi-gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv7 -mthumb -fPIE -pie" -#export THREADS=0 -#export LDFLAGS="$SMALLLD" -# -#make NOLPTHREAD=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLPTHREAD=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -# -# -# -# -#Android gcc 4.9 with API Level 21 (Android 5.0 Lollipop) arm64el - -export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android50-arm64v8 -export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android50-arm64v8 -export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android50-arm64v8 -export CC=/opt/toolchains/arm64el-android-21/bin/aarch64-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mtune=generic -mfix-cortex-a53-835769 -march=armv8-a -fPIE -pie" -export THREADS=0 -export LDFLAGS="$SMALLLD -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 NO_DNS=0 $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 NO_DNS=0 $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Android gcc 4.9 with API Level 21 (Android 5.0 Lollipop) arm64el STATIC - -export CLIENT_NAME=binaries/Android/arm/static/vlmcs-android50-arm64v8-static -export PROGRAM_NAME=binaries/Android/arm/static/vlmcsd-android50-arm64v8-static -export MULTI_NAME=binaries/Android/arm/static/vlmcsdmulti-android50-arm64v8-static -export CC=/opt/toolchains/arm64el-android-21/bin/aarch64-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mtune=generic -mfix-cortex-a53-835769 -march=armv8-a" -export THREADS=0 -export LDFLAGS="$SMALLLD -static -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Android gcc 4.8 with API Level 9 (Android 2.3 Gingerbread) x86 - -export CLIENT_NAME=binaries/Android/intel/bionic/vlmcs-android23-x86 -export PROGRAM_NAME=binaries/Android/intel/bionic/vlmcsd-android23-x86 -export CC=/opt/toolchains/x86-android-9/bin/i686-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=atom -m32" -export THREADS=1 -export LDFLAGS="$SMALLLD -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export CLIENT_NAME=binaries/Android/intel/static/vlmcs-android23-x86-static -export PROGRAM_NAME=binaries/Android/intel/static/vlmcsd-android23-x86-static -export MULTI_NAME=binaries/Android/intel/static/vlmcsdmulti-android23-x86-static -export LDFLAGS="$LDFLAGS -static" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export LDFLAGS="$SMALLLD -fuse-ld=bfd" -export MULTI_NAME=binaries/Android/intel/bionic/vlmcsdmulti-android23-x86 - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Android gcc 4.8 with API Level 16 (Android 4.1 Jelly Bean) x86 - -export CLIENT_NAME=binaries/Android/intel/bionic/vlmcs-android41-x86 -export PROGRAM_NAME=binaries/Android/intel/bionic/vlmcsd-android41-x86 -export MULTI_NAME=binaries/Android/intel/bionic/vlmcsdmulti-android41-x86 -export CC=/opt/toolchains/x86-android-16/bin/i686-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=atom -m32 -fPIE -pie" -export THREADS=1 -export LDFLAGS="$SMALLLD -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -##Android gcc 4.8 with API Level 21 (Android 5.0 Lollipop) x86 -# -#export CLIENT_NAME=binaries/Android/intel/bionic/vlmcs-android50-x86 -#export PROGRAM_NAME=binaries/Android/intel/bionic/vlmcsd-android50-x86 -#export MULTI_NAME=binaries/Android/intel/bionic/vlmcsdmulti-android50-x86 -#export CC=/opt/toolchains/x86-android-21/bin/i686-linux-android-gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=atom -m32 -fPIE -pie" -#export THREADS=1 -#export LDFLAGS="$SMALLLD" -# -#make NOLPTHREAD=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLPTHREAD=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - - - -#Android gcc 4.9 with API Level 21 (Android 5.0 Lollipop) x64 - -export CLIENT_NAME=binaries/Android/intel/bionic/vlmcs-android50-x64 -export PROGRAM_NAME=binaries/Android/intel/bionic/vlmcsd-android50-x64 -export MULTI_NAME=binaries/Android/intel/bionic/vlmcsdmulti-android50-x64 -export CC=/opt/toolchains/x86_64-android-21/bin/x86_64-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=atom -m64 -fPIE -pie" -export THREADS=0 -export LDFLAGS="$SMALLLD -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 NO_DNS=0 $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 NO_DNS=0 $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Android gcc 4.9 with API Level 21 (Android 5.0 Lollipop) x64 STATIC - -export CLIENT_NAME=binaries/Android/intel/static/vlmcs-android50-x64-static -export PROGRAM_NAME=binaries/Android/intel/static/vlmcsd-android50-x64-static -export MULTI_NAME=binaries/Android/intel/static/vlmcsdmulti-android50-x64-static -export CC=/opt/toolchains/x86_64-android-21/bin/x86_64-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=nocona -m64" -export THREADS=0 -export LDFLAGS="$SMALLLD -static -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - - -#Android gcc 4.8 with API Level 9 (Android 2.3 Gingerbread) mips32el - -export CLIENT_NAME=binaries/Android/mips/bionic/vlmcs-android23-mips32el -export PROGRAM_NAME=binaries/Android/mips/bionic/vlmcsd-android23-mips32el -export CC=/opt/toolchains/mipsel-android-9/bin/mipsel-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -export THREADS=1 -export LDFLAGS="$SMALLLD -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export CLIENT_NAME=binaries/Android/mips/static/vlmcs-android23-mips32el-static -export PROGRAM_NAME=binaries/Android/mips/static/vlmcsd-android23-mips32el-static -export MULTI_NAME=binaries/Android/mips/static/vlmcsdmulti-android23-mips32el-static -export LDFLAGS="$LDFLAGS -static -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export LDFLAGS="$SMALLLD -fuse-ld=bfd" -export MULTI_NAME=binaries/Android/mips/bionic/vlmcsdmulti-android23-mips32el - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - - -#Android gcc 4.8 with API Level 16 (Android 4.1 Jelly Bean) mips32el - -export CLIENT_NAME=binaries/Android/mips/bionic/vlmcs-android41-mips32el -export PROGRAM_NAME=binaries/Android/mips/bionic/vlmcsd-android41-mips32el -export MULTI_NAME=binaries/Android/mips/bionic/vlmcsdmulti-android41-mips32el -export CC=/opt/toolchains/mipsel-android-16/bin/mipsel-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -fPIE -pie" -export THREADS=1 -export LDFLAGS="$SMALLLD -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - - -##Android gcc 4.8 with API Level 21 (Android 5.0 Lollipop) mips32el -# -#export CLIENT_NAME=binaries/Android/mips/bionic/vlmcs-android50-mips32el -#export PROGRAM_NAME=binaries/Android/mips/bionic/vlmcsd-android50-mips32el -#export MULTI_NAME=binaries/Android/mips/bionic/vlmcsdmulti-android50-mips32el -#export CC=/opt/toolchains/mipsel-android-21/bin/mipsel-linux-android-gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -fPIE -pie" -#export THREADS=1 -#export LDFLAGS="$SMALLLD" -# -#make NOLPTHREAD=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLPTHREAD=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - - - -##Android gcc 4.8 with API Level 9 (Android 2.3 Gingerbread) mips16el -# -#export CLIENT_NAME=binaries/Android/mips/bionic/vlmcs-android23-mips16el -#export PROGRAM_NAME=binaries/Android/mips/bionic/vlmcsd-android23-mips16el -#export CC=/opt/toolchains/mipsel-android-9/bin/mipsel-linux-android-gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips16" -#export THREADS=1 -#export LDFLAGS="$SMALLLD" -# -#make NOLPTHREAD=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#export CLIENT_NAME=binaries/Android/mips/static/vlmcs-android23-mips16el-static -#export PROGRAM_NAME=binaries/Android/mips/static/vlmcsd-android23-mips16el-static -#export MULTI_NAME=binaries/Android/mips/static/vlmcsdmulti-android23-mips16el-static -#export LDFLAGS="$LDFLAGS -static" -# -#make NOLPTHREAD=1 $REUSEOBJFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLPTHREAD=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -#export LDFLAGS="$SMALLLD" -#export MULTI_NAME=binaries/Android/mips/bionic/vlmcsdmulti-android23-mips16el -# -#make NOLPTHREAD=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -# -# -# -# -##Android gcc 4.8 with API Level 16 (Android 4.1 Jelly Bean) mips16el -# -#export CLIENT_NAME=binaries/Android/mips/bionic/vlmcs-android41-mips16el -#export PROGRAM_NAME=binaries/Android/mips/bionic/vlmcsd-android41-mips16el -#export MULTI_NAME=binaries/Android/mips/bionic/vlmcsdmulti-android41-mips16el -#export CC=/opt/toolchains/mipsel-android-16/bin/mipsel-linux-android-gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -fPIE -pie -mips16" -#export THREADS=1 -#export LDFLAGS="$SMALLLD" -# -#make NOLPTHREAD=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLPTHREAD=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -# -# -# -# -#Android gcc 4.8 with API Level 21 (Android 5.0 Lollipop) mips16el -# -#export CLIENT_NAME=binaries/Android/mips/bionic/vlmcs-android50-mips16el -#export PROGRAM_NAME=binaries/Android/mips/bionic/vlmcsd-android50-mips16el -#export MULTI_NAME=binaries/Android/mips/bionic/vlmcsdmulti-android50-mips16el -#export CC=/opt/toolchains/mipsel-android-21/bin/mipsel-linux-android-gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -fPIE -pie -mips16" -#export THREADS=1 -#export LDFLAGS="$SMALLLD" -# -#make NOLPTHREAD=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLPTHREAD=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - -#Android gcc 4.9 with API Level 21 (Android 5.0 Lollipop) mips64el - -export CLIENT_NAME=binaries/Android/mips/bionic/vlmcs-android50-mips64el -export PROGRAM_NAME=binaries/Android/mips/bionic/vlmcsd-android50-mips64el -export MULTI_NAME=binaries/Android/mips/bionic/vlmcsdmulti-android50-mips64el -export CC=/opt/toolchains/mips64el-android-21/bin/mips64el-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -fPIE -pie" -export THREADS=0 -export LDFLAGS="$SMALLLD -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 NO_DNS=0 $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 NO_DNS=0 $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Android gcc 4.9 with API Level 21 (Android 5.0 Lollipop) mips64el STATIC - -export CLIENT_NAME=binaries/Android/mips/static/vlmcs-android50-mips64el-static -export PROGRAM_NAME=binaries/Android/mips/static/vlmcsd-android50-mips64el-static -export MULTI_NAME=binaries/Android/mips/static/vlmcsdmulti-android50-mips64el-static -export CC=/opt/toolchains/mips64el-android-21/bin/mips64el-linux-android-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -export THREADS=0 -export LDFLAGS="$SMALLLD -static -fuse-ld=bfd" - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make NOLPTHREAD=1 NOLRESOLV=1 DNS_PARSER=OS $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -## Android 5.0+ with Ubuntu toolchain -#export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android5 -#export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android5 -#export CC=arm-linux-androideabi-gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -#export LDFLAGS="$SMALLLD -pie -fpie" -#export THREADS=0 -# -#make $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -# -# Android 5.0+ with Ubuntu toolchain STATIC -#export CLIENT_NAME=binaries/Android/arm/static/vlmcs-android5-static -#export PROGRAM_NAME=binaries/Android/arm/static/vlmcsd-android5-static -#export MULTI_NAME=binaries/Android/arm/static/vlmcsdmulti-android5-static -#export LDFLAGS="$LDFLAGS -static" -# -#make $REUSEOBJFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -#export LDFLAGS="$SMALLLD -pie -fpie" -#export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android5 -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -# -# -# -## Android 5.0+ with Ubuntu toolchain for ARMv7 CPU with thumb2 instruction set -#export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android5-armv7 -#export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android5-armv7 -#export CC=arm-linux-androideabi-gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mthumb -march=armv7 -mtune=cortex-a9" -#export LDFLAGS="$SMALLLD -pie -fpie" -#export THREADS=0 -# -#make $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#export CLIENT_NAME=binaries/Android/arm/static/vlmcs-android5-armv7-static -#export PROGRAM_NAME=binaries/Android/arm/static/vlmcsd-android5-armv7-static -#export MULTI_NAME=binaries/Android/arm/static/vlmcsdmulti-android5-armv7-static -#export LDFLAGS="$LDFLAGS -static" -# -#make $REUSEOBJFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -#export LDFLAGS="$SMALLLD -pie -fpie" -#export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android5-armv7 -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -##unset TERMINAL_WIDTH -# -# -# -# -# -# Android with Ubuntu toolchain -export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android -export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android -export CC=arm-linux-androideabi-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -export LDFLAGS="$SMALLLD -fuse-ld=bfd" -export THREADS=0 -# -#make $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -# -# Android with Ubuntu toolchain STATIC -export CLIENT_NAME=binaries/Android/arm/static/vlmcs-android-static -export PROGRAM_NAME=binaries/Android/arm/static/vlmcsd-android-static -export MULTI_NAME=binaries/Android/arm/static/vlmcsdmulti-android-static -export LDFLAGS="$LDFLAGS -static" - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -#export LDFLAGS="$SMALLLD" -#export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - - - -# Android with Ubuntu toolchain for ARMv7 CPU with thumb2 instruction set -export CLIENT_NAME=binaries/Android/arm/bionic/vlmcs-android-armv7 -export PROGRAM_NAME=binaries/Android/arm/bionic/vlmcsd-android-armv7 -export CC=arm-linux-androideabi-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mthumb -march=armv7 -mtune=cortex-a9" -export LDFLAGS="$SMALLLD -fuse-ld=bfd" -export THREADS=0 - -#make $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi - -export CLIENT_NAME=binaries/Android/arm/static/vlmcs-android-armv7-static -export PROGRAM_NAME=binaries/Android/arm/static/vlmcsd-android-armv7-static -export MULTI_NAME=binaries/Android/arm/static/vlmcsdmulti-android-armv7-static -export LDFLAGS="$LDFLAGS -static" - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -#export LDFLAGS="$SMALLLD" -#export MULTI_NAME=binaries/Android/arm/bionic/vlmcsdmulti-android-armv7 -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - - - -# Linux x86 glibc -export MULTI_NAME=binaries/Linux/intel/glibc/vlmcsdmulti-x86-glibc -export CLIENT_NAME=binaries/Linux/intel/glibc/vlmcs-x86-glibc -export PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x86-glibc -export CC=~/openwrt/staging_dir/toolchain-i386_i486_gcc-4.8-linaro_eglibc-2.19/bin/i486-openwrt-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m32 -march=i686 -mtune=generic" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 - -make $MAKEFLAGS binaries/Linux/intel/glibc/vlmcsdmulti-x86-glibc - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - - - - -# Linux x86 glibc minimum standalone version -export PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x86-glibc-minimum -export CC=~/openwrt/staging_dir/toolchain-i386_i486_gcc-4.8-linaro_eglibc-2.19/bin/i486-openwrt-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m32 -march=i686 -mtune=generic" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 -export FEATURES=minimum - -make NO_DNS=1 $MAKEFLAGS $PROGRAM_NAME - -if [ $? != 0 ]; then - echo Error creating $PROGRAM_NAME - exit $? -fi - -# Linux x86 glibc minimum inetd version -export PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x86-glibc-minimum-inetd -export CFLAGS="$CFLAGS -DNO_SOCKETS" - -make NO_DNS=1 $MAKEFLAGS $PROGRAM_NAME - -if [ $? != 0 ]; then - echo Error creating $PROGRAM_NAME - exit $? -fi - -# Linux x86 glibc threads -export FEATURES=full -export THREADS=1 -export PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x86-glibc-threads -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -lpthread" -export CFLAGS="$SMALLCC" - -make $MAKEFLAGS $PROGRAM_NAME - -if [ $? != 0 ]; then - echo Error creating $PROGRAM_NAME - exit $? -fi - - - - -# Linux x86 musl -export FEATURES=full -export MULTI_NAME=binaries/Linux/intel/static/vlmcsdmulti-x86-musl-static -export CLIENT_NAME=binaries/Linux/intel/static/vlmcs-x86-musl-static -export PROGRAM_NAME=binaries/Linux/intel/static/vlmcsd-x86-musl-static -export CC=/opt/toolchains/i386_i486_gcc-4.9-linaro_musl-1.1.6/bin/i486-openwrt-linux-musl-gcc-4.9.2 -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m32 -march=i686 -mtune=generic" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -static" -export THREADS=0 -export NOPROCFS=0 -export AUXV=1 - -make $MAKEFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export MULTI_NAME=binaries/Linux/intel/musl/vlmcsdmulti-x86-musl - -make $MAKEFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -export LDFLAGS="$LDFLAGS -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export CLIENT_NAME=binaries/Linux/intel/musl/vlmcs-x86-musl -export PROGRAM_NAME=binaries/Linux/intel/musl/vlmcsd-x86-musl -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - - - - -# Linux x86 musl static threads -export FEATURES=full -export PROGRAM_NAME=binaries/Linux/intel/static/vlmcsd-x86-musl-static-threads -export CC=/opt/toolchains/i386_i486_gcc-4.9-linaro_musl-1.1.6/bin/i486-openwrt-linux-musl-gcc-4.9.2 -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m32 -march=i686 -mtune=generic" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -static" -export THREADS=1 -export NOPROCFS=0 -export AUXV=1 - -make $MAKEFLAGS $PROGRAM_NAME - -if [ $? != 0 ]; then - echo Error creating $PROGRAM_NAME - exit $? -fi - - - - - -# Linux x32 glibc -#export FEATURES=full -#export MULTI_NAME=binaries/Linux/intel/glibc/vlmcsdmulti-x32-glibc -#export CLIENT_NAME=binaries/Linux/intel/glibc/vlmcs-x32-glibc -#export PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x32-glibc -#export CC=gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mx32 -march=nocona -mtune=generic" -#export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -#export THREADS=0 -#export NOPROCFS=0 -#export AUXV=1 -# -#make DNS_PARSER=OS $MAKEFLAGS binaries/Linux/intel/glibc/vlmcsdmulti-x32-glibc -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make DNS_PARSER=OS $REUSEOBJFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -# -# -# -## Linux x32 glibc threads -#export FEATURES=full -#export PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x32-glibc-threads -#export CC=gcc -#export CFLAGS="$SMALLCC" -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mx32 -march=nocona -mtune=generic" -#export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -lpthread" -#export THREADS=1 -#export NOPROCFS=0 -#export AUXV=1 -# -#make DNS_PARSER=OS $MAKEFLAGS $PROGRAM_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $PROGRAM_NAME -# exit $? -#fi - - - - -# Linux armv4 little-endian glibc -export FEATURES=full -export MULTI_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsdmulti-armv4el-glibc -export CLIENT_NAME=binaries/Linux/arm/little-endian/glibc/vlmcs-armv4el-glibc -export PROGRAM_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsd-armv4el-glibc -export CC=/opt/toolchains/armelv5t-glibc-2.20/bin/arm-linux-gcc -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv4 -marm" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 -export NOPROCFS=0 -export AUXV=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux armv4 little-endian glibc thumb instruction set - -export MULTI_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsdmulti-armv4el-glibc-thumb -export CLIENT_NAME=binaries/Linux/arm/little-endian/glibc/vlmcs-armv4el-glibc-thumb -export PROGRAM_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsd-armv4el-glibc-thumb -export CC=/opt/toolchains/armelv5t-glibc-2.20/bin/arm-linux-gcc -export FEATURES=full -export CFLAGS="$SMALLCC" -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv4t -mthumb" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux armv5 little-endian glibc thumb instruction set -export PROGRAM_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsd-armv5el-glibc-thumb -export CLIENT_NAME=binaries/Linux/arm/little-endian/glibc/vlmcs-armv5el-glibc-thumb -export MULTI_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsdmulti-armv5el-glibc-thumb -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv5t -mthumb" - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - -# Linux armv5 little-endian glibc -export PROGRAM_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsd-armv5el-glibc -export CLIENT_NAME=binaries/Linux/arm/little-endian/glibc/vlmcs-armv5el-glibc -export MULTI_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsdmulti-armv5el-glibc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv5 -marm" - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux armv7 little-endian glibc thumb2 instruction set -export PROGRAM_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsd-armv7el-glibc -export CLIENT_NAME=binaries/Linux/arm/little-endian/glibc/vlmcs-armv7el-glibc -export MULTI_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsdmulti-armv7el-glibc -export CC=/opt/toolchains/armelv7-cortex-a8-glibc-2.18/usr/bin/arm-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv7 -mthumb" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux armv4 little-endian openwrt toolchain -export PROGRAM_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsd-armv4el-openwrt-glibc -export CLIENT_NAME=binaries/Linux/arm/little-endian/glibc/vlmcs-armv4el-openwrt-glibc -export MULTI_NAME=binaries/Linux/arm/little-endian/glibc/vlmcsdmulti-armv4el-openwrt-glibc -export CC=~/openwrt/staging_dir/toolchain-arm_mpcore+vfp_gcc-4.8-linaro_eglibc-2.19_eabi/bin/arm-openwrt-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv4" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - - -# Linux armv7 little-endian openwrt toolchain thumb 2 instruction set -INSTALLDIR=binaries/Linux/arm/little-endian/glibc/ -SUFFIX=-armv7el-openwrt-glibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=~/openwrt/staging_dir/toolchain-arm_mpcore+vfp_gcc-4.8-linaro_eglibc-2.19_eabi/bin/arm-openwrt-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv7 -mthumb" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - -# Linux armv5 little endian thumb instruction set -INSTALLDIR=binaries/Linux/arm/little-endian/static/ -SUFFIX=-armv5el-musl-thumb -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX}-static -export CC=/opt/toolchains/armelv5t-musl/usr/bin/arm-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -static" -export THREADS=0 -export NOPROCFS=0 -export AUXV=1 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -INSTALLDIR=binaries/Linux/arm/little-endian/musl/ -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -INSTALLDIR=binaries/Linux/arm/little-endian/static/ -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -static" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux armv5 little-endian uclibc thumb instruction set -INSTALLDIR=binaries/Linux/arm/little-endian/uclibc/ -SUFFIX=-armv5el-uclibc-thumb -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/armelv5t-uclibc-0.9.33/usr/bin/arm-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv5t -mthumb" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 -export NOPROCFS=0 -export AUXV=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux armv7 little-endian uclibc thumb 2 instruction set -INSTALLDIR=binaries/Linux/arm/little-endian/ -SUFFIX=-armv7el-uclibc -export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/armelv7-cortex-a8-uclibc-0.9.33/usr/bin/arm-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv7 -mthumb" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux armv4 little-endian uclibc openwrt toolchain -INSTALLDIR=binaries/Linux/arm/little-endian/uclibc/ -SUFFIX=-armv4el-openwrt-uclibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=~/openwrt/staging_dir/toolchain-arm_mpcore+vfp_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/arm-openwrt-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv4 -marm" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -## Linux armv4 little-endian uclibc openwrt toolchain thumb instruction set -#INSTALLDIR=binaries/Linux/arm/little-endian/uclibc/ -#SUFFIX=-armv4el-openwrt-uclibc-thumb -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=~/openwrt/staging_dir/toolchain-arm_mpcore+vfp_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/arm-openwrt-linux-gcc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv4t -mthumb" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -#export THREADS=0 -# -#make $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - - - -# Linux armv7 little-endian uclibc openwrt toolchain thumb 2 instruction set -INSTALLDIR=binaries/Linux/arm/little-endian/uclibc/ -SUFFIX=-armv7el-openwrt-uclibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=~/openwrt/staging_dir/toolchain-arm_mpcore+vfp_gcc-4.8-linaro_uClibc-0.9.33.2_eabi/bin/arm-openwrt-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv7 -mthumb" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -##Linux armv4 little-endian uclibc -#INSTALLDIR=binaries/Linux/arm/little-endian/ -#SUFFIX=-armv4el-uclibc -#export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export CC=/root/cross-compiler-armv4l/bin/armv4l-gcc -#export PLATFORMFLAGS="-pipe" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="-Wl,-z,norelro -fwhole-program" -#export THREADS=0 -#export NOPROCFS=1 -# -#make $MAKEFLAGS $CLIENT_NAME $PROGRAM_NAME $MULTI_NAME CAT=2 -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -#export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -#export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -#export LDFLAGS="-Wl,-z,norelro -fwhole-program -static" -# -#make $REUSEOBJFLAGS $CLIENT_NAME $PROGRAM_NAME $MULTI_NAME CAT=2 -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME -# exit $? -#fi - - - - - -## mips1 little-endian with openssl 0.9.8 support dreambox toolchain -#INSTALLDIR=binaries/Linux/mips/little-endian/glibc/ -#SUFFIX=-mips1el-glibc-openssl0.9.8-soft-EXPERIMENTAL -#export CRYPTO=openssl_with_aes_soft -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/mipsoe20/bin/mipsel-unknown-linux-gnu-gcc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD" -#export THREADS=0 -#export NOPROCFS=0 -# -#make $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -# -# -# -## mips1 little-endian dreambox toolchain -#INSTALLDIR=binaries/Linux/mips/little-endian/glibc/ -#SUFFIX=-mips1el-glibc -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/mipsoe20/bin/mipsel-unknown-linux-gnu-gcc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD" -#export THREADS=0 -#export CRYPTO=internal -# -#make $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -# - - -# Linux mips1 little-endian uclibc -#INSTALLDIR=binaries/Linux/mips/little-endian/ -#SUFFIX=-mips1el-uclibc -#export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export CC=/root/cross-compiler-mipsel/bin/mipsel-gcc -#export PLATFORMFLAGS="-pipe" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="-Wl,-z,norelro -fwhole-program" -#export THREADS=0 -#export CRYPTO=internal -#export NOPROCFS=1 -# -#make $MAKEFLAGS CAT=2 $CLIENT_NAME $MULTI_NAME $PROGRAM_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -#export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -#export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -#export LDFLAGS="-Wl,-z,norelro -fwhole-program -static" -# -#make $REUSEOBJFLAGS CAT=2 $CLIENT_NAME $MULTI_NAME $PROGRAM_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME -# exit $? -#fi - - - - -# Linux mips16 little endian glibc -INSTALLDIR=binaries/Linux/mips/little-endian/glibc/ -SUFFIX=-mips16el-glibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32el-mips16-glibc-2.18/usr/bin/mipsel-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips32 -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal -export NOPROCFS=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux mips16 little-endian uclibc -INSTALLDIR=binaries/Linux/mips/little-endian/uclibc/ -SUFFIX=-mips16el-uclibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32el-mips16-uclibc-0.9.33/bin/mipsel-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips32 -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -## Linux PowerPC glibc with SSL support and Dreambox 500 toolchain -#INSTALLDIR=binaries/Linux/ppc/big-endian/glibc/ -#SUFFIX=-ppc-glibc-openssl0.9.8-soft-EXPERIMENTAL -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/powerpc/bin/powerpc-linux-gcc -#export PLATFORMFLAGS="-pipe" -#export FEATURES=full -#export CFLAGS="-fno-common -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -fmerge-all-constants" -#export LDFLAGS="-Wl,--no-gc-sections -Wl,-z,norelro" -#export THREADS=0 -#export CRYPTO=internal -# -#make NO_DNS=1 $MAKEFLAGS CAT=2 $CLIENT_NAME $PROGRAM_NAME $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME -# exit $? -#fi - - - - - - -#Linux PowerPC uclibc OpenWRT toolchain -INSTALLDIR=binaries/Linux/ppc/big-endian/ -SUFFIX=-ppc-uclibc -export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export CC=~/openwrt/staging_dir/toolchain-powerpc_405_gcc-4.8-linaro_uClibc-0.9.33.2/bin/powerpc-openwrt-linux-gcc -export CC=/opt/toolchains/ppc-uclibc0.9.33.2-gcc-4.9.1-binutils2.24/bin/powerpc-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -L/root/cross-compiler-powerpc/lib -L/root/cross-compiler-powerpc/usr/lib" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$SMALLLD -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -##Fritzbox 7170 (mips32r2 little-endian) device specific, May or may not run on other devices -#INSTALLDIR=binaries/Linux/mips/little-endian/ -#SUFFIX=-mips32r2el-Fritzbox-71xx-72xx-uclibc -#export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/fritz71xx/bin/mipsel-linux-uclibc-gcc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=4kec -mtune=4kec" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD" -#export THREADS=0 -#export CRYPTO=internal -# -#make NOLRESOLV=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi - -#export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -#export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -#export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -#export LDFLAGS="$SMALLLD -static" -# -#make NOLRESOLV=1 $REUSEOBJFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLRESOLV=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -#export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export LDFLAGS="$SMALLLD" -# -#make NOLRESOLV=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - - - -##Fritzbox 7370 (mips32r2 big-endian) device specific, May or may not run on other devices -#INSTALLDIR=binaries/Linux/mips/big-endian/ -#SUFFIX=-mips16-Fritzbox-33xx-73xx-74xx-63xx-64xx-uclibc -#export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/fritz73xxOS62/bin/mips-linux-cc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=24kc -mtune=24kc -mips16 -mdsp" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD" -#export THREADS=0 -#export CRYPTO=internal -# -#make NOLRESOLV=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -#export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -#export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -#export LDFLAGS="$SMALLLD -static" -# -#make NOLRESOLV=1 $REUSEOBJFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLRESOLV=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -#export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export LDFLAGS="$SMALLLD" -# -#make NOLRESOLV=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - - - -##Fritzbox 7370 (mips32r2 big-endian) device specific with _PEDANTIC, May or may not run on other devices -#INSTALLDIR=binaries/Linux/mips/big-endian/uclibc/ -#SUFFIX=-mips16-Fritzbox-33xx-73xx-74xx-63xx-64xx-uclibc-pedantic -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/fritz73xxOS62/bin/mips-linux-cc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=24kc -mtune=24kc -mips16 -mdsp" -#export FEATURES=full -#export CFLAGS="$SMALLCC -D_PEDANTIC" -#export LDFLAGS="$SMALLLD" -#export THREADS=0 -#export CRYPTO=internal -# -#make NOLRESOLV=1 $MAKEFLAGS $PROGRAM_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $PROGRAM_NAME -# exit $? -#fi -# - - - -##Fritzbox 7370 (mips32r2 big-endian) device specific inetd start only, May or may not run on other devices -#INSTALLDIR=binaries/Linux/mips/big-endian/uclibc/ -#SUFFIX=-mips16-Fritzbox-33xx-73xx-74xx-63xx-64xx-uclibc-inetd -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/fritz73xxOS62/bin/mips-linux-cc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=24kc -mtune=24kc -mips16 -mdsp" -#export FEATURES=inetd -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD" -#export THREADS=0 -#export CRYPTO=internal -# -#make NOLRESOLV=1 $MAKEFLAGS $PROGRAM_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $PROGRAM_NAME -# exit $? -#fi -# -# -# -# -##Fritzbox 7370 (mips32r2 big-endian) device specific with pthreads, May or may not run on other devices -#INSTALLDIR=binaries/Linux/mips/big-endian/uclibc/ -#SUFFIX=-mips16-Fritzbox-33xx-73xx-74xx-63xx-64xx-uclibc-threads -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/fritz73xxOS62/bin/mips-linux-cc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=24kc -mtune=24kc -mips16 -mdsp" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD -lpthread" -#export THREADS=1 -# -#make NOLRESOLV=1 $MAKEFLAGS $PROGRAM_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $PROGRAM_NAME -# exit $? -#fi -# -# -# -# -##Fritzbox 7370 (mips32r2 big-endian) device specific with OpenSSL support, May or may not run on other devices -#INSTALLDIR=binaries/Linux/mips/big-endian/uclibc/ -#SUFFIX=-mips16-Fritzbox-33xx-73xx-74xx-63xx-64xx-uclibc-openssl0.9.8-soft-EXPERIMENTAL -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/fritz73xxOS62/bin/mips-linux-cc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=24kc -mtune=24kc -mips16 -mdsp" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD" -#export THREADS=0 -#export CRYPTO=openssl_with_aes_soft -#export OPENSSL_HMAC=0 -# -#make NOLRESOLV=1 $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make NOLRESOLV=1 $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi -# -#unset OPENSSL_HMAC -# -# -# -#make $MAKEFLAGS CLIENT_NAME=binaries/Linux/mips/big-endian/uclibc/vlmcs-mips32-uclibc CFLAGS="$SMALL -pipe -flto=jobserver -fwhole-program" PROGRAM_NAME=binaries/Linux/mips/big-endian/uclibc/vlmcsd-mips32-uclibc CC=/opt/toolchains/mips32eb-uclibc-0.9.33/usr/bin/mips-linux-cc && \ -#Linux mips32 big-endian uclibc -INSTALLDIR=binaries/Linux/mips/big-endian/uclibc/ -SUFFIX=-mips32-uclibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32eb-uclibc-0.9.33/usr/bin/mips-linux-cc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips32" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux mips16 big-endian uclibc -INSTALLDIR=binaries/Linux/mips/big-endian/uclibc/ -SUFFIX=-mips16-uclibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32eb-uclibc-0.9.33/usr/bin/mips-linux-cc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Atheros ar7xxx/ar9xxx chips with OpenWRT toolchain (mips16 big-endian) device specific, May or may not run on other devices -INSTALLDIR=binaries/Linux/mips/big-endian/ -SUFFIX=-mips16-openwrt-atheros-ar7xxx-ar9xxx-uclibc -export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips-openwrt-linux-uclibc/bin/mips-openwrt-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=24kc -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC -DNO_LIMIT" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - - -#Atheros ar7xxx/ar9xxx chips with OpenWRT toolchain (mips16 big-endian) device specific, May or may not run on other devices -INSTALLDIR=binaries/Linux/mips/big-endian/ -SUFFIX=-mips16-openwrt-atheros-ar7xxx-ar9xxx-musl -export PROGRAM_NAME=${INSTALLDIR}musl/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}musl/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}musl/vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips_34kc_gcc-4.9-linaro_musl-1.1.6-mips16/bin/mips-openwrt-linux-musl-gcc-4.9.2 -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=24kc -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$LDFLAGS -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=${INSTALLDIR}musl/vlmcsdmulti${SUFFIX} -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Atheros ar7xxx/ar9xxx chips with OpenWRT toolchain (mips32r2 big-endian) device specific, May or may not run on other devices -INSTALLDIR=binaries/Linux/mips/big-endian/ -SUFFIX=-mips32r2-openwrt-atheros-ar7xxx-ar9xxx-uclibc -export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips-openwrt-linux-uclibc/bin/mips-openwrt-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=24kc" -export FEATURES=full -export CFLAGS="$SMALLCC -DNO_LIMIT" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$SMALLLD -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux mips16 big-endian uclibc threads -INSTALLDIR=binaries/Linux/mips/big-endian/uclibc/ -SUFFIX=-mips16-uclibc-threads -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32eb-uclibc-0.9.33/usr/bin/mips-linux-cc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -lpthread" -export THREADS=1 -export CRYPTO=internal - -make $MAKEFLAGS $PROGRAM_NAME - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - - - - -# Linux mips32 big-endian glibc -INSTALLDIR=binaries/Linux/mips/big-endian/glibc/ -SUFFIX=-mips32-glibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32eb-glibc-2.19/usr/bin/mips-linux-cc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux mips16 big-endian glibc -INSTALLDIR=binaries/Linux/mips/big-endian/glibc/ -SUFFIX=-mips16-glibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32eb-glibc-2.19/usr/bin/mips-linux-cc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Linux mips32 big-endian musl -INSTALLDIR=binaries/Linux/mips/big-endian/ -SUFFIX=-mips32-musl -export PROGRAM_NAME=${INSTALLDIR}musl/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}musl/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}musl/vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32eb-musl/usr/bin/mips-linux-cc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips32" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal -export NOPROCFS=0 -export AUXV=1 - - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$SMALLLD -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=${INSTALLDIR}musl/vlmcsdmulti${SUFFIX} -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Linux mips16 little-endian musl soft-float -INSTALLDIR=binaries/Linux/mips/little-endian/ -SUFFIX=-mips16el-musl -export PROGRAM_NAME=${INSTALLDIR}musl/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}musl/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}musl/vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32el-mips16-musl/usr/bin/mipsel-linux-cc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal -export NOPROCFS=0 -export AUXV=1 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$SMALLLD -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=${INSTALLDIR}musl/vlmcsdmulti${SUFFIX} -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Linux mips16 little-endian musl fpu -INSTALLDIR=binaries/Linux/mips/little-endian/ -SUFFIX=-mips16el-musl-fpu -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export CC=/opt/toolchains/mips32el-mips16-musl-fpu/usr/bin/mipsel-linux-cc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips16" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -static" -export THREADS=0 -export CRYPTO=internal -export NOPROCFS=0 -export AUXV=1 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - -# Linux x86 uclibc -INSTALLDIR=binaries/Linux/intel/uclibc/ -SUFFIX=-x86-uclibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/i486-uclibc-0.9.33/bin/i486-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m32 -march=i486 -mtune=generic" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 -export CRYPTO=internal -export NOPROCFS=0 -export AUXV=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - -#make $MAKEFLAGS CLIENT_NAME=binaries/Linux/intel/glibc/vlmcs-x64-glibc LDFLAGS="-Wl,--hash-style=gnu" CFLAGS="$SMALL -pipe -flto=jobserver -fwhole-program" PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x64-glibc CC=/opt/toolchains/x86_64-glibc-2.19/usr/bin/x86_64-linux-gcc PLATFORMFLAGS="-m64 -mtune=generic"&& \ -# Linux x64 glibc -INSTALLDIR=binaries/Linux/intel/glibc/ -SUFFIX=-x64-glibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/x86_64-glibc-2.19/usr/bin/x86_64-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m64 -mtune=generic" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#Linux Sparc32v7 glibc -INSTALLDIR=binaries/Linux/sparc32/glibc/ -SUFFIX=-sparc32v7-glibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/sparc32-glibc-gcc-4.7.4/bin/sparc-buildroot-linux-gnu-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mcpu=v7" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -lpthread" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#make $MAKEFLAGS binaries/Linux/intel/glibc/vlmcsd-x64-glibc-threads CLIENT_NAME=binaries/Linux/intel/glibc/vlmcs-x64-glibc-threads THREADS=1 LDFLAGS="-Wl,--hash-style=gnu -lpthread" CFLAGS="-pipe -flto=jobserver -fwhole-program" PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x64-glibc-threads CC=/opt/toolchains/x86_64-glibc-2.19/usr/bin/x86_64-linux-gcc PLATFORMFLAGS="-m64 -mtune=generic"&& \ -# Linux x64 glibc with threads -INSTALLDIR=binaries/Linux/intel/glibc/ -SUFFIX=-x64-glibc-threads -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/x86_64-glibc-2.19/usr/bin/x86_64-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m64 -mtune=generic" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -lpthread" -export THREADS=1 -export CRYPTO=internal - -make $MAKEFLAGS $PROGRAM_NAME - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - - - - -#make $MAKEFLAGS LDFLAGS="-Wl,--hash-style=gnu" CLIENT_NAME=binaries/Linux/intel/glibc/vlmcs-x64-glibc-openssl1.0.0-hard-EXPERIMENTAL CRYPTO=openssl_with_aes CFLAGS="$SMALL -pipe -flto=jobserver -fwhole-program" PROGRAM_NAME=binaries/Linux/intel/glibc/vlmcsd-x64-glibc-openssl1.0.0-hard-EXPERIMENTAL CC=/opt/toolchains/x86_64-glibc-2.19/usr/bin/x86_64-linux-gcc PLATFORMFLAGS="-m64 -mtune=generic" && \ -# Linux x64 glibc with OpenSSL 1.0.x support -INSTALLDIR=binaries/Linux/intel/glibc/ -SUFFIX=-x64-glibc-openssl1.0.0-hard-EXPERIMENTAL -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/x86_64-glibc-2.19/usr/bin/x86_64-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m64 -mtune=generic" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 -export CRYPTO=openssl_with_aes - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -# Linux x64 musl -INSTALLDIR=binaries/Linux/intel/ -SUFFIX=-x64-musl -export PROGRAM_NAME=${INSTALLDIR}musl/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}musl/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}musl/vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/x86_64_gcc-4.9-linaro_musl-1.1.6/bin/x86_64-openwrt-linux-musl-gcc-4.9.2 -#export CC=/opt/toolchains/x86_64-musl/usr/bin/x86_64-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m64 -mtune=generic" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 -export CRYPTO=internal -export NOPROCFS=0 -export AUXV=1 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=${INSTALLDIR}musl/vlmcsdmulti${SUFFIX} -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -#make $MAKEFLAGS CC=/opt/toolchains/x86_64-uclibc-0.9.33/bin/x86_64-linux-gcc LDFLAGS="-Wl,--hash-style=gnu" CLIENT_NAME=binaries/Linux/intel/uclibc/vlmcs-x64-uclibc PROGRAM_NAME=binaries/Linux/intel/uclibc/vlmcsd-x64-uclibc CFLAGS="$SMALL -flto=jobserver -fwhole-program -pipe -fno-stack-protector" && \ -# Linux x64 uclibc -INSTALLDIR=binaries/Linux/intel/uclibc/ -SUFFIX=-x64-uclibc -export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/x86_64-uclibc-0.9.33/bin/x86_64-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -m64 -mtune=generic" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -export THREADS=0 -export CRYPTO=internal -export NOPROCFS=0 -export AUXV=0 - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - -## mips32 little-endian DD-WRT toolchain with gcc 4.1.0 -#export CC=/opt/simplebuild/toolchains/ddwrt410/bin/mipsel-linux-gcc -#INSTALLDIR=binaries/Linux/mips/little-endian/ -#SUFFIX=-mips32el-ddwrt-gcc$($CC -dumpversion)-uclibc -#export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export PLATFORMFLAGS="-pipe -mips32" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="-fwhole-program" -#export THREADS=0 -#export CRYPTO=internal -# -#make $MAKEFLAGS CAT=2 $PROGRAM_NAME $MULTI_NAME $CLIENT_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $PROGRAM_NAME, $MULTI_NAME and/or $CLIENT_NAME -# exit $? -#fi -# -#export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -#export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -#export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -#export LDFLAGS="-fwhole-program -static" -# -#make $REUSEOBJFLAGS CAT=2 $PROGRAM_NAME $MULTI_NAME $CLIENT_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $PROGRAM_NAME, $MULTI_NAME and/or $CLIENT_NAME -# exit $? -#fi - - - - - -#Linux mips32 little-endian uclibc -INSTALLDIR=binaries/Linux/mips/little-endian/ -SUFFIX=-mips32el-uclibc -export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -export CC=/opt/toolchains/mips32el-uclibc-0.9.33/bin/mipsel-linux-gcc -export PLATFORMFLAGS="-flto=jobserver -fwhole-program -mips32" -export FEATURES=full -export CFLAGS="$SMALLCC" -export LDFLAGS="$SMALLLD" -export THREADS=0 -export CRYPTO=internal - -make $MAKEFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="$SMALLLD -static" - -make $REUSEOBJFLAGS - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME - exit $? -fi - -rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - -export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -export LDFLAGS="$SMALLLD" - -make $REUSEOBJFLAGS $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $MULTI_NAME - exit $? -fi - - - - -##Linux armv6 hard-float little-endian. Used on Raspberry Pi with Raspbian. -##The hard-float ABI cannot be combined with thumb. -##You may wish to use armv5el-thumb instead because the binary is smaller -#INSTALLDIR=binaries/Linux/arm/little-endian/glibc/ -#SUFFIX=-armv6hf-Raspberry-glibc -#export PROGRAM_NAME=${INSTALLDIR}vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}vlmcsdmulti${SUFFIX} -#export CC=/opt/toolchains/armhfv6-glibc-2.19/bin/arm-linux-gcc -#export PLATFORMFLAGS="-flto=jobserver -fwhole-program -march=armv6zk -mfpu=vfp -mfloat-abi=hard -mtune=arm1176jzf-s" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="$SMALLLD -Wl,--hash-style=gnu" -#export THREADS=0 -#export CRYPTO=internal -# -#make $MAKEFLAGS -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME and/or $PROGRAM_NAME -# exit $? -#fi -# -#rm -f *_all.c vlmcsd.o vlmcs.o vlmcsdmulti.o 2> /dev/null -# -#make $REUSEOBJFLAGS $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $MULTI_NAME -# exit $? -#fi - - - - -## Linux arm big-endian uclibc -#INSTALLDIR=binaries/Linux/arm/big-endian/ -#SUFFIX=-armeb-nslu2-uclibc -#export PROGRAM_NAME=${INSTALLDIR}uclibc/vlmcsd${SUFFIX} -#export CLIENT_NAME=${INSTALLDIR}uclibc/vlmcs${SUFFIX} -#export MULTI_NAME=${INSTALLDIR}uclibc/vlmcsdmulti${SUFFIX} -#export CC=/opt/simplebuild/toolchains/nslu2open/bin/armeb-linux-uclibc-gcc -#export PLATFORMFLAGS="-pipe" -#export FEATURES=full -#export CFLAGS="$SMALLCC" -#export LDFLAGS="-Wl,-z,norelo" -#export THREADS=0 -# -#make $MAKEFLAGS CAT=2 $CLIENT_NAME $PROGRAM_NAME $MULTI_NAME -# -#if [ $? != 0 ]; then -# echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME -# exit $? -#fi - -export PROGRAM_NAME=${INSTALLDIR}static/vlmcsd${SUFFIX}-static -export CLIENT_NAME=${INSTALLDIR}static/vlmcs${SUFFIX}-static -export MULTI_NAME=${INSTALLDIR}static/vlmcsdmulti${SUFFIX}-static -export LDFLAGS="-Wl,-z,norelo -static" - -make $REUSEOBJFLAGS CAT=2 $CLIENT_NAME $PROGRAM_NAME $MULTI_NAME - -if [ $? != 0 ]; then - echo Error creating $CLIENT_NAME, $MULTI_NAME and/or $PROGRAM_NAME - exit $? -fi - - -# Strip off unnecessary stuff from binaries - -find binaries -xdev -name 'vlmcs*' -exec /opt/toolchains/mips32el-mips16-glibc-2.18/usr/bin/mipsel-linux-strip -s --strip-unneeded --remove-section=.note.gnu.gold-version --remove-section=.comment --remove-section=.note --remove-section=.note.gnu.build-id --remove-section=.note.ABI-tag {} \; 2>/dev/null -find binaries -xdev -name 'vlmcs*' -exec strip -s --strip-unneeded --remove-section=.note.gnu.gold-version --remove-section=.comment --remove-section=.note --remove-section=.note.gnu.build-id --remove-section=.note.ABI-tag {} \; 2>/dev/null -find binaries -xdev -name 'vlmcs*' -exec sstrip -z {} \; 2>/dev/null - -make alldocs - -rm *.o - -#cp -p binaries/Linux/intel/glibc/vlmcs-x32-glibc /usr/local/bin/vlmcs - -cp -pf binaries/Linux/intel/glibc/vlmcsdmulti-x64-glibc /usr/local/sbin/vlmcsdmulti - -ln -s vlmcsdmulti /usr/local/sbin/vlmcsd 2>/dev/null -ln -s ../sbin/vlmcsdmulti /usr/local/bin/vlmcs 2>/dev/null -mkdir -p /usr/local/man/man1 2>/dev/null -mkdir -p /usr/local/man/man5 2>/dev/null -mkdir -p /usr/local/man/man8 2>/dev/null -mkdir -p /usr/local/man/man7 2>/dev/null -cp -a vlmcs.1 vlmcsdmulti.1 /usr/local/man/man1/ -cp -a vlmcsd.7 /usr/local/man/man7/ -cp -a vlmcsd.8 /usr/local/man/man8/ -cp -a vlmcsd.ini.5 /usr/local/man/man5/ -pbzip2 -f -9 /usr/local/man/man5/vlmcsd.ini.5 /usr/local/man/man1/vlmcs.1 /usr/local/man/man1/vlmcsdmulti.1 /usr/local/man/man7/vlmcsd.7 /usr/local/man/man8/vlmcsd.8 -#pbzip2 -f /usr/local/man/man7/vlmcsd.7 -#pbzip2 -f /usr/local/man/man8/vlmcsd.8 - -mandb >/dev/null 2>&1 - diff --git a/make_multilib_linux b/make_multilib_linux index eeba9ed..64dcde5 100755 --- a/make_multilib_linux +++ b/make_multilib_linux @@ -1,5 +1,6 @@ #!/bin/bash +export VLMCSD_VERSION="svn`svnversion`" SMALLCC="-pipe -fno-common -fno-exceptions -fno-stack-protector -fno-unwind-tables -fno-asynchronous-unwind-tables -fmerge-all-constants" SMALLLD="-pipe -Wl,--hash-style=sysv -Wl,-z,norelro -Wl,--build-id=none" SMALL="$SMALLCC $SMALLLD" diff --git a/make_netbsd b/make_netbsd index 1d78bfb..b200941 100755 --- a/make_netbsd +++ b/make_netbsd @@ -1,5 +1,6 @@ #!/usr/pkg/bin/bash +export VLMCSD_VERSION="svn`svnversion`" export VERBOSE=3 export DNS_PARSER=OS diff --git a/make_openbsd b/make_openbsd index b883dfa..6134ec8 100755 --- a/make_openbsd +++ b/make_openbsd @@ -1,5 +1,6 @@ #!/usr/local/bin/bash +export VLMCSD_VERSION="svn`svnversion`" export VERBOSE=3 export DNS_PARSER=OS diff --git a/make_osx b/make_osx index f0459ac..c8c0d8b 100755 --- a/make_osx +++ b/make_osx @@ -1,5 +1,6 @@ #!/bin/bash +export VLMCSD_VERSION="svn`svnversion`" export VERBOSE=3 export DNS_PARSER=OS diff --git a/make_solaris b/make_solaris index c66fb47..4116e0e 100755 --- a/make_solaris +++ b/make_solaris @@ -1,5 +1,6 @@ #!/bin/sh +export VLMCSD_VERSION="svn`svnversion`" export VERBOSE=3 export CAT=2 diff --git a/make_windows b/make_windows index 630423f..13ee8e9 100755 --- a/make_windows +++ b/make_windows @@ -1,5 +1,6 @@ #!/bin/bash +export VLMCSD_VERSION="svn`svnversion`" rm -f cygkms*.dll libkms*.dll vlmcs-* vlmcsd-win* vlmcsd-cyg* vlmcsdmulti-* *_all.* vlmcsd.exe vlmcs.exe vlmcsdmulti.exe 2> /dev/null export CAT=2 @@ -33,9 +34,9 @@ make $MAKEFLAGS THREADS=1 MSRPC=1 DNS_PARSER=internal CLIENT_NAME=vlmcs-cygwin-m make $MAKEFLAGS THREADS=1 MSRPC=1 DNS_PARSER=internal CLIENT_NAME=vlmcs-cygwin-msrpc-x64-openssl-EXPERIMENTAL CRYPTO=openssl_with_aes PROGRAM_NAME=vlmcsd-cygwin-x64-openssl-EXPERIMENTAL CC=x86_64-pc-cygwin-gcc.exe CFLAGS="$CFMSRPC" PLATFORMFLAGS="$PF64" LDFLAGS="$LFCYG64" export CAT=2 - -#make $MAKEFLAGS libkms32.dll CRYPTO=windows FEATURES=minimum THREADS=1 DLL_NAME=libkms32.dll CC=i686-w64-MingW32-gcc.exe CFLAGS="$CF -flto=jobserver -fvisibility=hidden" PLATFORMFLAGS="$PF32" LDFLAGS="-static-libgcc $LFWIN32" -#make $MAKEFLAGS libkms64.dll CRYPTO=windows FEATURES=minimum THREADS=1 DLL_NAME=libkms64.dll CC=x86_64-w64-MingW32-gcc.exe CFLAGS="$CF -flto=jobserver -fvisibility=hidden" PLATFORMFLAGS="$PF64" LDFLAGS="-static-libgcc $LFWIN64" +#unset CAT +make $MAKEFLAGS libkms32.dll CRYPTO=windows FEATURES=minimum THREADS=1 DLL_NAME=libkms32.dll CC=i686-w64-MingW32-gcc.exe CFLAGS="$CF -flto=jobserver -fvisibility=hidden" PLATFORMFLAGS="$PF32" LDFLAGS="-static-libgcc $LFWIN32" +make $MAKEFLAGS libkms64.dll CRYPTO=windows FEATURES=minimum THREADS=1 DLL_NAME=libkms64.dll CC=x86_64-w64-MingW32-gcc.exe CFLAGS="$CF -flto=jobserver -fvisibility=hidden" PLATFORMFLAGS="$PF64" LDFLAGS="-static-libgcc $LFWIN64" #make $MAKEFLAGS all vlmcsdmulti-Windows-x86 THREADS=1 CRYPTO=windows CLIENT_NAME=vlmcs-Windows-x86 PROGRAM_NAME=vlmcsd-Windows-x86 MULTI_NAME=vlmcsdmulti-Windows-x86 CC=i686-w64-MingW32-gcc.exe CFLAGS="$CF" PLATFORMFLAGS="$PF32" LDFLAGS="$LFWIN32" #make $MAKEFLAGS all vlmcsdmulti-Windows-x64 THREADS=1 CRYPTO=windows CLIENT_NAME=vlmcs-Windows-x64 PROGRAM_NAME=vlmcsd-Windows-x64 MULTI_NAME=vlmcsdmulti-Windows-x64 CC=x86_64-w64-MingW32-gcc.exe CFLAGS="$CF" PLATFORMFLAGS="$PF64" LDFLAGS="$LFWIN64" #make -Bj MSRPC=1 CRYPTO=windows CLIENT_NAME=vlmcs-Windows-msrpc-x86 PROGRAM_NAME=vlmcsd-Windows-msrpc-x86 MULTI_NAME=vlmcsdmulti-Windows-msrpc-x86 CC=i686-w64-MingW32-gcc.exe CFLAGS="$CFMSRPC" PLATFORMFLAGS="$PF32" LDFLAGS="-Wl,--nxcompat,--dynamicbase,--tsaware,--large-address-aware" diff --git a/msrpc-client.c b/msrpc-client.c index aee5695..bbabcc0 100644 --- a/msrpc-client.c +++ b/msrpc-client.c @@ -72,13 +72,13 @@ RpcCtx connectToAddress(char *const addr, const int AddressFamily_unused, int_fa if ((status = createStringBinding(addr, &stringBinding)) != RPC_S_OK) { - errorout("%s\n", win_strerror(status)); + printerrorf("%s\n", win_strerror(status)); return !0; } if (PreviousRpcCallFailed) { - errorout("%s\n", win_strerror(PreviousRpcCallFailed)); + printerrorf("%s\n", win_strerror(PreviousRpcCallFailed)); return !0; } diff --git a/msrpc-client.h b/msrpc-client.h index bfb6dba..17d2a0c 100644 --- a/msrpc-client.h +++ b/msrpc-client.h @@ -7,6 +7,7 @@ #include "types.h" #include +#include "output.h" typedef int_fast8_t RpcCtx; typedef RPC_STATUS RpcStatus; diff --git a/msrpc-server.c b/msrpc-server.c index 04d2621..eb9b151 100644 --- a/msrpc-server.c +++ b/msrpc-server.c @@ -221,7 +221,7 @@ int ProcessActivationRequest(handle_t IDL_handle, int requestSize, unsigned char { RPC_CSTR clientIpAddress; RPC_STATUS result; - int status = RPC_S_OK; + int status = 0; result = getClientIp(IDL_handle, &clientIpAddress); @@ -238,7 +238,7 @@ int ProcessActivationRequest(handle_t IDL_handle, int requestSize, unsigned char logger ("Cannot verify that client has a private IP address\n"); # endif - return RPC_S_ACCESS_DENIED; + return 0x80070000 | RPC_S_ACCESS_DENIED; } if (!result && (PublicIPProtectionLevel & 2) && !IsPrivateIPAddress((char*)clientIpAddress)) @@ -248,7 +248,7 @@ int ProcessActivationRequest(handle_t IDL_handle, int requestSize, unsigned char # endif RpcStringFreeA(&clientIpAddress); - return RPC_S_ACCESS_DENIED; + return 0x80070000 | RPC_S_ACCESS_DENIED; } # endif // NO_PRIVATE_IP_DETECT @@ -256,25 +256,38 @@ int ProcessActivationRequest(handle_t IDL_handle, int requestSize, unsigned char if (requestSize < (int)sizeof(REQUEST_V4)) { if (!result) RpcStringFreeA(&clientIpAddress); - return RPC_S_CANNOT_SUPPORT; + return 0x8007000D; } *response = (uint8_t *)midl_user_allocate(MAX_RESPONSE_SIZE); + int kmsStatus = 0x8007000D; + int version = LE32(((REQUEST*)(request))->Version); - switch(LE16(((REQUEST*)(request))->MajorVer)) + switch(version) { - case 4: - *responseSize = CreateResponseV4((REQUEST_V4 *)request, *response, (char*)clientIpAddress); + case 0x40000: + kmsStatus = CreateResponseV4((REQUEST_V4 *)request, *response, (char*)clientIpAddress); break; - case 5: - case 6: - *responseSize = CreateResponseV6((REQUEST_V6 *) request, *response, (char*)clientIpAddress); + case 0x50000: + case 0x60000: + kmsStatus = CreateResponseV6((REQUEST_V6 *) request, *response, (char*)clientIpAddress); break; default: - status = RPC_S_INVALID_ARG; +# ifndef NO_LOG + logger("Fatal: KMSv%u.%u unsupported\n", version >> 16, version & 0xffff); +# endif // NO_LOG break; } + if (kmsStatus < 0) + { + status = kmsStatus; + } + else + { + *responseSize = kmsStatus; + } + if (!result) RpcStringFreeA(&clientIpAddress); return status; } diff --git a/network.c b/network.c index 8a96844..c90efa2 100644 --- a/network.c +++ b/network.c @@ -280,7 +280,7 @@ SOCKET connectToAddress(const char *const addr, const int AddressFamily, int_fas break; } - errorout("%s\n", socket_errno == VLMCSD_EINPROGRESS ? "Timed out" : vlmcsd_strerror(socket_errno)); + printerrorf("%s: %s\n", szAddr, socket_errno == VLMCSD_EINPROGRESS ? "Timed out" : vlmcsd_strerror(socket_errno)); socketclose(s); s = INVALID_SOCKET; diff --git a/network.h b/network.h index 48343d5..f46cd0f 100644 --- a/network.h +++ b/network.h @@ -11,7 +11,7 @@ #endif #include "types.h" - +#include "output.h" int_fast8_t sendrecv(SOCKET sock, BYTE *data, int len, int_fast8_t do_send); diff --git a/output.c b/output.c index 9df8abf..f0d7c05 100644 --- a/output.c +++ b/output.c @@ -94,7 +94,7 @@ int logger(const char *const fmt, ...) // Output to stderr if it is available or to log otherwise (e.g. if running as daemon/service) -void printerrorf(const char *const fmt, ...) +int printerrorf(const char *const fmt, ...) { int error = errno; va_list arglist; @@ -103,7 +103,8 @@ void printerrorf(const char *const fmt, ...) # ifdef IS_LIBRARY - snprintf(ErrorMessage, MESSAGE_BUFFER_SIZE, fmt, arglist); + size_t len = strlen(ErrorMessage); + vsnprintf(ErrorMessage + len, MESSAGE_BUFFER_SIZE - len - 1, fmt, arglist); # else // !IS_LIBRARY @@ -125,6 +126,7 @@ void printerrorf(const char *const fmt, ...) va_end(arglist); errno = error; + return 0; } @@ -191,7 +193,7 @@ void logRequestVerbose(const REQUEST *const Request, const PRINTFUNC p) productName = "Unknown"; #endif - p("Activation ID (Product) : %s (%s)\n", guidBuffer, productName); + p("SKU ID (aka Activation ID) : %s (%s)\n", guidBuffer, productName); uuid2StringLE(&Request->KMSID, guidBuffer); @@ -201,7 +203,7 @@ void logRequestVerbose(const REQUEST *const Request, const PRINTFUNC p) productName = "Unknown"; #endif - p("Key Management Service ID : %s (%s)\n", guidBuffer, productName); + p("KMS ID (aka KMS counted ID) : %s (%s)\n", guidBuffer, productName); uuid2StringLE(&Request->CMID, guidBuffer); p("Client machine ID : %s\n", guidBuffer); diff --git a/output.h b/output.h index e08e9e2..12e2560 100644 --- a/output.h +++ b/output.h @@ -11,7 +11,7 @@ typedef int (*PRINTFUNC)(const char *const fmt, ...); -void printerrorf(const char *const fmt, ...); +int printerrorf(const char *const fmt, ...); int errorout(const char* fmt, ...); void logRequestVerbose(const REQUEST *const Request, const PRINTFUNC p); void logResponseVerbose(const char *const ePID, const BYTE *const hwid, const RESPONSE *const response, const PRINTFUNC p); diff --git a/rpc.c b/rpc.c index 0ac8ef0..7696e97 100644 --- a/rpc.c +++ b/rpc.c @@ -176,25 +176,33 @@ static unsigned int checkRpcRequestSize(const RPC_REQUEST64 *const Request, cons if (requestSize < sizeof(REQUEST_V4) + (Ctx != *Ndr64Ctx ? sizeof(RPC_REQUEST) : sizeof(RPC_REQUEST64))) return 0; // Get KMS major version - uint_fast16_t _v; + uint16_t majorIndex, minor; + DWORD version; if (Ctx != *Ndr64Ctx) - _v = LE16(((WORD*)Request->Ndr.Data)[1]) - 4; + { + version = LE32(*(DWORD*)Request->Ndr.Data); + } else - _v = LE16(((WORD*)Request->Ndr64.Data)[1]) - 4; + { + version = LE32(*(DWORD*)Request->Ndr64.Data); + } + + majorIndex = (uint16_t)(version >> 16) - 4; + minor = (uint16_t)(version & 0xffff); // Only KMS v4, v5 and v6 are supported - if (_v >= vlmcsd_countof(_Versions)) + if (majorIndex >= vlmcsd_countof(_Versions) || minor) { # ifndef NO_LOG - logger("Fatal: KMSv%i unsupported\n", _v + 4); + logger("Fatal: KMSv%hu.%hu unsupported\n", (unsigned short)majorIndex + 4, (unsigned short)minor); # endif // NO_LOG return 0; } // Could check for equality but allow bigger requests to support buggy RPC clients (e.g. wine) // Buffer overrun is check by caller. - return (requestSize >= _Versions[_v].RequestSize); + return (requestSize >= _Versions[majorIndex].RequestSize); } @@ -205,10 +213,9 @@ static unsigned int checkRpcRequestSize(const RPC_REQUEST64 *const Request, cons * * The RPC packet size (excluding header) is actually in Response->AllocHint */ -static int rpcRequest(const RPC_REQUEST64 *const Request, RPC_RESPONSE64 *const Response, const DWORD RpcAssocGroup_unused, const SOCKET sock_unused, WORD* NdrCtx, WORD* Ndr64Ctx, BYTE packetType, const char* const ipstr) +static int rpcRequest(const RPC_REQUEST64 *const Request, RPC_RESPONSE64 *const Response, const DWORD RpcAssocGroup_unused, const SOCKET sock_unused, WORD* NdrCtx, WORD* Ndr64Ctx, BYTE isValid, const char* const ipstr) { - uint_fast16_t _v; - int ResponseSize; + int ResponseSize; // <0 = Errorcode (HRESULT) WORD Ctx = LE16(Request->ContextId); BYTE* requestData; BYTE* responseData; @@ -226,28 +233,45 @@ static int rpcRequest(const RPC_REQUEST64 *const Request, RPC_RESPONSE64 *const responseData = (BYTE*)&Response->Ndr64.Data; } - _v = LE16(((WORD*)requestData)[1]) - 4; + ResponseSize = 0x8007000D; // Invalid Data - if (!(ResponseSize = _Versions[_v].CreateResponse(requestData, responseData, ipstr))) + if (isValid) { - return 0; + uint16_t majorIndex = LE16(((WORD*)requestData)[1]) - 4; + if (!(ResponseSize = _Versions[majorIndex].CreateResponse(requestData, responseData, ipstr))) ResponseSize = 0x8007000D; } if (Ctx != *Ndr64Ctx) { - Response->Ndr.DataSizeMax = LE32(0x00020000); - Response->Ndr.DataLength = Response->Ndr.DataSizeIs = LE32(ResponseSize); - len = ResponseSize + sizeof(Response->Ndr); + if (ResponseSize < 0) + { + Response->Ndr.DataSizeMax = Response->Ndr.DataLength = 0; + len = sizeof(Response->Ndr) - sizeof(Response->Ndr.DataSizeIs); + } + else + { + Response->Ndr.DataSizeMax = LE32(0x00020000); + Response->Ndr.DataLength = Response->Ndr.DataSizeIs = LE32(ResponseSize); + len = ResponseSize + sizeof(Response->Ndr); + } } else { - Response->Ndr64.DataSizeMax = LE64(0x00020000ULL); - Response->Ndr64.DataLength = Response->Ndr64.DataSizeIs = LE64((uint64_t)ResponseSize); - len = ResponseSize + sizeof(Response->Ndr64); + if (ResponseSize < 0) + { + Response->Ndr64.DataSizeMax = Response->Ndr64.DataLength = 0; + len = sizeof(Response->Ndr64) - sizeof(Response->Ndr64.DataSizeIs); + } + else + { + Response->Ndr64.DataSizeMax = LE64(0x00020000ULL); + Response->Ndr64.DataLength = Response->Ndr64.DataSizeIs = LE64((uint64_t)ResponseSize); + len = ResponseSize + sizeof(Response->Ndr64); + } } pRpcReturnCode = ((BYTE*)&Response->Ndr) + len; - UA32(pRpcReturnCode) = 0; //LE32 not needed for 0 + UA32(pRpcReturnCode) = ResponseSize < 0 ? LE32(ResponseSize) : 0; len += sizeof(DWORD); // Pad zeros to 32-bit align (seems not neccassary but Windows RPC does it this way) @@ -518,10 +542,11 @@ void rpcServer(const SOCKET sock, const DWORD RpcAssocGroup, const char* const i if (!_recv(sock, requestBuffer, request_len)) return; // Request is invalid - if (!_Actions[_a].CheckRequestSize(requestBuffer, request_len, &NdrCtx, &Ndr64Ctx)) return; + BYTE isValid = _Actions[_a].CheckRequestSize(requestBuffer, request_len, &NdrCtx, &Ndr64Ctx); + if (rpcRequestHeader.PacketType != RPC_PT_REQUEST && !isValid) return; // Unable to create a valid response from request - if (!(response_len = _Actions[_a].GetResponse(requestBuffer, rpcResponse, RpcAssocGroup, sock, &NdrCtx, &Ndr64Ctx, rpcRequestHeader.PacketType, ipstr))) return; + if (!(response_len = _Actions[_a].GetResponse(requestBuffer, rpcResponse, RpcAssocGroup, sock, &NdrCtx, &Ndr64Ctx, rpcRequestHeader.PacketType != RPC_PT_REQUEST ? rpcRequestHeader.PacketType : isValid, ipstr))) return; response_len += sizeof(RPC_HEADER); @@ -560,26 +585,26 @@ static int checkRpcHeader(const RPC_HEADER *const Header, const BYTE desiredPack (uint32_t)desiredPacketType, Header->PacketType ); - status = !0; + status = RPC_S_PROTOCOL_ERROR; } if (Header->DataRepresentation != BE32(0x10000000)) { p("Fatal: RPC response does not conform to Microsoft's limited support of DCE RPC\n"); - status = !0; + status = RPC_S_PROTOCOL_ERROR; } if (Header->AuthLength != 0) { p("Fatal: RPC response requests authentication\n"); - status = !0; + status = RPC_S_UNKNOWN_AUTHN_TYPE; } // vlmcsd does not support fragmented packets (not yet neccassary) if ( (Header->PacketFlags & (RPC_PF_FIRST | RPC_PF_LAST)) != (RPC_PF_FIRST | RPC_PF_LAST) ) { p("Fatal: RPC packet flags RPC_PF_FIRST and RPC_PF_LAST are not both set.\n"); - status = !0; + status = RPC_S_CANNOT_SUPPORT; } if (Header->PacketFlags & RPC_PF_CANCEL_PENDING) p("Warning: %s should not be set\n", "RPC_PF_CANCEL_PENDING"); @@ -591,7 +616,7 @@ static int checkRpcHeader(const RPC_HEADER *const Header, const BYTE desiredPack if (Header->VersionMajor != 5 || Header->VersionMinor != 0) { p("Fatal: Expected RPC version 5.0 and got %u.%u\n", Header->VersionMajor, Header->VersionMinor); - status = !0; + status = RPC_S_INVALID_VERS_OPTION; } return status; @@ -639,7 +664,7 @@ static int checkRpcResponseHeader(const RPC_HEADER *const ResponseHeader, const (uint32_t)LE32(ResponseHeader->CallId) ); - status = !0; + status = RPC_S_PROTOCOL_ERROR; } return status; @@ -715,19 +740,19 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const if (!_send(sock, _Request, size)) { - errorout("\nFatal: Could not send RPC request\n"); - status = !0; + printerrorf("\nFatal: Could not send RPC request\n"); + status = RPC_S_COMM_FAILURE; break; } if (!_recv(sock, &ResponseHeader, sizeof(RPC_HEADER))) { - errorout("\nFatal: No RPC response received from server\n"); - status = !0; + printerrorf("\nFatal: No RPC response received from server\n"); + status = RPC_S_COMM_FAILURE; break; } - if ((status = checkRpcResponseHeader(&ResponseHeader, RequestHeader, RPC_PT_RESPONSE, &errorout))) break; + if ((status = checkRpcResponseHeader(&ResponseHeader, RequestHeader, RPC_PT_RESPONSE, &printerrorf))) break; size = useNdr64 ? sizeof(RPC_RESPONSE64) : sizeof(RPC_RESPONSE); @@ -736,21 +761,21 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const if (!_recv(sock, &_Response, size)) { - errorout("\nFatal: RPC response is incomplete\n"); - status = !0; + printerrorf("\nFatal: RPC response is incomplete\n"); + status = RPC_S_COMM_FAILURE; break; } if (_Response.CancelCount != 0) { - errorout("\nFatal: RPC response cancel count is not 0\n"); - status = !0; + printerrorf("\nFatal: RPC response cancel count is not 0\n"); + status = RPC_S_CALL_CANCELLED; } if (_Response.ContextId != (useNdr64 ? LE16(1) : 0)) { - errorout("\nFatal: RPC response context id %u is not bound\n", (unsigned int)LE16(_Response.ContextId)); - status = !0; + printerrorf("\nFatal: RPC response context id %u is not bound\n", (unsigned int)LE16(_Response.ContextId)); + status = RPC_X_SS_CONTEXT_DAMAGED; } int_fast8_t sizesMatch; @@ -760,7 +785,7 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const *responseSize = (size_t)LE64(_Response.Ndr64.DataLength); responseSize2 = (size_t)LE64(_Response.Ndr64.DataSizeIs); - if (!*responseSize || !_Response.Ndr64.DataSizeMax) + if (/*!*responseSize ||*/ !_Response.Ndr64.DataSizeMax) { status = (int)LE32(_Response.Ndr64.status); break; @@ -773,7 +798,7 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const *responseSize = (size_t)LE32(_Response.Ndr.DataLength); responseSize2 = (size_t)LE32(_Response.Ndr.DataSizeIs); - if (!*responseSize || !_Response.Ndr.DataSizeMax) + if (/*!*responseSize ||*/ !_Response.Ndr.DataSizeMax) { status = (int)LE32(_Response.Ndr.status); break; @@ -784,12 +809,12 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const if (!sizesMatch) { - errorout("\nFatal: NDR data length (%u) does not match NDR data size (%u)\n", + printerrorf("\nFatal: NDR data length (%u) does not match NDR data size (%u)\n", (uint32_t)*responseSize, (uint32_t)LE32(_Response.Ndr.DataSizeIs) ); - status = !0; + status = RPC_S_PROTOCOL_ERROR; } *KmsResponse = (BYTE*)vlmcsd_malloc(*responseSize + MAX_EXCESS_BYTES); @@ -800,12 +825,12 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const // Read up to 16 bytes more than bytes expected to detect faulty KMS emulators if ((bytesread = recv(sock, (char*)*KmsResponse, *responseSize + MAX_EXCESS_BYTES, 0)) < (int)*responseSize) { - errorout("\nFatal: No or incomplete KMS response received. Required %u bytes but only got %i\n", + printerrorf("\nFatal: No or incomplete KMS response received. Required %u bytes but only got %i\n", (uint32_t)*responseSize, (int32_t)(bytesread < 0 ? 0 : bytesread) ); - status = !0; + status = RPC_S_PROTOCOL_ERROR; break; } @@ -816,7 +841,7 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const if (len + pad != LE32(_Response.AllocHint)) { - errorout("\nWarning: RPC stub size is %u, should be %u (probably incorrect padding)\n", (uint32_t)LE32(_Response.AllocHint), (uint32_t)(len + pad)); + printerrorf("\nWarning: RPC stub size is %u, should be %u (probably incorrect padding)\n", (uint32_t)LE32(_Response.AllocHint), (uint32_t)(len + pad)); } else { @@ -825,7 +850,7 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const { if (*(*KmsResponse + *responseSize + sizeof(*pReturnCode) + i)) { - errorout("\nWarning: RPC stub data not padded to zeros according to Microsoft standard\n"); + printerrorf("\nWarning: RPC stub data not padded to zeros according to Microsoft standard\n"); break; } } @@ -834,8 +859,6 @@ RpcStatus rpcSendRequest(const RpcCtx sock, const BYTE *const KmsRequest, const pReturnCode = (DWORD*)(*KmsResponse + *responseSize + pad); status = LE32(UA32(pReturnCode)); - if (status) errorout("\nWarning: RPC stub data reported Error %u\n", (uint32_t)status); - break; } @@ -914,14 +937,14 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const if (!_send(sock, _Request, rpcBindSize)) { - errorout("\nFatal: Sending RPC bind request failed\n"); - return !0; + printerrorf("\nFatal: Sending RPC bind request failed\n"); + return RPC_S_COMM_FAILURE; } if (!_recv(sock, &ResponseHeader, sizeof(RPC_HEADER))) { - errorout("\nFatal: Did not receive a response from server\n"); - return !0; + printerrorf("\nFatal: Did not receive a response from server\n"); + return RPC_S_COMM_FAILURE; } if ((status = checkRpcResponseHeader @@ -929,7 +952,7 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const &ResponseHeader, RequestHeader, packetType == RPC_PT_BIND_REQ ? RPC_PT_BIND_ACK : RPC_PT_ALTERCONTEXT_ACK, - &errorout + &printerrorf ))) { return status; @@ -940,9 +963,9 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const if (!_recv(sock, bindResponse, LE16(ResponseHeader.FragLength) - sizeof(RPC_HEADER))) { - errorout("\nFatal: Incomplete RPC bind acknowledgement received\n"); + printerrorf("\nFatal: Incomplete RPC bind acknowledgement received\n"); free(bindResponseBytePtr); - return !0; + return RPC_S_COMM_FAILURE; } else { @@ -958,12 +981,12 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const if (bindResponse->NumResults != bindRequest->NumCtxItems) { - errorout("\nFatal: Expected %u CTX items but got %u\n", + printerrorf("\nFatal: Expected %u CTX items but got %u\n", (uint32_t)LE32(bindRequest->NumCtxItems), (uint32_t)LE32(bindResponse->NumResults) ); - status = !0; + status = RPC_S_PROTOCOL_ERROR; } for (i = 0; i < ctxItems; i++) @@ -975,7 +998,7 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const { if (!IsNullGuid((BYTE*)&bindResponse->Results[i].TransferSyntax)) { - errorout( + printerrorf( "\nWarning: Rejected transfer syntax %s did not return NULL Guid\n", transferSyntaxName ); @@ -983,7 +1006,7 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const if (bindResponse->Results[i].SyntaxVersion) { - errorout( + printerrorf( "\nWarning: Rejected transfer syntax %s did not return syntax version 0 but %u\n", transferSyntaxName, LE32(bindResponse->Results[i].SyntaxVersion) @@ -992,14 +1015,14 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const if (bindResponse->Results[i].AckReason == RPC_ABSTRACTSYNTAX_UNSUPPORTED) { - errorout( + printerrorf( "\nWarning: Transfer syntax %s does not support KMS activation\n", transferSyntaxName ); } else if (bindResponse->Results[i].AckReason != RPC_SYNTAX_UNSUPPORTED) { - errorout( + printerrorf( "\nWarning: Rejected transfer syntax %s did not return ack reason RPC_SYNTAX_UNSUPPORTED\n", transferSyntaxName ); @@ -1012,12 +1035,12 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const { if (bindResponse->Results[i].AckResult != RPC_BIND_ACK) { - errorout("\nWarning: BTFN did not respond with RPC_BIND_ACK or RPC_BIND_NACK\n"); + printerrorf("\nWarning: BTFN did not respond with RPC_BIND_ACK or RPC_BIND_NACK\n"); } if (bindResponse->Results[i].AckReason != LE16(3)) { - errorout("\nWarning: BTFN did not return expected feature mask 0x3 but 0x%X\n", (unsigned int)LE16(bindResponse->Results[i].AckReason)); + printerrorf("\nWarning: BTFN did not return expected feature mask 0x3 but 0x%X\n", (unsigned int)LE16(bindResponse->Results[i].AckReason)); } if (verbose) printf("... BTFN "); @@ -1029,38 +1052,38 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const // NDR32 or NDR64 Ctx if (bindResponse->Results[i].AckResult != RPC_BIND_ACCEPT) { - errorout( + printerrorf( "\nFatal: transfer syntax %s returned an invalid status, neither RPC_BIND_ACCEPT nor RPC_BIND_NACK\n", transferSyntaxName ); - status = !0; + status = RPC_S_PROTOCOL_ERROR; } if (!IsEqualGUID(&bindResponse->Results[i].TransferSyntax, &bindRequest->CtxItems[i].TransferSyntax)) { - errorout( + printerrorf( "\nFatal: Transfer syntax of RPC bind request and response does not match\n" ); - status = !0; + status = RPC_S_UNSUPPORTED_TRANS_SYN; } if (bindResponse->Results[i].SyntaxVersion != bindRequest->CtxItems[i].SyntaxVersion) { - errorout("\nFatal: Expected transfer syntax version %u for %s but got %u\n", + printerrorf("\nFatal: Expected transfer syntax version %u for %s but got %u\n", (uint32_t)LE32(bindRequest->CtxItems[0].SyntaxVersion), transferSyntaxName, (uint32_t)LE32(bindResponse->Results[0].SyntaxVersion) ); - status = !0; + status = RPC_S_UNSUPPORTED_TRANS_SYN; } // The ack reason field is actually undefined here but Microsoft sets this to 0 if (bindResponse->Results[i].AckReason != 0) { - errorout( + printerrorf( "\nWarning: Ack reason should be 0 but is %u\n", LE16(bindResponse->Results[i].AckReason) ); @@ -1087,8 +1110,8 @@ RpcStatus rpcBindOrAlterClientContext(const RpcCtx sock, BYTE packetType, const if (!RpcFlags.HasNDR64 && !RpcFlags.HasNDR32) { - errorout("\nFatal: Could neither negotiate NDR32 nor NDR64 with the RPC server\n"); - status = !0; + printerrorf("\nFatal: Could neither negotiate NDR32 nor NDR64 with the RPC server\n"); + status = RPC_S_NO_PROTSEQS; } return status; diff --git a/rpc.h b/rpc.h index 86792cb..18ac456 100644 --- a/rpc.h +++ b/rpc.h @@ -8,6 +8,139 @@ #include "types.h" +#if !defined(_WIN32) && !defined(__CYGWIN__) +#define RPC_S_OK 0 +#define RPC_S_INVALID_ARG 87 +#define RPC_S_OUT_OF_MEMORY 14 +#define RPC_S_OUT_OF_THREADS 164 +#define RPC_S_INVALID_LEVEL RPC_S_INVALID_ARG +#define RPC_S_BUFFER_TOO_SMALL 122 +#define RPC_S_INVALID_SECURITY_DESC 1338 +#define RPC_S_ACCESS_DENIED 5 +#define RPC_S_SERVER_OUT_OF_MEMORY 1130 +#define RPC_S_ASYNC_CALL_PENDING 997 +#define RPC_S_UNKNOWN_PRINCIPAL 1332 +#define RPC_S_TIMEOUT 1460 +#define RPC_S_INVALID_STRING_BINDING 1700 +#define RPC_S_WRONG_KIND_OF_BINDING 1701 +#define RPC_S_INVALID_BINDING 1702 +#define RPC_S_PROTSEQ_NOT_SUPPORTED 1703 +#define RPC_S_INVALID_RPC_PROTSEQ 1704 +#define RPC_S_INVALID_STRING_UUID 1705 +#define RPC_S_INVALID_ENDPOINT_FORMAT 1706 +#define RPC_S_INVALID_NET_ADDR 1707 +#define RPC_S_NO_ENDPOINT_FOUND 1708 +#define RPC_S_INVALID_TIMEOUT 1709 +#define RPC_S_OBJECT_NOT_FOUND 1710 +#define RPC_S_ALREADY_REGISTERED 1711 +#define RPC_S_TYPE_ALREADY_REGISTERED 1712 +#define RPC_S_ALREADY_LISTENING 1713 +#define RPC_S_NO_PROTSEQS_REGISTERED 1714 +#define RPC_S_NOT_LISTENING 1715 +#define RPC_S_UNKNOWN_MGR_TYPE 1716 +#define RPC_S_UNKNOWN_IF 1717 +#define RPC_S_NO_BINDINGS 1718 +#define RPC_S_NO_PROTSEQS 1719 +#define RPC_S_CANT_CREATE_ENDPOINT 1720 +#define RPC_S_OUT_OF_RESOURCES 1721 +#define RPC_S_SERVER_UNAVAILABLE 1722 +#define RPC_S_SERVER_TOO_BUSY 1723 +#define RPC_S_INVALID_NETWORK_OPTIONS 1724 +#define RPC_S_NO_CALL_ACTIVE 1725 +#define RPC_S_CALL_FAILED 1726 +#define RPC_S_CALL_FAILED_DNE 1727 +#define RPC_S_PROTOCOL_ERROR 1728 +#define RPC_S_PROXY_ACCESS_DENIED 1729 +#define RPC_S_UNSUPPORTED_TRANS_SYN 1730 +#define RPC_S_UNSUPPORTED_TYPE 1732 +#define RPC_S_INVALID_TAG 1733 +#define RPC_S_INVALID_BOUND 1734 +#define RPC_S_NO_ENTRY_NAME 1735 +#define RPC_S_INVALID_NAME_SYNTAX 1736 +#define RPC_S_UNSUPPORTED_NAME_SYNTAX 1737 +#define RPC_S_UUID_NO_ADDRESS 1739 +#define RPC_S_DUPLICATE_ENDPOINT 1740 +#define RPC_S_UNKNOWN_AUTHN_TYPE 1741 +#define RPC_S_MAX_CALLS_TOO_SMALL 1742 +#define RPC_S_STRING_TOO_LONG 1743 +#define RPC_S_PROTSEQ_NOT_FOUND 1744 +#define RPC_S_PROCNUM_OUT_OF_RANGE 1745 +#define RPC_S_BINDING_HAS_NO_AUTH 1746 +#define RPC_S_UNKNOWN_AUTHN_SERVICE 1747 +#define RPC_S_UNKNOWN_AUTHN_LEVEL 1748 +#define RPC_S_INVALID_AUTH_IDENTITY 1749 +#define RPC_S_UNKNOWN_AUTHZ_SERVICE 1750 +#define EPT_S_INVALID_ENTRY 1751 +#define EPT_S_CANT_PERFORM_OP 1752 +#define EPT_S_NOT_REGISTERED 1753 +#define RPC_S_NOTHING_TO_EXPORT 1754 +#define RPC_S_INCOMPLETE_NAME 1755 +#define RPC_S_INVALID_VERS_OPTION 1756 +#define RPC_S_NO_MORE_MEMBERS 1757 +#define RPC_S_NOT_ALL_OBJS_UNEXPORTED 1758 +#define RPC_S_INTERFACE_NOT_FOUND 1759 +#define RPC_S_ENTRY_ALREADY_EXISTS 1760 +#define RPC_S_ENTRY_NOT_FOUND 1761 +#define RPC_S_NAME_SERVICE_UNAVAILABLE 1762 +#define RPC_S_INVALID_NAF_ID 1763 +#define RPC_S_CANNOT_SUPPORT 1764 +#define RPC_S_NO_CONTEXT_AVAILABLE 1765 +#define RPC_S_INTERNAL_ERROR 1766 +#define RPC_S_ZERO_DIVIDE 1767 +#define RPC_S_ADDRESS_ERROR 1768 +#define RPC_S_FP_DIV_ZERO 1769 +#define RPC_S_FP_UNDERFLOW 1770 +#define RPC_S_FP_OVERFLOW 1771 +#define RPC_X_NO_MORE_ENTRIES 1772 +#define RPC_X_SS_CHAR_TRANS_OPEN_FAIL 1773 +#define RPC_X_SS_CHAR_TRANS_SHORT_FILE 1774 +#define RPC_X_SS_IN_NULL_CONTEXT 1775 +#define RPC_X_SS_CONTEXT_DAMAGED 1777 +#define RPC_X_SS_HANDLES_MISMATCH 1778 +#define RPC_X_SS_CANNOT_GET_CALL_HANDLE 1779 +#define RPC_X_NULL_REF_POINTER 1780 +#define RPC_X_ENUM_VALUE_OUT_OF_RANGE 1781 +#define RPC_X_BYTE_COUNT_TOO_SMALL 1782 +#define RPC_X_BAD_STUB_DATA 1783 +#define RPC_S_CALL_IN_PROGRESS 1791 +#define RPC_S_NO_MORE_BINDINGS 1806 +#define RPC_S_NO_INTERFACES 1817 +#define RPC_S_CALL_CANCELLED 1818 +#define RPC_S_BINDING_INCOMPLETE 1819 +#define RPC_S_COMM_FAILURE 1820 +#define RPC_S_UNSUPPORTED_AUTHN_LEVEL 1821 +#define RPC_S_NO_PRINC_NAME 1822 +#define RPC_S_NOT_RPC_ERROR 1823 +#define RPC_S_UUID_LOCAL_ONLY 1824 +#define RPC_S_SEC_PKG_ERROR 1825 +#define RPC_S_NOT_CANCELLED 1826 +#define RPC_X_INVALID_ES_ACTION 1827 +#define RPC_X_WRONG_ES_VERSION 1828 +#define RPC_X_WRONG_STUB_VERSION 1829 +#define RPC_X_INVALID_PIPE_OBJECT 1830 +#define RPC_X_WRONG_PIPE_ORDER 1831 +#define RPC_X_WRONG_PIPE_VERSION 1832 +#define RPC_S_COOKIE_AUTH_FAILED 1833 +#define RPC_S_GROUP_MEMBER_NOT_FOUND 1898 +#define EPT_S_CANT_CREATE 1899 +#define RPC_S_INVALID_OBJECT 1900 +#define RPC_S_SEND_INCOMPLETE 1913 +#define RPC_S_INVALID_ASYNC_HANDLE 1914 +#define RPC_S_INVALID_ASYNC_CALL 1915 +#define RPC_X_PIPE_CLOSED 1916 +#define RPC_X_PIPE_DISCIPLINE_ERROR 1917 +#define RPC_X_PIPE_EMPTY 1918 +#define RPC_S_ENTRY_TYPE_MISMATCH 1922 +#define RPC_S_NOT_ALL_OBJS_EXPORTED 1923 +#define RPC_S_INTERFACE_NOT_EXPORTED 1924 +#define RPC_S_PROFILE_NOT_ADDED 1925 +#define RPC_S_PRF_ELT_NOT_ADDED 1926 +#define RPC_S_PRF_ELT_NOT_REMOVED 1927 +#define RPC_S_GRP_ELT_NOT_ADDED 1928 +#define RPC_S_GRP_ELT_NOT_REMOVED 1929 +#endif // !defined(_WIN32) && !_defined(__CYGWIN__) + + typedef struct { BYTE VersionMajor; BYTE VersionMinor; diff --git a/shared_globals.c b/shared_globals.c index adba698..0487791 100644 --- a/shared_globals.c +++ b/shared_globals.c @@ -14,6 +14,10 @@ int_fast8_t DisconnectImmediately = FALSE; const char *const cIPv4 = "IPv4"; const char *const cIPv6 = "IPv6"; +#ifdef IS_LIBRARY +char ErrorMessage[MESSAGE_BUFFER_SIZE]; +#endif // IS_LIBRARY + #ifndef USE_MSRPC int_fast8_t UseMultiplexedRpc = TRUE; int_fast8_t UseRpcNDR64 = TRUE; diff --git a/shared_globals.h b/shared_globals.h index 2a1dd73..808b2e1 100644 --- a/shared_globals.h +++ b/shared_globals.h @@ -74,9 +74,9 @@ extern const char *const Version; #define UINT_MAX 4294967295 #endif +#define MESSAGE_BUFFER_SIZE 4096 #ifdef IS_LIBRARY -#define MESSAGE_BUFFER_SIZE 256 -EXTERNC __declspec(EXTERNAL) extern char ErrorMessage[MESSAGE_BUFFER_SIZE]; +extern char ErrorMessage[MESSAGE_BUFFER_SIZE]; #endif // IS_LIBRARY extern int global_argc, multi_argc; diff --git a/types.h b/types.h index b3db448..ce948bc 100644 --- a/types.h +++ b/types.h @@ -301,6 +301,4 @@ typedef struct { } CLDATA, *const PCLDATA; - - #endif // __types_h diff --git a/vlmcs.1 b/vlmcs.1 index b42e44a..7ef8f93 100644 --- a/vlmcs.1 +++ b/vlmcs.1 @@ -75,11 +75,11 @@ to specify applications that are not listed with \fB-x\fR. The .B -l option is used as a shortcut for the most common applications. +.IP "\fB-K\fR \fIprotocol-version\fR" +Force a specific version of the KMS protocol. Valid versions are 4.0, 5.0 and 6.0. The default is to select a suitable version according to the \fIapplication\fR selected. You may use \fB-K\fR to send an incorrect protocol version to the KMS server and see how it behaves. Genuine KMS servers return HRESULT 0x8007000D if the KMS protocol is not 4.0, 5.0 or 6.0. Emulators should do the same. When sending a request with an incorrect protocol number, vlmcs ignores the minor protocol number (e.g. sends a v4 request for version 4.1). If the major version number is less then 4, it sends a v4 request. If the major version is greater then 6, is sends a v6 request. In any case the \fIprotocol-version\fR as specified by \fB-K\fR is put in the version fields of the request. + .IP "\fB-4\fR, \fB-5\fR and \fB-6" -Force version 4, 5 or 6 of the KMS protocol. The default is to select a suitable -version according to the -.IR "application" -selected. Plese note that some products (e.g. Office 2013) may use different protocols with different versions of Windows. +Force version 4, 5 or 6 of the KMS protocol. These options are actually shortcuts of \fB-K 4.0\fR, \fB-K 5.0\fR and \fB-K 6.0\fR. .IP "\fB-m" Let the client pretend to be a virtual machine. Early versions of Microsoft's diff --git a/vlmcs.1.dos.txt b/vlmcs.1.dos.txt index 49d84eb..dcd26b6 100644 --- a/vlmcs.1.dos.txt +++ b/vlmcs.1.dos.txt @@ -80,31 +80,44 @@ OPTIONS as a shortcut for the most common applications. + -K protocol-version + Force a specific version of the KMS protocol. Valid versions are + 4.0, 5.0 and 6.0. The default is to select a suitable version + according to the application selected. You may use -K to send an + incorrect protocol version to the KMS server and see how it + behaves. Genuine KMS servers return HRESULT 0x8007000D if the + KMS protocol is not 4.0, 5.0 or 6.0. Emulators should do the + same. When sending a request with an incorrect protocol number, + vlmcs ignores the minor protocol number (e.g. sends a v4 request + for version 4.1). If the major version number is less then 4, it + sends a v4 request. If the major version is greater then 6, is + sends a v6 request. In any case the protocol-version as speci‐ + fied by -K is put in the version fields of the request. + + -4, -5 and -6 - Force version 4, 5 or 6 of the KMS protocol. The default is to - select a suitable version according to the application selected. - Plese note that some products (e.g. Office 2013) may use differ‐ - ent protocols with different versions of Windows. + Force version 4, 5 or 6 of the KMS protocol. These options are + actually shortcuts of -K 4.0, -K 5.0 and -K 6.0. - -m Let the client pretend to be a virtual machine. Early versions - of Microsoft's KMS server did not increase the client count if - the request came from a virtual machine. Newer versions ignore + -m Let the client pretend to be a virtual machine. Early versions + of Microsoft's KMS server did not increase the client count if + the request came from a virtual machine. Newer versions ignore this flag. -d Use NetBIOS names instead of DNS names. By default vlmcsd gener‐ - ates some random DNS names for each request. If you prefer Net‐ - BIOS names, you may use -d. A real Microsoft activation client - uses DNS names or NetBIOS depending on the client name configu‐ + ates some random DNS names for each request. If you prefer Net‐ + BIOS names, you may use -d. A real Microsoft activation client + uses DNS names or NetBIOS depending on the client name configu‐ ration. KMS servers treat the workstation name as a comment that - affects logging only. Clients will be identified by a GUID that - can be specified using -c. -d has no effect if you also specify + affects logging only. Clients will be identified by a GUID that + can be specified using -c. -d has no effect if you also specify -w. -a application-guid - Send requests with a specific application-guid. There are cur‐ + Send requests with a specific application-guid. There are cur‐ rently only three known valid application-guids: @@ -113,91 +126,91 @@ OPTIONS 0ff1ce15-a989-479d-af46-f275c6370663 (Office 2013) - A Microsoft KMS server uses these GUIDs to have seperate coun‐ - ters for the already activated clients. A client that does not - contact the KMS server within 30 days will be deleted from the + A Microsoft KMS server uses these GUIDs to have seperate coun‐ + ters for the already activated clients. A client that does not + contact the KMS server within 30 days will be deleted from the database. Emulated KMS servers are always fully charged. -k kms-guid - Send requests with a specific kms-guid. A Microsoft KMS server - uses these GUIDs as a product id to decide whether to grant - activation or not. A list of current kms-guids can be found in - kms.c (table KmsIdList). Emulated KMS servers grant activation + Send requests with a specific kms-guid. A Microsoft KMS server + uses these GUIDs as a product id to decide whether to grant + activation or not. A list of current kms-guids can be found in + kms.c (table KmsIdList). Emulated KMS servers grant activation unconditionally and do not check the kms-guid. -s activation-guid - The activation-guid defines the actual product, e.g. "Windows - 8.1 Professional WMC KMSCLIENT edition". A activation-guid maps - 1:1 to a product key. However, neither a Microsoft KMS server + The activation-guid defines the actual product, e.g. "Windows + 8.1 Professional WMC KMSCLIENT edition". A activation-guid maps + 1:1 to a product key. However, neither a Microsoft KMS server nor emulated servers check this id. The activation-guid is use‐ - ful in logging to get a specific product description like "Win‐ - dows 8.1 Professional WMC". A list of current activation-guids + ful in logging to get a specific product description like "Win‐ + dows 8.1 Professional WMC". A list of current activation-guids can be found in kms.c (table ExtendedProductList). -n requests - Send requests requests to the server. The default is to send at + Send requests requests to the server. The default is to send at least one request and enough subsequent requests that the server - is fully charged afterwards for the application-guid you + is fully charged afterwards for the application-guid you selected (explicitly with -a or implicitly by using -l). - -T Causes to use a new TCP connection for each request if multiple - requests are sent with vlmcsd. This is useful when you want to - test an emulated KMS server whether it suffers from memory - leaks. To test for memory leaks use -n with a large number of - requests (> 100000) and then test twice (with and without -T). - This option may become neccessary for future versions of Micro‐ - soft's KMS server because multiple requests with different - clients-guids for the same kms-id-guid are impossible in a real + -T Causes to use a new TCP connection for each request if multiple + requests are sent with vlmcsd. This is useful when you want to + test an emulated KMS server whether it suffers from memory + leaks. To test for memory leaks use -n with a large number of + requests (> 100000) and then test twice (with and without -T). + This option may become neccessary for future versions of Micro‐ + soft's KMS server because multiple requests with different + clients-guids for the same kms-id-guid are impossible in a real KMS szenario over the same TCP connection. -c client-machine-guid - Normally vlmcs generates a random client-machine-guid for each - request. By using this option you can specify a fixed client- - machine-guid This causes a Microsoft KMS not to increment its - client count because it receives multiple requests for the same - client. Thus do not use -c if you want to charge a real KMS + Normally vlmcs generates a random client-machine-guid for each + request. By using this option you can specify a fixed client- + machine-guid This causes a Microsoft KMS not to increment its + client count because it receives multiple requests for the same + client. Thus do not use -c if you want to charge a real KMS server. -o previous-client-machine-guid If the client-machine-guid changes for some reason, the real KMS - client stores a previous-client-machine-guid which is sent to - the KMS server. This happens rarely and usually - 00000000-0000-0000-0000-000000000000 is used. You can use -o to + client stores a previous-client-machine-guid which is sent to + the KMS server. This happens rarely and usually + 00000000-0000-0000-0000-000000000000 is used. You can use -o to specify a different previous-client-machine-guid. -G filename - Grabs ePIDs and HWIDs from a KMS server and writes the informa‐ - tion to filename in format suitable to be used as a configura‐ + Grabs ePIDs and HWIDs from a KMS server and writes the informa‐ + tion to filename in format suitable to be used as a configura‐ tion file (aka ini file) for vlmcsd(8). This is especially use‐ - ful if you have access to a genuine KMS server and want to use + ful if you have access to a genuine KMS server and want to use the same data with vlmcsd(8). - If filename does not exist, it will be created. If you specify - an existing filename, it will be updated to use the information - received from the remote KMS server and a backup filename~ will + If filename does not exist, it will be created. If you specify + an existing filename, it will be updated to use the information + received from the remote KMS server and a backup filename~ will be created. -G cannot be used with -l, -4, -5, -6, -a, -s, -k, -r and -n -w workstation-name - Send requests with a specific workstation-name. This disables - the random generator for the workstation name. Since it is a + Send requests with a specific workstation-name. This disables + the random generator for the workstation name. Since it is a comment only, this option does not have much effect. -r required-client-count - Also known as the "N count policy". Tells the KMS server that - successful activation requires required-client-count clients. - The default is the required-client-count that the product would - need if the request was a real activation. A Microsoft KMS + Also known as the "N count policy". Tells the KMS server that + successful activation requires required-client-count clients. + The default is the required-client-count that the product would + need if the request was a real activation. A Microsoft KMS server counts clients up to the double amount what was specified with -r. This option can be used to "overcharge" a Microsoft KMS server. @@ -205,57 +218,57 @@ OPTIONS -t status Reports a specific license status to the KMS server. status is a - number that can be from 0 to 6. 0=unlicensed, 1=licensed, 2=OOB - grace, 3=OOT grace, 4=Non-genuinue grace, 5=notification, + number that can be from 0 to 6. 0=unlicensed, 1=licensed, 2=OOB + grace, 3=OOT grace, 4=Non-genuinue grace, 5=notification, 6=extended grace. Refer to TechNet ⟨http:// technet.microsoft.com/en-us/library/ff686879.aspx#_Toc257201371⟩ - for more information. A Microsoft KMS server collects this + for more information. A Microsoft KMS server collects this information for statistics only. -g binding-expiration - This tells the KMS server how long a client will stay in its - current license status. This can be the remaining OOB time (the - grace peroid that is granted between installation of a product - and when activation is actuall required) or the remaining time - when KMS activation must be renewed. binding-expiration is + This tells the KMS server how long a client will stay in its + current license status. This can be the remaining OOB time (the + grace peroid that is granted between installation of a product + and when activation is actuall required) or the remaining time + when KMS activation must be renewed. binding-expiration is specified in minutes. A Microsoft KMS server apparantly does not use this information. -i protocol-version - Force the use of Internet protocol protocol-version. Allowed - values are 4 (IPv4) and 6 (IPv6). This option is useful only if - you specfiy a hostname and not an ip-address on the command + Force the use of Internet protocol protocol-version. Allowed + values are 4 (IPv4) and 6 (IPv6). This option is useful only if + you specfiy a hostname and not an ip-address on the command line. - -p Do not set the RPC_PF_MULTIPLEX flag in the RPC bind request. + -p Do not set the RPC_PF_MULTIPLEX flag in the RPC bind request. This can be used to test if the KMS server uses the same setting - of this flag in the RPC bind respone. Some KMS emulators don't + of this flag in the RPC bind respone. Some KMS emulators don't set this correctly. -N0 and -N1 Disables (-N0) or enables (-N1) the NDR64 transfer syntax in the - RPC protocol. Disable NDR64 only in case of problems. If NDR64 + RPC protocol. Disable NDR64 only in case of problems. If NDR64 is not used, vlmcs cannot detect many RPC protocol errors in KMS emulators. If you want to test whether a KMS emulator fully sup‐ - ports NDR64, you must use the -n option to send at least two - requests. This is because Microsoft's client always sends the - first request using NDR32 syntax and subsequent requests using + ports NDR64, you must use the -n option to send at least two + requests. This is because Microsoft's client always sends the + first request using NDR32 syntax and subsequent requests using NDR64 syntax. -B0 and -B1 - Disables (-B0) or enables (-B1) bind time feature negotiation - (BTFN) in the RPC protocol. Disable BTFN only in case of prob‐ + Disables (-B0) or enables (-B1) bind time feature negotiation + (BTFN) in the RPC protocol. Disable BTFN only in case of prob‐ lems. If BTFN is not used, vlmcs cannot detect many RPC protocol errors in KMS emulators. - Options that do not require an argument can be specified together with - a single dash, e.g. vlmcs -6mvT. If you specify an option more than + Options that do not require an argument can be specified together with + a single dash, e.g. vlmcs -6mvT. If you specify an option more than once, the last occurence will be in effect. @@ -265,34 +278,34 @@ FILES EXAMPLES vlmcs kms.example.com - Request activation for Windows Vista using v4 protocol from - kms.example.com. Repeat activation requests until server is + Request activation for Windows Vista using v4 protocol from + kms.example.com. Repeat activation requests until server is charged for all Windows products. vlmcs - - Request activation for Windows Vista using v4 protocol from a + Request activation for Windows Vista using v4 protocol from a KMS server that is published via DNS for the current domain. vlmcs .example.com - Request activation for Windows Vista using v4 protocol from a + Request activation for Windows Vista using v4 protocol from a KMS server that is published via DNS for domain example.com. vlmcs -6 -l Office2013 -v -n 1 - Request exactly one activation for Office2013 using v6 protocol + Request exactly one activation for Office2013 using v6 protocol from localhost. Display verbose results. vlmcs kms.bigcompany.com -G /etc/vlmcsd.ini - Get ePIDs and HWIDs from kms.bigcompany.com and create/update + Get ePIDs and HWIDs from kms.bigcompany.com and create/update /etc/vlmcsd.ini accordingly. BUGS - Some platforms (e.g. Solaris) may have a man(7) system that does not - handle URLs. URLs may be omitted in the documentation on those plat‐ + Some platforms (e.g. Solaris) may have a man(7) system that does not + handle URLs. URLs may be omitted in the documentation on those plat‐ forms. Cygwin, Linux, FreeBSD and Mac OS X are known to work correctly. @@ -301,7 +314,7 @@ AUTHOR CREDITS - Thanks to CODYQX4, crony12, deagles, DougQaid, eIcn, mikmik38, nos‐ + Thanks to CODYQX4, crony12, deagles, DougQaid, eIcn, mikmik38, nos‐ ferati87, qad, Ratiborus, vityan666, ... diff --git a/vlmcs.1.html b/vlmcs.1.html index 2d3ec65..0196526 100644 --- a/vlmcs.1.html +++ b/vlmcs.1.html @@ -1,5 +1,5 @@ - + @@ -183,14 +183,30 @@ applications is not complete. You may supply GUIDs with that are not listed with -x. The -l option is used as a shortcut for the most common applications.

+

-K +protocol-version

+ +

Force a specific version of the +KMS protocol. Valid versions are 4.0, 5.0 and 6.0. The +default is to select a suitable version according to the +application selected. You may use -K to send +an incorrect protocol version to the KMS server and see how +it behaves. Genuine KMS servers return HRESULT 0x8007000D if +the KMS protocol is not 4.0, 5.0 or 6.0. Emulators should do +the same. When sending a request with an incorrect protocol +number, vlmcs ignores the minor protocol number (e.g. sends +a v4 request for version 4.1). If the major version number +is less then 4, it sends a v4 request. If the major version +is greater then 6, is sends a v6 request. In any case the +protocol-version as specified by -K is put in +the version fields of the request.

+

-4, -5 and -6

Force version 4, 5 or 6 of the -KMS protocol. The default is to select a suitable version -according to the application selected. Plese note -that some products (e.g. Office 2013) may use different -protocols with different versions of Windows.

+KMS protocol. These options are actually shortcuts of -K +4.0, -K 5.0 and -K 6.0.

diff --git a/vlmcs.1.pdf b/vlmcs.1.pdf index 97e3ba04e7e4f28effcccca9e2c3766c76ae1690..dc0b8e68bd10e4fd2ff8057e875f85b00f8fc986 100644 GIT binary patch delta 9892 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 diff --git a/vlmcs.1.unix.txt b/vlmcs.1.unix.txt index d6a6438..c4db060 100644 --- a/vlmcs.1.unix.txt +++ b/vlmcs.1.unix.txt @@ -80,31 +80,44 @@ OPTIONS as a shortcut for the most common applications. + -K protocol-version + Force a specific version of the KMS protocol. Valid versions are + 4.0, 5.0 and 6.0. The default is to select a suitable version + according to the application selected. You may use -K to send an + incorrect protocol version to the KMS server and see how it + behaves. Genuine KMS servers return HRESULT 0x8007000D if the + KMS protocol is not 4.0, 5.0 or 6.0. Emulators should do the + same. When sending a request with an incorrect protocol number, + vlmcs ignores the minor protocol number (e.g. sends a v4 request + for version 4.1). If the major version number is less then 4, it + sends a v4 request. If the major version is greater then 6, is + sends a v6 request. In any case the protocol-version as speci‐ + fied by -K is put in the version fields of the request. + + -4, -5 and -6 - Force version 4, 5 or 6 of the KMS protocol. The default is to - select a suitable version according to the application selected. - Plese note that some products (e.g. Office 2013) may use differ‐ - ent protocols with different versions of Windows. + Force version 4, 5 or 6 of the KMS protocol. These options are + actually shortcuts of -K 4.0, -K 5.0 and -K 6.0. - -m Let the client pretend to be a virtual machine. Early versions - of Microsoft's KMS server did not increase the client count if - the request came from a virtual machine. Newer versions ignore + -m Let the client pretend to be a virtual machine. Early versions + of Microsoft's KMS server did not increase the client count if + the request came from a virtual machine. Newer versions ignore this flag. -d Use NetBIOS names instead of DNS names. By default vlmcsd gener‐ - ates some random DNS names for each request. If you prefer Net‐ - BIOS names, you may use -d. A real Microsoft activation client - uses DNS names or NetBIOS depending on the client name configu‐ + ates some random DNS names for each request. If you prefer Net‐ + BIOS names, you may use -d. A real Microsoft activation client + uses DNS names or NetBIOS depending on the client name configu‐ ration. KMS servers treat the workstation name as a comment that - affects logging only. Clients will be identified by a GUID that - can be specified using -c. -d has no effect if you also specify + affects logging only. Clients will be identified by a GUID that + can be specified using -c. -d has no effect if you also specify -w. -a application-guid - Send requests with a specific application-guid. There are cur‐ + Send requests with a specific application-guid. There are cur‐ rently only three known valid application-guids: @@ -113,91 +126,91 @@ OPTIONS 0ff1ce15-a989-479d-af46-f275c6370663 (Office 2013) - A Microsoft KMS server uses these GUIDs to have seperate coun‐ - ters for the already activated clients. A client that does not - contact the KMS server within 30 days will be deleted from the + A Microsoft KMS server uses these GUIDs to have seperate coun‐ + ters for the already activated clients. A client that does not + contact the KMS server within 30 days will be deleted from the database. Emulated KMS servers are always fully charged. -k kms-guid - Send requests with a specific kms-guid. A Microsoft KMS server - uses these GUIDs as a product id to decide whether to grant - activation or not. A list of current kms-guids can be found in - kms.c (table KmsIdList). Emulated KMS servers grant activation + Send requests with a specific kms-guid. A Microsoft KMS server + uses these GUIDs as a product id to decide whether to grant + activation or not. A list of current kms-guids can be found in + kms.c (table KmsIdList). Emulated KMS servers grant activation unconditionally and do not check the kms-guid. -s activation-guid - The activation-guid defines the actual product, e.g. "Windows - 8.1 Professional WMC KMSCLIENT edition". A activation-guid maps - 1:1 to a product key. However, neither a Microsoft KMS server + The activation-guid defines the actual product, e.g. "Windows + 8.1 Professional WMC KMSCLIENT edition". A activation-guid maps + 1:1 to a product key. However, neither a Microsoft KMS server nor emulated servers check this id. The activation-guid is use‐ - ful in logging to get a specific product description like "Win‐ - dows 8.1 Professional WMC". A list of current activation-guids + ful in logging to get a specific product description like "Win‐ + dows 8.1 Professional WMC". A list of current activation-guids can be found in kms.c (table ExtendedProductList). -n requests - Send requests requests to the server. The default is to send at + Send requests requests to the server. The default is to send at least one request and enough subsequent requests that the server - is fully charged afterwards for the application-guid you + is fully charged afterwards for the application-guid you selected (explicitly with -a or implicitly by using -l). - -T Causes to use a new TCP connection for each request if multiple - requests are sent with vlmcsd. This is useful when you want to - test an emulated KMS server whether it suffers from memory - leaks. To test for memory leaks use -n with a large number of - requests (> 100000) and then test twice (with and without -T). - This option may become neccessary for future versions of Micro‐ - soft's KMS server because multiple requests with different - clients-guids for the same kms-id-guid are impossible in a real + -T Causes to use a new TCP connection for each request if multiple + requests are sent with vlmcsd. This is useful when you want to + test an emulated KMS server whether it suffers from memory + leaks. To test for memory leaks use -n with a large number of + requests (> 100000) and then test twice (with and without -T). + This option may become neccessary for future versions of Micro‐ + soft's KMS server because multiple requests with different + clients-guids for the same kms-id-guid are impossible in a real KMS szenario over the same TCP connection. -c client-machine-guid - Normally vlmcs generates a random client-machine-guid for each - request. By using this option you can specify a fixed client- - machine-guid This causes a Microsoft KMS not to increment its - client count because it receives multiple requests for the same - client. Thus do not use -c if you want to charge a real KMS + Normally vlmcs generates a random client-machine-guid for each + request. By using this option you can specify a fixed client- + machine-guid This causes a Microsoft KMS not to increment its + client count because it receives multiple requests for the same + client. Thus do not use -c if you want to charge a real KMS server. -o previous-client-machine-guid If the client-machine-guid changes for some reason, the real KMS - client stores a previous-client-machine-guid which is sent to - the KMS server. This happens rarely and usually - 00000000-0000-0000-0000-000000000000 is used. You can use -o to + client stores a previous-client-machine-guid which is sent to + the KMS server. This happens rarely and usually + 00000000-0000-0000-0000-000000000000 is used. You can use -o to specify a different previous-client-machine-guid. -G filename - Grabs ePIDs and HWIDs from a KMS server and writes the informa‐ - tion to filename in format suitable to be used as a configura‐ + Grabs ePIDs and HWIDs from a KMS server and writes the informa‐ + tion to filename in format suitable to be used as a configura‐ tion file (aka ini file) for vlmcsd(8). This is especially use‐ - ful if you have access to a genuine KMS server and want to use + ful if you have access to a genuine KMS server and want to use the same data with vlmcsd(8). - If filename does not exist, it will be created. If you specify - an existing filename, it will be updated to use the information - received from the remote KMS server and a backup filename~ will + If filename does not exist, it will be created. If you specify + an existing filename, it will be updated to use the information + received from the remote KMS server and a backup filename~ will be created. -G cannot be used with -l, -4, -5, -6, -a, -s, -k, -r and -n -w workstation-name - Send requests with a specific workstation-name. This disables - the random generator for the workstation name. Since it is a + Send requests with a specific workstation-name. This disables + the random generator for the workstation name. Since it is a comment only, this option does not have much effect. -r required-client-count - Also known as the "N count policy". Tells the KMS server that - successful activation requires required-client-count clients. - The default is the required-client-count that the product would - need if the request was a real activation. A Microsoft KMS + Also known as the "N count policy". Tells the KMS server that + successful activation requires required-client-count clients. + The default is the required-client-count that the product would + need if the request was a real activation. A Microsoft KMS server counts clients up to the double amount what was specified with -r. This option can be used to "overcharge" a Microsoft KMS server. @@ -205,57 +218,57 @@ OPTIONS -t status Reports a specific license status to the KMS server. status is a - number that can be from 0 to 6. 0=unlicensed, 1=licensed, 2=OOB - grace, 3=OOT grace, 4=Non-genuinue grace, 5=notification, + number that can be from 0 to 6. 0=unlicensed, 1=licensed, 2=OOB + grace, 3=OOT grace, 4=Non-genuinue grace, 5=notification, 6=extended grace. Refer to TechNet ⟨http:// technet.microsoft.com/en-us/library/ff686879.aspx#_Toc257201371⟩ - for more information. A Microsoft KMS server collects this + for more information. A Microsoft KMS server collects this information for statistics only. -g binding-expiration - This tells the KMS server how long a client will stay in its - current license status. This can be the remaining OOB time (the - grace peroid that is granted between installation of a product - and when activation is actuall required) or the remaining time - when KMS activation must be renewed. binding-expiration is + This tells the KMS server how long a client will stay in its + current license status. This can be the remaining OOB time (the + grace peroid that is granted between installation of a product + and when activation is actuall required) or the remaining time + when KMS activation must be renewed. binding-expiration is specified in minutes. A Microsoft KMS server apparantly does not use this information. -i protocol-version - Force the use of Internet protocol protocol-version. Allowed - values are 4 (IPv4) and 6 (IPv6). This option is useful only if - you specfiy a hostname and not an ip-address on the command + Force the use of Internet protocol protocol-version. Allowed + values are 4 (IPv4) and 6 (IPv6). This option is useful only if + you specfiy a hostname and not an ip-address on the command line. - -p Do not set the RPC_PF_MULTIPLEX flag in the RPC bind request. + -p Do not set the RPC_PF_MULTIPLEX flag in the RPC bind request. This can be used to test if the KMS server uses the same setting - of this flag in the RPC bind respone. Some KMS emulators don't + of this flag in the RPC bind respone. Some KMS emulators don't set this correctly. -N0 and -N1 Disables (-N0) or enables (-N1) the NDR64 transfer syntax in the - RPC protocol. Disable NDR64 only in case of problems. If NDR64 + RPC protocol. Disable NDR64 only in case of problems. If NDR64 is not used, vlmcs cannot detect many RPC protocol errors in KMS emulators. If you want to test whether a KMS emulator fully sup‐ - ports NDR64, you must use the -n option to send at least two - requests. This is because Microsoft's client always sends the - first request using NDR32 syntax and subsequent requests using + ports NDR64, you must use the -n option to send at least two + requests. This is because Microsoft's client always sends the + first request using NDR32 syntax and subsequent requests using NDR64 syntax. -B0 and -B1 - Disables (-B0) or enables (-B1) bind time feature negotiation - (BTFN) in the RPC protocol. Disable BTFN only in case of prob‐ + Disables (-B0) or enables (-B1) bind time feature negotiation + (BTFN) in the RPC protocol. Disable BTFN only in case of prob‐ lems. If BTFN is not used, vlmcs cannot detect many RPC protocol errors in KMS emulators. - Options that do not require an argument can be specified together with - a single dash, e.g. vlmcs -6mvT. If you specify an option more than + Options that do not require an argument can be specified together with + a single dash, e.g. vlmcs -6mvT. If you specify an option more than once, the last occurence will be in effect. @@ -265,34 +278,34 @@ FILES EXAMPLES vlmcs kms.example.com - Request activation for Windows Vista using v4 protocol from - kms.example.com. Repeat activation requests until server is + Request activation for Windows Vista using v4 protocol from + kms.example.com. Repeat activation requests until server is charged for all Windows products. vlmcs - - Request activation for Windows Vista using v4 protocol from a + Request activation for Windows Vista using v4 protocol from a KMS server that is published via DNS for the current domain. vlmcs .example.com - Request activation for Windows Vista using v4 protocol from a + Request activation for Windows Vista using v4 protocol from a KMS server that is published via DNS for domain example.com. vlmcs -6 -l Office2013 -v -n 1 - Request exactly one activation for Office2013 using v6 protocol + Request exactly one activation for Office2013 using v6 protocol from localhost. Display verbose results. vlmcs kms.bigcompany.com -G /etc/vlmcsd.ini - Get ePIDs and HWIDs from kms.bigcompany.com and create/update + Get ePIDs and HWIDs from kms.bigcompany.com and create/update /etc/vlmcsd.ini accordingly. BUGS - Some platforms (e.g. Solaris) may have a man(7) system that does not - handle URLs. URLs may be omitted in the documentation on those plat‐ + Some platforms (e.g. Solaris) may have a man(7) system that does not + handle URLs. URLs may be omitted in the documentation on those plat‐ forms. Cygwin, Linux, FreeBSD and Mac OS X are known to work correctly. @@ -301,7 +314,7 @@ AUTHOR CREDITS - Thanks to CODYQX4, crony12, deagles, DougQaid, eIcn, mikmik38, nos‐ + Thanks to CODYQX4, crony12, deagles, DougQaid, eIcn, mikmik38, nos‐ ferati87, qad, Ratiborus, vityan666, ... diff --git a/vlmcs.c b/vlmcs.c index ddb77bd..74d8ef1 100644 --- a/vlmcs.c +++ b/vlmcs.c @@ -39,7 +39,9 @@ #define VLMCS_OPTION_GRAB_INI 1 #define VLMCS_OPTION_NO_GRAB_INI 2 -#define kmsVersionMinor 0 // Currently constant. May change in future KMS versions +//#define kmsVersionMinor 0 // Currently constant. May change in future KMS versions + +#ifndef IS_LIBRARY // Function Prototypes static void CreateRequestBase(REQUEST *Request); @@ -53,7 +55,7 @@ static int_fast8_t verbose = FALSE; static int_fast8_t VMInfo = FALSE; static int_fast8_t dnsnames = TRUE; static int FixedRequests = 0; -static BYTE LicenseStatus = 0x02; +static DWORD LicenseStatus = 0x02; static const char *CMID = NULL; static const char *CMID_prev = NULL; static const char *WorkstationName = NULL; @@ -63,6 +65,7 @@ static int_fast8_t ReconnectForEachRequest = FALSE; static int AddressFamily = AF_UNSPEC; static int_fast8_t incompatibleOptions = 0; static const char* fn_ini_client = NULL; +static int_fast16_t kmsVersionMinor = 0; #ifndef NO_DNS static int_fast8_t NoSrvRecordPriority = FALSE; @@ -185,6 +188,7 @@ __noreturn static void clientUsage(const char* const programName) " -k Use custom KMS GUID\n" " -c Use custom Client GUID. Default: Use random\n" " -o Use custom Prevoius Client GUID. Default: ZeroGUID\n" + " -K Use a specific (possibly invalid) protocol version\n" " -w Use custom workstation name. Default: Use random\n" " -r Fake required clients\n" " -n Fixed # of requests (Default: Enough to charge)\n" @@ -358,6 +362,35 @@ __noreturn static void examples(const char* const programName) exit(0); } +static void parseProtocolVersion(void) +{ + char *endptr_major, *endptr_minor, *period = strchr(optarg, (int)'.'); + + if (!period) + { + errorout("Fatal: Protocol version must be in the format #.#\n"); + exit(!0); + } + + long major = strtol(optarg, &endptr_major, 10); + long minor = strtol(period + 1, &endptr_minor, 10); + + if ((*endptr_major && *endptr_major != '.') || *endptr_minor || *optarg == '.' || !period[1]) + { + errorout("Fatal: Protocol version must be in the format #.#\n"); + exit(!0); + } + + if (major < 0 || major > 0xffff || minor < 0 || minor > 0xffff) + { + errorout("Fatal: Major and minor protocol version number must be between 0 and 65535\n"); + exit(!0); + } + + ActiveLicensePack.kmsVersionMajor = (int)major; + kmsVersionMinor = (int_fast16_t)minor; +} + #else // NO_HELP @@ -426,7 +459,7 @@ static BOOL findLicensePackByName(const char* const name, LicensePack* const lp) #endif // Both Lists are available } -static const char* const client_optstring = "+N:B:i:l:a:s:k:c:w:r:n:t:g:G:o:pPTv456mexdV"; +static const char* const client_optstring = "+N:B:i:l:a:s:k:c:w:r:n:t:g:G:o:K:pPTv456mexdV"; //First pass. We handle only "-l". Since -a -k -s -4 -5 and -6 are exceptions to -l, we process -l first @@ -536,7 +569,7 @@ static void parseCommandLinePass2(const char *const programName, const int argc, case 'r': // Fake minimum required client count incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; - ActiveLicensePack.N_Policy = getOptionArgumentInt(o, 1, INT_MAX); + ActiveLicensePack.N_Policy = getOptionArgumentInt(o, 0, INT_MAX); break; case 'c': // use a specific client GUID @@ -583,6 +616,12 @@ static void parseCommandLinePass2(const char *const programName, const int argc, incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; ActiveLicensePack.kmsVersionMajor = o - 0x30; + kmsVersionMinor = 0; + break; + + case 'K': // Use specific protocol (may be invalid) + + parseProtocolVersion(); break; case 'd': // Don't use DNS names @@ -610,14 +649,15 @@ static void parseCommandLinePass2(const char *const programName, const int argc, if (strlen(WorkstationName) > 63) { - errorout("\007WARNING! Truncating Workstation name to 63 characters (%s).\n", WorkstationName); + errorout("\007WARNING! Truncating workstation name to 63 characters (%s).\n", WorkstationName); } break; case 't': - LicenseStatus = getOptionArgumentInt(o, 0, 6) & 0xff; + LicenseStatus = getOptionArgumentInt(o, 0, 0x7fffffff); + if ((unsigned int)LicenseStatus > 6) errorout("Warning: Correct license status is 0 <= license status <= 6.\n"); break; # ifndef USE_MSRPC @@ -697,7 +737,7 @@ static void displayResponse(const RESPONSE_RESULT result, const REQUEST* request if (!result.TimeStampOK) errorout("\n\007ERROR: Time stamps of request and response do not match.\n"); if (!result.VersionOK) errorout("\n\007ERROR: Protocol versions of request and response do not match.\n"); if (!result.HmacSha256OK) errorout("\n\007ERROR: Keyed-Hash Message Authentication Code (HMAC) is incorrect.\n"); - if (!result.IVnotSuspicious) errorout("\nWARNING: Response uses an IV following KMSv5 rules in KMSv6 protocol.\n"); + if (!result.IVnotSuspicious) errorout("\nWARNING: The KMS server is an emulator because the response uses an IV following KMSv5 rules in KMSv6 protocol.\n"); if (result.effectiveResponseSize != result.correctResponseSize) { @@ -852,8 +892,9 @@ static void connectRpc(RpcCtx *s) # endif // DNS } +#endif // IS_LIBRARY -static int SendActivationRequest(const RpcCtx sock, RESPONSE *baseResponse, REQUEST *baseRequest, RESPONSE_RESULT *result, BYTE *const hwid) +int SendActivationRequest(const RpcCtx sock, RESPONSE *baseResponse, REQUEST *baseRequest, RESPONSE_RESULT *result, BYTE *const hwid) { size_t requestSize, responseSize; BYTE *request, *response; @@ -861,7 +902,7 @@ static int SendActivationRequest(const RpcCtx sock, RESPONSE *baseResponse, REQU result->mask = 0; - if (LE16(baseRequest->MajorVer) == 4) + if (LE16(baseRequest->MajorVer) < 5) request = CreateRequestV4(&requestSize, baseRequest); else request = CreateRequestV6(&requestSize, baseRequest); @@ -889,6 +930,7 @@ static int SendActivationRequest(const RpcCtx sock, RESPONSE *baseResponse, REQU return status; } +#ifndef IS_LIBRARY static int sendRequest(RpcCtx *const s, REQUEST *const request, RESPONSE *const response, hwid_t hwid, RESPONSE_RESULT *const result) { @@ -1212,7 +1254,7 @@ int client_main(const int argc, CARGV argv) int requests; RpcCtx s = INVALID_RPCCTX; - for (requests = 0, RequestsToGo = ActiveLicensePack.N_Policy - 1; RequestsToGo; requests++) + for (requests = 0, RequestsToGo = ActiveLicensePack.N_Policy == 1 ? 1 : ActiveLicensePack.N_Policy - 1; RequestsToGo; requests++) { RESPONSE response; REQUEST request; @@ -1346,4 +1388,4 @@ static void CreateRequestBase(REQUEST *Request) # endif // NO_VERBOSE_LOG } - +#endif // IS_LIBRARY diff --git a/vlmcs.h b/vlmcs.h index 47386d0..cca368b 100644 --- a/vlmcs.h +++ b/vlmcs.h @@ -10,6 +10,12 @@ #include #endif // defined(USE_MSRPC) && defined(_WIN32) #include "types.h" +#ifndef USE_MSRPC +#include "rpc.h" +#else // USE_MSRPC +#include "msrpc-client.h" +#endif // USE_MSRPC +#include "kms.h" #if MULTI_CALL_BINARY < 1 #define client_main main @@ -17,5 +23,7 @@ int client_main(int argc, CARGV argv); #endif +int SendActivationRequest(const RpcCtx sock, RESPONSE *baseResponse, REQUEST *baseRequest, RESPONSE_RESULT *result, BYTE *const hwid); + #endif /* VLMCS_H_ */ diff --git a/vlmcsd-floppy.7.html b/vlmcsd-floppy.7.html index a9b2c2f..def268c 100644 --- a/vlmcsd-floppy.7.html +++ b/vlmcsd-floppy.7.html @@ -1,5 +1,5 @@ - + diff --git a/vlmcsd-floppy.7.pdf b/vlmcsd-floppy.7.pdf index e58b5484213fe2c40bcb731a8a9be9971d29bbca..c7f8218616bb730a34ec96089c33317fe4ad10ee 100644 GIT binary patch delta 38 lcmdlzk!kltrVadIoEC - + diff --git a/vlmcsd.7.pdf b/vlmcsd.7.pdf index 35c98a8ccfe982ca32bda9cb301de7e802310a8d..82a808270ff19cb45abef5a9b39e636eb1611502 100644 GIT binary patch delta 38 lcmbQ*&N#K5af6^Lr-h-Rp_zfXf#qZ=RVxHqPfzf0sRVxH - + @@ -30,6 +30,7 @@ FILES
EXAMPLES
BUGS
+INTENTIONAL BUGS
AUTHOR
CREDITS
SEE ALSO
@@ -204,6 +205,16 @@ addresses even if NAT port forwarding is used. While -o1, the client sees that the KMS TCP port (1688 by default) is actually accepting connections.

+

If vlmcsd is +compiled to use MS RPC, -o2 can only offer very poor +protection. Control is passed from MS RPC to vlmcsd after +the KMS protocol has already been negotiated. Thus a client +can always verify that the KMS protocol is available even +though it receives an RPC_S_ACCESS_DENIED error message. +vlmcsd will issue a warning if -o2 is used with MS +RPC. For adaequate protection do not use a MS RPC build +of vlmcsd with -o2.

+

-o3 combines -o1 and -o2. vlmcsd listens on private interfaces only and if a public client manages to @@ -840,11 +851,15 @@ sources or may require minor porting efforts.

vlmcsd can answer activation requests for the following products: -Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows -10, Windows Server 2008, Windows Server 2008 R2, Windows -Server 2012, Windows Server 2012 R2, Office 2010, Project -2010, Visio 2010, Office 2013, Project 2013, Visio 2013, -Office 2016, Project 2016, Visio 2016.

+Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 +(up to 1607), Windows Server 2008, Windows Server 2008 R2, +Windows Server 2012, Windows Server 2012 R2, Windows Server +2016, Office 2010, Project 2010, Visio 2010, Office 2013, +Project 2013, Visio 2013, Office 2016, Project 2016, Visio +2016. Newer version may work as long as the KMS protocol +does not change. A complete list of fully supported products +can be obtained using the -x option of +vlmcs(1).

Office, Project and Visio must be volume license versions.

@@ -900,11 +915,16 @@ C:\logs\vlmcsd.log when the service is started with

An ePID specified in an ini file must not contain spaces.

-

The maximum -number of -L options in the command line or listen -statements in the inifile is the platform default for -FD_SETSIZE. This is 64 on Windows and 1024 on most -Unixes.

+

INTENTIONAL BUGS + +

+ + +

vlmcsd +activates non-VL (retail) and beta/preview versions of +Windows.
+vlmcsd always reports enough active clients to satisfy the N +count policy of the request.

AUTHOR diff --git a/vlmcsd.8.pdf b/vlmcsd.8.pdf index 331f5119ff0dd75236dd25497703f6a45438f438..0f9a0e9abd4a6319e4c4281c1f0ef0ccf698e604 100644 GIT binary patch delta 21609 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⋚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 diff --git a/vlmcsd.8.unix.txt b/vlmcsd.8.unix.txt index 832237e..d0557f1 100644 --- a/vlmcsd.8.unix.txt +++ b/vlmcsd.8.unix.txt @@ -117,6 +117,14 @@ OPTIONS the client sees that the KMS TCP port (1688 by default) is actu‐ ally accepting connections. + If vlmcsd is compiled to use MS RPC, -o2 can only offer very + poor protection. Control is passed from MS RPC to vlmcsd after + the KMS protocol has already been negotiated. Thus a client can + always verify that the KMS protocol is available even though it + receives an RPC_S_ACCESS_DENIED error message. vlmcsd will issue + a warning if -o2 is used with MS RPC. For adaequate protection + do not use a MS RPC build of vlmcsd with -o2. + -o3 combines -o1 and -o2. vlmcsd listens on private interfaces only and if a public client manages to connect anyway due to NAT port forwarding, it will be immediately dropped. @@ -533,10 +541,13 @@ SUPPORTED OPERATING SYSTEMS SUPPORTED PRODUCTS vlmcsd can answer activation requests for the following products: Win‐ - dows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10, Windows - Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows - Server 2012 R2, Office 2010, Project 2010, Visio 2010, Office 2013, - Project 2013, Visio 2013, Office 2016, Project 2016, Visio 2016. + dows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 (up to 1607), + Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Win‐ + dows Server 2012 R2, Windows Server 2016, Office 2010, Project 2010, + Visio 2010, Office 2013, Project 2013, Visio 2013, Office 2016, Project + 2016, Visio 2016. Newer version may work as long as the KMS protocol + does not change. A complete list of fully supported products can be + obtained using the -x option of vlmcs(1). Office, Project and Visio must be volume license versions. @@ -547,24 +558,24 @@ FILES EXAMPLES vlmcsd -De - Starts vlmcsd in foreground. Useful if you use it for the first - time and want to see what's happening when a client requests + Starts vlmcsd in foreground. Useful if you use it for the first + time and want to see what's happening when a client requests activation. vlmcsd -l /var/log/vlmcsd.log - Starts vlmcsd as a daemon and logs everything to /var/log/vlm‐ + Starts vlmcsd as a daemon and logs everything to /var/log/vlm‐ csd.log. vlmcsd -L 192.168.1.17 Starts vlmcsd as a daemon and listens on IP address 192.168.1.17 - only. This is useful for routers that have a public and a pri‐ + only. This is useful for routers that have a public and a pri‐ vate IP address to prevent your KMS server from becoming public. vlmcsd -s -U /n -l C:\logs\vlmcsd.log - Installs vlmcsd as a Windows service with low privileges and + Installs vlmcsd as a Windows service with low privileges and logs everything to C:\logs\vlmcsd.log when the service is started with "net start vlmcsd". @@ -572,9 +583,11 @@ EXAMPLES BUGS An ePID specified in an ini file must not contain spaces. - The maximum number of -L options in the command line or listen state‐ - ments in the inifile is the platform default for FD_SETSIZE. This is 64 - on Windows and 1024 on most Unixes. + +INTENTIONAL BUGS + vlmcsd activates non-VL (retail) and beta/preview versions of Windows. + vlmcsd always reports enough active clients to satisfy the N count pol‐ + icy of the request. AUTHOR diff --git a/vlmcsd.c b/vlmcsd.c index 4b54310..fd243b6 100644 --- a/vlmcsd.c +++ b/vlmcsd.c @@ -279,7 +279,11 @@ static __noreturn void usage() #if HAVE_GETIFADDR " -o 0|1|2|3\t\tset protection level against clients with public IP addresses (default 0)\n" #else // !HAVE_GETIFADDR + #ifndef USE_MSRPC " -o 0|2\t\tset protection level against clients with public IP addresses (default 0)\n" + #else // USE_MSRPC + " -o 0|2\t\tset protection level against clients with public IP addresses (default 0). Limited use with MS RPC\n" + #endif // USE_MSRPC #endif // !HAVE_GETIFADDR #endif // !defined(NO_PRIVATE_IP_DETECT) #ifndef NO_SOCKETS @@ -1678,7 +1682,14 @@ int newmain() } #endif // NO_INI_FILE - #if !defined(NO_LIMIT) && !defined(NO_SOCKETS) && !__minix__ && !defined(USE_MSRPC) + #if defined(USE_MSRPC) && !defined(NO_PRIVATE_IP_DETECT) + if (PublicIPProtectionLevel) + { + printerrorf("Warning: Public IP address protection using MS RPC is poor. See vlmcsd.8\n"); + } + #endif // defined(USE_MSRPC) && !defined(NO_PRIVATE_IP_DETECT) + +#if !defined(NO_LIMIT) && !defined(NO_SOCKETS) && !__minix__ && !defined(USE_MSRPC) allocateSemaphore(); #endif // !defined(NO_LIMIT) && !defined(NO_SOCKETS) && __minix__ diff --git a/vlmcsd.ini.5.html b/vlmcsd.ini.5.html index 30dd070..906319e 100644 --- a/vlmcsd.ini.5.html +++ b/vlmcsd.ini.5.html @@ -1,5 +1,5 @@ - + diff --git a/vlmcsd.ini.5.pdf b/vlmcsd.ini.5.pdf index eb3a2d3ca5df7a5cf0cdc08486efc660f02b2e0d..f0917fc8baad9aa510f2f7c57737a10412f49493 100644 GIT binary patch delta 38 mcmeyei1EuJ#tjpUI4ukf4b2S94J;?mG_peQHs3LtAqM~i?hIrA delta 38 mcmeyei1EuJ#tjpUIL!@>4ULRV42&nwG_peQHs3LtAqM~h@(fY{ diff --git a/vlmcsdmulti.1.html b/vlmcsdmulti.1.html index d6d352f..c4337ec 100644 --- a/vlmcsdmulti.1.html +++ b/vlmcsdmulti.1.html @@ -1,5 +1,5 @@ - + diff --git a/vlmcsdmulti.1.pdf b/vlmcsdmulti.1.pdf index d2dd6773f51e18d244843542666201611f79f462..656f4eb10043c3cba39b513954c3d2cdccb9317b 100644 GIT binary patch delta 36 jcmdnxx65yXI47rtp`oFffw_U@WCczu1aEUP=XF^Cxflta delta 36 jcmdnxx65yXI47sMp|PQnv5A4vWCczu1aEUP=XF^CxB>}^