Feature/systemd query events (#1728)
* [service] Subscribe to systemd-resolver events * [service] Add disabled state to the resolver * [service] Add ETW DNS event listener * [service] DNS listener refactoring * [service] Add windows core dll project * [service] DNSListener refactoring, small bugfixes * [service] Change dns bypass rule * [service] Update gitignore * [service] Remove shim from integration module * [service] Add DNS packet analyzer * [service] Add self-check in dns monitor * [service] Fix go linter errors * [CI] Add github workflow for the windows core dll * [service] Minor fixes to the dns monitor
This commit is contained in:
2
windows_core_dll/build.ps1
Normal file
2
windows_core_dll/build.ps1
Normal file
@@ -0,0 +1,2 @@
|
||||
msbuild .\windows_core_dll.sln /p:Configuration=Release
|
||||
ls .\x64\Release\portmaster-core.dll
|
||||
197
windows_core_dll/dllmain.cpp
Normal file
197
windows_core_dll/dllmain.cpp
Normal file
@@ -0,0 +1,197 @@
|
||||
// dllmain.cpp : Defines the entry point for the DLL application.
|
||||
#include "pch.h"
|
||||
|
||||
#pragma comment(lib, "tdh.lib")
|
||||
|
||||
// GUID of the DNS log provider
|
||||
static const GUID DNS_CLIENT_PROVIDER_GUID = {
|
||||
0x1C95126E,
|
||||
0x7EEA,
|
||||
0x49A9,
|
||||
{0xA3, 0xFE, 0xA3, 0x78, 0xB0, 0x3D, 0xDB, 0x4D} };
|
||||
|
||||
// GUID of the event session. This should be unique for the application.
|
||||
static const GUID PORTMASTER_ETW_SESSION_GUID = {
|
||||
0x0211d070,
|
||||
0xc3b2,
|
||||
0x4609,
|
||||
{0x92, 0xf5, 0x28, 0xe7, 0x18, 0xb2, 0x3b, 0x18} };
|
||||
|
||||
// Name of the session. This is visble when user queries all ETW sessions.
|
||||
// (example `logman query -ets`)
|
||||
#define LOGSESSION_NAME L"PortmasterDNSEventListener"
|
||||
|
||||
// Fuction type of the callback that will be called on each event.
|
||||
typedef uint64_t(*GoEventRecordCallback)(wchar_t* domain, wchar_t* result);
|
||||
|
||||
// Holds the state of the ETW Session.
|
||||
struct ETWSessionState {
|
||||
TRACEHANDLE SessionTraceHandle;
|
||||
EVENT_TRACE_PROPERTIES* SessionProperties;
|
||||
TRACEHANDLE sessionHandle;
|
||||
GoEventRecordCallback callback;
|
||||
};
|
||||
|
||||
// getPropertyValue reads a property from the event.
|
||||
static bool getPropertyValue(PEVENT_RECORD evt, LPWSTR prop, PBYTE* pData) {
|
||||
// Describe the data that needs to be retrieved from the event.
|
||||
PROPERTY_DATA_DESCRIPTOR DataDescriptor;
|
||||
ZeroMemory(&DataDescriptor, sizeof(DataDescriptor));
|
||||
DataDescriptor.PropertyName = (ULONGLONG)(prop);
|
||||
DataDescriptor.ArrayIndex = 0;
|
||||
|
||||
DWORD PropertySize = 0;
|
||||
// Check if the data is avaliable and what is the size of it.
|
||||
DWORD status =
|
||||
TdhGetPropertySize(evt, 0, NULL, 1, &DataDescriptor, &PropertySize);
|
||||
if (ERROR_SUCCESS != status) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Allocate memory for the data.
|
||||
*pData = (PBYTE)malloc(PropertySize);
|
||||
if (NULL == *pData) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get the data.
|
||||
status =
|
||||
TdhGetProperty(evt, 0, NULL, 1, &DataDescriptor, PropertySize, *pData);
|
||||
if (ERROR_SUCCESS != status) {
|
||||
if (*pData) {
|
||||
free(*pData);
|
||||
*pData = NULL;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// EventRecordCallback is a callback called on each event.
|
||||
static void WINAPI EventRecordCallback(PEVENT_RECORD eventRecord) {
|
||||
PBYTE resultValue = NULL;
|
||||
PBYTE domainValue = NULL;
|
||||
|
||||
getPropertyValue(eventRecord, (LPWSTR)L"QueryResults", &resultValue);
|
||||
getPropertyValue(eventRecord, (LPWSTR)L"QueryName", &domainValue);
|
||||
|
||||
ETWSessionState* state = (ETWSessionState*)eventRecord->UserContext;
|
||||
|
||||
if (resultValue != NULL && domainValue != NULL) {
|
||||
state->callback((wchar_t*)domainValue, (wchar_t*)resultValue);
|
||||
}
|
||||
|
||||
free(resultValue);
|
||||
free(domainValue);
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
// PM_ETWCreateState allocates memory for the state and initializes the config for the session. PM_ETWDestroySession must be called to avoid leaks.
|
||||
// callback must be set to a valid function pointer.
|
||||
__declspec(dllexport) ETWSessionState* PM_ETWCreateState(GoEventRecordCallback callback) {
|
||||
// Create trace session properties.
|
||||
ULONG BufferSize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGSESSION_NAME);
|
||||
EVENT_TRACE_PROPERTIES* SessionProperties =
|
||||
(EVENT_TRACE_PROPERTIES*)calloc(1, BufferSize);
|
||||
SessionProperties->Wnode.BufferSize = BufferSize;
|
||||
SessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
|
||||
SessionProperties->Wnode.ClientContext = 1; // QPC clock resolution
|
||||
SessionProperties->Wnode.Guid = PORTMASTER_ETW_SESSION_GUID;
|
||||
SessionProperties->LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
|
||||
SessionProperties->MaximumFileSize = 1; // MB
|
||||
SessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
|
||||
|
||||
// Create state
|
||||
ETWSessionState* state = (ETWSessionState*)calloc(1, sizeof(ETWSessionState));
|
||||
state->SessionProperties = SessionProperties;
|
||||
state->callback = callback;
|
||||
return state;
|
||||
}
|
||||
|
||||
// PM_ETWInitializeSession initializes the session.
|
||||
__declspec(dllexport) uint32_t PM_ETWInitializeSession(ETWSessionState* state) {
|
||||
return StartTrace(&state->SessionTraceHandle, LOGSESSION_NAME,
|
||||
state->SessionProperties);
|
||||
}
|
||||
|
||||
// PM_ETWStartTrace subscribes to the dns events and start listening. The function blocks while the listener is running.
|
||||
// Call PM_ETWStopTrace to stop the listener.
|
||||
__declspec(dllexport) uint32_t PM_ETWStartTrace(ETWSessionState* state) {
|
||||
ULONG status =
|
||||
EnableTraceEx2(state->SessionTraceHandle, (LPCGUID)&DNS_CLIENT_PROVIDER_GUID,
|
||||
EVENT_CONTROL_CODE_ENABLE_PROVIDER,
|
||||
TRACE_LEVEL_INFORMATION, 0, 0, 0, NULL);
|
||||
|
||||
if (status != ERROR_SUCCESS) {
|
||||
return status;
|
||||
}
|
||||
|
||||
EVENT_TRACE_LOGFILE trace = { 0 };
|
||||
|
||||
trace.LoggerName = (LPWSTR)(LOGSESSION_NAME);
|
||||
trace.ProcessTraceMode =
|
||||
PROCESS_TRACE_MODE_REAL_TIME | PROCESS_TRACE_MODE_EVENT_RECORD;
|
||||
trace.EventRecordCallback = EventRecordCallback;
|
||||
trace.Context = state;
|
||||
|
||||
state->sessionHandle = OpenTrace(&trace);
|
||||
if (state->sessionHandle == INVALID_PROCESSTRACE_HANDLE) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
status = ProcessTrace(&state->sessionHandle, 1, NULL, NULL);
|
||||
if (status != ERROR_SUCCESS) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
// PM_ETWFlushTrace flushes the event buffer.
|
||||
__declspec(dllexport) uint32_t PM_ETWFlushTrace(ETWSessionState* state) {
|
||||
return ControlTrace(state->SessionTraceHandle, LOGSESSION_NAME,
|
||||
state->SessionProperties, EVENT_TRACE_CONTROL_FLUSH);
|
||||
}
|
||||
|
||||
// PM_ETWFlushTrace stops the listener.
|
||||
__declspec(dllexport) uint32_t PM_ETWStopTrace(ETWSessionState* state) {
|
||||
return ControlTrace(state->SessionTraceHandle, LOGSESSION_NAME, state->SessionProperties,
|
||||
EVENT_TRACE_CONTROL_STOP);
|
||||
}
|
||||
|
||||
// PM_ETWFlushTrace Closes the session and frees resourses.
|
||||
__declspec(dllexport) uint32_t PM_ETWDestroySession(ETWSessionState* state) {
|
||||
if (state == NULL) {
|
||||
return 1;
|
||||
}
|
||||
uint32_t status = CloseTrace(state->sessionHandle);
|
||||
|
||||
// Free memory.
|
||||
free(state->SessionProperties);
|
||||
free(state);
|
||||
return status;
|
||||
}
|
||||
|
||||
// PM_ETWStopOldSession removes old session with the same name if they exist.
|
||||
// It returns success(0) only if its able to delete the old session.
|
||||
__declspec(dllexport) ULONG PM_ETWStopOldSession() {
|
||||
ULONG status = ERROR_SUCCESS;
|
||||
TRACEHANDLE sessionHandle = 0;
|
||||
|
||||
// Create trace session properties
|
||||
size_t bufferSize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGSESSION_NAME);
|
||||
EVENT_TRACE_PROPERTIES* sessionProperties = (EVENT_TRACE_PROPERTIES*)calloc(1, bufferSize);
|
||||
sessionProperties->Wnode.BufferSize = (ULONG)bufferSize;
|
||||
sessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
|
||||
sessionProperties->Wnode.ClientContext = 1; // QPC clock resolution
|
||||
sessionProperties->Wnode.Guid = PORTMASTER_ETW_SESSION_GUID;
|
||||
sessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
|
||||
|
||||
// Use Control trace will stop the session which will trigger a delete.
|
||||
status = ControlTrace(NULL, LOGSESSION_NAME, sessionProperties, EVENT_TRACE_CONTROL_STOP);
|
||||
|
||||
free(sessionProperties);
|
||||
return status;
|
||||
}
|
||||
}
|
||||
5
windows_core_dll/framework.h
Normal file
5
windows_core_dll/framework.h
Normal file
@@ -0,0 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
||||
// Windows Header Files
|
||||
#include <windows.h>
|
||||
5
windows_core_dll/pch.cpp
Normal file
5
windows_core_dll/pch.cpp
Normal file
@@ -0,0 +1,5 @@
|
||||
// pch.cpp: source file corresponding to the pre-compiled header
|
||||
|
||||
#include "pch.h"
|
||||
|
||||
// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
|
||||
22
windows_core_dll/pch.h
Normal file
22
windows_core_dll/pch.h
Normal file
@@ -0,0 +1,22 @@
|
||||
// pch.h: This is a precompiled header file.
|
||||
// Files listed below are compiled only once, improving build performance for future builds.
|
||||
// This also affects IntelliSense performance, including code completion and many code browsing features.
|
||||
// However, files listed here are ALL re-compiled if any one of them is updated between builds.
|
||||
// Do not add files here that you will be updating frequently as this negates the performance advantage.
|
||||
|
||||
#ifndef PCH_H
|
||||
#define PCH_H
|
||||
|
||||
// add headers that you want to pre-compile here
|
||||
#include "framework.h"
|
||||
|
||||
#include <evntrace.h>
|
||||
#include <tdh.h>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <evntcons.h>
|
||||
#include <codecvt>
|
||||
#include <thread>
|
||||
|
||||
|
||||
#endif //PCH_H
|
||||
31
windows_core_dll/windows_core_dll.sln
Normal file
31
windows_core_dll/windows_core_dll.sln
Normal file
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.11.35222.181
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "windows_core_dll", "windows_core_dll.vcxproj", "{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}.Debug|x64.Build.0 = Debug|x64
|
||||
{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}.Debug|x86.Build.0 = Debug|Win32
|
||||
{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}.Release|x64.ActiveCfg = Release|x64
|
||||
{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}.Release|x64.Build.0 = Release|x64
|
||||
{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}.Release|x86.ActiveCfg = Release|Win32
|
||||
{6F3C7EAF-8511-4822-AAF0-1086D27E4DA9}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {8E60106D-49DF-49C7-AC08-02775342FEAE}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
158
windows_core_dll/windows_core_dll.vcxproj
Normal file
158
windows_core_dll/windows_core_dll.vcxproj
Normal file
@@ -0,0 +1,158 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>17.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{6f3c7eaf-8511-4822-aaf0-1086d27e4da9}</ProjectGuid>
|
||||
<RootNamespace>windowscoredll</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
<ProjectName>portmaster-core</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;WINDOWSCOREDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;WINDOWSCOREDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;WINDOWSCOREDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;WINDOWSCOREDLL_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableUAC>false</EnableUAC>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="framework.h" />
|
||||
<ClInclude Include="pch.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp" />
|
||||
<ClCompile Include="pch.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
33
windows_core_dll/windows_core_dll.vcxproj.filters
Normal file
33
windows_core_dll/windows_core_dll.vcxproj.filters
Normal file
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="framework.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="pch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="dllmain.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="pch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
4
windows_core_dll/windows_core_dll.vcxproj.user
Normal file
4
windows_core_dll/windows_core_dll.vcxproj.user
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup />
|
||||
</Project>
|
||||
Reference in New Issue
Block a user