From 633f20d561b523db271349bc0de1838de83204fa Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sat, 25 Jan 2020 10:01:58 +0200 Subject: [PATCH] Initial commit --- .gitignore | 7 + README.md | 1 + serverbrowser.sln | 42 + servertool/icon.ico | Bin 0 -> 4286 bytes servertool/icon16.ico | Bin 0 -> 1150 bytes servertool/main.c | 51 ++ servertool/master.dat | 1 + servertool/masterscan.c | 230 +++++ servertool/masterscan.h | 37 + servertool/resource.h | Bin 0 -> 998 bytes servertool/serverinfo.c | 275 ++++++ servertool/serverinfo.h | 31 + servertool/serverlist.c | 611 ++++++++++++++ servertool/serverlist.h | 39 + servertool/servertool.aps | Bin 0 -> 39484 bytes servertool/servertool.c | 786 ++++++++++++++++++ servertool/servertool.h | 103 +++ servertool/servertool.rc | Bin 0 -> 3350 bytes servertool/servertool.vcxproj | 135 +++ servertool/servertool.vcxproj.filters | 64 ++ servertool/servertool.vcxproj.user | 3 + servertool/x64/Release/CL.read.1.tlog | Bin 0 -> 70864 bytes servertool/x64/Release/CL.write.1.tlog | Bin 0 -> 3250 bytes servertool/x64/Release/cl.command.1.tlog | Bin 0 -> 3028 bytes .../x64/Release/link-cvtres.read.1.tlog | 1 + .../x64/Release/link-cvtres.write.1.tlog | 1 + servertool/x64/Release/link.command.1.tlog | Bin 0 -> 2078 bytes servertool/x64/Release/link.read.1.tlog | Bin 0 -> 4358 bytes servertool/x64/Release/link.write.1.tlog | Bin 0 -> 990 bytes servertool/x64/Release/mt.command.1.tlog | Bin 0 -> 444 bytes servertool/x64/Release/mt.read.1.tlog | Bin 0 -> 622 bytes servertool/x64/Release/mt.write.1.tlog | Bin 0 -> 250 bytes servertool/x64/Release/rc.command.1.tlog | Bin 0 -> 500 bytes servertool/x64/Release/rc.read.1.tlog | Bin 0 -> 2676 bytes servertool/x64/Release/rc.write.1.tlog | Bin 0 -> 202 bytes .../x64/Release/servertool.Build.CppClean.log | 20 + .../servertool.exe.intermediate.manifest | 10 + .../x64/Release/servertool.lastbuildstate | 2 + servertool/x64/Release/servertool.log | 33 + servertool/x64/Release/servertool.res | Bin 0 -> 5592 bytes ...tool.vcxprojResolveAssemblyReference.cache | Bin 0 -> 713 bytes .../x64/Release/servertool.write.1.tlog | 0 servertool/x64/Release/vc100.pdb | Bin 0 -> 86016 bytes x64/Release/master.dat | 1 + x64/Release/servertool.exe | Bin 0 -> 37376 bytes x64/Release/servertool.pdb | Bin 0 -> 322560 bytes 46 files changed, 2484 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 serverbrowser.sln create mode 100644 servertool/icon.ico create mode 100644 servertool/icon16.ico create mode 100644 servertool/main.c create mode 100644 servertool/master.dat create mode 100644 servertool/masterscan.c create mode 100644 servertool/masterscan.h create mode 100644 servertool/resource.h create mode 100644 servertool/serverinfo.c create mode 100644 servertool/serverinfo.h create mode 100644 servertool/serverlist.c create mode 100644 servertool/serverlist.h create mode 100644 servertool/servertool.aps create mode 100644 servertool/servertool.c create mode 100644 servertool/servertool.h create mode 100644 servertool/servertool.rc create mode 100644 servertool/servertool.vcxproj create mode 100644 servertool/servertool.vcxproj.filters create mode 100644 servertool/servertool.vcxproj.user create mode 100644 servertool/x64/Release/CL.read.1.tlog create mode 100644 servertool/x64/Release/CL.write.1.tlog create mode 100644 servertool/x64/Release/cl.command.1.tlog create mode 100644 servertool/x64/Release/link-cvtres.read.1.tlog create mode 100644 servertool/x64/Release/link-cvtres.write.1.tlog create mode 100644 servertool/x64/Release/link.command.1.tlog create mode 100644 servertool/x64/Release/link.read.1.tlog create mode 100644 servertool/x64/Release/link.write.1.tlog create mode 100644 servertool/x64/Release/mt.command.1.tlog create mode 100644 servertool/x64/Release/mt.read.1.tlog create mode 100644 servertool/x64/Release/mt.write.1.tlog create mode 100644 servertool/x64/Release/rc.command.1.tlog create mode 100644 servertool/x64/Release/rc.read.1.tlog create mode 100644 servertool/x64/Release/rc.write.1.tlog create mode 100644 servertool/x64/Release/servertool.Build.CppClean.log create mode 100644 servertool/x64/Release/servertool.exe.intermediate.manifest create mode 100644 servertool/x64/Release/servertool.lastbuildstate create mode 100644 servertool/x64/Release/servertool.log create mode 100644 servertool/x64/Release/servertool.res create mode 100644 servertool/x64/Release/servertool.vcxprojResolveAssemblyReference.cache create mode 100644 servertool/x64/Release/servertool.write.1.tlog create mode 100644 servertool/x64/Release/vc100.pdb create mode 100644 x64/Release/master.dat create mode 100644 x64/Release/servertool.exe create mode 100644 x64/Release/servertool.pdb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4dee3f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.obj +*.sdf +*.suo +*.opensdf +ipch/ +masterlist/ +serverbrowser/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..940ab91 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# servertool diff --git a/serverbrowser.sln b/serverbrowser.sln new file mode 100644 index 0000000..84bba15 --- /dev/null +++ b/serverbrowser.sln @@ -0,0 +1,42 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "serverbrowser", "serverbrowser\serverbrowser.vcxproj", "{4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "servertool", "servertool\servertool.vcxproj", "{FF615871-8561-4F2E-9307-9CEA2E7BE381}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "masterlist", "masterlist\masterlist.vcxproj", "{84DA515D-A7E8-4A95-A3A6-B45BEB09FA6E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}.Debug|Win32.ActiveCfg = Release|Win32 + {4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}.Debug|Win32.Build.0 = Release|Win32 + {4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}.Debug|x64.ActiveCfg = Debug|x64 + {4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}.Debug|x64.Build.0 = Debug|x64 + {4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}.Release|Win32.ActiveCfg = Release|Win32 + {4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}.Release|Win32.Build.0 = Release|Win32 + {4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}.Release|x64.ActiveCfg = Release|x64 + {4CAC26DD-5286-43A0-8C9C-60CB1B9613FE}.Release|x64.Build.0 = Release|x64 + {FF615871-8561-4F2E-9307-9CEA2E7BE381}.Debug|Win32.ActiveCfg = Debug|Win32 + {FF615871-8561-4F2E-9307-9CEA2E7BE381}.Debug|Win32.Build.0 = Debug|Win32 + {FF615871-8561-4F2E-9307-9CEA2E7BE381}.Debug|x64.ActiveCfg = Debug|Win32 + {FF615871-8561-4F2E-9307-9CEA2E7BE381}.Release|Win32.ActiveCfg = Release|Win32 + {FF615871-8561-4F2E-9307-9CEA2E7BE381}.Release|Win32.Build.0 = Release|Win32 + {FF615871-8561-4F2E-9307-9CEA2E7BE381}.Release|x64.ActiveCfg = Release|x64 + {84DA515D-A7E8-4A95-A3A6-B45BEB09FA6E}.Debug|Win32.ActiveCfg = Debug|Win32 + {84DA515D-A7E8-4A95-A3A6-B45BEB09FA6E}.Debug|Win32.Build.0 = Debug|Win32 + {84DA515D-A7E8-4A95-A3A6-B45BEB09FA6E}.Debug|x64.ActiveCfg = Debug|Win32 + {84DA515D-A7E8-4A95-A3A6-B45BEB09FA6E}.Release|Win32.ActiveCfg = Release|Win32 + {84DA515D-A7E8-4A95-A3A6-B45BEB09FA6E}.Release|Win32.Build.0 = Release|Win32 + {84DA515D-A7E8-4A95-A3A6-B45BEB09FA6E}.Release|x64.ActiveCfg = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/servertool/icon.ico b/servertool/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..21f188788866aa0fd605be9d91f92d18c189a8d8 GIT binary patch literal 4286 zcmcIn2~1Q+7=Eb8a>=nA%DDvOhUHSrB_IW@$W>7Y1%jeb5GWvrV8lgKK#9OoC?Z9` zs4KO!R!qc%G$bubBWg_BG^wen)=DL{msOfpr{DkJnbpFgvK{j6yt)2w{$u_bI8Fn9 z5($SQ;S`1(XNE6lzQu8&s4ySw{U;wMO@(*Cx#Hcb^v=RCA**|O6DAJrNf8jpb| zQ+wULG{LQuVK)q2bS%!MeM< z{e+oo)~q=j6BAP>w5jgz?_U%Z6_pzn7S;mJbLiszqf|eD-_9X+k2^a%*KgXiDTLOk zDnmmgsw%nAg|WC)%)KgHuUKiH<^{NZhw?U&Vm~2g>T|>N0oi*b!G;@R*{0NMR#o{p=8=Em}YwNp~mX^2O+}yr^z86uC zczAdWgZBz}?_l1YsX1egj*fRRK8{#o78Vw**g_-8RED;;Hq+A5dZrKYE`~lb`0^*r zol_Yc92Dv5>azLs=Uh0~VR(|+d4!I2Ra2I*~L-?Q*K0Yo0_CAT2AK=;lAN#*c z{NTG@R#vtbxwjmU3D~-IYgK-JKAll2P3rJJY|NiO#Q%VUg9GpX@bK_BBB-pa45+HA z@)3X>?~Akd8jYcJsKfpvBO@ZpF$)$f7!cwQ=TC~9G-LcVH#dv1MuvM}Y;r5F{(JcF zVJ+lM;=droAL2T^prF7W_g!mRTAEBiN=iyqR#p~of8@k+%8NJ$AAtQ6fbK#8bpN~v z&LGwXNPpztPU!z0)-m|CqqViw=jYca^a(ZW@IH;%+1YuoT)8q0cO&`Yhv|U3d>ppCk(-;l z6Z&66P7K5QBcIj_@^Dv|Qv1@SORhp6{B(`_ur5RB6Kd$s^TRLhI0Ns{JXM%CZ{EZB z`1swp|8L>l5s!BQ>B%Z8DsdsucQ7?QQ}XaLF6HQ z=%_m#5CbBNFIv2Kv7eQdl>^PkJUL={JUKZz6U}M&4(`*#!^7G%|M`MDwi$g4dfh}m z>Vqr=V(~Nq-zO21lzVR=H++uvalD&8Li;P=GREkQ_BU`3;PAer{|)GUbRYY9BQ!KL z0kLOIV>6Z6-XGW#Td`ur5PUNZ8N7b5!6@wZwa~_1zZc}Uw6wS(M@;PBzduIkQ&rE# zkNtgec@;{T**<-VD|Rq?~e-_bg}A#aY3 zjyk}m?RX3OCnO|v6&Dwmc6N4pVVLsa?V04y)~|}6WaC{OMKYihy~`PL5XCfK{QdnY z4-@}0`cDnNP&FGr?g)mQ@TtDO{!{-WXIzGDz9eon@YhYrd4T%&=kP1ql#_|)G4KmO zxtZrhO>0Phip5td>?&jIB4bZ982bm9h~x|=u5bpw$skSwXt4=`p%ZF?@;BOiKl=E& kG@lD;Fy#CjkQo5Z)=-19g`nMNGcMAfak3E905^$$0e1c49RL6T literal 0 HcmV?d00001 diff --git a/servertool/icon16.ico b/servertool/icon16.ico new file mode 100644 index 0000000000000000000000000000000000000000..7beff0c0126caecec4b8af3269d126484750cb77 GIT binary patch literal 1150 zcmaJ>T}awd6u+isX^9^(>mewXHdkTP%s$slC?Tk%wg;gVp)ySwf#DkD2dvaa1o5X2 zwJj=Sh3tbqMoAN4W6;AM_BO^IMz9a|FxuF|U|aiLTTrYz^84R=f9ITg&bjwo31Q(U z5)nuNxxpdi9A*~)N)-UC)R&Me&`AXc0DYn`48v`0Z5{LZd>2nNID>3zYGQai-Ukkc zvo8{f-ko9kpUUNO4P|9zeG3MI`HhW@)1gpELydZSdz-7Os+Ocu>8@NZf1y^ZhrnGv z+@PnYM`X9#r8PA*QwD>U(e0WO_Z0H-!U4EBk_1VV_{)IzOk_(r28fk2{z{W$z)O%jYf@m zd3hn^6~VsqP(K1TDOXff4y;d=<>loH*iH)sf|;_ivI(4B9JM{~>grl5EiDb$ zY&QF;&QL5aE>sM-qF$VWO8y+H9S1rJU2I|K)tR&AaLs}|DBzkRD9Gui+aba ztE*R$$97v=TcozOcEn^dIsf_d5krFcA;groSS&iknaR%1zE@aSxQ#uwajq{>$7*M1 zXE%Hpn7P5-l*wci*KyW1j24wjWq^)>&cWq!A0qZMhr?mPy$%Am`}_N^n$6~GR;$&7 zoI=P&;P?B*s5#B+^{VuG{VL6Y3gSnwpSQlgegb_mRasd%g+5uUtE*!?9*@4Ep&`)H z(qe_pE^@w`laupNr_-$+c%vwZB$}C-xdjAq{}J#{k^5teE3geKmCF0*#~G~m(VuS+ zWBkyUj_9E!s-r;P|3nW4H5$#PR;!KSKDWUC0LbX*s206VpXD(*>W^B!hQs0WsDB7| z+3j>XO)&nATJUlSiN#`R$DFZ%Kh2rO-vj<2=T|t>&v<`t`F#E-Hk + +APPLICATION_T g_App; + +INT APIENTRY wWinMain(HINSTANCE hInst,HINSTANCE hPrevInst, + LPWSTR lpCmdLine,INT nCmdShow) +{ + WSADATA WSA; + MSG Msg; + + + g_App.hInst = hInst; + g_App.nCmdShow = nCmdShow; + + //Load stuff + + InitCommonControls(); + + g_App.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1)); + g_App.hIconSm = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON2)); + + //Init WSA + + WSAStartup(MAKEWORD(2,2),&WSA); + + //Register windows + + InitServerListWindow(); + InitMasterScanWindow(); + InitServerInfoWindow(); + + //Do something + + CreateServerListWindow(); + //CreateMasterScanPopup(); + + //Main loop + while(GetMessage(&Msg,NULL,0,0)) + { + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + + WSACleanup(); + return (INT)Msg.wParam; +} \ No newline at end of file diff --git a/servertool/master.dat b/servertool/master.dat new file mode 100644 index 0000000..143ae8b --- /dev/null +++ b/servertool/master.dat @@ -0,0 +1 @@ +@4i@'i@Ai@Ai@4i@'i \ No newline at end of file diff --git a/servertool/masterscan.c b/servertool/masterscan.c new file mode 100644 index 0000000..2aeb877 --- /dev/null +++ b/servertool/masterscan.c @@ -0,0 +1,230 @@ +#include "masterscan.h" +#include + +MASTERSCAN_WINDOW_T g_MasterScan; +static INT iWidth = 400; +static INT iHeight = 350; + +static LRESULT CALLBACK WndCallback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +VOID InitMasterScanWindow() +{ + WNDCLASSEX wndClass; + + g_MasterScan.lpClass = MASTERSCAN_CLASS; + + ZeroMemory(&wndClass,sizeof(WNDCLASSEX)); + + wndClass.cbSize = sizeof(WNDCLASSEX); + wndClass.lpszClassName = g_MasterScan.lpClass; + wndClass.hInstance = g_App.hInst; + wndClass.lpfnWndProc = WndCallback; + wndClass.hCursor = LoadCursor(NULL,IDC_ARROW); + wndClass.hbrBackground = (HBRUSH)COLOR_WINDOW; + wndClass.hIcon = g_App.hIcon; + wndClass.hIconSm = g_App.hIconSm; + + RegisterClassEx(&wndClass); +} + +VOID CreateMasterScanWindow() +{ + g_MasterScan.IsPopup = FALSE; + + g_MasterScan.hWnd = CreateWindow(MASTERSCAN_CLASS,L"Master servers", + WINDOW_STYLE,CW_USEDEFAULT,CW_USEDEFAULT, + iWidth,iHeight,NULL,NULL,g_App.hInst,NULL); + + ShowWindow(g_MasterScan.hWnd,g_App.nCmdShow); + UpdateWindow(g_MasterScan.hWnd); +} + +VOID CreateMasterScanPopup() +{ + //CreateMasterScanWindow(); + //SetWindowPos(g_MasterScan.hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); + g_MasterScan.IsPopup = TRUE; + + g_MasterScan.hWnd = CreateWindowEx(WS_EX_TOPMOST, + MASTERSCAN_CLASS, + L"Master servers [first scan]", + WS_OVERLAPPED|WS_SYSMENU,CW_USEDEFAULT,CW_USEDEFAULT, + iWidth,iHeight,g_MasterScan.hParent,NULL,g_App.hInst,NULL); + + ShowWindow(g_MasterScan.hWnd,g_App.nCmdShow); + UpdateWindow(g_MasterScan.hWnd); +} + +static DWORD WINAPI ScanThread(LPVOID lpArg) +{ + //Do some work + + //Send message to thread + FindMasterServers((MASTERFINDPARAMETERS_T*)lpArg); + + PostMessage(g_MasterScan.hWnd,WM_ENDMASTERSCAN,0,0); + return 0; +} + +static VOID AddServer(struct sockaddr_in* addrs) +{ + LV_ITEM Item; + WCHAR szText[32]; + + ZeroMemory(&Item,sizeof(LV_ITEM)); + Item.iItem = g_MasterScan.MasterNum; + + Item.mask = LVIF_TEXT; + Item.pszText = LPSTR_TEXTCALLBACK; + Item.cchTextMax = 64; + + ListView_InsertItem(g_MasterScan.hList,&Item); + + MultiByteToWideChar(CP_UTF8,0,inet_ntoa(addrs->sin_addr),-1,szText,32); + ListView_SetItemText(g_MasterScan.hList,Item.iItem,0,szText); + + _itow(ntohs(addrs->sin_port),szText,10); + ListView_SetItemText(g_MasterScan.hList,Item.iItem,1,szText); + + g_MasterScan.MasterNum++; + SendMessage(g_MasterScan.hProgressBar,PBM_SETPOS,g_MasterScan.MasterNum,0); +} + +VOID AddMasterServers() +{ + INT i; + INT iSize; + + iSize = g_MasterScan.MasterNum; + g_MasterScan.MasterNum = 0; + for(i = 0; i < iSize; i++) + AddServer(&g_MasterScan.addrs[i]); +} + +VOID DoMasterScan(LPCSTR lpSearch,HWND hParent) +{ + g_MasterScan.hParent = hParent; + CreateMasterScanPopup(); + + SendMessage(g_MasterScan.hProgressBar,PBM_SETRANGE,0,MAKELPARAM(0,6)); + g_MasterScan.MasterNum = 0; + g_MasterScan.ScanParams.addrs = g_MasterScan.addrs; + g_MasterScan.ScanParams.AddServer = AddServer; + //Start thread + g_MasterScan.hScanThread = CreateThread(0,0,ScanThread,&g_MasterScan.ScanParams,0,NULL); + + SetWindowText(g_MasterScan.hLabel,L"Scanning.."); +} + +static VOID AddMaster() +{ + WCHAR szText[64]; + char szAddr[64]; + struct sockaddr_in addr; + + GetWindowText(g_MasterScan.hMasterIpEdit,szText,64); + if(wcslen(szText) == 0) return; + + WideCharToMultiByte(CP_UTF8,0,szText,-1,szAddr,64,NULL,NULL); + addr.sin_addr.s_addr = inet_addr(szAddr); + + GetWindowText(g_MasterScan.hMasterPortEdit,szText,64); + if(wcslen(szText) == 0) return; + addr.sin_port = htons(_wtoi(szText)); + + SetWindowText(g_MasterScan.hMasterIpEdit,L""); + SetWindowText(g_MasterScan.hMasterPortEdit,L""); + + if(g_MasterScan.MasterNum == 32) + { + MessageBox(g_MasterScan.hWnd, + L"Reached limit of master servers!", + L"Error", + MB_ICONERROR); + return; + } + + CopyMemory(&g_MasterScan.addrs[g_MasterScan.MasterNum], + &addr,sizeof(struct sockaddr_in)); + AddServer(&g_MasterScan.addrs[g_MasterScan.MasterNum]); +} + +static HWND CreateListView(LPCREATESTRUCT lpCreate,HWND hParent,INT x,INT y,INT w,INT h) +{ + HWND hList; + LV_COLUMN Column; + + hList = CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW,L"",WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_EDITLABELS, + x,y,w,h,hParent,NULL,lpCreate->hInstance,NULL); + + ZeroMemory(&Column,sizeof(LV_COLUMN)); + Column.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH; + + Column.cx = w-(w/4); + Column.iSubItem = 0; + Column.iOrder = 0; + Column.pszText = L"Address"; + ListView_InsertColumn(hList,0,&Column); + + Column.cx = w/4; + Column.iSubItem = 1; + Column.iOrder = 1; + Column.pszText = L"Port"; + ListView_InsertColumn(hList,1,&Column); + + return hList; +} + +static LRESULT CALLBACK WndCallback(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + LPCREATESTRUCT lpCreate; + + switch(Msg) + { + case WM_CREATE: + //Create something + lpCreate = (LPCREATESTRUCT)lParam; + + g_MasterScan.hProgressBar = CreateWindow(PROGRESS_CLASS,L"",WS_CHILD|WS_VISIBLE, + 6,10,380,20,hWnd,NULL,lpCreate->hInstance,NULL); + g_MasterScan.hLabel = CreateWindow(L"STATIC",L"Status",WS_CHILD|WS_VISIBLE, + 6,35,100,20,hWnd,NULL,lpCreate->hInstance,NULL); + g_MasterScan.hList = CreateListView(lpCreate,hWnd,6,50,380,200); + + g_MasterScan.hMasterIpEdit = CreateWindowEx(WS_EX_CLIENTEDGE,L"Edit",L"",WS_CHILD|WS_VISIBLE, + 6,255,300,25,hWnd,NULL,lpCreate->hInstance,NULL); + g_MasterScan.hMasterPortEdit = CreateWindowEx(WS_EX_CLIENTEDGE,L"Edit",L"",WS_CHILD|WS_VISIBLE, + 310,255,76,25,hWnd,NULL,lpCreate->hInstance,NULL); + g_MasterScan.hMasterAddBtn = CreateWindow(L"Button",L"Add master server",WS_CHILD|WS_VISIBLE, + 6,285,380,25,hWnd,(HMENU)IDC_MASTERSCAN_ADDMASTER_BTN,lpCreate->hInstance,NULL); + + if(!g_MasterScan.IsPopup) + AddMasterServers(); + else + { + EnableWindow(g_MasterScan.hMasterIpEdit,FALSE); + EnableWindow(g_MasterScan.hMasterPortEdit,FALSE); + EnableWindow(g_MasterScan.hMasterAddBtn,FALSE); + } + break; + case WM_COMMAND: + //Command + if(LOWORD(wParam) == IDC_MASTERSCAN_ADDMASTER_BTN) + AddMaster(); + break; + case WM_ENDMASTERSCAN: + CloseHandle(g_MasterScan.hScanThread); + SendMessage(g_MasterScan.hParent,WM_ENDMASTERSCAN, + g_MasterScan.MasterNum, + (LPARAM)g_MasterScan.addrs); + SetWindowText(g_MasterScan.hLabel,L"Done"); + DestroyWindow(hWnd); + break; + case WM_CLOSE: + if(g_MasterScan.IsPopup) return TRUE; + break; + case WM_DESTROY: + break; + } + return DefWindowProc(hWnd,Msg,wParam,lParam); +} \ No newline at end of file diff --git a/servertool/masterscan.h b/servertool/masterscan.h new file mode 100644 index 0000000..4d99945 --- /dev/null +++ b/servertool/masterscan.h @@ -0,0 +1,37 @@ +#ifndef __MASTERSCAN_H +#define __MASTERSCAN_H + +#include "servertool.h" + +#define MASTERSCAN_CLASS L"ServerTool_MasterScan" + +#define IDC_MASTERSCAN_ADDMASTER_BTN 134 + +typedef struct { + LPCWSTR lpClass; + HWND hParent; + HWND hWnd; + HWND hProgressBar; + HWND hLabel; + HWND hList; + HWND hMasterIpEdit; + HWND hMasterPortEdit; + HWND hMasterAddBtn; + + struct sockaddr_in addrs[32]; + INT MasterNum; + + BOOL IsPopup; + HANDLE hScanThread; + MASTERFINDPARAMETERS_T ScanParams; +} MASTERSCAN_WINDOW_T; + +VOID InitMasterScanWindow(); +VOID CreateMasterScanWindow(); +VOID CreateMasterScanPopup(); + +VOID DoMasterScan(LPCSTR lpSearch,HWND hParent); + +extern MASTERSCAN_WINDOW_T g_MasterScan; + +#endif \ No newline at end of file diff --git a/servertool/resource.h b/servertool/resource.h new file mode 100644 index 0000000000000000000000000000000000000000..ef7d41c4fe3c10888ef1b588ce8fda4279932983 GIT binary patch literal 998 zcmb7@-%7(!4934}!FMQlDeRxVKy7z1+^X1hxU1s2RVHJDcAbj&>gq4;m{UgC2GxMtO?@DN?i9;cSNCX8T7f+E@Irke=Q<;|DMtg%l_=9nIhtxsY(y+qp(icy zJY6D=o;A}F&4{l#r^Mz&60!=s8GcG+fz{aS5P?-?PxMZXd6_olcTLX~6%8WEuEwUj zC=m_MdOFPRqcQ4nyFhJXr$}2ZYK}qfoP_Iu+ES-P{$({_=C_hd<0XZ$f?FE5o08Rn zXpWb1`;61>_{zD`L@(G0x%rL{XFK +#include +#include + +SERVERINFO_WINDOW_T g_ServerInfo; + +static LRESULT CALLBACK WndCallback(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); + +static INT iWidth = 400; +static INT iHeight = 640; + +VOID InitServerInfoWindow() +{ + WNDCLASSEX wndClass; + + g_ServerInfo.lpClass = SERVERINFO_CLASS; + + ZeroMemory(&wndClass,sizeof(WNDCLASSEX)); + + wndClass.cbSize = sizeof(WNDCLASSEX); + wndClass.lpszClassName = g_ServerInfo.lpClass; + wndClass.hInstance = g_App.hInst; + wndClass.lpfnWndProc = WndCallback; + wndClass.hCursor = LoadCursor(NULL,IDC_ARROW); + wndClass.hbrBackground = (HBRUSH)COLOR_WINDOW; + wndClass.hIcon = g_App.hIcon; + wndClass.hIconSm = g_App.hIconSm; + + RegisterClassEx(&wndClass); +} + +VOID CreateServerInfoWindow() +{ + g_ServerInfo.hWnd = CreateWindow(SERVERINFO_CLASS, + L"Server-Info",WINDOW_STYLE, + CW_USEDEFAULT,CW_USEDEFAULT, + iWidth,iHeight,NULL,NULL, + g_App.hInst,NULL); + + ShowWindow(g_ServerInfo.hWnd,g_App.nCmdShow); + UpdateWindow(g_ServerInfo.hWnd); +} + +static VOID AddServer(SERVER_T* Server) +{ + static WCHAR szText[1024]; + + swprintf(szText,1024, + L"Name: %s\r\n" + L"Map: %s\r\n" + L"Game: %s\r\n" + L"Players: %d\r\n" + L"Slots: %d\r\n" + L"Type: %C\r\n" + L"System: %C\r\n" + L"Password: %d\r\n" + L"VAC: %d\r\n", + Server->szName, + Server->szMap, + Server->szGame, + Server->cPlayers, + Server->cMaxPlayers, + Server->cType, + Server->cOS, + Server->cVisibility, + Server->cVAC); + + SetWindowText(g_ServerInfo.hInfoBox,szText); +} + +static VOID AddPlayer(PCHAR pName,UINT Score,FLOAT Duration) +{ + WCHAR szText[64]; + LV_ITEM Item; + INT Idx; + ULONG Time; + + Idx = g_ServerInfo.PlayerNum; + + ZeroMemory(&Item,sizeof(Item)); + Item.mask = LVIF_TEXT; + Item.pszText = LPSTR_TEXTCALLBACK; + Item.cchTextMax = 64; + Item.iItem = Idx; + Item.iSubItem = 0; + ListView_InsertItem(g_ServerInfo.hPlayerList,&Item); + + MultiByteToWideChar(CP_UTF8,0,pName,-1,szText,64); + ListView_SetItemText(g_ServerInfo.hPlayerList,Idx,0,szText); + + swprintf(szText,64,L"%u",Score); + ListView_SetItemText(g_ServerInfo.hPlayerList,Idx,1,szText); + + Time = (ULONG)Duration; + swprintf(szText,64,L"%02u:%02u:%02u",Time/3600,(Time/60)%60,Time%60); + ListView_SetItemText(g_ServerInfo.hPlayerList,Idx,2,szText); + + g_ServerInfo.PlayerNum++; +} + +static VOID AddRule(PCHAR pName,PCHAR pValue) +{ + WCHAR szText[MAX_PATH]; + LV_ITEM Item; + INT Idx; + + Idx = g_ServerInfo.RuleNum; + + ZeroMemory(&Item,sizeof(Item)); + Item.mask = LVIF_TEXT; + Item.pszText = LPSTR_TEXTCALLBACK; + Item.cchTextMax = 64; + Item.iItem = Idx; + Item.iSubItem = 0; + ListView_InsertItem(g_ServerInfo.hRuleList,&Item); + + MultiByteToWideChar(CP_UTF8,0,pName,-1,szText,MAX_PATH); + ListView_SetItemText(g_ServerInfo.hRuleList,Idx,0,szText); + + MultiByteToWideChar(CP_UTF8,0,pValue,-1,szText,MAX_PATH); + ListView_SetItemText(g_ServerInfo.hRuleList,Idx,1,szText); + + g_ServerInfo.RuleNum++; +} + +static DWORD WINAPI RequestThread(LPVOID lpArg) +{ + GetServerInfo((NETADR_T*)lpArg,AddServer,AddPlayer,AddRule); + PostMessage(g_ServerInfo.hWnd,WM_ENDSERVERINFOREQUEST,0,0); + return 0; +} + +static VOID RequestServerInfo() +{ + WCHAR szText[64]; + char szAddr[32]; + PWCHAR pDel; + NETADR_T Addr; + + g_ServerInfo.PlayerNum = 0; + g_ServerInfo.RuleNum = 0; + + SetWindowText(g_ServerInfo.hInfoBox,L""); + ListView_DeleteAllItems(g_ServerInfo.hPlayerList); + ListView_DeleteAllItems(g_ServerInfo.hRuleList); + + if(g_ServerInfo.hRequestThread) + { + TerminateThread(g_ServerInfo.hRequestThread,0); + CloseHandle(g_ServerInfo.hRequestThread); + } + + GetWindowText(g_ServerInfo.hAddressEdit,szText,32); + pDel = wcschr(szText,L':'); + if(!pDel) return; + + *pDel = L'\0'; + WideCharToMultiByte(CP_UTF8,0,szText,-1,szAddr,32,NULL,NULL); + + Addr.sin_addr.s_addr = inet_addr(szAddr); + Addr.sin_port = htons(_wtoi(pDel+1)); + + g_ServerInfo.hRequestThread = CreateThread(NULL,0,RequestThread,&Addr,0,NULL); + + SetWindowText(g_ServerInfo.hRequestBtn,L"Wait.."); +} + +VOID EndServerInfoRequest() +{ + SetWindowText(g_ServerInfo.hRequestBtn,L"Request"); + CloseHandle(g_ServerInfo.hRequestThread); + g_ServerInfo.hRequestThread = NULL; +} + +static HWND CreatePlayerList(LPCREATESTRUCT lpCreate,HWND hParent,INT x,INT y) +{ + HWND hList; + LV_COLUMN Column; + + hList = CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW,L"", + WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_EDITLABELS,x,y,380,150, + hParent,NULL,lpCreate->hInstance,NULL); + + ZeroMemory(&Column,sizeof(Column)); + + Column.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + + Column.iOrder = 0; + Column.iSubItem = 0; + Column.cx = 190; + Column.pszText = L"Name"; + ListView_InsertColumn(hList,0,&Column); + + Column.iOrder = 1; + Column.iSubItem = 1; + Column.cx = 95; + Column.pszText = L"Score"; + ListView_InsertColumn(hList,1,&Column); + + Column.iOrder = 2; + Column.iSubItem = 2; + Column.cx = 90; + Column.pszText = L"Time"; + ListView_InsertColumn(hList,2,&Column); + + return hList; +} + +static HWND CreateRulesList(LPCREATESTRUCT lpCreate,HWND hParent,INT x,INT y) +{ + HWND hList; + LV_COLUMN Column; + + hList = CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW,L"", + WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_EDITLABELS,x,y,380,170, + hParent,NULL,lpCreate->hInstance,NULL); + + ZeroMemory(&Column,sizeof(Column)); + + Column.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; + + Column.iOrder = 0; + Column.iSubItem = 0; + Column.cx = 140; + Column.pszText = L"Name"; + ListView_InsertColumn(hList,0,&Column); + + Column.iOrder = 1; + Column.iSubItem = 1; + Column.cx = 235; + Column.pszText = L"Value"; + ListView_InsertColumn(hList,1,&Column); + + return hList; +} + +static LRESULT CALLBACK WndCallback(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) +{ + LPCREATESTRUCT lpCreate; + + switch(Msg) + { + case WM_CREATE: + lpCreate = (LPCREATESTRUCT)lParam; + + g_ServerInfo.hAddressEdit = CreateWindowEx(WS_EX_CLIENTEDGE,L"Edit",L"Address:Port", + WS_CHILD|WS_VISIBLE,6,10,280,25,hWnd,NULL,lpCreate->hInstance,NULL); + g_ServerInfo.hRequestBtn = CreateWindow(L"Button",L"Request",WS_CHILD|WS_VISIBLE, + 295,10,92,25,hWnd,(HMENU)IDC_SERVERINFO_REQUEST_BTN,lpCreate->hInstance,NULL); + g_ServerInfo.hInfoBox = CreateWindowEx(WS_EX_CLIENTEDGE,L"Edit",L"", + WS_CHILD|WS_VISIBLE|WS_VSCROLL|ES_MULTILINE|ES_AUTOVSCROLL|ES_LEFT, + 6,40,380,200,hWnd,NULL,lpCreate->hInstance,NULL); + + CreateWindow(L"STATIC",L"Players",WS_CHILD|WS_VISIBLE, + 6,245,100,25,hWnd,NULL,lpCreate->hInstance,NULL); + g_ServerInfo.hPlayerList = CreatePlayerList(lpCreate,hWnd,6,275); + + CreateWindow(L"STATIC",L"Server's ConVar (FCVAR_NOTIFY)", + WS_CHILD|WS_VISIBLE,6,405,380,25,hWnd,NULL,lpCreate->hInstance,NULL); + g_ServerInfo.hRuleList = CreateRulesList(lpCreate,hWnd,6,435); + + g_ServerInfo.PlayerNum = 0; + g_ServerInfo.RuleNum = 0; + break; + case WM_COMMAND: + if(LOWORD(wParam) == IDC_SERVERINFO_REQUEST_BTN) + RequestServerInfo(); + break; + case WM_ENDSERVERINFOREQUEST: + EndServerInfoRequest(); + break; + } + return DefWindowProc(hWnd,Msg,wParam,lParam); +} \ No newline at end of file diff --git a/servertool/serverinfo.h b/servertool/serverinfo.h new file mode 100644 index 0000000..76f53ac --- /dev/null +++ b/servertool/serverinfo.h @@ -0,0 +1,31 @@ +#ifndef __SERVERINFO_H +#define __SERVERINFO_H + +#include "servertool.h" + +#define SERVERINFO_CLASS L"ServerTool_ServerInfo" + +#define IDC_SERVERINFO_REQUEST_BTN 135 + +typedef struct { + LPCWSTR lpClass; + HWND hWnd; + + HWND hAddressEdit; + HWND hRequestBtn; + HWND hInfoBox; + HWND hPlayerList; + HWND hRuleList; + + INT PlayerNum; + INT RuleNum; + + HANDLE hRequestThread; +} SERVERINFO_WINDOW_T; + +VOID InitServerInfoWindow(); +VOID CreateServerInfoWindow(); + +extern SERVERINFO_WINDOW_T g_ServerInfo; + +#endif \ No newline at end of file diff --git a/servertool/serverlist.c b/servertool/serverlist.c new file mode 100644 index 0000000..c7c32ae --- /dev/null +++ b/servertool/serverlist.c @@ -0,0 +1,611 @@ +#include "serverlist.h" +#include "masterscan.h" +#include "serverinfo.h" +#include +#include +#include + +SERVERLIST_WINDOW_T g_ServerList; +static INT iWidth = 1072; +static INT iHeight = 600; + +static LRESULT CALLBACK WndCallback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +VOID InitServerListWindow() +{ + WNDCLASSEX wndClass; + + g_ServerList.lpClass = SERVERLIST_CLASS; + + ZeroMemory(&wndClass,sizeof(WNDCLASSEX)); + + wndClass.cbSize = sizeof(WNDCLASSEX); + wndClass.lpszClassName = g_ServerList.lpClass; + wndClass.hInstance = g_App.hInst; + wndClass.lpfnWndProc = WndCallback; + wndClass.hCursor = LoadCursor(NULL,IDC_ARROW); + wndClass.hbrBackground = (HBRUSH)COLOR_WINDOW; + wndClass.hIcon = g_App.hIcon; + wndClass.hIconSm = g_App.hIconSm; + + RegisterClassEx(&wndClass); +} + +VOID CreateServerListWindow() +{ + g_ServerList.hWnd = CreateWindow(SERVERLIST_CLASS,L"ServerList", + WINDOW_STYLE,CW_USEDEFAULT,CW_USEDEFAULT, + iWidth,iHeight,NULL,NULL,g_App.hInst,NULL); + + ShowWindow(g_ServerList.hWnd,g_App.nCmdShow); + UpdateWindow(g_ServerList.hWnd); +} + +static VOID StartMasterScan(HWND hParent) +{ + DoMasterScan("\\appid\\320",hParent); +} + +static VOID LoadMasterServers(HWND hParent) +{ + HANDLE hFile; + LARGE_INTEGER size; + NETADR_T Addr; + DWORD dwRead; + INT i; + + hFile = CreateFile(L"master.dat",GENERIC_READ,FILE_SHARE_READ, + NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if(hFile == INVALID_HANDLE_VALUE) + { + StartMasterScan(hParent); + return; + } + + GetFileSizeEx(hFile,&size); + g_ServerList.MasterNum = (INT)(size.QuadPart/sizeof(NETADR_T)); + if(g_ServerList.MasterNum > 32) + g_ServerList.MasterNum = 32; + g_MasterScan.MasterNum = g_ServerList.MasterNum; + for(i = 0; i < g_ServerList.MasterNum; i++) + { + ReadFile(hFile,&Addr,sizeof(NETADR_T),&dwRead,NULL); + g_ServerList.Masters[i].Conn.addr.sin_family = AF_INET; + g_ServerList.Masters[i].Conn.addr.sin_addr = Addr.sin_addr; + g_ServerList.Masters[i].Conn.addr.sin_port = Addr.sin_port; + g_MasterScan.addrs[i].sin_family = AF_INET; + g_MasterScan.addrs[i].sin_addr = Addr.sin_addr; + g_MasterScan.addrs[i].sin_port = Addr.sin_port; + } + CloseHandle(hFile); + + g_ServerList.Params.Masters = g_ServerList.Masters; + g_ServerList.Params.MasterNum = g_ServerList.MasterNum; + g_MasterScan.ScanParams.addrs = g_MasterScan.addrs; +} + +static VOID SaveMasters() +{ + HANDLE hFile; + NETADR_T Addr; + DWORD dwWrote; + INT i; + + hFile = CreateFile(L"master.dat",GENERIC_ALL,0,NULL, + CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + for(i = 0; i < g_ServerList.MasterNum; i++) + { + Addr.sin_addr = g_ServerList.Masters[i].Conn.addr.sin_addr; + Addr.sin_port = g_ServerList.Masters[i].Conn.addr.sin_port; + WriteFile(hFile,&Addr,sizeof(NETADR_T),&dwWrote,NULL); + } + CloseHandle(hFile); +} + +static VOID EndMasterScan(WPARAM wParam,LPARAM lParam) +{ + INT i; + struct sockaddr_in* addrs; + + if(wParam < MAX_MASTER_NUM) //We need 3 master servers at least + { + Sleep(5000); + StartMasterScan(g_ServerList.hWnd); + } + else + { + g_ServerList.MasterNum = (INT)wParam; + addrs = (struct sockaddr_in*)lParam; + + for(i = 0; i < g_ServerList.MasterNum; i++) + { + CopyMemory(&g_ServerList.Masters[i].Conn.addr, + &addrs[i],sizeof(struct sockaddr_in)); + } + + //Save masters to file + SaveMasters(); + } +} + +static DWORD WINAPI RequestThread(LPVOID lpArg) +{ + MASTERREQUESTPARAMETERS_T* Params; + + Params = (MASTERREQUESTPARAMETERS_T*)lpArg; + + DoMasterServers(Params->Masters,Params->MasterNum,Params->szSearch); + Params->Servers = GetUniqueServers(Params->Masters,Params->MasterNum,&Params->ServerNum); + + SendMessage(Params->hParent,WM_ENDMASTERREQUEST,0,(LPARAM)Params); + return 0; +} + +VOID MakeMasterServersRequest() +{ + WCHAR szRequest[MAX_PATH]; + + if(g_ServerList.Params.ServerList) + { + free(g_ServerList.Params.ServerList); + g_ServerList.Params.ServerList = NULL; + } + + if(g_ServerList.hScanThread) + { + TerminateThread(g_ServerList.hScanThread,0); + CloseHandle(g_ServerList.hScanThread); + g_ServerList.hScanThread = NULL; + } + + ListView_DeleteAllItems(g_ServerList.hServerList); + SendMessage(g_ServerList.hProgressBar,PBM_SETPOS,0,0); + + ZeroMemory(&g_ServerList.Params,sizeof(g_ServerList.Params)); + + GetWindowText(g_ServerList.hRequestEdit,szRequest,MAX_PATH); + WideCharToMultiByte(CP_UTF8,0,szRequest,-1, + g_ServerList.Params.szSearch,MAX_PATH,NULL,NULL); + + g_ServerList.Params.hParent = g_ServerList.hWnd; + g_ServerList.Params.Masters = g_ServerList.Masters; + g_ServerList.Params.MasterNum = g_ServerList.MasterNum; + + g_ServerList.hScanThread = CreateThread(0,0,RequestThread, + &g_ServerList.Params,0,NULL); + + SetWindowText(g_ServerList.hLabel,L"Requests to masters.."); + SetWindowText(g_ServerList.hRequestBtn,L"Stop"); +} + +static VOID AddServer(SERVER_T* Server) +{ + LV_ITEM Item; + WCHAR szText[64]; + char szAddr[64]; + LPCWSTR pText; + INT Idx; + + ZeroMemory(&Item,sizeof(LV_ITEM)); + Idx = g_ServerList.ServerIdx; + + Item.mask = LVIF_TEXT; + Item.pszText = LPSTR_TEXTCALLBACK; + Item.iItem = Idx; + + ListView_InsertItem(g_ServerList.hServerList,&Item); + + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,0,Server->szName); + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,1,Server->szMap); + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,2,Server->szGame); + + _itow(Server->cPlayers,szText,10); + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,3,szText); + + _itow(Server->cMaxPlayers,szText,10); + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,4,szText); + + switch(Server->cType) + { + case 'd': pText = L"Dedicated"; break; + case 'l': pText = L"Non-Dedic."; break; + case 'p': pText = L"SourceTV"; break; + default: + swprintf(szText,64,L"<%02X>",Server->cType&0xFF); + pText = szText; + } + + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,5,(LPWSTR)pText); + + switch(Server->cOS) + { + case 'l': pText = L"Linux"; break; + case 'w': pText = L"Windows"; break; + case 'm': pText = L"Mac OS"; break; + default: + swprintf(szText,64,L"<%02X>",Server->cOS&0xFF); + pText = szText; + } + + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,6,(LPWSTR)pText); + + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,7, + Server->cVisibility ? L"Yes" : L"No"); + + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,8, + Server->cVAC ? L"Yes" : L"No"); + + sprintf(szAddr,"%s:%d",inet_ntoa(Server->Addr.sin_addr), + ntohs(Server->Addr.sin_port)); + MultiByteToWideChar(CP_UTF8,0,szAddr,-1,szText,64); + + ListView_SetItemText(g_ServerList.hServerList,Item.iItem,9,szText); + + SendMessage(g_ServerList.hProgressBar,PBM_SETPOS,Idx,0); + g_ServerList.ServerIdx++; +} + +typedef struct { + UINT Num; + UINT Size; + UINT WaitTime; +} BLOCKPARAMS_T; + +static BLOCKPARAMS_T s_BlockSize[] = { + {300,32,2}, + {512,128,3}, + {1024,256,4}, + {2048,512,5}, + {4096,1024,7}, + {-1,2048,10}, +}; + +static BLOCKPARAMS_T* GetBlockParams(UINT Num) +{ + INT i; + + i = 0; + while(Num > s_BlockSize[i].Num){i++;} + return &s_BlockSize[i]; +} + +static DWORD WINAPI QueryThread(LPVOID lpArg) +{ + MASTERREQUESTPARAMETERS_T* Params; + BLOCKPARAMS_T* Block; + NETADR_T* AddrPtr; + SERVER_T* ServerPtr; + INT iNum,iRemaind; + INT i; + + Params = (MASTERREQUESTPARAMETERS_T*)lpArg; + Block = GetBlockParams(Params->ServerNum); + Params->ServerList = (SERVER_T*)calloc(Params->ServerNum,sizeof(SERVER_T)); + ServerPtr = Params->ServerList; + + g_ServerList.ServerIdx = 0; + iNum = Params->ServerNum/Block->Size; + iRemaind = Params->ServerNum%Block->Size; + + AddrPtr = Params->Servers; + for(i = 0; i < iNum; i++) + { + QueryServers(AddrPtr,ServerPtr,Block->Size,AddServer,Block->WaitTime); + AddrPtr += Block->Size; + ServerPtr += Block->Size; + } + + if(iRemaind) + QueryServers(AddrPtr,ServerPtr,iRemaind,AddServer,Block->WaitTime); + + PostMessage(g_ServerList.hWnd,WM_ENDQUERYSERVERS,0,0); + return 0; +} + +VOID EndMasterRequest() +{ + WCHAR szText[64]; + + CloseHandle(g_ServerList.hScanThread); + + swprintf(szText,64,L"Found %d servers. Request..",g_ServerList.Params.ServerNum); + SetWindowText(g_ServerList.hLabel,szText); + + SendMessage(g_ServerList.hProgressBar,PBM_SETRANGE,0,MAKELPARAM(0,g_ServerList.Params.ServerNum)); + + //Query all servers + g_ServerList.hScanThread = CreateThread(0,0,QueryThread,&g_ServerList.Params,0,NULL); +} + +VOID EndQueryServers() +{ + SetWindowText(g_ServerList.hLabel,L"Done"); + + free(g_ServerList.Params.Servers); + g_ServerList.hScanThread = NULL; + + //ZeroMemory(&g_ServerList.Params,sizeof(g_ServerList.Params)); + SendMessage(g_ServerList.hProgressBar,PBM_SETPOS,0,0); + SetWindowText(g_ServerList.hRequestBtn,L"Execute"); +} + +VOID StopAnyRequests() +{ + TerminateThread(g_ServerList.hScanThread,0); + EndQueryServers(); +} + +typedef struct { + INT iWidth; + LPWSTR lpName; +} COLUMNHDR_T; + +static COLUMNHDR_T Columns[] = { + {300,L"Name"}, + {100,L"Map"}, + {100,L"Game"}, + {65,L"Players"}, + {65,L"Slots"}, + {95,L"Type"}, + {80,L"System"}, + {60,L"Password"}, + {40,L"VAC"}, + {150,L"Address"}, +}; + +VOID CreateBar(LPCREATESTRUCT lpCreate,HWND hParent) +{ + HMENU hMenuBar,hMenu; + + hMenuBar = CreateMenu(); + + hMenu = CreateMenu(); + AppendMenu(hMenu,MF_STRING,IDC_FILE_SAVEAS,L"Save ss.."); + + AppendMenu(hMenuBar,MF_POPUP,(UINT_PTR)hMenu,L"File"); + + hMenu = CreateMenu(); + AppendMenu(hMenu,MF_STRING,IDC_SERVERS_MASTERS,L"Master servers"); + AppendMenu(hMenu,MF_STRING,IDC_SERVERS_QUERY,L"Server-Info"); + + AppendMenu(hMenuBar,MF_POPUP,(UINT_PTR)hMenu,L"Servers"); + + hMenu = CreateMenu(); + AppendMenu(hMenu,MF_STRING,IDC_HELP_HELP,L"Help"); + AppendMenu(hMenu,MF_SEPARATOR,0,NULL); + AppendMenu(hMenu,MF_STRING,IDC_HELP_ABOUT,L"About program"); + + AppendMenu(hMenuBar,MF_POPUP,(UINT_PTR)hMenu,L"Help"); + + SetMenu(hParent,hMenuBar); +} + +VOID DialogHelp() +{ + MessageBox(g_ServerList.hWnd, + L"You must make request like it described here:" + L">>> https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol#Filter\n" + L"\n" + L"Example for Garry's Mod:\n\\appid\\4000\n\n" + L"\\appid\\%SteamAppId !!!%\\\n\n", + + L"Help", + MB_ICONINFORMATION); +} + +VOID DialogAbout() +{ + MessageBox(g_ServerList.hWnd, + L"https://github.com/nikolaytihonov/servertool\n" + L"\thttps://steamcommunity.com/id/dominqnta\n" + L"\tDiscord: ISurface030#1470" + L"\n\nAuthor: nikolaytihonov", + + L"About", + MB_ICONINFORMATION); +} + +#define FILE_1STLINE L"Name\tMap\tGame\tPlayers\tSlots\tType\tSystem\tPassword\tVAC\tAddress\r\n" + +VOID SaveServers() +{ + HANDLE hFile; + static WCHAR szLine[512]; + static WCHAR szPath[MAX_PATH]; + static WCHAR szText[64]; + static CHAR sz8Line[1024]; + char szAddr[32]; + PWCHAR pText; + OPENFILENAME ofn; + DWORD dwWrote; + INT i; + + ZeroMemory(&ofn,sizeof(OPENFILENAME)); + + ofn.lStructSize = sizeof(OPENFILENAME); + ofn.hwndOwner = g_ServerList.hWnd; + ofn.lpstrFile = szPath; + ofn.nMaxFile = MAX_PATH; + ofn.lpstrDefExt = L".TXT"; + + if(!GetSaveFileName(&ofn)) + { + MessageBox(g_ServerList.hWnd,L"Can't save file!",L"Error",MB_ICONERROR); + return; + } + + hFile = CreateFile(szPath,GENERIC_ALL,0,NULL, + CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); + if(hFile == INVALID_HANDLE_VALUE) + { + MessageBox(g_ServerList.hWnd,L"Can't save file!",L"Error",MB_ICONERROR); + return; + } + + WideCharToMultiByte(CP_UTF8,0,FILE_1STLINE,-1,sz8Line,sizeof(sz8Line),NULL,NULL); + WriteFile(hFile,sz8Line,(DWORD)strlen(sz8Line)*sizeof(CHAR),&dwWrote,NULL); + + for(i = 0; i < g_ServerList.Params.ServerNum; i++) + { + SERVER_T* Server; + + //swprintf(szLine,L"%s\t%s\t%s%d\t%d\t%s\t%s\t%s + Server = &g_ServerList.Params.ServerList[i]; + if(!Server->IsValid) continue; + + wcsncpy(szLine,Server->szName,512); + wcsncat(szLine,L" ",512); + + wcsncat(szLine,Server->szMap,512); + wcsncat(szLine,L" ",512); + + wcsncat(szLine,Server->szGame,512); + wcsncat(szLine,L" ",512); + + _itow(Server->cPlayers,szText,10); + + wcsncat(szLine,szText,512); + wcsncat(szLine,L" ",512); + + _itow(Server->cMaxPlayers,szText,10); + + wcsncat(szLine,szText,512); + wcsncat(szLine,L" ",512); + + switch(Server->cType) + { + case 'd': pText = L"Dedicated"; break; + case 'l': pText = L"Non-Dedic."; break; + case 'p': pText = L"SourceTV"; break; + default: + swprintf(szText,64,L"<%02X>",Server->cType&0xFF); + pText = szText; + } + + wcsncat(szLine,pText,512); + wcsncat(szLine,L" ",512); + + switch(Server->cOS) + { + case 'l': pText = L"Linux"; break; + case 'w': pText = L"Windows"; break; + case 'm': pText = L"Mac OS"; break; + default: + swprintf(szText,64,L"<%02X>",Server->cOS&0xFF); + pText = szText; + } + + wcsncat(szLine,pText,512); + wcsncat(szLine,L" ",512); + + wcsncat(szLine,Server->cVisibility ? L"Yes" : L"No",512); + wcsncat(szLine,L" ",512); + + wcsncat(szLine,Server->cVAC ? L"Yes" : L"No",512); + wcsncat(szLine,L" ",512); + + sprintf(szAddr,"%s:%d",inet_ntoa(Server->Addr.sin_addr), + ntohs(Server->Addr.sin_port)); + MultiByteToWideChar(CP_UTF8,0,szAddr,-1,szText,64); + + wcsncat(szLine,szText,512); + wcsncat(szLine,L"\r\n",512); + + WideCharToMultiByte(CP_UTF8,0,szLine,-1,sz8Line,sizeof(sz8Line),NULL,NULL); + WriteFile(hFile,sz8Line,(DWORD)strlen(sz8Line)*sizeof(CHAR),&dwWrote,NULL); + } + CloseHandle(hFile); +} + +static HWND CreateListView(LPCREATESTRUCT lpCreate,HWND hParent,INT x,INT y,INT w,INT h) +{ + HWND hList; + LV_COLUMN Column; + INT i; + + hList = CreateWindowEx(WS_EX_CLIENTEDGE,WC_LISTVIEW,L"",WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_EDITLABELS, + x,y,w,h,hParent,NULL,lpCreate->hInstance,NULL); + + ZeroMemory(&Column,sizeof(LV_COLUMN)); + Column.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM|LVCF_WIDTH; + + for(i = 0; i < sizeof(Columns)/sizeof(COLUMNHDR_T); i++) + { + Column.cx = Columns[i].iWidth; + Column.pszText = Columns[i].lpName; + Column.iSubItem = i; + Column.iOrder = i; + ListView_InsertColumn(hList,i,&Column); + } + + return hList; +} + +static LRESULT CALLBACK WndCallback(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + LPCREATESTRUCT lpCreate; + + switch(Msg) + { + case WM_CREATE: + //Create something + lpCreate = (LPCREATESTRUCT)lParam; + + g_ServerList.hProgressBar = CreateWindow(PROGRESS_CLASS,L"",WS_CHILD|WS_VISIBLE, + 6,10,1055,20,hWnd,NULL,lpCreate->hInstance,NULL); + g_ServerList.hRequestEdit = CreateWindowEx(WS_EX_CLIENTEDGE,L"Edit",L"\\appid\\4000", + WS_CHILD|WS_VISIBLE,6,35,400,25,hWnd,NULL,lpCreate->hInstance,NULL); + g_ServerList.hRequestBtn = CreateWindow(L"Button",L"Request",WS_CHILD|WS_VISIBLE, + 415,35,95,25,hWnd,(HMENU)IDC_REQUEST_BTN,lpCreate->hInstance,NULL); + g_ServerList.hLabel = CreateWindow(L"STATIC",L"Status",WS_CHILD|WS_VISIBLE, + 525,35,200,30,hWnd,NULL,lpCreate->hInstance,NULL); + + CreateBar(lpCreate,hWnd); + + g_ServerList.hServerList = CreateListView(lpCreate,hWnd,6,70,1055,480); + g_ServerList.hScanThread = NULL; + g_ServerList.Params.Servers = NULL; + ZeroMemory(&g_ServerList.Params,sizeof(g_ServerList.Params)); + + //Find master servers + //StartMasterScan(hWnd); + LoadMasterServers(hWnd); + break; + case WM_ENDMASTERSCAN: + EndMasterScan(wParam,lParam); + break; + case WM_ENDMASTERREQUEST: + EndMasterRequest(); + break; + case WM_ENDQUERYSERVERS: + EndQueryServers(); + break; + case WM_COMMAND: + if(LOWORD(wParam) == IDC_REQUEST_BTN) + { + if(g_ServerList.hScanThread != 0) + StopAnyRequests(); + else MakeMasterServersRequest(); + } + else + { + switch(LOWORD(wParam)) + { + case IDC_FILE_SAVEAS: SaveServers(); break; + case IDC_SERVERS_MASTERS: + CreateMasterScanWindow(); + break; + case IDC_SERVERS_QUERY: + CreateServerInfoWindow(); + break; + case IDC_HELP_HELP: DialogHelp(); break; + case IDC_HELP_ABOUT: DialogAbout(); break; + } + } + break; + case WM_DESTROY: + PostQuitMessage(0); + break; + } + return DefWindowProc(hWnd,Msg,wParam,lParam); +} \ No newline at end of file diff --git a/servertool/serverlist.h b/servertool/serverlist.h new file mode 100644 index 0000000..110e7f5 --- /dev/null +++ b/servertool/serverlist.h @@ -0,0 +1,39 @@ +#ifndef __SERVERLIST_H +#define __SERVERLIST_H + +#include "servertool.h" + +#define SERVERLIST_CLASS L"ServerTool_ServerList" + +#define IDC_REQUEST_BTN 128 +#define IDC_FILE_SAVEAS 129 +#define IDC_SERVERS_MASTERS 130 +#define IDC_SERVERS_QUERY 131 +#define IDC_HELP_HELP 132 +#define IDC_HELP_ABOUT 133 + +typedef struct { + LPCWSTR lpClass; + HWND hWnd; + HWND hProgressBar; + HWND hRequestEdit; + HWND hRequestBtn; + HWND hLabel; + HWND hServerList; + + INT ServerIdx; + + MASTER_T Masters[32]; + INT MasterNum; + + + MASTERREQUESTPARAMETERS_T Params; + HANDLE hScanThread; +} SERVERLIST_WINDOW_T; + +VOID InitServerListWindow(); +VOID CreateServerListWindow(); + +extern SERVERLIST_WINDOW_T g_ServerList; + +#endif \ No newline at end of file diff --git a/servertool/servertool.aps b/servertool/servertool.aps new file mode 100644 index 0000000000000000000000000000000000000000..5ae7ee056f84840e9c954f85b79fc1b0d691bc6c GIT binary patch literal 39484 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 TuScByZ1&tjPE_Hi&ujk;Q*r+T literal 0 HcmV?d00001 diff --git a/servertool/servertool.c b/servertool/servertool.c new file mode 100644 index 0000000..43b42df --- /dev/null +++ b/servertool/servertool.c @@ -0,0 +1,786 @@ +#include "servertool.h" +#include +#include +#include + +typedef struct { + LONG changed; + INT stage; + BOOL IsResending; +} CONNSTATUS_T; + +static ULONG GetTimeNow() +{ + return (LONG)time(NULL); +} + +VOID FormatRequest(LPVOID lpBuf,NETADR_T* pAddr,LPSTR lpSearch,PSIZE_T pszLen) +{ + PBYTE pCur; + SIZE_T szLen; + PCHAR pChar; + CHAR szFormat[32]; + + pCur = (PBYTE)lpBuf; + *pCur++ = 0x31; + *pCur++ = 0xFF; + + sprintf(szFormat,"%s:%d",inet_ntoa(pAddr->sin_addr), + ntohs(pAddr->sin_port)); + pChar = szFormat; + szLen = strlen(pChar)+1; + CopyMemory(pCur,pChar,szLen); + pCur += szLen; + + pChar = lpSearch; + szLen = strlen(pChar)+1; + CopyMemory(pCur,pChar,szLen); + pCur += szLen; + + *pszLen = (SIZE_T)((char*)pCur-(char*)lpBuf); +} + +VOID MakeNonblocking(SOCKET s) +{ + unsigned long arg = 1; + ioctlsocket(s, FIONBIO, &arg); +} + +BOOL FindMasterServers(MASTERFINDPARAMETERS_T* pParams) +{ + struct hostent* host; + NETADR_T addr; + + CONNECTION_T m_conn[32]; + INT m_num; + INT stages[32]; + INT rel[32]; + INT changed,tries; + + WSAPOLLFD polls[32]; + INT p_num; + + static BYTE szPacket[1240]; + SIZE_T szLen; + INT i; + + host = gethostbyname("hl2master.steampowered.com"); + if(!host) return FALSE; + + addr.sin_addr.s_addr = 0; + addr.sin_port = htons(0); + + FormatRequest(szPacket,&addr,"\\app\\4020",&szLen); + + i = 0; + m_num = 0; + while(host->h_addr_list[i] != 0) + { + INT j; + + for(j = 27010; j <= 27015; j++) + { + m_conn[m_num].s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); + + m_conn[m_num].addr.sin_family = AF_INET; + m_conn[m_num].addr.sin_addr = *(IN_ADDR*)host->h_addr_list[i]; + m_conn[m_num].addr.sin_port = htons(j); + m_num++; + } + + i++; + } + + ZeroMemory(stages,sizeof(stages)); + + tries = 0; + do { + p_num = 0; + for(i = 0; i < m_num; i++) + { + if(stages[i] == 2) continue; + polls[p_num].fd = m_conn[i].s; + if(stages[i] == 0) + polls[p_num].events = POLLOUT; + else polls[p_num].events = POLLIN; + rel[p_num] = i; + p_num++; + } + + changed = 0; + + if(p_num == 0) break; + if(WSAPoll(polls,p_num,500) > 0) //5 second timeout + { + for(i = 0; i < p_num; i++) + { + CONNECTION_T* pConn; + + pConn = &m_conn[rel[i]]; + if(polls[i].revents & POLLOUT) + { + sendto(pConn->s,(const char*)szPacket,(INT)szLen,0, + (const struct sockaddr*)&pConn->addr,sizeof(struct sockaddr_in)); + stages[rel[i]]++; + //printf("sent request to %s:%d\n",inet_ntoa(pConn->addr.sin_addr), + // ntohs(pConn->addr.sin_port)); + changed = 1; + } + else if(polls[i].revents & POLLIN) + { + INT FromLen; + + FromLen = sizeof(struct sockaddr_in); + recvfrom(pConn->s,(char*)szPacket,sizeof(szPacket),0, + (struct sockaddr*)&pConn->addr,&FromLen); + stages[rel[i]]++; + + //Close + closesocket(pConn->s); + + //Add to list + CopyMemory(pParams->addrs,&pConn->addr,sizeof(struct sockaddr_in)); + pParams->addrs++; + + pParams->AddServer(&pConn->addr); + + //printf("recv response from %s:%d\n",inet_ntoa(pConn->addr.sin_addr), + // ntohs(pConn->addr.sin_port)); + changed = 1; + } + //unnecessary for UDP + else if(polls[i].revents & (POLLHUP|POLLERR)) + { + //Error + + //Close + closesocket(pConn->s); + stages[rel[i]] = 2; + + //printf("error %s:%d\n",inet_ntoa(pConn->addr.sin_addr), + // ntohs(pConn->addr.sin_port)); + } + } + } + + //printf("changed %d tries %d\n",changed,tries); + if(changed == 0) + { + if(tries++ == 2) + { + for(i = 0; i < m_num; i++) + { + if(stages[i] == 2) continue; + stages[i] = 2; + closesocket(m_conn[i].s); + } + } + } else tries = 0; + } while(p_num > 0); + + return TRUE; +} + +INT DoMasterServers(MASTER_T* Masters,INT MasterNum,LPCSTR lpSearch) +{ + static BYTE szPacket[2048]; + CONNSTATUS_T status[32]; + WSAPOLLFD polls[32]; + SIZE_T szLen; + INT rel[32]; + INT i,p_num,CurTime,Delta; + INT servers; + PBYTE pPtr; + + for(i = 0; i < MasterNum; i++) + { + Masters[i].Conn.s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); + Masters[i].ServerNum = 0; + Masters[i].PacketNum = 0; + MakeNonblocking(Masters[i].Conn.s); + status[i].stage = 0; + status[i].changed = GetTimeNow(); + } + + servers = 0; + do { + p_num = 0; + for(i = 0; i < MasterNum; i++) + { + if(status[i].stage == 2) + continue; + polls[p_num].fd = Masters[i].Conn.s; + if(status[i].stage == 0) + polls[p_num].events = POLLOUT; + else polls[p_num].events = POLLIN; + rel[p_num] = i; + p_num++; + } + + if(p_num == 0) break; + + if(WSAPoll(polls,p_num,500)) + { + for(i = 0; i < p_num; i++) + { + MASTER_T* Master; + + Master = &Masters[rel[i]]; + if(polls[i].revents & POLLOUT) + { + NETADR_T last; + if(Master->ServerNum == 0) + { + last.sin_addr.s_addr = 0; + last.sin_port = 0; + } + else last = Master->Servers[Master->ServerNum-1]; + FormatRequest(szPacket,&last,(LPSTR)lpSearch,&szLen); + + sendto(Master->Conn.s,(const char*)szPacket,(INT)szLen,0, + (const struct sockaddr*)&Master->Conn.addr, + sizeof(struct sockaddr_in)); + status[rel[i]].stage = 1; //Request stage + status[rel[i]].changed = GetTimeNow(); + } + else if(polls[i].revents & POLLIN) + { + INT FromLen; + INT SvNum; + + FromLen = sizeof(struct sockaddr_in); + szLen = recvfrom(Master->Conn.s,(char*)szPacket,sizeof(szPacket), + 0,(struct sockaddr*)&Master->Conn.addr,&FromLen); + //Now we need to process data + pPtr = szPacket; + if(Master->PacketNum == 0) + { + //First packet have header which we want to skip + szLen -= 6; + MoveMemory(szPacket,szPacket+6,szLen); + } + + SvNum = (INT)(szLen/6); + //Check for ending mark + if(((NETADR_T*)szPacket+SvNum-1)->sin_addr.s_addr == 0) + { + //printf("got last packet\n"); + SvNum--; //We don't want to copy ending mark + //status[rel[i]].stage = 2; + status[rel[i]].stage = 2; + if(Master->Conn.s) + { + closesocket(Master->Conn.s); + Master->Conn.s = 0; + } + continue; + } else status[rel[i]].stage = 0; + if(SvNum == 0) continue; + + //Alocate space for server data and copy server + if(Master->ServerNum == 0) + Master->Servers = (NETADR_T*)malloc(SvNum*6); + else + { + Master->Servers = (NETADR_T*)realloc( + Master->Servers,(Master->ServerNum*6)+SvNum*6); + } + + CopyMemory(Master->Servers+Master->ServerNum,szPacket,SvNum*6); + Master->ServerNum += SvNum; + + //printf("got %d servers from %s:%d\n",SvNum,inet_ntoa(pMaster->Conn.addr.sin_addr), + // ntohs(pMaster->Conn.addr.sin_port)); + servers += SvNum; + status[rel[i]].changed = GetTimeNow(); + } + else if(polls[i].revents & (POLLHUP|POLLERR)) + { + status[rel[i]].stage = 2; + if(Master->Conn.s) + { + closesocket(Master->Conn.s); + Master->Conn.s = 0; + } + + //printf("POLLHUP|POLLERR\n"); + } + } + } + CurTime = GetTimeNow(); + for(i = 0; i < MasterNum; i++) + { + CONNSTATUS_T* pStat; + + pStat = &status[i]; + Delta = CurTime - pStat->changed; + if(Delta > 8) + { + //Get the fuck out! + pStat->stage = 2; + if(Masters[i].Conn.s) + { + closesocket(Masters[i].Conn.s); + Masters[i].Conn.s = 0; + } + } + } + } while(p_num != 0); + + return servers; +} + +VOID MasterFree(MASTER_T* Master) +{ + if(Master->ServerNum) + free(Master->Servers); +} + +BOOL IsServerAlreadyInList(NETADR_T* Servers,INT ServerNum,NETADR_T* Target) +{ + INT i; + + for(i = 0; i < ServerNum; i++) + { + if(!memcmp(Target,&Servers[i],sizeof(NETADR_T))) + return TRUE; + } + return FALSE; +} + +NETADR_T* GetUniqueServers(MASTER_T* pMasters,INT MasterNum,INT* pServerNum) +{ + INT i,j; + INT SvNum; + NETADR_T* pServers; + + SvNum = 0; + pServers = NULL; + for(i = 0; i < MasterNum; i++) + { + for(j = 0; j < pMasters[i].ServerNum; j++) + { + if(!IsServerAlreadyInList(pServers,SvNum,&pMasters[i].Servers[j])) + { + if(SvNum == 0) + { + pServers = (NETADR_T*)malloc(sizeof(NETADR_T)); + } + else + { + pServers = (NETADR_T*)realloc(pServers,sizeof(NETADR_T)*(SvNum+1)); + } + CopyMemory(&pServers[SvNum++],&pMasters[i].Servers[j],sizeof(NETADR_T)); + } + } + } + + *pServerNum = SvNum; + return pServers; +} + +VOID ParsePacket(PBYTE pPacket,SERVER_T* Server) +{ + PBYTE pCur; + INT iNum; + + pCur = pPacket; + + if(*(PINT)pCur != -1) + { + wcscpy(Server->szName,L"!!!!"); + return; + } + + pCur += 5; + pCur++; + MultiByteToWideChar(CP_UTF8,0,(LPCSTR)pCur,-1,Server->szName,MAX_PATH); + pCur += strlen((const char*)pCur)+1; + + MultiByteToWideChar(CP_UTF8,0,(LPCSTR)pCur,-1,Server->szMap,64); + pCur += strlen((const char*)pCur)+1; + + pCur += strlen((const char*)pCur)+1; //Skip folder + + MultiByteToWideChar(CP_UTF8,0,(LPCSTR)pCur,-1,Server->szGame,64); + pCur += strlen((const char*)pCur)+1; + + pCur += 2; //Skip ID + + Server->cPlayers = *pCur++; + Server->cMaxPlayers = *pCur++; + iNum = *pCur++; + Server->cPlayers += iNum; + Server->cType = *pCur++; + Server->cOS = *pCur++; + Server->cVisibility = *pCur++; + Server->cVAC = *pCur++; +} + +static BYTE szSourceQuery[] = "\xFF\xFF\xFF\xFFTSource Engine Query"; + +VOID QueryServers(NETADR_T* Addrs,SERVER_T* Servers,INT ServerNum, + AddServer_t AddServer,INT WaitTime) +{ + static WSAPOLLFD polls[SERVER_BLOCK]; + static CONNECTION_T m_conn[SERVER_BLOCK]; + static CONNSTATUS_T status[SERVER_BLOCK]; + static INT rel[SERVER_BLOCK]; + BYTE szPacket[1240]; + INT i,p_num; + LONG CurTime,Delta; + + ZeroMemory(status,sizeof(status)); + ZeroMemory(rel,sizeof(rel)); + + for(i = 0; i < ServerNum; i++) + { + m_conn[i].s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); + MakeNonblocking(m_conn[i].s); + m_conn[i].addr.sin_family = AF_INET; + m_conn[i].addr.sin_addr = Addrs[i].sin_addr; + m_conn[i].addr.sin_port = Addrs[i].sin_port; + status[i].stage = 0; + status[i].changed = GetTimeNow(); + } + + do { + p_num = 0; + for(i = 0; i < ServerNum; i++) + { + if(status[i].stage == 2) continue; + polls[p_num].fd = m_conn[i].s; + if(status[i].stage == 0) + polls[p_num].events = POLLOUT; + else polls[p_num].events = POLLIN; + rel[p_num] = i; + p_num++; + } + + if(p_num == 0) break; + + //We need to be precisous, + //because everything based on timings + if(WSAPoll(polls,p_num,1000)) + { + for(i = 0; i < p_num; i++) + { + CONNECTION_T* pConn; + CONNSTATUS_T* pStat; + + pConn = &m_conn[rel[i]]; + pStat = &status[rel[i]]; + if(polls[i].revents & POLLOUT) + { + //Send request + sendto(pConn->s,(const char*)szSourceQuery,25, + 0,(const struct sockaddr*)&pConn->addr,sizeof(struct sockaddr_in)); + pStat->stage = 1; + //pStat->changed = GetTimeNow(); + } + else if(polls[i].revents & POLLIN) + { + INT FromLen; + + FromLen = sizeof(struct sockaddr_in); + recvfrom(pConn->s,(char*)szPacket,sizeof(szPacket),0, + (struct sockaddr*)&pConn->addr,&FromLen); + //Parse packet + ZeroMemory(Servers,sizeof(SERVER_T)); + Servers->Addr.sin_addr = pConn->addr.sin_addr; + Servers->Addr.sin_port = pConn->addr.sin_port; + + ParsePacket(szPacket,Servers); + Servers->IsValid = TRUE; + AddServer(Servers); + Servers++; + + closesocket(pConn->s); + pConn->s = 0; + pStat->stage = 2; + pStat->changed = GetTimeNow(); + } + else if(polls[i].revents & (POLLHUP|POLLERR)) + { + closesocket(pConn->s); + pConn->s = 0; + pStat->stage = 2; + } + } + } + CurTime = GetTimeNow(); + for(i = 0; i < ServerNum; i++) + { + if(status[i].stage == 2) continue; + + Delta = CurTime - status[i].changed; + if(Delta >= WaitTime) + { + //2 seconds no activity - get the fuck out! + status[i].stage = 2; + if(m_conn[i].s) + { + closesocket(m_conn[i].s); + m_conn[i].s = 0; + } + } + } + } while(p_num != 0); +} + +static BOOL RecvTimeOut(CONNECTION_T* pConn,PBYTE pPacket,INT Len,INT TimeOut) +{ + INT FromLen; + FromLen = sizeof(struct sockaddr_in); + recvfrom(pConn->s,(char*)pPacket,Len,0, + (struct sockaddr*)&pConn->addr,&FromLen); + return TRUE; +} + +static VOID ParseRules(PBYTE pMem,AddRule_t AddRule) +{ + PBYTE pPtr; + SHORT NumRules; + INT Len; + + pPtr = pMem; + pPtr += 5; + + NumRules = *(PSHORT)pPtr; + pPtr += 2; + + while(NumRules--) + { + Len = (INT)strlen((const char*)pPtr)+1; + AddRule((PCHAR)pPtr,(PCHAR)pPtr+Len); + pPtr += Len; + pPtr += strlen((const char*)pPtr)+1; + } +} + +static BOOL GetServerRules(CONNECTION_T* pConn,AddRule_t AddRule) +{ + static BYTE szPacket[2048]; + WSAPOLLFD poll; + PBYTE pMem; + PBYTE pPtr; + INT Len; + INT Stage; + UINT Challenge; + BOOL IsMultipacket; + INT Total,Current; + SHORT SwitchSize; + + //Stage 0 - send request with challenge + //Stage 1 - if challenge is -1, request again with challenge + // otherwise, start parsing multipackets + //Stage 2 - final + + Total = 0; + Current = 0; + SwitchSize = 0; + + pMem = NULL; + + Challenge = (UINT)-1; + Stage = 0; + do { + poll.fd = pConn->s; + if(Stage == 0) + poll.events = POLLOUT; + else poll.events = POLLIN; + + if(WSAPoll(&poll,1,3000)) + { + if(poll.revents & POLLOUT) + { + pPtr = szPacket; + *(PUINT)pPtr = (UINT)-1; + pPtr += 4; + + *pPtr++ = 0x56; + + *(PUINT)pPtr = (UINT)Challenge; + pPtr += 4; + + sendto(pConn->s,(const char*)szPacket,9,0, + (const struct sockaddr*)&pConn->addr,sizeof(struct sockaddr_in)); + Stage = 1; + } + else if(poll.revents & POLLIN) + { + INT FromLen; + + pPtr = szPacket; + + FromLen = sizeof(struct sockaddr_in); + Len = recvfrom(pConn->s,(char*)szPacket,sizeof(szPacket),0, + (struct sockaddr*)&pConn->addr,&FromLen); + + if(*(PUINT)pPtr == -1) + { + if(Challenge == -1) + { + pPtr += 5; + Challenge = *(PUINT)pPtr; + Stage = 0; //Request again + } + else //If it regular packet + { + IsMultipacket = FALSE; + pMem = (PBYTE)malloc(Len); + CopyMemory(pMem,szPacket,Len); + + Stage = 2; + } + } + else if(*(PUINT)pPtr == -2) //Multipacket + { + INT HdrSize; + + IsMultipacket = TRUE; + pPtr += 4; + if(*(PUINT)pPtr & 0x80000000) + { + //Compressed??! FUCK YOU! + return FALSE; + } + pPtr += 4; + if(!Total) Total = *pPtr; + pPtr++; + Current = *pPtr++; + + if(!SwitchSize) //Avoid exploit + SwitchSize = *(PSHORT)pPtr; + pPtr += 2; + + HdrSize = (INT)(pPtr-szPacket); + Len -= HdrSize; + + //Remove multipacket header + MoveMemory(szPacket,szPacket+HdrSize,Len); + + if(Current == 0 || !pMem) //If first + { + //Allocate memory + pMem = (PBYTE)calloc(Total,SwitchSize); + } + + //Copy memory at given index (current) + //Because UDP is unordered + if(Current < Total) + CopyMemory(pMem+SwitchSize*Current,szPacket,SwitchSize); + if(Current + 1 == Total) //Last packet + Stage = 2; + else Stage = 1; + } + } + } + else return FALSE; //Time out! + } while(Stage != 2); + + ParseRules(pMem,AddRule); + free(pMem); + return TRUE; +} + +BOOL GetServerInfo(NETADR_T* Addr,AddServer_t AddServer, + AddPlayer_t AddPlayer,AddRule_t AddRule) +{ + static BYTE szPacket[1240]; + CONNECTION_T m_conn; + PBYTE pPtr; + SERVER_T Server; + UINT Challenge; + + m_conn.s = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); + m_conn.addr.sin_family = AF_INET; + m_conn.addr.sin_addr = Addr->sin_addr; + m_conn.addr.sin_port = Addr->sin_port; + + //MakeNonblocking(m_conn.s); + + //Request info + + sendto(m_conn.s,(const char*)szSourceQuery,sizeof(szSourceQuery),0, + (const struct sockaddr*)&m_conn.addr,sizeof(struct sockaddr_in)); + if(RecvTimeOut(&m_conn,szPacket,sizeof(szPacket),3000)) + { + ParsePacket(szPacket,&Server); + AddServer(&Server); + } + else + { + closesocket(m_conn.s); + return FALSE; + } + + //Request players + Challenge = (UINT)-1; + + pPtr = szPacket; + *(PUINT)pPtr = (UINT)-1; + pPtr += 4; + *pPtr++ = 0x55; + *(PUINT)pPtr = Challenge; + pPtr += 4; + + //Got challenge + sendto(m_conn.s,(const char*)szPacket,9,0, + (const struct sockaddr*)&m_conn.addr,sizeof(struct sockaddr_in)); + if(RecvTimeOut(&m_conn,szPacket,sizeof(szPacket),3000)) + { + Challenge = *(PUINT)(szPacket+5); + } + else + { + closesocket(m_conn.s); + return FALSE; + } + + pPtr = szPacket; + *(PUINT)pPtr = (UINT)-1; + pPtr += 4; + *pPtr++ = 0x55; + *(PUINT)pPtr = Challenge; + pPtr += 4; + + sendto(m_conn.s,(const char*)szPacket,9,0, + (const struct sockaddr*)&m_conn.addr,sizeof(struct sockaddr_in)); + if(RecvTimeOut(&m_conn,szPacket,sizeof(szPacket),3000)) + { + //Parse players + BYTE PlayerNum; + PCHAR Name; + UINT Score; + FLOAT Duration; + INT i; + + pPtr = szPacket; + pPtr += 5; + PlayerNum = *pPtr++; + + for(i = 0; i < PlayerNum; i++) + { + pPtr++; + Name = (PCHAR)pPtr; + pPtr += strlen((const char*)pPtr)+1; + + Score = *(PUINT)pPtr; + pPtr += 4; + + Duration = *(PFLOAT)pPtr; + pPtr += 4; + + AddPlayer(Name,Score,Duration); + } + } + + MakeNonblocking(m_conn.s); + + //Parse rules + GetServerRules(&m_conn,AddRule); + closesocket(m_conn.s); + + return TRUE; +} \ No newline at end of file diff --git a/servertool/servertool.h b/servertool/servertool.h new file mode 100644 index 0000000..73ba0ec --- /dev/null +++ b/servertool/servertool.h @@ -0,0 +1,103 @@ +#ifndef __SERVERTOOL_H +#define __SERVERTOOL_H + +#include + +#define WINDOW_STYLE (WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX) +#define POPUP_STYLE (WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX) + +#define WM_ENDMASTERSCAN (WM_USER+1) +//WPARAM - MasterNum +//LPARAM - Addrs +#define WM_ENDMASTERREQUEST (WM_USER+2) +//LPARAM - Param ptr +#define WM_ENDQUERYSERVERS (WM_USER+3) +//LPARAM - Server num +#define WM_ENDSERVERINFOREQUEST (WM_USER+4) + +#define SERVER_BLOCK 2048 + +#define MAX_MASTER_NUM 6 + +typedef struct { + HINSTANCE hInst; + INT nCmdShow; + HICON hIcon; + HICON hIconSm; +} APPLICATION_T; + +typedef struct { + SOCKET s; + struct sockaddr_in addr; +} CONNECTION_T; + +#pragma pack(push,1) +typedef struct { + IN_ADDR sin_addr; + SHORT sin_port; +} NETADR_T; +#pragma pack(pop) + +typedef struct { + CONNECTION_T Conn; + NETADR_T* Servers; + INT ServerNum; + INT PacketNum; +} MASTER_T; + +typedef struct { + LPCSTR lpszSearch; + struct sockaddr_in* addrs; + VOID (*AddServer)(struct sockaddr_in*); +} MASTERFINDPARAMETERS_T; + +typedef struct { + WCHAR szName[MAX_PATH]; + WCHAR szMap[64]; + WCHAR szGame[64]; + BYTE cPlayers; + BYTE cMaxPlayers; + BYTE cOS; + BYTE cType; + BYTE cVisibility; + BYTE cVAC; + BOOL IsValid; + NETADR_T Addr; +} SERVER_T; + +typedef struct { + IN char szSearch[MAX_PATH]; + IN MASTER_T* Masters; + IN INT MasterNum; + IN HWND hParent; + OUT NETADR_T* Servers; + OUT INT ServerNum; + SERVER_T* ServerList; +} MASTERREQUESTPARAMETERS_T; + +typedef struct { + WCHAR szName[32]; + INT Score; + FLOAT Duration; +} PLAYER_T; + +typedef VOID (*AddServer_t)(SERVER_T*); +typedef VOID (*AddPlayer_t)(PCHAR,UINT,FLOAT); +typedef VOID (*AddRule_t)(PCHAR,PCHAR); + +VOID FormatRequest(LPVOID lpBuf,NETADR_T* pAddr,LPSTR lpSearch,PSIZE_T pszLen); +VOID MakeNonblocking(SOCKET s); +BOOL FindMasterServers(MASTERFINDPARAMETERS_T* pParams); +INT DoMasterServers(MASTER_T* pMasters,INT MasterNum,LPCSTR lpSearch); +VOID MasterFree(MASTER_T* Master); +BOOL IsServerAlreadyInList(NETADR_T* Servers,INT ServerNum,NETADR_T* Target); +NETADR_T* GetUniqueServers(MASTER_T* pMasters,INT MasterNum,INT* pServerNum); +VOID ParsePacket(PBYTE pPacket,SERVER_T* Server); +VOID QueryServers(NETADR_T* Addrs,SERVER_T* Servers,INT ServerNum, + AddServer_t AddServer,INT WaitTime); +BOOL GetServerInfo(NETADR_T* Addr,AddServer_t AddServer, + AddPlayer_t AddPlayer,AddRule_t AddRule); + +extern APPLICATION_T g_App; + +#endif \ No newline at end of file diff --git a/servertool/servertool.rc b/servertool/servertool.rc new file mode 100644 index 0000000000000000000000000000000000000000..7682401672a67b2bf4769154845621314018a46f GIT binary patch literal 3350 zcmds(TWeE65Xa}?JPCe>HF>cpiB*v5gOHmcn6}b1MIlf^Vl_fkma1&ot@d8o%^q!MJt-KQyW^(<~Fqj-@umOuD~s9WnCMws@M~Tv(NU)CVX@7 zOJE<|94NjOvmSHDN~aBN22H^p+5>JWdYA`0VRr;|-_z!{_zU*Ma-Le8c~3X+d^)>i z@2zE**0!oO?A)&H!fIfv%+IW8AHlTvpIRAAlXl|CM=zT?9-yVEjd}kP z?MM%oy!r$G2CuI0PU)it{yE>KMgDAqE>{1x=DV-|>}f1W6nn=CUCEOMy!$ZU2$~P) zW(x-CoVlnHl^Cz1ljv3C>@k=(9&-|%M@KvCzDPvT&}-0RL)DzxWH?5Mw@s$^0zj@o`G!x>)ta1CeXF;UC}({>=txoZi{(z zcMZ8pV4L{3bP!uxuSmDHV&RH6yo0;yIkIKTq%^^<0j5QC*ca4yjJDEZU;Aa=UiVo+ zE4;>!-C4F{&(@i?hUQ|8iAy=;kUMr|_Z*dCGq>cdL$2u%xpAJqlQK=B7Y9o8xA)|I z?(I`;luzOztL@4y+ukPK=}X!Pt2{ZMSaV{zOQ%3z_<=d;s)8OL7r33porQx0^L5E+Qin4v<@OzK#C2y5Rr|Sqy_v=HeO1AtuDNXR;0F{*nc*p-*H~y_(RA$}ZF9tm( Xb)2oaBuw}42~nWTu-zT*&fvcRQ)Pv= literal 0 HcmV?d00001 diff --git a/servertool/servertool.vcxproj b/servertool/servertool.vcxproj new file mode 100644 index 0000000..7679c5f --- /dev/null +++ b/servertool/servertool.vcxproj @@ -0,0 +1,135 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {FF615871-8561-4F2E-9307-9CEA2E7BE381} + servertool + + + + Application + true + MultiByte + + + Application + true + MultiByte + + + Application + false + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + + + true + + + + + Level3 + Disabled + + + true + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + Level3 + MaxSpeed + true + true + _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + + + true + true + true + WS2_32.lib;Comctl32.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/servertool/servertool.vcxproj.filters b/servertool/servertool.vcxproj.filters new file mode 100644 index 0000000..0f61fcd --- /dev/null +++ b/servertool/servertool.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + Файлы исходного кода + + + + + Заголовочные файлы + + + Заголовочные файлы + + + Заголовочные файлы + + + Заголовочные файлы + + + Заголовочные файлы + + + + + Файлы ресурсов + + + Файлы ресурсов + + + + + Файлы ресурсов + + + \ No newline at end of file diff --git a/servertool/servertool.vcxproj.user b/servertool/servertool.vcxproj.user new file mode 100644 index 0000000..695b5c7 --- /dev/null +++ b/servertool/servertool.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/servertool/x64/Release/CL.read.1.tlog b/servertool/x64/Release/CL.read.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..02b433427a272f74fa263d53631dd88aa0125e91 GIT binary patch literal 70864 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 ZxH6a{%_CMRM&Mp{)~iKB^fv4D_YW9R8@d1h literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/CL.write.1.tlog b/servertool/x64/Release/CL.write.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..4fa38ea9f3783e16b6af2b1dda696afeee879535 GIT binary patch literal 3250 zcmeHJ+X{j}5IxU9zajSq@qD(V+^e_ds&Q@X`#=CIlO+IvHYnXDcAr%Bbf*jdH>$eA|pp}VU) FXYL6J-9P{U literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/cl.command.1.tlog b/servertool/x64/Release/cl.command.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..30add9d8b6795756c5ddc726221f9a50abcfd076 GIT binary patch literal 3028 zcmeHJ%TB^T6g_Jb|G}^qe8mO3+Q(=DZPFGogxDYyB|&K_@$vKOnd>wnMi$x~lV;}L zIdfk#J-O}s+ciA2F+>6%F)n33qZXlWuA`d0uoR%}%=YkKoYU7#n9Y);Euw22X zJbB6L#*~He2&gykf>WIE4r8Koj*&zh5^0EkfXN1{Cq_KP0iP!0PHEzLO=Jbxk8*7g4X$E1W+YX&B)-Lb6NYF7Qmg}*awwY%w_6|g_pzO|iw hYZDjhVOWRXCCy>WFw3xYF4V)Y>MzVP%rb193m;{M!-4<+ literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/link-cvtres.read.1.tlog b/servertool/x64/Release/link-cvtres.read.1.tlog new file mode 100644 index 0000000..46b134b --- /dev/null +++ b/servertool/x64/Release/link-cvtres.read.1.tlog @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/servertool/x64/Release/link-cvtres.write.1.tlog b/servertool/x64/Release/link-cvtres.write.1.tlog new file mode 100644 index 0000000..46b134b --- /dev/null +++ b/servertool/x64/Release/link-cvtres.write.1.tlog @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/servertool/x64/Release/link.command.1.tlog b/servertool/x64/Release/link.command.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..a2eac1a508a8509e59b465e0d619af030791b007 GIT binary patch literal 2078 zcmchYU2hUm5Qg7t6aNG0P48%|#tRZJ*hMOauK;Z|AsV1it8^jV()PmNu0AtoDJ(`K zCfkr*=FG==XU@EH_UDgJs;Q!(`g*IL&ioxAb#$KT^0on%j+#V#&}+Tozeh}yr|SMg zwU8QWtBhZy_xfH4LSF;VwXYbwBGI-_#_Fn5S8=s%qcu54tMh5l)}4K7G~-WS&-F}4 z-cjRT&so)VX#hXF&d3)31C{XW=oG1aO-7aMt5n*PF*n{b zyMzA3G-HhMsZ7tu`s(-9-+Yb1#=I0h7}x$KZu=H9tQlDQ#@X2z_P%kO8*o$KFE`6n A#sB~S literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/link.read.1.tlog b/servertool/x64/Release/link.read.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..c0b5a7878b71b57d88e2fb6bc257f8ac7c22a3cf GIT binary patch literal 4358 zcmd6q$xg#C5QgWB#5?o|mx`rgyJc$$%~I7#fhwXe!m|V4I4ud003njrhuTiP%``_2Tf}UIwW<1H2OsJR4N%(nod?hKZSTY$i&X)&y z9mIl>!eTWNU~fokZO`bwrtE9Dy|t|+_)+({A8WhF?%SI3$H=i95lLm@!m@8h>A|HD z{*Eob4DAzGcLVQE8JF^ZV8KiFXiRgF6-PU}EoSIWcmdsHlpHcUvc2`(4tgLuc`xdlSf#iIh zqjgp9s`3peeTz&ruj=Owb5h3EFSx+!UcHr*o^<$MknPlX8&S$`6t{Y`-}Cgp$n@q3 ziK3#_cgx|>{S;A+{zPtxyLva{O{90z803eE@eXT1R12b7doF^FQHycid^7TFSsmeP ay)`Q4u0LmY_wxJfC98Q@%urWtUwi=O&tcdA literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/link.write.1.tlog b/servertool/x64/Release/link.write.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..7e5df22ee4d3318b19ea7c123f47e7419bcaf2d3 GIT binary patch literal 990 zcmchW!485j5Jcxp;;-~XJb0r}5={X^33?!YiQlfyt{Q6s372vJy6tu!vz(hqI=7*HPj+jX_$Oe8Y=uvjJQsKEr^C^sZe``U3dQ#~ b?ra!Wj0<(E(Yw(yt~oC!n?m)OM5~ow1O=3H literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/mt.command.1.tlog b/servertool/x64/Release/mt.command.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..059f145a7789fc936de93a315809d15da7393cee GIT binary patch literal 444 zcmbV|!Ab)`5JcZu@E?NSM}*)Zo>rm|NDOR(<`9Ias|aQzvr+T)iEqXwAbRr9yCUD3 NQM|}F{MwNI%@-a3P4)l) literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/mt.read.1.tlog b/servertool/x64/Release/mt.read.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..c2e942dcf0ab6466bd6f265cb32487a64ed5052f GIT binary patch literal 622 zcmb`F&1%Ci5QOI(=sWnBUQAo3P12iV#lh4+K?-&brtkk0Z9gq8CBYB~J*=eN+12ih z^!@cIr+1AC+RLlAb;qgGFvTvh6G*3;inHFdV)xY4SZ?|A*(vxLOI4}WiIZ2u>hN>( zQ~VsPQb{}zd(c9K%{Ew-n`RoxtU%(70V~N(sob-Vc%FOW-2<4{2eDo+WISQ7tZTeA z(T3{6at5*jsDnrSuYFfj-;BPQp0%ZKK@UIE?P!b+)BFicD$_M6(GvAG=>2GOU$ak` q-Wi7x)=}X5!HOYpbK&;2$$>7Hj0%Qd-_yS26Am0(p*8}n$fpVSVmO)uvJ$!?%tH8>_QNl?rvut+8Uph=Dk#IuUc@KiQOs1}C8@ zv{jimBPSJhg4J8Skz6ggymketfi-(YU&ex?@`8h$)*CAiQf!{NzUiCiUH^6OZ+_+q Dk9$sD literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/rc.read.1.tlog b/servertool/x64/Release/rc.read.1.tlog new file mode 100644 index 0000000000000000000000000000000000000000..4b755dbe8907cd2e193bf996943f7f8e065fcb6f GIT binary patch literal 2676 zcmd6p%TB{E5Jm4AiGRovHdVU;#4hAfDw-zBt6fC&|9=8F<4_T*Zb*Y1RdOBMGd{V# zvHkh+u2|3NR4GxZ)|D^Ra_zs{e)rY%k9@Ccdw9=B9mPEG1 zb&RPQl@V!A8}0bty77tYO_{4Fog?4g5l_umq1GF^bvVNmiBZlxVwycV^}-8U4Oz?^ z)9G~$PXo94-TXS0zsB)IsF?AKa9oMU{1e5jtbKRBmFbpS8wy(E3 nQku)>M%VL{_5!HOY + + + + + + + + + diff --git a/servertool/x64/Release/servertool.lastbuildstate b/servertool/x64/Release/servertool.lastbuildstate new file mode 100644 index 0000000..fde1e1c --- /dev/null +++ b/servertool/x64/Release/servertool.lastbuildstate @@ -0,0 +1,2 @@ +#v4.0:v100:false +Release|x64|D:\serverbrowser\| diff --git a/servertool/x64/Release/servertool.log b/servertool/x64/Release/servertool.log new file mode 100644 index 0000000..f322bde --- /dev/null +++ b/servertool/x64/Release/servertool.log @@ -0,0 +1,33 @@ +Построение начато 25.01.2020 9:51:48. + 1>Проект "D:\serverbrowser\servertool\servertool.vcxproj" в узле 2 (целевые объекты build). + 1>InitializeBuildStatus: + Создание "x64\Release\servertool.unsuccessfulbuild", так как было задано "AlwaysCreate". + ClCompile: + C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\CL.exe /c /Zi /nologo /W3 /WX- /O2 /Oi /GL /D _CRT_SECURE_NO_WARNINGS /D _UNICODE /D UNICODE /Gm- /EHsc /MD /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fo"x64\Release\\" /Fd"x64\Release\vc100.pdb" /Gd /TC /errorReport:prompt main.c masterscan.c serverinfo.c serverlist.c servertool.c + main.c + masterscan.c + serverinfo.c + serverlist.c + servertool.c + ResourceCompile: + Для всех выходных данных обновления не требуется. + Link: + C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:PROMPT /OUT:"D:\serverbrowser\x64\Release\servertool.exe" /NOLOGO WS2_32.lib Comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /ManifestFile:"x64\Release\servertool.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"D:\serverbrowser\x64\Release\servertool.pdb" /OPT:REF /OPT:ICF /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"D:\serverbrowser\x64\Release\servertool.lib" /MACHINE:X64 x64\Release\servertool.res + x64\Release\main.obj + x64\Release\masterscan.obj + x64\Release\serverinfo.obj + x64\Release\serverlist.obj + x64\Release\servertool.obj + Создание кода + Создание кода завершено + servertool.vcxproj -> D:\serverbrowser\x64\Release\servertool.exe + Manifest: + C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\mt.exe /nologo /verbose /outputresource:"D:\serverbrowser\x64\Release\servertool.exe;#1" /manifest x64\Release\servertool.exe.intermediate.manifest + FinalizeBuildStatus: + Файл "x64\Release\servertool.unsuccessfulbuild" удаляется. + Обращение к "x64\Release\servertool.lastbuildstate". + 1>Построение проекта "D:\serverbrowser\servertool\servertool.vcxproj" завершено (целевые объекты build). + +Построение успешно завершено. + +Затраченное время: 00:00:04.88 diff --git a/servertool/x64/Release/servertool.res b/servertool/x64/Release/servertool.res new file mode 100644 index 0000000000000000000000000000000000000000..a188f036a6db4ce5bacd299bc01d6439ee236e1c GIT binary patch literal 5592 zcmcJT3s6?a6~`|i@+k@*55*VyIVhqcAmRfR5vgcJPz#D<1(lak!Jq*YGRjAM0TNL_ z1VqGVkWw2fTEU@=Gl{Q>CX;D9?Zh^d*hCViNlntkOry8IbKx?d7SKepGyl7LchBzG zvwQZOv#ThIVgjn#28vIlTBF`>1C5o|W;71&r4xBkFoD^?N-HUfnLaM|ZJ_!`rQqP; zn$4Rx&;3!IdXP9TFK-jWsi~={F+DhJw?nO4x9%5X$BsSkB^NWuC(77H*VZHo$l<}vxcQhmyXHE$mm;J zTN|@$*RJe>f`Tpi`T5CPw{Bg$W5~yoCww?dcc4IzjAbRTuysB zc%^sm-Yc1t*QQOI+?Fq2?z3#!va#^+%FN94UbJYD59{TbkdWZX`i&>|rjMi?pfb*< zpw-32rFHo5;jQlO?)Qcc9eQ{C`0+Q9_Zs<)2@@tx_V%icjZIT${2BZS-tu2m zRHX6u^YeRQ{&jVAhJO9}skXMZO{_p!_)U0t=ltLdLpBI+jl0SSk{(}b( z_U+rZZ<@@dGZYsWyRc_w^s7ht>+(;TG9^l6Jbn7K$MNIGhwC_T;>2*y`ABIa9i2FF zVvq7?pNkn+MIY{A*MG|%RI|sYbg7BK5bN=nMz zxN)PLQAr1SV*goV?fjwtjiW}5()K?zG<2~r*uH)H^xWKBe;wHPNu0fD(nhN4iS@s6 z2S{P|*&y41gtk`fpCnDGOxZBzN_--?O~JM5L@aP#*$~GI#FWVc4fM>`~r~88dcrX7&UH1!drWQ`wgi#wzjf z@F>P+9ANDI*pg!8ET=6Gd43%c5wRItQaNzoz+z}K7A#mW3H=w@RBXH060xa2!5S@CyTxAbjS`nbFgyPtU|hy#!5{37^()&z?P@th?{iL>B8GCv7z~HLjJF zmChD$I(+zWfBO5e7D2=pL7bCV;=xGD{gCfXx{1x|NE%Kd;slXX&CbrY zU$}5#t(2Xeom+`jUL)=~#{U;m$3DML{(s4Wf3!4Whx#LjjkGKqtla-oZA! z&HpLlrr+`ZXYdYf5~KYWd=3=iOSv0JeDnqL`Q_}{v!l^HcWLV?JuCiTPU_UDQ?IZ$ z_ZdTzk2Sc(y8T7}XRaUV;~zYDa6C5R;qKkLBlWuO@@Mg9{=w3pbK!uz>f*(V#a?KM zxc4Xp@m(LcS7}*QRh2LIqzKEpuFBorj(uq^Yh)l;X@3cV6sWK;r+una&MVYE_4 zFi;NvsuC8cD&}BvptM0Y)dW=40VGkv23fpg$m<2~7pAsX40-jiQeNVfg9_;7?ZcXq zqCEZf0ii}iUujlm)8|=lAEl+Gw%GFmVxJD%t#y8m5BJYf&i$vNFWg`M{v2I8NbqM_ zoZ+vyPr75X58?Z!N+WmZFnq^J?r(RoH*fPMkVV}rz2mA?tBm**7tTQ$K0)($@$vBi z+$l4t&!t>|?uy-4v729GhilN?BK$)I_AH59^A`>d4t31^0(QLx+qRQ)zU%Vk%LZcb z(HAdXbP#?mEiE>b-MJsT5kIcrzEH`$su;J1X0geQQb#u7@57E9IpT@DTZj#|cGv&r z&6^s3}v+dCU#j$%)gAc zr$pvd$z1G-eVmZlnpoUd-a%vzlHgy(cxK|TBJ`w;yGt2*(m-rjnv;_=pBN>N*lZm% zcbW5E-gE8|=Qp(VMkr_J)A-aTkk9_hJ>U<_{Y~;ZXb%%>9z`F^`4=DaH+a0R_mvzS zIw@@e^!|HvFdtvph+nE_Kbxo*TczL&L(pw6DO)DX{>btrah?bAXR(*D_?JXzA0Z1T zS5fNg>)Q^x#Q^lz?k-e40FRmTZPxTN&ff>zWn1x=VzawU519E!;EIi+7=+4%b@{;p i8fWTh*I-A!2>5~=MS0S8N%+&5?J{aM%cNN?Yvq3nd)|it literal 0 HcmV?d00001 diff --git a/servertool/x64/Release/servertool.vcxprojResolveAssemblyReference.cache b/servertool/x64/Release/servertool.vcxprojResolveAssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..3f0168105c545dc757bd6373b277614955157056 GIT binary patch literal 713 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 literal 0 HcmV?d00001 diff --git a/x64/Release/master.dat b/x64/Release/master.dat new file mode 100644 index 0000000..a45b179 --- /dev/null +++ b/x64/Release/master.dat @@ -0,0 +1 @@ +@4i@'i@4i@'i@Ai@Ai \ No newline at end of file diff --git a/x64/Release/servertool.exe b/x64/Release/servertool.exe new file mode 100644 index 0000000000000000000000000000000000000000..c5407967460370b29fba10424a38989c971198d8 GIT binary patch literal 37376 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 literal 0 HcmV?d00001