add plugins-extra

This commit is contained in:
AirDog46
2025-05-13 19:49:49 +03:00
parent c5fab8aa94
commit 3575d86c17
531 changed files with 70258 additions and 1 deletions

View File

@@ -0,0 +1,5 @@
1.0
* Initial release
1.1
* Added Geoip support

View File

@@ -0,0 +1,645 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (Australia) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENA)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_AUS
#pragma code_page(1252)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,1,0,0
PRODUCTVERSION 1,1,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "0c0904b0"
BEGIN
VALUE "CompanyName", "dmex"
VALUE "FileDescription", "Network Extras Plugin for Process Hacker"
VALUE "FileVersion", "1.1"
VALUE "InternalName", "dmex.NetworkExtrasPlugin"
VALUE "LegalCopyright", "Licensed under the GNU GPL, v3."
VALUE "OriginalFilename", "NetExtrasPlugin.dll"
VALUE "ProductName", "Network Extras Plugin for Process Hacker"
VALUE "ProductVersion", "1.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0xc09, 1200
END
END
/////////////////////////////////////////////////////////////////////////////
//
// PNG
//
AD_PNG PNG "resources\\ad.png"
AE_PNG PNG "resources\\ae.png"
AF_PNG PNG "resources\\af.png"
AG_PNG PNG "resources\\ag.png"
AI_PNG PNG "resources\\ai.png"
AL_PNG PNG "resources\\al.png"
AM_PNG PNG "resources\\am.png"
AN_PNG PNG "resources\\an.png"
AO_PNG PNG "resources\\ao.png"
AR_PNG PNG "resources\\ar.png"
AS_PNG PNG "resources\\as.png"
AT_PNG PNG "resources\\at.png"
AU_PNG PNG "resources\\au.png"
AW_PNG PNG "resources\\aw.png"
AX_PNG PNG "resources\\ax.png"
AZ_PNG PNG "resources\\az.png"
BA_PNG PNG "resources\\ba.png"
BB_PNG PNG "resources\\bb.png"
BD_PNG PNG "resources\\bd.png"
BE_PNG PNG "resources\\be.png"
BF_PNG PNG "resources\\bf.png"
BG_PNG PNG "resources\\bg.png"
BH_PNG PNG "resources\\bh.png"
BI__PNG PNG "resources\\bi.png"
BJ_PNG PNG "resources\\bj.png"
BM_PNG PNG "resources\\bm.png"
BN_PNG PNG "resources\\bn.png"
BO_PNG PNG "resources\\bo.png"
BR_PNG PNG "resources\\br.png"
BS_PNG PNG "resources\\bs.png"
BT_PNG PNG "resources\\bt.png"
BV_PNG PNG "resources\\bv.png"
BW_PNG PNG "resources\\bw.png"
BY_PNG PNG "resources\\by.png"
BZ_PNG PNG "resources\\bz.png"
CA_PNG PNG "resources\\ca.png"
AAC_PNG PNG "resources\\catalonia.png"
CC_PNG PNG "resources\\cc.png"
CD_PNG PNG "resources\\cd.png"
CF_PNG PNG "resources\\cf.png"
CG_PNG PNG "resources\\cg.png"
CH_PNG PNG "resources\\ch.png"
CI_PNG PNG "resources\\ci.png"
CK_PNG PNG "resources\\ck.png"
CL_PNG PNG "resources\\cl.png"
CM_PNG PNG "resources\\cm.png"
CN_PNG PNG "resources\\cn.png"
CO_PNG PNG "resources\\co.png"
CR_PNG PNG "resources\\cr.png"
CS_PNG PNG "resources\\cs.png"
CU_PNG PNG "resources\\cu.png"
CV_PNG PNG "resources\\cv.png"
CX_PNG PNG "resources\\cx.png"
CY_PNG PNG "resources\\cy.png"
CZ_PNG PNG "resources\\cz.png"
DE_PNG PNG "resources\\de.png"
DJ_PNG PNG "resources\\dj.png"
DK_PNG PNG "resources\\dk.png"
DM_PNG PNG "resources\\dm.png"
DO_PNG PNG "resources\\do.png"
DZ_PNG PNG "resources\\dz.png"
EC_PNG PNG "resources\\ec.png"
EE_PNG PNG "resources\\ee.png"
EG_PNG PNG "resources\\eg.png"
EH_PNG PNG "resources\\eh.png"
AAD_PNG PNG "resources\\england.png"
ER_PNG PNG "resources\\er.png"
ES_PNG PNG "resources\\es.png"
ET_PNG PNG "resources\\et.png"
AAE_PNG PNG "resources\\europeanunion.png"
AAF_PNG PNG "resources\\fam.png"
FI_PNG PNG "resources\\fi.png"
FJ_PNG PNG "resources\\fj.png"
FK_PNG PNG "resources\\fk.png"
FM_PNG PNG "resources\\fm.png"
FO_PNG PNG "resources\\fo.png"
FR_PNG PNG "resources\\fr.png"
GA_PNG PNG "resources\\ga.png"
GB_PNG PNG "resources\\gb.png"
GD_PNG PNG "resources\\gd.png"
GE_PNG PNG "resources\\ge.png"
GF_PNG PNG "resources\\gf.png"
GH_PNG PNG "resources\\gh.png"
GI_PNG PNG "resources\\gi.png"
GL_PNG PNG "resources\\gl.png"
GM_PNG PNG "resources\\gm.png"
GN_PNG PNG "resources\\gn.png"
GP_PNG PNG "resources\\gp.png"
GQ_PNG PNG "resources\\gq.png"
GR_PNG PNG "resources\\gr.png"
GS_PNG PNG "resources\\gs.png"
GT_PNG PNG "resources\\gt.png"
GU_PNG PNG "resources\\gu.png"
GW_PNG PNG "resources\\gw.png"
GY_PNG PNG "resources\\gy.png"
HK_PNG PNG "resources\\hk.png"
HM_PNG PNG "resources\\hm.png"
HN_PNG PNG "resources\\hn.png"
HR_PNG PNG "resources\\hr.png"
HT_PNG PNG "resources\\ht.png"
HU_PNG PNG "resources\\hu.png"
ID_PNG PNG "resources\\id.png"
IE_PNG PNG "resources\\ie.png"
IL_PNG PNG "resources\\il.png"
IN_PNG PNG "resources\\in.png"
IO_PNG PNG "resources\\io.png"
IQ_PNG PNG "resources\\iq.png"
IR_PNG PNG "resources\\ir.png"
IS_PNG PNG "resources\\is.png"
IT_PNG PNG "resources\\it.png"
JM_PNG PNG "resources\\jm.png"
JO_PNG PNG "resources\\jo.png"
JP_PNG PNG "resources\\jp.png"
KE_PNG PNG "resources\\ke.png"
KG_PNG PNG "resources\\kg.png"
KH_PNG PNG "resources\\kh.png"
KI_PNG PNG "resources\\ki.png"
KM_PNG PNG "resources\\km.png"
KN_PNG PNG "resources\\kn.png"
KP_PNG PNG "resources\\kp.png"
KR_PNG PNG "resources\\kr.png"
KW_PNG PNG "resources\\kw.png"
KY_PNG PNG "resources\\ky.png"
KZ_PNG PNG "resources\\kz.png"
LA_PNG PNG "resources\\la.png"
LB_PNG PNG "resources\\lb.png"
LC_PNG PNG "resources\\lc.png"
LI_PNG PNG "resources\\li.png"
LK_PNG PNG "resources\\lk.png"
LR_PNG PNG "resources\\lr.png"
LS_PNG PNG "resources\\ls.png"
LT_PNG PNG "resources\\lt.png"
LU_PNG PNG "resources\\lu.png"
LV_PNG PNG "resources\\lv.png"
LY_PNG PNG "resources\\ly.png"
MA_PNG PNG "resources\\ma.png"
MC_PNG PNG "resources\\mc.png"
MD_PNG PNG "resources\\md.png"
ME_PNG PNG "resources\\me.png"
MG_PNG PNG "resources\\mg.png"
MH_PNG PNG "resources\\mh.png"
MK_PNG PNG "resources\\mk.png"
ML_PNG PNG "resources\\ml.png"
MM_PNG PNG "resources\\mm.png"
MN_PNG PNG "resources\\mn.png"
MO_PNG PNG "resources\\mo.png"
MP_PNG PNG "resources\\mp.png"
MQ_PNG PNG "resources\\mq.png"
MR_PNG PNG "resources\\mr.png"
MS_PNG PNG "resources\\ms.png"
MT_PNG PNG "resources\\mt.png"
MU_PNG PNG "resources\\mu.png"
MV_PNG PNG "resources\\mv.png"
MW_PNG PNG "resources\\mw.png"
MX_PNG PNG "resources\\mx.png"
MY_PNG PNG "resources\\my.png"
MZ_PNG PNG "resources\\mz.png"
NA_PNG PNG "resources\\na.png"
NC_PNG PNG "resources\\nc.png"
NE_PNG PNG "resources\\ne.png"
NF_PNG PNG "resources\\nf.png"
NG_PNG PNG "resources\\ng.png"
NI_PNG PNG "resources\\ni.png"
NL_PNG PNG "resources\\nl.png"
NO_PNG PNG "resources\\no.png"
NP_PNG PNG "resources\\np.png"
NR_PNG PNG "resources\\nr.png"
NU_PNG PNG "resources\\nu.png"
NZ_PNG PNG "resources\\nz.png"
OM_PNG PNG "resources\\om.png"
PA_PNG PNG "resources\\pa.png"
PE_PNG PNG "resources\\pe.png"
PF_PNG PNG "resources\\pf.png"
PG_PNG PNG "resources\\pg.png"
PH_PNG PNG "resources\\ph.png"
PK_PNG PNG "resources\\pk.png"
PL_PNG PNG "resources\\pl.png"
PM_PNG PNG "resources\\pm.png"
PN_PNG PNG "resources\\pn.png"
PR_PNG PNG "resources\\pr.png"
PS_PNG PNG "resources\\ps.png"
PT_PNG PNG "resources\\pt.png"
PW_PNG PNG "resources\\pw.png"
PY_PNG PNG "resources\\py.png"
QA_PNG PNG "resources\\qa.png"
RE_PNG PNG "resources\\re.png"
RO_PNG PNG "resources\\ro.png"
RS_PNG PNG "resources\\rs.png"
RU_PNG PNG "resources\\ru.png"
RW_PNG PNG "resources\\rw.png"
SA_PNG PNG "resources\\sa.png"
SB_PNG PNG "resources\\sb.png"
SC_PNG PNG "resources\\sc.png"
AAA_PNG PNG "resources\\scotland.png"
SD_PNG PNG "resources\\sd.png"
SE_PNG PNG "resources\\se.png"
SG_PNG PNG "resources\\sg.png"
SH_PNG PNG "resources\\sh.png"
SI_PNG PNG "resources\\si.png"
SJ_PNG PNG "resources\\sj.png"
SK_PNG PNG "resources\\sk.png"
SL_PNG PNG "resources\\sl.png"
SM_PNG PNG "resources\\sm.png"
SN_PNG PNG "resources\\sn.png"
SO_PNG PNG "resources\\so.png"
SR_PNG PNG "resources\\sr.png"
ST_PNG PNG "resources\\st.png"
SV_PNG PNG "resources\\sv.png"
SY_PNG PNG "resources\\sy.png"
SZ_PNG PNG "resources\\sz.png"
TC_PNG PNG "resources\\tc.png"
TD_PNG PNG "resources\\td.png"
TF_PNG PNG "resources\\tf.png"
TG_PNG PNG "resources\\tg.png"
TH_PNG PNG "resources\\th.png"
TJ_PNG PNG "resources\\tj.png"
TK_PNG PNG "resources\\tk.png"
TL_PNG PNG "resources\\tl.png"
TM_PNG PNG "resources\\tm.png"
TN_PNG PNG "resources\\tn.png"
TO_PNG PNG "resources\\to.png"
TR_PNG PNG "resources\\tr.png"
TT_PNG PNG "resources\\tt.png"
TV_PNG PNG "resources\\tv.png"
TW_PNG PNG "resources\\tw.png"
TZ_PNG PNG "resources\\tz.png"
UA_PNG PNG "resources\\ua.png"
UG_PNG PNG "resources\\ug.png"
UM_PNG PNG "resources\\um.png"
US_PNG PNG "resources\\us.png"
UY_PNG PNG "resources\\uy.png"
UZ_PNG PNG "resources\\uz.png"
VA_PNG PNG "resources\\va.png"
VC_PNG PNG "resources\\vc.png"
VE_PNG PNG "resources\\ve.png"
VG_PNG PNG "resources\\vg.png"
VI_PNG PNG "resources\\vi.png"
VN_PNG PNG "resources\\vn.png"
VU_PNG PNG "resources\\vu.png"
AAB_PNG PNG "resources\\wales.png"
WF_PNG PNG "resources\\wf.png"
WS_PNG PNG "resources\\ws.png"
YE_PNG PNG "resources\\ye.png"
YT_PNG PNG "resources\\yt.png"
ZA_PNG PNG "resources\\za.png"
ZM_PNG PNG "resources\\zm.png"
ZW_PNG PNG "resources\\zw.png"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_OPTIONS DIALOGEX 0, 0, 309, 178
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,198,157,50,14
PUSHBUTTON "Cancel",IDCANCEL,252,157,50,14
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_OPTIONS, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 302
TOPMARGIN, 7
BOTTOMMARGIN, 171
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//
IDD_OPTIONS AFX_DIALOG_LAYOUT
BEGIN
0
END
#endif // English (Australia) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@@ -0,0 +1,383 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B2F55139-7984-498F-98CB-AC25A3E08CCC}</ProjectGuid>
<RootNamespace>NetExtrasPlugin</RootNamespace>
<Keyword>Win32Proj</Keyword>
<ProjectName>NetExtrasPlugin</ProjectName>
<WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v140</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\ExtraPlugins.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\ExtraPlugins.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\ExtraPlugins.props" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="..\ExtraPlugins.props" />
</ImportGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;C:\Users\AirDog46\Downloads\processhacker-2.39-src\bin\Debug32</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;C:\Users\AirDog46\Downloads\processhacker-2.39-src\bin\Release64</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LibraryPath>$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;$(VC_LibraryPath_x86);$(WindowsSDK_LibraryPath_x86);$(NETFXKitsDir)Lib\um\x86;C:\Users\AirDog46\Downloads\processhacker-2.39-src\bin\Release32</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Link>
<AdditionalDependencies>WindowsCodecs.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<DelayLoadDLLs>ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<ClCompile>
<TreatWarningAsError>false</TreatWarningAsError>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Link>
<AdditionalDependencies>WindowsCodecs.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<DelayLoadDLLs>ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<ClCompile>
<TreatWarningAsError>false</TreatWarningAsError>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Link>
<AdditionalDependencies>WindowsCodecs.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<DelayLoadDLLs>ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<ClCompile>
<TreatWarningAsError>false</TreatWarningAsError>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Link>
<AdditionalDependencies>WindowsCodecs.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<DelayLoadDLLs>ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
</Link>
<ClCompile>
<TreatWarningAsError>false</TreatWarningAsError>
</ClCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="country.c" />
<ClCompile Include="main.c" />
<ClCompile Include="extra.c" />
<ClCompile Include="maxminddb.c" />
<ClCompile Include="png.c" />
<ClCompile Include="ports.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="main.h" />
<ClInclude Include="maxminddb-compat-util.h" />
<ClInclude Include="maxminddb.h" />
<ClInclude Include="maxminddb_config.h" />
<ClInclude Include="resource.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="NetExtrasPlugin.rc" />
</ItemGroup>
<ItemGroup>
<Text Include="CHANGELOG.txt" />
<Text Include="resources\licence.txt" />
</ItemGroup>
<ItemGroup>
<Image Include="resources\ad.png" />
<Image Include="resources\ae.png" />
<Image Include="resources\af.png" />
<Image Include="resources\ag.png" />
<Image Include="resources\ai.png" />
<Image Include="resources\al.png" />
<Image Include="resources\am.png" />
<Image Include="resources\an.png" />
<Image Include="resources\ao.png" />
<Image Include="resources\ar.png" />
<Image Include="resources\as.png" />
<Image Include="resources\at.png" />
<Image Include="resources\au.png" />
<Image Include="resources\aw.png" />
<Image Include="resources\ax.png" />
<Image Include="resources\az.png" />
<Image Include="resources\ba.png" />
<Image Include="resources\bb.png" />
<Image Include="resources\bd.png" />
<Image Include="resources\be.png" />
<Image Include="resources\bf.png" />
<Image Include="resources\bg.png" />
<Image Include="resources\bh.png" />
<Image Include="resources\bi.png" />
<Image Include="resources\bj.png" />
<Image Include="resources\bm.png" />
<Image Include="resources\bn.png" />
<Image Include="resources\bo.png" />
<Image Include="resources\br.png" />
<Image Include="resources\bs.png" />
<Image Include="resources\bt.png" />
<Image Include="resources\bv.png" />
<Image Include="resources\bw.png" />
<Image Include="resources\by.png" />
<Image Include="resources\bz.png" />
<Image Include="resources\ca.png" />
<Image Include="resources\catalonia.png" />
<Image Include="resources\cc.png" />
<Image Include="resources\cd.png" />
<Image Include="resources\cf.png" />
<Image Include="resources\cg.png" />
<Image Include="resources\ch.png" />
<Image Include="resources\ci.png" />
<Image Include="resources\ck.png" />
<Image Include="resources\cl.png" />
<Image Include="resources\cm.png" />
<Image Include="resources\cn.png" />
<Image Include="resources\co.png" />
<Image Include="resources\cr.png" />
<Image Include="resources\cs.png" />
<Image Include="resources\cu.png" />
<Image Include="resources\cv.png" />
<Image Include="resources\cx.png" />
<Image Include="resources\cy.png" />
<Image Include="resources\cz.png" />
<Image Include="resources\de.png" />
<Image Include="resources\dj.png" />
<Image Include="resources\dk.png" />
<Image Include="resources\dm.png" />
<Image Include="resources\do.png" />
<Image Include="resources\dz.png" />
<Image Include="resources\ec.png" />
<Image Include="resources\ee.png" />
<Image Include="resources\eg.png" />
<Image Include="resources\eh.png" />
<Image Include="resources\england.png" />
<Image Include="resources\er.png" />
<Image Include="resources\es.png" />
<Image Include="resources\et.png" />
<Image Include="resources\europeanunion.png" />
<Image Include="resources\fam.png" />
<Image Include="resources\fi.png" />
<Image Include="resources\fj.png" />
<Image Include="resources\fk.png" />
<Image Include="resources\fm.png" />
<Image Include="resources\fo.png" />
<Image Include="resources\fr.png" />
<Image Include="resources\ga.png" />
<Image Include="resources\gb.png" />
<Image Include="resources\gd.png" />
<Image Include="resources\ge.png" />
<Image Include="resources\gf.png" />
<Image Include="resources\gh.png" />
<Image Include="resources\gi.png" />
<Image Include="resources\gl.png" />
<Image Include="resources\gm.png" />
<Image Include="resources\gn.png" />
<Image Include="resources\gp.png" />
<Image Include="resources\gq.png" />
<Image Include="resources\gr.png" />
<Image Include="resources\gs.png" />
<Image Include="resources\gt.png" />
<Image Include="resources\gu.png" />
<Image Include="resources\gw.png" />
<Image Include="resources\gy.png" />
<Image Include="resources\hk.png" />
<Image Include="resources\hm.png" />
<Image Include="resources\hn.png" />
<Image Include="resources\hr.png" />
<Image Include="resources\ht.png" />
<Image Include="resources\hu.png" />
<Image Include="resources\id.png" />
<Image Include="resources\ie.png" />
<Image Include="resources\il.png" />
<Image Include="resources\in.png" />
<Image Include="resources\io.png" />
<Image Include="resources\iq.png" />
<Image Include="resources\ir.png" />
<Image Include="resources\is.png" />
<Image Include="resources\it.png" />
<Image Include="resources\jm.png" />
<Image Include="resources\jo.png" />
<Image Include="resources\jp.png" />
<Image Include="resources\ke.png" />
<Image Include="resources\kg.png" />
<Image Include="resources\kh.png" />
<Image Include="resources\ki.png" />
<Image Include="resources\km.png" />
<Image Include="resources\kn.png" />
<Image Include="resources\kp.png" />
<Image Include="resources\kr.png" />
<Image Include="resources\kw.png" />
<Image Include="resources\ky.png" />
<Image Include="resources\kz.png" />
<Image Include="resources\la.png" />
<Image Include="resources\lb.png" />
<Image Include="resources\lc.png" />
<Image Include="resources\li.png" />
<Image Include="resources\lk.png" />
<Image Include="resources\lr.png" />
<Image Include="resources\ls.png" />
<Image Include="resources\lt.png" />
<Image Include="resources\lu.png" />
<Image Include="resources\lv.png" />
<Image Include="resources\ly.png" />
<Image Include="resources\ma.png" />
<Image Include="resources\mc.png" />
<Image Include="resources\md.png" />
<Image Include="resources\me.png" />
<Image Include="resources\mg.png" />
<Image Include="resources\mh.png" />
<Image Include="resources\mk.png" />
<Image Include="resources\ml.png" />
<Image Include="resources\mm.png" />
<Image Include="resources\mn.png" />
<Image Include="resources\mo.png" />
<Image Include="resources\mp.png" />
<Image Include="resources\mq.png" />
<Image Include="resources\mr.png" />
<Image Include="resources\ms.png" />
<Image Include="resources\mt.png" />
<Image Include="resources\mu.png" />
<Image Include="resources\mv.png" />
<Image Include="resources\mw.png" />
<Image Include="resources\mx.png" />
<Image Include="resources\my.png" />
<Image Include="resources\mz.png" />
<Image Include="resources\na.png" />
<Image Include="resources\nc.png" />
<Image Include="resources\ne.png" />
<Image Include="resources\nf.png" />
<Image Include="resources\ng.png" />
<Image Include="resources\ni.png" />
<Image Include="resources\nl.png" />
<Image Include="resources\no.png" />
<Image Include="resources\np.png" />
<Image Include="resources\nr.png" />
<Image Include="resources\nu.png" />
<Image Include="resources\nz.png" />
<Image Include="resources\om.png" />
<Image Include="resources\pa.png" />
<Image Include="resources\pe.png" />
<Image Include="resources\pf.png" />
<Image Include="resources\pg.png" />
<Image Include="resources\ph.png" />
<Image Include="resources\pk.png" />
<Image Include="resources\pl.png" />
<Image Include="resources\pm.png" />
<Image Include="resources\pn.png" />
<Image Include="resources\pr.png" />
<Image Include="resources\ps.png" />
<Image Include="resources\pt.png" />
<Image Include="resources\pw.png" />
<Image Include="resources\py.png" />
<Image Include="resources\qa.png" />
<Image Include="resources\re.png" />
<Image Include="resources\ro.png" />
<Image Include="resources\rs.png" />
<Image Include="resources\ru.png" />
<Image Include="resources\rw.png" />
<Image Include="resources\sa.png" />
<Image Include="resources\sb.png" />
<Image Include="resources\sc.png" />
<Image Include="resources\scotland.png" />
<Image Include="resources\sd.png" />
<Image Include="resources\se.png" />
<Image Include="resources\sg.png" />
<Image Include="resources\sh.png" />
<Image Include="resources\si.png" />
<Image Include="resources\sj.png" />
<Image Include="resources\sk.png" />
<Image Include="resources\sl.png" />
<Image Include="resources\sm.png" />
<Image Include="resources\sn.png" />
<Image Include="resources\so.png" />
<Image Include="resources\sr.png" />
<Image Include="resources\st.png" />
<Image Include="resources\sv.png" />
<Image Include="resources\sy.png" />
<Image Include="resources\sz.png" />
<Image Include="resources\tc.png" />
<Image Include="resources\td.png" />
<Image Include="resources\tf.png" />
<Image Include="resources\tg.png" />
<Image Include="resources\th.png" />
<Image Include="resources\tj.png" />
<Image Include="resources\tk.png" />
<Image Include="resources\tl.png" />
<Image Include="resources\tm.png" />
<Image Include="resources\tn.png" />
<Image Include="resources\to.png" />
<Image Include="resources\tr.png" />
<Image Include="resources\tt.png" />
<Image Include="resources\tv.png" />
<Image Include="resources\tw.png" />
<Image Include="resources\tz.png" />
<Image Include="resources\ua.png" />
<Image Include="resources\ug.png" />
<Image Include="resources\um.png" />
<Image Include="resources\us.png" />
<Image Include="resources\uy.png" />
<Image Include="resources\uz.png" />
<Image Include="resources\va.png" />
<Image Include="resources\vc.png" />
<Image Include="resources\ve.png" />
<Image Include="resources\vg.png" />
<Image Include="resources\vi.png" />
<Image Include="resources\vn.png" />
<Image Include="resources\vu.png" />
<Image Include="resources\wales.png" />
<Image Include="resources\wf.png" />
<Image Include="resources\ws.png" />
<Image Include="resources\ye.png" />
<Image Include="resources\yt.png" />
<Image Include="resources\za.png" />
<Image Include="resources\zm.png" />
<Image Include="resources\zw.png" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
</Project>

View File

@@ -0,0 +1,814 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClInclude Include="main.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="resource.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="maxminddb.h">
<Filter>Header Files\maxminddb</Filter>
</ClInclude>
<ClInclude Include="maxminddb_config.h">
<Filter>Header Files\maxminddb</Filter>
</ClInclude>
<ClInclude Include="maxminddb-compat-util.h">
<Filter>Header Files\maxminddb</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="Header Files">
<UniqueIdentifier>{f016dd0f-55a7-4710-b96e-233df3940081}</UniqueIdentifier>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{8f9f7140-8e74-4f4c-bd2e-e18ce8633914}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{9dc309ac-a574-4615-b42f-421e0207238b}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\maxminddb">
<UniqueIdentifier>{8a8c1d78-2fe6-452d-8dd6-fff1ee982001}</UniqueIdentifier>
</Filter>
<Filter Include="Header Files\maxminddb">
<UniqueIdentifier>{db470705-8b61-4e5f-b0a7-e4e9a847ff43}</UniqueIdentifier>
</Filter>
<Filter Include="Resource Files\Images">
<UniqueIdentifier>{675b6a82-6895-4512-86fc-e00583505b6e}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="ports.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="extra.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="maxminddb.c">
<Filter>Source Files\maxminddb</Filter>
</ClCompile>
<ClCompile Include="country.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="png.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Text Include="CHANGELOG.txt" />
<Text Include="resources\licence.txt">
<Filter>Resource Files</Filter>
</Text>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="NetExtrasPlugin.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<Image Include="resources\ad.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ae.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\af.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ag.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ai.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\al.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\am.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\an.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ao.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ar.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\as.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\at.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\au.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\aw.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ax.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\az.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ba.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bb.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bd.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\be.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bf.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bh.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bi.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bj.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bo.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\br.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bs.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bt.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bv.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bw.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\by.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\bz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ca.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\catalonia.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cc.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cd.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cf.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ch.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cs.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cu.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cv.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cx.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cy.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\de.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\dj.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\dk.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\dm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\do.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\dz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ec.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ee.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\eg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\eh.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\england.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\er.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\es.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\et.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\europeanunion.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\fam.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\fi.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\fj.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\fk.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\fm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\fo.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\fr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ga.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gb.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gd.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ge.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gf.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gh.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gi.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gl.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gp.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gq.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gs.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gt.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gu.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gw.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\gy.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\hk.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\hm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\hn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\hr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ht.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\hu.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\id.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ie.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\il.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\in.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\io.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\iq.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ir.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\is.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\it.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\jm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\jo.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\jp.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ke.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\kg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\kh.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ki.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\km.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\kn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\kp.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\kr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\kw.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ky.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\kz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\la.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\lb.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\lc.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\li.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ci.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ck.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cl.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\cn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\co.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\lk.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\lr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ls.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\lt.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\lu.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\lv.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ly.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ma.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mc.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\md.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\me.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mh.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mk.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ml.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mo.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mp.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mq.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ms.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mt.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mu.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mv.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mw.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mx.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\my.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\mz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\na.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\nc.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ne.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\nf.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ng.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ni.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\nl.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\no.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\np.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\nr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\nu.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\nz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\om.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pa.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pe.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pf.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ph.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pk.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pl.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ps.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pt.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\pw.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\py.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\qa.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\re.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ro.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\rs.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ru.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\rw.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sa.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sb.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sc.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\scotland.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sd.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\se.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sh.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\si.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sj.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sk.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sl.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\so.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\st.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sv.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sy.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\sz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tc.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\td.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tf.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\th.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tj.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tk.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tl.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\to.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tr.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tt.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tv.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tw.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\tz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ua.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ug.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\um.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\us.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\uy.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\uz.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\va.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\vc.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ve.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\vg.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\vi.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\vn.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\vu.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\wales.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\wf.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ws.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\ye.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\yt.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\za.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\zm.png">
<Filter>Resource Files\Images</Filter>
</Image>
<Image Include="resources\zw.png">
<Filter>Resource Files\Images</Filter>
</Image>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,189 @@
/*
* Process Hacker Extra Plugins -
* Network Extras Plugin
*
* Copyright (C) 2016 dmex
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see <http://www.gnu.org/licenses/>.
*/
#include "main.h"
#include "maxminddb.h"
BOOLEAN GeoDbLoaded = FALSE;
static MMDB_s GeoDb = { 0 };
// Copied from mstcpip.h (due to PH-SDK conflicts).
// Note: Ipv6 versions are already available from ws2ipdef.h and did not need copying.
#define INADDR_ANY (ULONG)0x00000000
#define INADDR_LOOPBACK 0x7f000001
FORCEINLINE
BOOLEAN
IN4_IS_ADDR_UNSPECIFIED(_In_ CONST IN_ADDR *a)
{
return (BOOLEAN)(a->s_addr == INADDR_ANY);
}
FORCEINLINE
BOOLEAN
IN4_IS_ADDR_LOOPBACK(_In_ CONST IN_ADDR *a)
{
return (BOOLEAN)(*((PUCHAR)a) == 0x7f); // 127/8
}
// end copy from mstcpip.h
VOID LoadGeoLiteDb(VOID)
{
PPH_STRING directory;
PPH_STRING path;
directory = PH_AUTO(PhGetApplicationDirectory());
path = PhaCreateString(DATABASE_PATH);
path = PH_AUTO(PhConcatStringRef2(&directory->sr, &path->sr));
if (MMDB_open(path->Buffer, MMDB_MODE_MMAP, &GeoDb) == MMDB_SUCCESS)
{
time_t systemTime;
// Query the current time
time(&systemTime);
// Check if the Geoip database is older than 6 months (182 days = approx. 6 months).
if ((systemTime - GeoDb.metadata.build_epoch) > (182 * 24 * 60 * 60))
{
// TODO: Warn about old database...
}
if (GeoDb.metadata.ip_version == 6)
{
// Database includes ipv6 entires.
}
GeoDbLoaded = TRUE;
}
}
VOID FreeGeoLiteDb(VOID)
{
if (GeoDbLoaded)
{
MMDB_close(&GeoDb);
}
}
BOOLEAN LookupCountryCode(
_In_ PH_IP_ADDRESS RemoteAddress,
_Out_ PPH_STRING* CountryCode,
_Out_ PPH_STRING* CountryName
)
{
PPH_STRING countryCode = NULL;
PPH_STRING countryName = NULL;
MMDB_entry_data_s mmdb_entry;
MMDB_lookup_result_s mmdb_lookup;
INT mmdb_error = 0;
if (!GeoDbLoaded)
return FALSE;
if (RemoteAddress.Type == PH_IPV4_NETWORK_TYPE)
{
SOCKADDR_IN ipv4SockAddr;
if (IN4_IS_ADDR_UNSPECIFIED(&RemoteAddress.InAddr))
return FALSE;
if (IN4_IS_ADDR_LOOPBACK(&RemoteAddress.InAddr))
return FALSE;
memset(&ipv4SockAddr, 0, sizeof(SOCKADDR_IN));
memset(&mmdb_lookup, 0, sizeof(MMDB_lookup_result_s));
ipv4SockAddr.sin_family = AF_INET;
ipv4SockAddr.sin_addr = RemoteAddress.InAddr;
mmdb_lookup = MMDB_lookup_sockaddr(
&GeoDb,
(struct sockaddr*)&ipv4SockAddr,
&mmdb_error
);
}
else
{
SOCKADDR_IN6 ipv6SockAddr;
if (IN6_IS_ADDR_UNSPECIFIED(&RemoteAddress.In6Addr))
return FALSE;
if (IN6_IS_ADDR_LOOPBACK(&RemoteAddress.In6Addr))
return FALSE;
memset(&ipv6SockAddr, 0, sizeof(SOCKADDR_IN6));
memset(&mmdb_lookup, 0, sizeof(MMDB_lookup_result_s));
ipv6SockAddr.sin6_family = AF_INET6;
ipv6SockAddr.sin6_addr = RemoteAddress.In6Addr;
mmdb_lookup = MMDB_lookup_sockaddr(
&GeoDb,
(struct sockaddr*)&ipv6SockAddr,
&mmdb_error
);
}
if (mmdb_error == 0 && mmdb_lookup.found_entry)
{
memset(&mmdb_entry, 0, sizeof(MMDB_entry_data_s));
if (MMDB_get_value(&mmdb_lookup.entry, &mmdb_entry, "country", "iso_code", NULL) == MMDB_SUCCESS)
{
if (mmdb_entry.has_data && mmdb_entry.type == MMDB_DATA_TYPE_UTF8_STRING)
{
countryCode = PhConvertUtf8ToUtf16Ex((PCHAR)mmdb_entry.utf8_string, mmdb_entry.data_size);
}
}
if (MMDB_get_value(&mmdb_lookup.entry, &mmdb_entry, "country", "names", "en", NULL) == MMDB_SUCCESS)
{
if (mmdb_entry.has_data && mmdb_entry.type == MMDB_DATA_TYPE_UTF8_STRING)
{
countryName = PhConvertUtf8ToUtf16Ex((PCHAR)mmdb_entry.utf8_string, mmdb_entry.data_size);
}
}
}
if (countryCode && countryName)
{
*CountryCode = countryCode;
*CountryName = countryName;
return TRUE;
}
if (countryCode)
{
PhDereferenceObject(countryCode);
}
if (countryName)
{
PhDereferenceObject(countryName);
}
return FALSE;
}

View File

@@ -0,0 +1,91 @@
/*
* Process Hacker Extra Plugins -
* Network Extras Plugin
*
* Copyright (C) 2015 dmex
* Copyright (C) 2015 TETYYS
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see <http://www.gnu.org/licenses/>.
*/
#include "main.h"
VOID UpdateNetworkNode(
_In_ NETWORK_COLUMN_ID ColumnID,
_In_ PPH_NETWORK_NODE Node,
_In_ PNETWORK_EXTENSION Extension
)
{
switch (ColumnID)
{
case NETWORK_COLUMN_ID_LOCAL_SERVICE:
{
if (!Extension->LocalValid)
{
//PH_STRING_BUILDER stringBuilder;
//PhInitializeStringBuilder(&stringBuilder, 24);
for (ULONG x = 0; x < ARRAYSIZE(ResolvedPortsTable); x++)
{
if (Node->NetworkItem->LocalEndpoint.Port == ResolvedPortsTable[x].Port)
{
//PhAppendFormatStringBuilder(&stringBuilder, L"%s,", ResolvedPortsTable[x].Name);
PhSwapReference(&Extension->LocalServiceName, PhCreateString(ResolvedPortsTable[x].Name));
break;
}
}
//if (stringBuilder.String->Length != 0)
// PhRemoveEndStringBuilder(&stringBuilder, 1);
//PhSwapReference(&Extension->LocalServiceName, PhFinalStringBuilderString(&stringBuilder));
Extension->LocalValid = TRUE;
}
}
break;
case NETWORK_COLUMN_ID_REMOTE_SERVICE:
{
if (!Extension->RemoteValid)
{
//PH_STRING_BUILDER stringBuilder;
//PhInitializeStringBuilder(&stringBuilder, 24);
for (ULONG x = 0; x < ARRAYSIZE(ResolvedPortsTable); x++)
{
if (Node->NetworkItem->RemoteEndpoint.Port == ResolvedPortsTable[x].Port)
{
//PhAppendFormatStringBuilder(&stringBuilder, L"%s,", ResolvedPortsTable[x].Name);
PhSwapReference(&Extension->RemoteServiceName, PhCreateString(ResolvedPortsTable[x].Name));
break;
}
}
//if (stringBuilder.String->Length != 0)
// PhRemoveEndStringBuilder(&stringBuilder, 1);
//PhSwapReference(&Extension->RemoteServiceName, PhFinalStringBuilderString(&stringBuilder));
Extension->RemoteValid = TRUE;
}
}
break;
}
}

View File

@@ -0,0 +1,347 @@
/*
* Process Hacker Extra Plugins -
* Network Extras Plugin
*
* Copyright (C) 2015 dmex
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see <http://www.gnu.org/licenses/>.
*/
#include "main.h"
PPH_PLUGIN PluginInstance = NULL;
static PH_CALLBACK_REGISTRATION PluginLoadCallbackRegistration;
static PH_CALLBACK_REGISTRATION PluginUnloadCallbackRegistration;
static PH_CALLBACK_REGISTRATION NetworkTreeNewInitializingCallbackRegistration;
static PH_CALLBACK_REGISTRATION TreeNewMessageCallbackRegistration;
static HWND NetworkTreeNewHandle = NULL;
static LONG NTAPI NetworkServiceSortFunction(
_In_ PVOID Node1,
_In_ PVOID Node2,
_In_ ULONG SubId,
_In_ PVOID Context
)
{
PPH_NETWORK_NODE node1 = Node1;
PPH_NETWORK_NODE node2 = Node2;
PNETWORK_EXTENSION extension1 = PhPluginGetObjectExtension(PluginInstance, node1->NetworkItem, EmNetworkItemType);
PNETWORK_EXTENSION extension2 = PhPluginGetObjectExtension(PluginInstance, node2->NetworkItem, EmNetworkItemType);
UpdateNetworkNode(SubId, node1, extension1);
UpdateNetworkNode(SubId, node2, extension2);
switch (SubId)
{
case NETWORK_COLUMN_ID_LOCAL_SERVICE:
return PhCompareStringWithNull(extension1->LocalServiceName, extension2->LocalServiceName, TRUE);
case NETWORK_COLUMN_ID_REMOTE_SERVICE:
return PhCompareStringWithNull(extension1->RemoteServiceName, extension2->RemoteServiceName, TRUE);
case NETWORK_COLUMN_ID_REMOTE_COUNTRY:
return PhCompareStringWithNull(extension1->RemoteCountryCode, extension2->RemoteCountryCode, TRUE);
}
return 0;
}
VOID NTAPI LoadCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
{
LoadGeoLiteDb();
}
VOID NTAPI UnloadCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
{
NOTHING;
}
VOID NTAPI NetworkTreeNewInitializingCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
{
PPH_PLUGIN_TREENEW_INFORMATION info = Parameter;
PH_TREENEW_COLUMN column;
*(HWND*)Context = info->TreeNewHandle;
memset(&column, 0, sizeof(PH_TREENEW_COLUMN));
column.Text = L"Local Service";
column.Width = 140;
column.Alignment = PH_ALIGN_LEFT;
PhPluginAddTreeNewColumn(PluginInstance, info->CmData, &column, NETWORK_COLUMN_ID_LOCAL_SERVICE, NULL, NetworkServiceSortFunction);
memset(&column, 0, sizeof(PH_TREENEW_COLUMN));
column.Text = L"Remote Service";
column.Width = 140;
column.Alignment = PH_ALIGN_LEFT;
PhPluginAddTreeNewColumn(PluginInstance, info->CmData, &column, NETWORK_COLUMN_ID_REMOTE_SERVICE, NULL, NetworkServiceSortFunction);
memset(&column, 0, sizeof(PH_TREENEW_COLUMN));
column.Text = L"Country";
column.Width = 140;
column.Alignment = PH_ALIGN_LEFT;
column.CustomDraw = TRUE; // Owner-draw this column to show country flags
PhPluginAddTreeNewColumn(PluginInstance, info->CmData, &column, NETWORK_COLUMN_ID_REMOTE_COUNTRY, NULL, NetworkServiceSortFunction);
}
VOID NTAPI NetworkItemCreateCallback(
_In_ PVOID Object,
_In_ PH_EM_OBJECT_TYPE ObjectType,
_In_ PVOID Extension
)
{
//PPH_NETWORK_ITEM networkItem = Object;
PNETWORK_EXTENSION extension = Extension;
memset(extension, 0, sizeof(NETWORK_EXTENSION));
}
VOID NTAPI NetworkItemDeleteCallback(
_In_ PVOID Object,
_In_ PH_EM_OBJECT_TYPE ObjectType,
_In_ PVOID Extension
)
{
//PPH_NETWORK_ITEM networkItem = Object;
PNETWORK_EXTENSION extension = Extension;
PhClearReference(&extension->LocalServiceName);
PhClearReference(&extension->RemoteServiceName);
PhClearReference(&extension->RemoteCountryCode);
PhClearReference(&extension->RemoteCountryName);
if (extension->CountryIcon)
DestroyIcon(extension->CountryIcon);
}
VOID NTAPI NetworkNodeCreateCallback(
_In_ PVOID Object,
_In_ PH_EM_OBJECT_TYPE ObjectType,
_In_ PVOID Extension
)
{
PPH_NETWORK_NODE networkNode = Object;
PNETWORK_EXTENSION extension = PhPluginGetObjectExtension(PluginInstance, networkNode->NetworkItem, EmNetworkItemType);
// Update the country data for this connection
if (!extension->CountryValid)
{
PPH_STRING remoteCountryCode;
PPH_STRING remoteCountryName;
if (LookupCountryCode(networkNode->NetworkItem->RemoteEndpoint.Address, &remoteCountryCode, &remoteCountryName))
{
PhSwapReference(&extension->RemoteCountryCode, remoteCountryCode);
PhSwapReference(&extension->RemoteCountryName, remoteCountryName);
}
extension->CountryValid = TRUE;
}
}
VOID NTAPI TreeNewMessageCallback(
_In_opt_ PVOID Parameter,
_In_opt_ PVOID Context
)
{
PPH_PLUGIN_TREENEW_MESSAGE message = Parameter;
switch (message->Message)
{
case TreeNewGetCellText:
{
if (message->TreeNewHandle == NetworkTreeNewHandle)
{
PPH_TREENEW_GET_CELL_TEXT getCellText = message->Parameter1;
PPH_NETWORK_NODE networkNode = (PPH_NETWORK_NODE)getCellText->Node;
PNETWORK_EXTENSION extension = PhPluginGetObjectExtension(PluginInstance, networkNode->NetworkItem, EmNetworkItemType);
UpdateNetworkNode(message->SubId, networkNode, extension);
switch (message->SubId)
{
case NETWORK_COLUMN_ID_LOCAL_SERVICE:
getCellText->Text = PhGetStringRef(extension->LocalServiceName);
break;
case NETWORK_COLUMN_ID_REMOTE_SERVICE:
getCellText->Text = PhGetStringRef(extension->RemoteServiceName);
break;
}
}
}
break;
case TreeNewCustomDraw:
{
PPH_TREENEW_CUSTOM_DRAW customDraw = message->Parameter1;
PPH_NETWORK_NODE networkNode = (PPH_NETWORK_NODE)customDraw->Node;
PNETWORK_EXTENSION extension = PhPluginGetObjectExtension(PluginInstance, networkNode->NetworkItem, EmNetworkItemType);
HDC hdc = customDraw->Dc;
RECT rect = customDraw->CellRect;
// Check if this is the country column
if (message->SubId != NETWORK_COLUMN_ID_REMOTE_COUNTRY)
break;
// Check if there's something to draw
if (rect.right - rect.left <= 1)
{
// nothing to draw
break;
}
// Padding
rect.left += 5;
// Draw the column data
if (GeoDbLoaded && extension->RemoteCountryCode && extension->RemoteCountryName)
{
if (!extension->CountryIcon)
{
HBITMAP countryBitmap;
if (countryBitmap = LoadImageFromResources(16, 11, extension->RemoteCountryCode))
{
HDC screenDc = CreateIC(L"DISPLAY", NULL, NULL, NULL);
HBITMAP screenBitmap = CreateCompatibleBitmap(screenDc, 16, 11);
ICONINFO iconInfo = { 0 };
iconInfo.fIcon = TRUE;
iconInfo.hbmColor = countryBitmap;
iconInfo.hbmMask = screenBitmap;
extension->CountryIcon = CreateIconIndirect(&iconInfo);
DeleteObject(screenBitmap);
DeleteDC(screenDc);
DeleteObject(countryBitmap);
}
}
if (extension->CountryIcon)
{
DrawIconEx(
hdc,
rect.left,
rect.top + ((rect.bottom - rect.top) - 11) / 2,
extension->CountryIcon,
16,
11,
0,
NULL,
DI_NORMAL
);
rect.left += 16 + 2;
}
DrawText(
hdc,
extension->RemoteCountryName->Buffer,
(INT)extension->RemoteCountryName->Length / 2,
&rect,
DT_LEFT | DT_VCENTER | DT_SINGLELINE
);
}
if (!GeoDbLoaded)
{
DrawText(
hdc,
L"Geoip database error.",
-1,
&rect,
DT_LEFT | DT_VCENTER | DT_SINGLELINE
);
}
}
break;
}
}
LOGICAL DllMain(
_In_ HINSTANCE Instance,
_In_ ULONG Reason,
_Reserved_ PVOID Reserved
)
{
switch (Reason)
{
case DLL_PROCESS_ATTACH:
{
PPH_PLUGIN_INFORMATION info;
PluginInstance = PhRegisterPlugin(PLUGIN_NAME, Instance, &info);
if (!PluginInstance)
return FALSE;
info->DisplayName = L"Network Extras";
info->Author = L"dmex";
info->Description = L"Plugin for extra network information.";
info->HasOptions = FALSE;
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackLoad),
LoadCallback,
NULL,
&PluginLoadCallbackRegistration
);
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackUnload),
UnloadCallback,
NULL,
&PluginUnloadCallbackRegistration
);
PhRegisterCallback(
PhGetGeneralCallback(GeneralCallbackNetworkTreeNewInitializing),
NetworkTreeNewInitializingCallback,
&NetworkTreeNewHandle,
&NetworkTreeNewInitializingCallbackRegistration
);
PhRegisterCallback(
PhGetPluginCallback(PluginInstance, PluginCallbackTreeNewMessage),
TreeNewMessageCallback,
NULL,
&TreeNewMessageCallbackRegistration
);
PhPluginSetObjectExtension(
PluginInstance,
EmNetworkItemType,
sizeof(NETWORK_EXTENSION),
NetworkItemCreateCallback,
NetworkItemDeleteCallback
);
PhPluginSetObjectExtension(
PluginInstance,
EmNetworkNodeType,
sizeof(NETWORK_EXTENSION),
NetworkNodeCreateCallback,
NULL
);
}
break;
}
return TRUE;
}

View File

@@ -0,0 +1,95 @@
/*
* Process Hacker Extra Plugins -
* Network Extras Plugin
*
* Copyright (C) 2015 dmex
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _EXTRA_H_
#define _EXTRA_H_
#define PLUGIN_NAME L"dmex.NetworkExtrasPlugin"
#define DATABASE_PATH L"plugins\\plugindata\\GeoLite2-Country.mmdb"
#define CINTERFACE
#define COBJMACROS
#include <phdk.h>
#include <phappresource.h>
#include <workqueue.h>
#include <wincodec.h>
#include <time.h>
#include "resource.h"
typedef struct _NETWORK_EXTRA_CONTEXT
{
PH_LAYOUT_MANAGER LayoutManager;
} NETWORK_EXTRA_CONTEXT, *PNETWORK_EXTRA_CONTEXT;
typedef struct _NETWORK_EXTENSION
{
BOOLEAN LocalValid;
BOOLEAN RemoteValid;
BOOLEAN CountryValid;
PPH_STRING LocalServiceName;
PPH_STRING RemoteServiceName;
HICON CountryIcon;
PPH_STRING RemoteCountryCode;
PPH_STRING RemoteCountryName;
} NETWORK_EXTENSION, *PNETWORK_EXTENSION;
typedef enum _NETWORK_COLUMN_ID
{
NETWORK_COLUMN_ID_LOCAL_SERVICE = 1,
NETWORK_COLUMN_ID_REMOTE_SERVICE = 2,
NETWORK_COLUMN_ID_REMOTE_COUNTRY = 3,
} NETWORK_COLUMN_ID;
typedef struct _RESOLVED_PORT
{
PWSTR Name;
USHORT Port;
} RESOLVED_PORT;
extern PPH_PLUGIN PluginInstance;
extern RESOLVED_PORT ResolvedPortsTable[6265];
extern BOOLEAN GeoDbLoaded;
HBITMAP LoadImageFromResources(
_In_ UINT Width,
_In_ UINT Height,
_In_ PPH_STRING Name
);
VOID UpdateNetworkNode(
_In_ NETWORK_COLUMN_ID ColumnID,
_In_ PPH_NETWORK_NODE Node,
_In_ PNETWORK_EXTENSION Extension
);
VOID LoadGeoLiteDb(VOID);
VOID FreeGeoLiteDb(VOID);
BOOLEAN LookupCountryCode(
_In_ PH_IP_ADDRESS RemoteAddress,
_Out_ PPH_STRING* CountryCode,
_Out_ PPH_STRING* CountryName
);
#endif

View File

@@ -0,0 +1,167 @@
#include <stdlib.h>
#include <string.h>
/* *INDENT-OFF* */
/* The memmem, strdup, and strndup functions were all copied from the
* FreeBSD source, along with the relevant copyright notice.
*
* It'd be nicer to simply use the functions available on the system if they
* exist, but there doesn't seem to be a good way to detect them without also
* defining things like _GNU_SOURCE, which we want to avoid, because then we
* end up _accidentally_ using GNU features without noticing, which then
* breaks on systems like OSX.
*
* C is fun! */
/* Applies to memmem implementation */
/*-
* Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
static void *
mmdb_memmem(const void *l, size_t l_len, const void *s, size_t s_len)
{
register char *cur, *last;
const char *cl = (const char *)l;
const char *cs = (const char *)s;
/* we need something to compare */
if (l_len == 0 || s_len == 0)
return NULL;
/* "s" must be smaller or equal to "l" */
if (l_len < s_len)
return NULL;
/* special case where s_len == 1 */
if (s_len == 1)
return memchr(l, (int)*cs, l_len);
/* the last position where its possible to find "s" in "l" */
last = (char *)cl + l_len - s_len;
for (cur = (char *)cl; cur <= last; cur++)
if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
return cur;
return NULL;
}
/* Applies to strnlen implementation */
/*-
* Copyright (c) 2009 David Schultz <das@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
static size_t
mmdb_strnlen(const char *s, size_t maxlen)
{
size_t len;
for (len = 0; len < maxlen; len++, s++) {
if (!*s)
break;
}
return (len);
}
/* Applies to strdup and strndup implementation */
/*
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
static char *
mmdb_strdup(const char *str)
{
size_t len;
char *copy;
len = strlen(str) + 1;
if ((copy = malloc(len)) == NULL)
return (NULL);
memcpy(copy, str, len);
return (copy);
}
static char *
mmdb_strndup(const char *str, size_t n)
{
size_t len;
char *copy;
len = mmdb_strnlen(str, n);
if ((copy = malloc(len + 1)) == NULL)
return (NULL);
memcpy(copy, str, len);
copy[len] = '\0';
return (copy);
}
/* *INDENT-ON* */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,232 @@
#ifdef __cplusplus
extern "C" {
#endif
#ifndef MAXMINDDB_H
#define MAXMINDDB_H
#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200112L
#endif
#include "maxminddb_config.h"
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/types.h>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
/* libmaxminddb package version from configure */
#define PACKAGE_VERSION "1.2.0"
typedef ADDRESS_FAMILY sa_family_t;
#if defined(_MSC_VER)
/* MSVC doesn't define signed size_t, copy it from configure */
#define ssize_t int
/* MSVC doesn't support restricted pointers */
#define restrict
#endif
#else
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#endif
#define MMDB_DATA_TYPE_EXTENDED (0)
#define MMDB_DATA_TYPE_POINTER (1)
#define MMDB_DATA_TYPE_UTF8_STRING (2)
#define MMDB_DATA_TYPE_DOUBLE (3)
#define MMDB_DATA_TYPE_BYTES (4)
#define MMDB_DATA_TYPE_UINT16 (5)
#define MMDB_DATA_TYPE_UINT32 (6)
#define MMDB_DATA_TYPE_MAP (7)
#define MMDB_DATA_TYPE_INT32 (8)
#define MMDB_DATA_TYPE_UINT64 (9)
#define MMDB_DATA_TYPE_UINT128 (10)
#define MMDB_DATA_TYPE_ARRAY (11)
#define MMDB_DATA_TYPE_CONTAINER (12)
#define MMDB_DATA_TYPE_END_MARKER (13)
#define MMDB_DATA_TYPE_BOOLEAN (14)
#define MMDB_DATA_TYPE_FLOAT (15)
#define MMDB_RECORD_TYPE_SEARCH_NODE (0)
#define MMDB_RECORD_TYPE_EMPTY (1)
#define MMDB_RECORD_TYPE_DATA (2)
#define MMDB_RECORD_TYPE_INVALID (3)
/* flags for open */
#define MMDB_MODE_MMAP (1)
#define MMDB_MODE_MASK (7)
/* error codes */
#define MMDB_SUCCESS (0)
#define MMDB_FILE_OPEN_ERROR (1)
#define MMDB_CORRUPT_SEARCH_TREE_ERROR (2)
#define MMDB_INVALID_METADATA_ERROR (3)
#define MMDB_IO_ERROR (4)
#define MMDB_OUT_OF_MEMORY_ERROR (5)
#define MMDB_UNKNOWN_DATABASE_FORMAT_ERROR (6)
#define MMDB_INVALID_DATA_ERROR (7)
#define MMDB_INVALID_LOOKUP_PATH_ERROR (8)
#define MMDB_LOOKUP_PATH_DOES_NOT_MATCH_DATA_ERROR (9)
#define MMDB_INVALID_NODE_NUMBER_ERROR (10)
#define MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR (11)
#if !(MMDB_UINT128_IS_BYTE_ARRAY)
#if MMDB_UINT128_USING_MODE
typedef unsigned int mmdb_uint128_t __attribute__ ((__mode__(TI)));
#else
typedef unsigned __int128 mmdb_uint128_t;
#endif
#endif
/* This is a pointer into the data section for a given IP address lookup */
typedef struct MMDB_entry_s {
struct MMDB_s *mmdb;
uint32_t offset;
} MMDB_entry_s;
typedef struct MMDB_lookup_result_s {
bool found_entry;
MMDB_entry_s entry;
uint16_t netmask;
} MMDB_lookup_result_s;
typedef struct MMDB_entry_data_s {
bool has_data;
union {
uint32_t pointer;
const char *utf8_string;
double double_value;
const uint8_t *bytes;
uint16_t uint16;
uint32_t uint32;
int32_t int32;
uint64_t uint64;
#if MMDB_UINT128_IS_BYTE_ARRAY
uint8_t uint128[16];
#else
mmdb_uint128_t uint128;
#endif
bool boolean;
float float_value;
};
/* This is a 0 if a given entry cannot be found. This can only happen
* when a call to MMDB_(v)get_value() asks for hash keys or array
* indices that don't exist. */
uint32_t offset;
/* This is the next entry in the data section, but it's really only
* relevant for entries that part of a larger map or array
* struct. There's no good reason for an end user to look at this
* directly. */
uint32_t offset_to_next;
/* This is only valid for strings, utf8_strings or binary data */
uint32_t data_size;
/* This is an MMDB_DATA_TYPE_* constant */
uint32_t type;
} MMDB_entry_data_s;
/* This is the return type when someone asks for all the entry data in a map or array */
typedef struct MMDB_entry_data_list_s {
MMDB_entry_data_s entry_data;
struct MMDB_entry_data_list_s *next;
} MMDB_entry_data_list_s;
typedef struct MMDB_description_s {
const char *language;
const char *description;
} MMDB_description_s;
typedef struct MMDB_metadata_s {
uint32_t node_count;
uint16_t record_size;
uint16_t ip_version;
const char *database_type;
struct {
size_t count;
const char **names;
} languages;
uint16_t binary_format_major_version;
uint16_t binary_format_minor_version;
uint64_t build_epoch;
struct {
size_t count;
MMDB_description_s **descriptions;
} description;
} MMDB_metadata_s;
typedef struct MMDB_ipv4_start_node_s {
uint16_t netmask;
uint32_t node_value;
} MMDB_ipv4_start_node_s;
typedef struct MMDB_s {
uint32_t flags;
const wchar_t* filename;
ssize_t file_size;
const uint8_t *file_content;
const uint8_t *data_section;
uint32_t data_section_size;
const uint8_t *metadata_section;
uint32_t metadata_section_size;
uint16_t full_record_byte_size;
uint16_t depth;
MMDB_ipv4_start_node_s ipv4_start_node;
MMDB_metadata_s metadata;
} MMDB_s;
typedef struct MMDB_search_node_s {
uint64_t left_record;
uint64_t right_record;
uint8_t left_record_type;
uint8_t right_record_type;
MMDB_entry_s left_record_entry;
MMDB_entry_s right_record_entry;
} MMDB_search_node_s;
/* *INDENT-OFF* */
/* --prototypes automatically generated by dev-bin/regen-prototypes.pl - don't remove this comment */
extern int MMDB_open(const wchar_t *const filename, uint32_t flags, MMDB_s *const mmdb);
extern MMDB_lookup_result_s MMDB_lookup_string(MMDB_s *const mmdb,
const char *const ipstr,
int *const gai_error,
int *const mmdb_error);
extern MMDB_lookup_result_s MMDB_lookup_sockaddr(
MMDB_s *const mmdb,
const struct sockaddr *const sockaddr,
int *const mmdb_error);
extern int MMDB_read_node(MMDB_s *const mmdb, uint32_t node_number,
MMDB_search_node_s *const node);
extern int MMDB_get_value(MMDB_entry_s *const start,
MMDB_entry_data_s *const entry_data,
...);
extern int MMDB_vget_value(MMDB_entry_s *const start,
MMDB_entry_data_s *const entry_data,
va_list va_path);
extern int MMDB_aget_value(MMDB_entry_s *const start,
MMDB_entry_data_s *const entry_data,
const char *const *const path);
extern int MMDB_get_metadata_as_entry_data_list(
MMDB_s *const mmdb, MMDB_entry_data_list_s **const entry_data_list);
extern int MMDB_get_entry_data_list(
MMDB_entry_s *start, MMDB_entry_data_list_s **const entry_data_list);
extern void MMDB_free_entry_data_list(MMDB_entry_data_list_s *const entry_data_list);
extern void MMDB_close(MMDB_s *const mmdb);
extern const char *MMDB_lib_version(void);
extern int MMDB_dump_entry_data_list(FILE *const stream,
MMDB_entry_data_list_s *const entry_data_list,
int indent);
extern const char *MMDB_strerror(int error_code);
/* --prototypes end - don't remove this comment-- */
/* *INDENT-ON* */
#endif /* MAXMINDDB_H */
#ifdef __cplusplus
}
#endif

View File

@@ -0,0 +1,14 @@
#ifndef MAXMINDDB_CONFIG_H
#define MAXMINDDB_CONFIG_H
#ifndef MMDB_UINT128_USING_MODE
/* Define as 1 if we we use unsigned int __atribute__ ((__mode__(TI))) for uint128 values */
#define MMDB_UINT128_USING_MODE 0
#endif
#ifndef MMDB_UINT128_IS_BYTE_ARRAY
/* Define as 1 if we don't have an unsigned __int128 type */
#define MMDB_UINT128_IS_BYTE_ARRAY 1
#endif
#endif /* MAXMINDDB_CONFIG_H */

View File

@@ -0,0 +1,496 @@
/*
* Process Hacker Extra Plugins -
* Network Extras Plugin
*
* Copyright (C) 2016 dmex
*
* This file is part of Process Hacker.
*
* Process Hacker is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Process Hacker is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Process Hacker. If not, see <http://www.gnu.org/licenses/>.
*/
#include "main.h"
struct
{
PWSTR CountryCode;
INT ResourceID;
}
CountryResourceTable[] =
{
{ L"AD", AD_PNG },
{ L"AE", AE_PNG },
{ L"AF", AF_PNG },
{ L"AG", AG_PNG },
{ L"AI", AI_PNG },
{ L"AL", AL_PNG },
{ L"AM", AM_PNG },
{ L"AN", AN_PNG },
{ L"AO", AO_PNG },
{ L"AR", AR_PNG },
{ L"AS", AS_PNG },
{ L"AT", AT_PNG },
{ L"AU", AU_PNG },
{ L"AW", AW_PNG },
{ L"AX", AX_PNG },
{ L"AZ", AZ_PNG },
{ L"BA", BA_PNG },
{ L"BB", BB_PNG },
{ L"BD", BD_PNG },
{ L"BE", BE_PNG },
{ L"BF", BF_PNG },
{ L"BG", BG_PNG },
{ L"BH", BH_PNG },
{ L"BI", BI__PNG },
{ L"BJ", BJ_PNG },
{ L"BM", BM_PNG },
{ L"BN", BN_PNG },
{ L"BO", BO_PNG },
{ L"BR", BR_PNG },
{ L"BS", BS_PNG },
{ L"BT", BT_PNG },
{ L"BV", BV_PNG },
{ L"BW", BW_PNG },
{ L"BY", BY_PNG },
{ L"BZ", BZ_PNG },
{ L"CA", CA_PNG },
{ L"CC", CC_PNG },
{ L"CD", CD_PNG },
{ L"CF", CF_PNG },
{ L"CG", CG_PNG },
{ L"CH", CH_PNG },
{ L"CI", CI_PNG },
{ L"CK", CK_PNG },
{ L"CL", CL_PNG },
{ L"CM", CM_PNG },
{ L"CN", CN_PNG },
{ L"CO", CO_PNG },
{ L"CR", CR_PNG },
{ L"CS", CS_PNG },
{ L"CU", CU_PNG },
{ L"CV", CV_PNG },
{ L"CX", CX_PNG },
{ L"CY", CY_PNG },
{ L"CZ", CZ_PNG },
{ L"DE", DE_PNG },
{ L"DJ", DJ_PNG },
{ L"DK", DK_PNG },
{ L"DM", DM_PNG },
{ L"DO", DO_PNG },
{ L"DZ", DZ_PNG },
{ L"EC", EC_PNG },
{ L"EE", EE_PNG },
{ L"EG", EG_PNG },
{ L"EH", EH_PNG },
{ L"ER", ER_PNG },
{ L"ES", ES_PNG },
{ L"ET", ET_PNG },
{ L"FI", FI_PNG },
{ L"FJ", FJ_PNG },
{ L"FK", FK_PNG },
{ L"FO", FO_PNG },
{ L"FR", FR_PNG },
{ L"GA", GA_PNG },
{ L"GB", GB_PNG },
{ L"GD", GD_PNG },
{ L"GE", GE_PNG },
{ L"GF", GF_PNG },
{ L"GH", GH_PNG },
{ L"GI", GI_PNG },
{ L"GL", GL_PNG },
{ L"GM", GM_PNG },
{ L"GN", GN_PNG },
{ L"GP", GP_PNG },
{ L"GQ", GQ_PNG },
{ L"GR", GR_PNG },
{ L"GS", GS_PNG },
{ L"GT", GT_PNG },
{ L"GU", GU_PNG },
{ L"GW", GW_PNG },
{ L"GY", GY_PNG },
{ L"HK", HK_PNG },
{ L"HM", HM_PNG },
{ L"HN", HN_PNG },
{ L"HR", HR_PNG },
{ L"HT", HT_PNG },
{ L"HU", HU_PNG },
{ L"ID", ID_PNG },
{ L"IE", IE_PNG },
{ L"IL", IL_PNG },
{ L"IN", IN_PNG },
{ L"IO", IO_PNG },
{ L"IQ", IQ_PNG },
{ L"IR", IR_PNG },
{ L"IS", IS_PNG },
{ L"IT", IT_PNG },
{ L"JM", JM_PNG },
{ L"JO", JO_PNG },
{ L"JP", JP_PNG },
{ L"KE", KE_PNG },
{ L"KG", KG_PNG },
{ L"KH", KH_PNG },
{ L"KI", KI_PNG },
{ L"KM", KM_PNG },
{ L"KN", KN_PNG },
{ L"KP", KP_PNG },
{ L"KR", KR_PNG },
{ L"KW", KW_PNG },
{ L"KY", KY_PNG },
{ L"KZ", KZ_PNG },
{ L"LA", LA_PNG },
{ L"LB", LB_PNG },
{ L"LC", LC_PNG },
{ L"LI", LI_PNG },
{ L"LK", LK_PNG },
{ L"LR", LR_PNG },
{ L"LS", LS_PNG },
{ L"LT", LT_PNG },
{ L"LU", LU_PNG },
{ L"LV", LV_PNG },
{ L"LY", LY_PNG },
{ L"MA", MA_PNG },
{ L"MC", MC_PNG },
{ L"MD", MD_PNG },
{ L"ME", ME_PNG },
{ L"MG", MG_PNG },
{ L"MH", MH_PNG },
{ L"MK", MK_PNG },
{ L"ML", ML_PNG },
{ L"MM", MM_PNG },
{ L"MN", MN_PNG },
{ L"MO", MO_PNG },
{ L"MP", MP_PNG },
{ L"MQ", MQ_PNG },
{ L"MR", MR_PNG },
{ L"MS", MS_PNG },
{ L"MT", MT_PNG },
{ L"MU", MU_PNG },
{ L"MV", MV_PNG },
{ L"MW", MW_PNG },
{ L"MX", MX_PNG },
{ L"MY", MY_PNG },
{ L"MZ", MZ_PNG },
{ L"NA", NA_PNG },
{ L"NC", NC_PNG },
{ L"NE", NE_PNG },
{ L"NF", NF_PNG },
{ L"NG", NG_PNG },
{ L"NI", NI_PNG },
{ L"NL", NL_PNG },
{ L"NO", NO_PNG },
{ L"NP", NP_PNG },
{ L"NR", NR_PNG },
{ L"NU", NU_PNG },
{ L"NZ", NZ_PNG },
{ L"OM", OM_PNG },
{ L"PA", PA_PNG },
{ L"PE", PE_PNG },
{ L"PF", PF_PNG },
{ L"PG", PG_PNG },
{ L"PH", PH_PNG },
{ L"PK", PK_PNG },
{ L"PL", PL_PNG },
{ L"PM", PM_PNG },
{ L"PN", PN_PNG },
{ L"PR", PR_PNG },
{ L"PS", PS_PNG },
{ L"PT", PT_PNG },
{ L"PW", PW_PNG },
{ L"PY", PY_PNG },
{ L"QA", QA_PNG },
{ L"RE", RE_PNG },
{ L"RO", RO_PNG },
{ L"RS", RS_PNG },
{ L"RU", RU_PNG },
{ L"RW", RW_PNG },
{ L"SA", SA_PNG },
{ L"SB", SB_PNG },
{ L"SC", SC_PNG },
{ L"SD", SD_PNG },
{ L"SE", SE_PNG },
{ L"SG", SG_PNG },
{ L"SH", SH_PNG },
{ L"SI", SI_PNG },
{ L"SJ", SJ_PNG },
{ L"SK", SK_PNG },
{ L"SL", SL_PNG },
{ L"SM", SM_PNG },
{ L"SN", SN_PNG },
{ L"SO", SO_PNG },
{ L"SR", SR_PNG },
{ L"ST", ST_PNG },
{ L"SV", SV_PNG },
{ L"SY", SY_PNG },
{ L"SZ", SZ_PNG },
{ L"TC", TC_PNG },
{ L"TD", TD_PNG },
{ L"TF", TF_PNG },
{ L"TG", TG_PNG },
{ L"TH", TH_PNG },
{ L"TJ", TJ_PNG },
{ L"TK", TK_PNG },
{ L"TL", TL_PNG },
{ L"TM", TM_PNG },
{ L"TN", TN_PNG },
{ L"TO", TO_PNG },
{ L"TR", TR_PNG },
{ L"TT", TT_PNG },
{ L"TV", TV_PNG },
{ L"TW", TW_PNG },
{ L"TZ", TZ_PNG },
{ L"UA", UA_PNG },
{ L"UG", UG_PNG },
{ L"UM", UM_PNG },
{ L"US", US_PNG },
{ L"UY", UY_PNG },
{ L"UZ", UZ_PNG },
{ L"VA", VA_PNG },
{ L"VC", VC_PNG },
{ L"VE", VE_PNG },
{ L"VG", VG_PNG },
{ L"VI", VI_PNG },
{ L"VN", VN_PNG },
{ L"VU", VU_PNG },
{ L"WF", WF_PNG },
{ L"WS", WS_PNG },
{ L"YE", YE_PNG },
{ L"YT", YT_PNG },
{ L"ZA", ZA_PNG },
{ L"ZM", ZM_PNG },
{ L"ZW", ZW_PNG }
};
INT LookupResourceCode(
_In_ PPH_STRING Name
)
{
for (INT i = 0; i < ARRAYSIZE(CountryResourceTable); i++)
{
if (PhEqualString2(Name, CountryResourceTable[i].CountryCode, TRUE))
{
return CountryResourceTable[i].ResourceID;
}
}
return 0;
}
HBITMAP LoadImageFromResources(
_In_ UINT Width,
_In_ UINT Height,
_In_ PPH_STRING Name
)
{
UINT frameCount = 0;
BOOLEAN isSuccess = FALSE;
ULONG resourceLength = 0;
HGLOBAL resourceHandle = NULL;
HRSRC resourceHandleSource = NULL;
WICInProcPointer resourceBuffer = NULL;
HDC screenHdc = NULL;
HDC bufferDc = NULL;
BITMAPINFO bitmapInfo = { 0 };
HBITMAP bitmapHandle = NULL;
PBYTE bitmapBuffer = NULL;
IWICStream* wicStream = NULL;
IWICBitmapSource* wicBitmapSource = NULL;
IWICBitmapDecoder* wicDecoder = NULL;
IWICBitmapFrameDecode* wicFrame = NULL;
IWICImagingFactory* wicFactory = NULL;
IWICBitmapScaler* wicScaler = NULL;
WICPixelFormatGUID pixelFormat;
WICRect rect = { 0, 0, Width, Height };
INT resourceCode = LookupResourceCode(Name);
if (resourceCode == 0)
return NULL;
__try
{
// Create the ImagingFactory
if (FAILED(CoCreateInstance(&CLSID_WICImagingFactory1, NULL, CLSCTX_INPROC_SERVER, &IID_IWICImagingFactory, &wicFactory)))
__leave;
// Find the resource
if ((resourceHandleSource = FindResource(PluginInstance->DllBase, MAKEINTRESOURCE(resourceCode), L"PNG")) == NULL)
__leave;
// Get the resource length
resourceLength = SizeofResource(PluginInstance->DllBase, resourceHandleSource);
// Load the resource
if ((resourceHandle = LoadResource(PluginInstance->DllBase, resourceHandleSource)) == NULL)
__leave;
if ((resourceBuffer = (WICInProcPointer)LockResource(resourceHandle)) == NULL)
__leave;
// Create the Stream
if (FAILED(IWICImagingFactory_CreateStream(wicFactory, &wicStream)))
__leave;
// Initialize the Stream from Memory
if (FAILED(IWICStream_InitializeFromMemory(wicStream, resourceBuffer, resourceLength)))
__leave;
if (FAILED(IWICImagingFactory_CreateDecoder(wicFactory, &GUID_ContainerFormatPng, NULL, &wicDecoder)))
__leave;
if (FAILED(IWICBitmapDecoder_Initialize(wicDecoder, (IStream*)wicStream, WICDecodeMetadataCacheOnLoad)))
__leave;
// Get the Frame count
if (FAILED(IWICBitmapDecoder_GetFrameCount(wicDecoder, &frameCount)) || frameCount < 1)
__leave;
// Get the Frame
if (FAILED(IWICBitmapDecoder_GetFrame(wicDecoder, 0, &wicFrame)))
__leave;
// Get the WicFrame image format
if (FAILED(IWICBitmapFrameDecode_GetPixelFormat(wicFrame, &pixelFormat)))
__leave;
// Check if the image format is supported:
if (IsEqualGUID(&pixelFormat, &GUID_WICPixelFormat32bppPRGBA))
{
wicBitmapSource = (IWICBitmapSource*)wicFrame;
}
else
{
IWICFormatConverter* wicFormatConverter = NULL;
if (FAILED(IWICImagingFactory_CreateFormatConverter(wicFactory, &wicFormatConverter)))
__leave;
if (FAILED(IWICFormatConverter_Initialize(
wicFormatConverter,
(IWICBitmapSource*)wicFrame,
&GUID_WICPixelFormat32bppPRGBA,
WICBitmapDitherTypeNone,
NULL,
0.0,
WICBitmapPaletteTypeCustom
)))
{
IWICFormatConverter_Release(wicFormatConverter);
__leave;
}
// Convert the image to the correct format:
IWICFormatConverter_QueryInterface(wicFormatConverter, &IID_IWICBitmapSource, &wicBitmapSource);
// Cleanup the converter.
IWICFormatConverter_Release(wicFormatConverter);
// Dispose the old frame now that the converted frame is in wicBitmapSource.
IWICBitmapFrameDecode_Release(wicFrame);
}
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfo.bmiHeader.biWidth = rect.Width;
bitmapInfo.bmiHeader.biHeight = -((LONG)rect.Height);
bitmapInfo.bmiHeader.biPlanes = 1;
bitmapInfo.bmiHeader.biBitCount = 32;
bitmapInfo.bmiHeader.biCompression = BI_RGB;
screenHdc = CreateIC(L"DISPLAY", NULL, NULL, NULL);
bufferDc = CreateCompatibleDC(screenHdc);
bitmapHandle = CreateDIBSection(screenHdc, &bitmapInfo, DIB_RGB_COLORS, (PVOID*)&bitmapBuffer, NULL, 0);
// Check if it's the same rect as the requested size.
//if (width != rect.Width || height != rect.Height)
if (FAILED(IWICImagingFactory_CreateBitmapScaler(wicFactory, &wicScaler)))
__leave;
if (FAILED(IWICBitmapScaler_Initialize(wicScaler, wicBitmapSource, rect.Width, rect.Height, WICBitmapInterpolationModeFant)))
__leave;
if (FAILED(IWICBitmapScaler_CopyPixels(wicScaler, &rect, rect.Width * 4, rect.Width * rect.Height * 4, bitmapBuffer)))
__leave;
isSuccess = TRUE;
}
__finally
{
if (wicScaler)
{
IWICBitmapScaler_Release(wicScaler);
}
if (bufferDc)
{
DeleteDC(bufferDc);
}
if (screenHdc)
{
DeleteDC(screenHdc);
}
if (wicBitmapSource)
{
IWICBitmapSource_Release(wicBitmapSource);
}
if (wicStream)
{
IWICStream_Release(wicStream);
}
if (wicDecoder)
{
IWICBitmapDecoder_Release(wicDecoder);
}
if (wicFactory)
{
IWICImagingFactory_Release(wicFactory);
}
if (resourceHandle)
{
FreeResource(resourceHandle);
}
}
if (isSuccess)
return bitmapHandle;
DeleteObject(bitmapHandle);
return NULL;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,264 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by NetExtrasPlugin.rc
//
#define AD_PNG 101
#define AE_PNG 102
#define AF_PNG 103
#define AG_PNG 104
#define AI_PNG 105
#define AL_PNG 106
#define AM_PNG 107
#define AN_PNG 108
#define AO_PNG 109
#define AR_PNG 110
#define AS_PNG 111
#define AT_PNG 112
#define AU_PNG 113
#define AW_PNG 114
#define AX_PNG 115
#define AZ_PNG 116
#define BA_PNG 117
#define BB_PNG 118
#define BD_PNG 119
#define BE_PNG 120
#define BF_PNG 121
#define BG_PNG 122
#define BH_PNG 123
#define BI__PNG 124
#define BJ_PNG 125
#define BM_PNG 126
#define BN_PNG 127
#define BO_PNG 128
#define BR_PNG 129
#define BS_PNG 130
#define BT_PNG 131
#define BV_PNG 132
#define BW_PNG 133
#define BY_PNG 134
#define BZ_PNG 135
#define CA_PNG 136
#define AAC_PNG 137
#define CC_PNG 138
#define CD_PNG 139
#define CF_PNG 140
#define CG_PNG 141
#define CH_PNG 142
#define CI_PNG 143
#define CK_PNG 144
#define CL_PNG 145
#define CM_PNG 146
#define CN_PNG 147
#define CO_PNG 148
#define CR_PNG 149
#define CS_PNG 150
#define CU_PNG 151
#define CV_PNG 152
#define CX_PNG 153
#define CY_PNG 154
#define CZ_PNG 155
#define DE_PNG 156
#define DJ_PNG 157
#define DK_PNG 158
#define DM_PNG 159
#define DO_PNG 160
#define DZ_PNG 161
#define EC_PNG 162
#define EE_PNG 163
#define EG_PNG 164
#define EH_PNG 165
#define AAD_PNG 166
#define ER_PNG 167
#define ES_PNG 168
#define ET_PNG 169
#define AAE_PNG 170
#define AAF_PNG 171
#define FI_PNG 172
#define FJ_PNG 173
#define FK_PNG 174
#define FM_PNG 175
#define FO_PNG 176
#define FR_PNG 177
#define GA_PNG 178
#define GB_PNG 179
#define GD_PNG 180
#define GE_PNG 181
#define GF_PNG 182
#define GH_PNG 183
#define GI_PNG 184
#define GL_PNG 185
#define GM_PNG 186
#define GN_PNG 187
#define GP_PNG 188
#define GQ_PNG 189
#define GR_PNG 190
#define GS_PNG 191
#define GT_PNG 192
#define GU_PNG 193
#define GW_PNG 194
#define GY_PNG 195
#define HK_PNG 196
#define HM_PNG 197
#define HN_PNG 198
#define HR_PNG 199
#define HT_PNG 200
#define ID_PNG 202
#define IE_PNG 203
#define IL_PNG 204
#define IN_PNG 205
#define IO_PNG 206
#define IQ_PNG 207
#define IR_PNG 208
#define IS_PNG 209
#define IT_PNG 210
#define JM_PNG 211
#define JO_PNG 212
#define JP_PNG 213
#define KE_PNG 214
#define KG_PNG 215
#define KH_PNG 216
#define KI_PNG 217
#define KM_PNG 218
#define KN_PNG 219
#define KP_PNG 220
#define KR_PNG 221
#define KW_PNG 222
#define KY_PNG 223
#define KZ_PNG 224
#define LA_PNG 225
#define LB_PNG 226
#define LC_PNG 227
#define LI_PNG 228
#define LK_PNG 229
#define LR_PNG 230
#define LS_PNG 231
#define LT_PNG 232
#define LU_PNG 233
#define LV_PNG 234
#define LY_PNG 235
#define MA_PNG 236
#define MC_PNG 237
#define MD_PNG 238
#define ME_PNG 239
#define MG_PNG 240
#define MH_PNG 241
#define MK_PNG 242
#define ML_PNG 243
#define MM_PNG 244
#define MN_PNG 245
#define MO_PNG 246
#define MP_PNG 247
#define MQ_PNG 248
#define MR_PNG 249
#define MS_PNG 250
#define MT_PNG 251
#define MU_PNG 252
#define MV_PNG 253
#define MW_PNG 254
#define MX_PNG 255
#define MY_PNG 256
#define MZ_PNG 257
#define NA_PNG 258
#define NC_PNG 259
#define NE_PNG 260
#define NF_PNG 261
#define NG_PNG 262
#define NI_PNG 263
#define NL_PNG 264
#define NO_PNG 265
#define NP_PNG 266
#define NR_PNG 267
#define NU_PNG 268
#define NZ_PNG 269
#define OM_PNG 270
#define PA_PNG 271
#define PE_PNG 272
#define PF_PNG 273
#define PG_PNG 274
#define PH_PNG 275
#define PK_PNG 276
#define PL_PNG 277
#define PM_PNG 278
#define PN_PNG 279
#define PR_PNG 280
#define PS_PNG 281
#define PT_PNG 282
#define PW_PNG 283
#define PY_PNG 284
#define QA_PNG 285
#define RE_PNG 286
#define RO_PNG 287
#define RS_PNG 288
#define RU_PNG 289
#define RW_PNG 290
#define SA_PNG 291
#define SB_PNG 292
#define SC_PNG 293
#define AAA_PNG 294
#define SD_PNG 295
#define SE_PNG 296
#define SG_PNG 297
#define SH_PNG 298
#define SI_PNG 299
#define SJ_PNG 300
#define SK_PNG 301
#define SL_PNG 302
#define SM_PNG 303
#define SN_PNG 304
#define SO_PNG 305
#define SR_PNG 306
#define ST_PNG 307
#define SV_PNG 308
#define SY_PNG 309
#define SZ_PNG 310
#define TC_PNG 311
#define TD_PNG 312
#define TF_PNG 313
#define TG_PNG 314
#define TH_PNG 315
#define TJ_PNG 316
#define TK_PNG 317
#define TL_PNG 318
#define TM_PNG 319
#define TN_PNG 320
#define TO_PNG 321
#define TR_PNG 322
#define TT_PNG 323
#define TV_PNG 324
#define TW_PNG 325
#define TZ_PNG 326
#define UA_PNG 327
#define UG_PNG 328
#define UM_PNG 329
#define US_PNG 330
#define UY_PNG 331
#define UZ_PNG 332
#define VA_PNG 333
#define VC_PNG 334
#define VE_PNG 335
#define VG_PNG 336
#define VI_PNG 337
#define VN_PNG 338
#define VU_PNG 339
#define AAB_PNG 340
#define WF_PNG 341
#define WS_PNG 342
#define YE_PNG 343
#define YT_PNG 344
#define ZA_PNG 345
#define ZM_PNG 346
#define ZW_PNG 347
#define HU_PNG 348
#define IDD_DIALOG1 349
#define IDD_OPTIONS 349
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 351
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 100
#endif
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 675 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 593 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 443 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 398 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 483 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 572 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 479 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 545 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Some files were not shown because too many files have changed in this diff Show More