Skip to content

Commit

Permalink
Add visual studio build interface for devpal driver on Windows
Browse files Browse the repository at this point in the history
  • Loading branch information
JaredWright committed Aug 20, 2021
1 parent 0c78fb2 commit 763f5c1
Show file tree
Hide file tree
Showing 28 changed files with 620 additions and 135 deletions.
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
output
build
devpal/linux/Makefile
devpal/windows/visual_studio/.vs
devpal/windows/visual_studio/x64
devpal/windows/visual_studio/x86
devpal/windows/visual_studio/ARM
devpal/windows/visual_studio/ARM64
devpal/windows/visual_studio/Debug
devpal/windows/visual_studio/Release
target
Cargo.lock
*.swp
22 changes: 21 additions & 1 deletion devpal/windows/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,21 @@
message(STATUS "Building Windows Driver")
message(STATUS "Building Windows Driver")

set(VS_SOLUTION_FILE ${CMAKE_CURRENT_LIST_DIR}/visual_studio/devpal.sln)
set(VS_PROJECT_FILE ${CMAKE_CURRENT_LIST_DIR}/visual_studio/devpal.vcxproj)
set(VS_CONFIGURATION "Release")
set(VS_PLATFORM "x64")
set(VS_OUTPUT_DIR ${CMAKE_CURRENT_LIST_DIR}/visual_studio/${VS_PLATFORM}/${VS_CONFIGURATION})
set(DRIVER_BIN ${VS_OUTPUT_DIR}/devpal/devpal.sys)
set(MSBUILD_CMD msbuild ${VS_SOLUTION_FILE} /p:Configuration=${VS_CONFIGURATION} /p:Platform=${VS_PLATFORM})

# configure_file(${CMAKE_CURRENT_LIST_DIR}/visual_studio/devpal.vcxproj.in ${CMAKE_CURRENT_LIST_DIR}/visual_studio/devpal.vcxproj)

add_custom_command(
OUTPUT ${DRIVER_BIN}
COMMAND ${MSBUILD_CMD}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS ${VS_SOLUTION_FILE} ${VS_PROJECT_FILE}
VERBATIM
)

add_custom_target(devpal ALL DEPENDS ${DRIVER_BIN})
115 changes: 1 addition & 114 deletions devpal/windows/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,127 +6,14 @@
DRIVER_INITIALIZE DriverEntry;
DEFINE_GUID(GUID_DEVPAL_DEVINTERFACE, 0x6da124e8, 0x2b25, 0xefd8, 0x45, 0xc3, 0xab, 0xe6, 0xf0, 0xd2, 0x79, 0x90);

//x86-64 Generic
void handle_devpal_ioctl_cpuid(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_in_8(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_in_16(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_in_32(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_out_8(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_out_16(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_out_32(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_rdmsr(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_read_mem8(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_read_mem16(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_read_mem32(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_read_mem64(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_write_mem8(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_write_mem16(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_write_mem32(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_write_mem64(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_wrmsr(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);

// Intel Specific
void handle_devpal_ioctl_vmcall(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_vmcall_kvm(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);
void handle_devpal_ioctl_vmcall_xen(WDFREQUEST Request, size_t OutputBufferLength, size_t InputBufferLength);

VOID
devpalEvtIoDeviceControl(
_In_ WDFQUEUE Queue,
_In_ WDFREQUEST Request,
_In_ size_t OutputBufferLength,
_In_ size_t InputBufferLength,
_In_ ULONG IoControlCode
)
{
UNREFERENCED_PARAMETER(Queue);

switch (IoControlCode) {
case DEVPAL_EXECUTE_CPUID: {
handle_devpal_ioctl_cpuid(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_IN_8: {
handle_devpal_ioctl_in_8(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_IN_16: {
handle_devpal_ioctl_in_16(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_IN_32: {
handle_devpal_ioctl_in_32(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_OUT_8: {
handle_devpal_ioctl_out_8(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_OUT_16: {
handle_devpal_ioctl_out_16(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_OUT_32: {
handle_devpal_ioctl_out_32(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_RDMSR: {
handle_devpal_ioctl_rdmsr(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_READ_MEM8: {
handle_devpal_ioctl_read_mem8(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_READ_MEM16: {
handle_devpal_ioctl_read_mem16(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_READ_MEM32: {
handle_devpal_ioctl_read_mem32(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_READ_MEM64: {
handle_devpal_ioctl_read_mem64(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_WRITE_MEM8: {
handle_devpal_ioctl_write_mem8(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_WRITE_MEM16: {
handle_devpal_ioctl_write_mem16(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_WRITE_MEM32: {
handle_devpal_ioctl_write_mem32(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_WRITE_MEM64: {
handle_devpal_ioctl_write_mem64(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_VMCALL: {
handle_devpal_ioctl_vmcall(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_VMCALL_KVM: {
handle_devpal_ioctl_vmcall_kvm(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_VMCALL_XEN: {
handle_devpal_ioctl_vmcall_xen(Request, InputBufferLength, OutputBufferLength);
break;
}
case DEVPAL_EXECUTE_WRMSR: {
handle_devpal_ioctl_wrmsr(Request, InputBufferLength, OutputBufferLength);
break;
}
default: {
WdfRequestComplete(Request, STATUS_ACCESS_DENIED);
}
}
}
);

VOID
devpalEvtIoStop(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include <ntddk.h>
#include <wdf.h>
#include "devpal_abi_generic.h"
#include "pal/instruction/read_mem16.h"

void handle_devpal_ioctl_read_mem16(
_In_ WDFREQUEST Request,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include <ntddk.h>
#include <wdf.h>
#include "devpal_abi_generic.h"
#include "pal/instruction/read_mem32.h"

void handle_devpal_ioctl_read_mem32(
_In_ WDFREQUEST Request,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include <ntddk.h>
#include <wdf.h>
#include "devpal_abi_generic.h"
#include "pal/instruction/read_mem64.h"

void handle_devpal_ioctl_read_mem64(
_In_ WDFREQUEST Request,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include <ntddk.h>
#include <wdf.h>
#include "devpal_abi_generic.h"
#include "pal/instruction/read_mem8.h"

void handle_devpal_ioctl_read_mem8(
_In_ WDFREQUEST Request,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include <ntddk.h>
#include <wdf.h>
#include "devpal_abi_generic.h"
#include "pal/instruction/write_mem16.h"

void handle_devpal_ioctl_write_mem16(
_In_ WDFREQUEST Request,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include <ntddk.h>
#include <wdf.h>
#include "devpal_abi_generic.h"
#include "pal/instruction/write_mem32.h"

void handle_devpal_ioctl_write_mem32(
_In_ WDFREQUEST Request,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include <ntddk.h>
#include <wdf.h>
#include "devpal_abi_generic.h"
#include "pal/instruction/write_mem64.h"

void handle_devpal_ioctl_write_mem64(
_In_ WDFREQUEST Request,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
#include <ntddk.h>
#include <wdf.h>
#include "devpal_abi_generic.h"
#include "pal/instruction/write_mem8.h"

void handle_devpal_ioctl_write_mem8(
_In_ WDFREQUEST Request,
Expand Down
77 changes: 77 additions & 0 deletions devpal/windows/visual_studio/devpal.inf
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
;
; devpal.inf
;

[Version]
Signature="$WINDOWS NT$"
Class=System ; TODO: specify appropriate Class
ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318} ; TODO: specify appropriate ClassGuid
Provider=%ManufacturerName%
CatalogFile=devpal.cat
DriverVer= ; TODO: set DriverVer in stampinf property pages
PnpLockdown=1

[DestinationDirs]
DefaultDestDir = 12
devpal_Device_CoInstaller_CopyFiles = 11

[SourceDisksNames]
1 = %DiskName%,,,""

[SourceDisksFiles]
devpal.sys = 1,,
WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll=1 ; make sure the number matches with SourceDisksNames

;*****************************************
; Install Section
;*****************************************

[Manufacturer]
%ManufacturerName%=Standard,NT$ARCH$

[Standard.NT$ARCH$]
%devpal.DeviceDesc%=devpal_Device, Root\devpal ; TODO: edit hw-id

[devpal_Device.NT]
CopyFiles=Drivers_Dir

[Drivers_Dir]
devpal.sys

;-------------- Service installation
[devpal_Device.NT.Services]
AddService = devpal,%SPSVCINST_ASSOCSERVICE%, devpal_Service_Inst

; -------------- devpal driver install sections
[devpal_Service_Inst]
DisplayName = %devpal.SVCDESC%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\devpal.sys

;
;--- devpal_Device Coinstaller installation ------
;

[devpal_Device.NT.CoInstallers]
AddReg=devpal_Device_CoInstaller_AddReg
CopyFiles=devpal_Device_CoInstaller_CopyFiles

[devpal_Device_CoInstaller_AddReg]
HKR,,CoInstallers32,0x00010000, "WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll,WdfCoInstaller"

[devpal_Device_CoInstaller_CopyFiles]
WdfCoInstaller$KMDFCOINSTALLERVERSION$.dll

[devpal_Device.NT.Wdf]
KmdfService = devpal, devpal_wdfsect
[devpal_wdfsect]
KmdfLibraryVersion = $KMDFVERSION$

[Strings]
SPSVCINST_ASSOCSERVICE= 0x00000002
ManufacturerName="<Your manufacturer name>" ;TODO: Replace with your manufacturer name
DiskName = "devpal Installation Disk"
devpal.DeviceDesc = "devpal Device"
devpal.SVCDESC = "devpal Service"
51 changes: 51 additions & 0 deletions devpal/windows/visual_studio/devpal.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31605.320
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "devpal", "devpal.vcxproj", "{BFEF67EF-3B43-4BDF-92A1-633B0324107E}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|ARM.ActiveCfg = Debug|ARM
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|ARM.Build.0 = Debug|ARM
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|ARM.Deploy.0 = Debug|ARM
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|ARM64.ActiveCfg = Debug|ARM64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|ARM64.Build.0 = Debug|ARM64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|ARM64.Deploy.0 = Debug|ARM64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|x64.ActiveCfg = Debug|x64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|x64.Build.0 = Debug|x64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|x64.Deploy.0 = Debug|x64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|x86.ActiveCfg = Debug|Win32
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|x86.Build.0 = Debug|Win32
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Debug|x86.Deploy.0 = Debug|Win32
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|ARM.ActiveCfg = Release|ARM
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|ARM.Build.0 = Release|ARM
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|ARM.Deploy.0 = Release|ARM
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|ARM64.ActiveCfg = Release|ARM64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|ARM64.Build.0 = Release|ARM64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|ARM64.Deploy.0 = Release|ARM64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|x64.ActiveCfg = Release|x64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|x64.Build.0 = Release|x64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|x64.Deploy.0 = Release|x64
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|x86.ActiveCfg = Release|Win32
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|x86.Build.0 = Release|Win32
{BFEF67EF-3B43-4BDF-92A1-633B0324107E}.Release|x86.Deploy.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {865B4E9B-2EB3-401D-BFBE-AD8417D24670}
EndGlobalSection
EndGlobal
Loading

0 comments on commit 763f5c1

Please sign in to comment.