Initial commit
This commit is contained in:
commit
32256494e9
63
.gitattributes
vendored
Normal file
63
.gitattributes
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
###############################################################################
|
||||
# Set default behavior to automatically normalize line endings.
|
||||
###############################################################################
|
||||
* text=auto
|
||||
|
||||
###############################################################################
|
||||
# Set default behavior for command prompt diff.
|
||||
#
|
||||
# This is need for earlier builds of msysgit that does not have it on by
|
||||
# default for csharp files.
|
||||
# Note: This is only used by command line
|
||||
###############################################################################
|
||||
#*.cs diff=csharp
|
||||
|
||||
###############################################################################
|
||||
# Set the merge driver for project and solution files
|
||||
#
|
||||
# Merging from the command prompt will add diff markers to the files if there
|
||||
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||
# the diff markers are never inserted). Diff markers may cause the following
|
||||
# file extensions to fail to load in VS. An alternative would be to treat
|
||||
# these files as binary and thus will always conflict and require user
|
||||
# intervention with every merge. To do so, just uncomment the entries below
|
||||
###############################################################################
|
||||
#*.sln merge=binary
|
||||
#*.csproj merge=binary
|
||||
#*.vbproj merge=binary
|
||||
#*.vcxproj merge=binary
|
||||
#*.vcproj merge=binary
|
||||
#*.dbproj merge=binary
|
||||
#*.fsproj merge=binary
|
||||
#*.lsproj merge=binary
|
||||
#*.wixproj merge=binary
|
||||
#*.modelproj merge=binary
|
||||
#*.sqlproj merge=binary
|
||||
#*.wwaproj merge=binary
|
||||
|
||||
###############################################################################
|
||||
# behavior for image files
|
||||
#
|
||||
# image files are treated as binary by default.
|
||||
###############################################################################
|
||||
#*.jpg binary
|
||||
#*.png binary
|
||||
#*.gif binary
|
||||
|
||||
###############################################################################
|
||||
# diff behavior for common document formats
|
||||
#
|
||||
# Convert binary document formats to text before diffing them. This feature
|
||||
# is only available from the command line. Turn it on by uncommenting the
|
||||
# entries below.
|
||||
###############################################################################
|
||||
#*.doc diff=astextplain
|
||||
#*.DOC diff=astextplain
|
||||
#*.docx diff=astextplain
|
||||
#*.DOCX diff=astextplain
|
||||
#*.dot diff=astextplain
|
||||
#*.DOT diff=astextplain
|
||||
#*.pdf diff=astextplain
|
||||
#*.PDF diff=astextplain
|
||||
#*.rtf diff=astextplain
|
||||
#*.RTF diff=astextplain
|
385
.gitignore
vendored
Normal file
385
.gitignore
vendored
Normal file
@ -0,0 +1,385 @@
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
##
|
||||
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||
|
||||
# User-specific files
|
||||
*.rsuser
|
||||
*.suo
|
||||
*.user
|
||||
*.userosscache
|
||||
*.sln.docstates
|
||||
|
||||
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||
*.userprefs
|
||||
|
||||
# Mono auto generated files
|
||||
mono_crash.*
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Dd]ebugPublic/
|
||||
[Rr]elease/
|
||||
[Rr]eleases/
|
||||
x64/
|
||||
x86/
|
||||
[Ww][Ii][Nn]32/
|
||||
[Aa][Rr][Mm]/
|
||||
[Aa][Rr][Mm]64/
|
||||
bld/
|
||||
[Bb]in/
|
||||
[Oo]bj/
|
||||
[Oo]ut/
|
||||
[Ll]og/
|
||||
[Ll]ogs/
|
||||
|
||||
# Visual Studio 2015/2017 cache/options directory
|
||||
.vs/
|
||||
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||
#wwwroot/
|
||||
|
||||
# Visual Studio 2017 auto generated files
|
||||
Generated\ Files/
|
||||
|
||||
# MSTest test Results
|
||||
[Tt]est[Rr]esult*/
|
||||
[Bb]uild[Ll]og.*
|
||||
|
||||
# NUnit
|
||||
*.VisualState.xml
|
||||
TestResult.xml
|
||||
nunit-*.xml
|
||||
|
||||
# Build Results of an ATL Project
|
||||
[Dd]ebugPS/
|
||||
[Rr]eleasePS/
|
||||
dlldata.c
|
||||
|
||||
# Benchmark Results
|
||||
BenchmarkDotNet.Artifacts/
|
||||
|
||||
# .NET Core
|
||||
project.lock.json
|
||||
project.fragment.lock.json
|
||||
artifacts/
|
||||
|
||||
# ASP.NET Scaffolding
|
||||
ScaffoldingReadMe.txt
|
||||
|
||||
# StyleCop
|
||||
StyleCopReport.xml
|
||||
|
||||
# Files built by Visual Studio
|
||||
*_i.c
|
||||
*_p.c
|
||||
*_h.h
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.iobj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.ipdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.tmp_proj
|
||||
*_wpftmp.csproj
|
||||
*.log
|
||||
*.vspscc
|
||||
*.vssscc
|
||||
.builds
|
||||
*.pidb
|
||||
*.svclog
|
||||
*.scc
|
||||
|
||||
# Chutzpah Test files
|
||||
_Chutzpah*
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opendb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
*.cachefile
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
*.vspx
|
||||
*.sap
|
||||
|
||||
# Visual Studio Trace Files
|
||||
*.e2e
|
||||
|
||||
# TFS 2012 Local Workspace
|
||||
$tf/
|
||||
|
||||
# Guidance Automation Toolkit
|
||||
*.gpState
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*/
|
||||
*.[Rr]e[Ss]harper
|
||||
*.DotSettings.user
|
||||
|
||||
# TeamCity is a build add-in
|
||||
_TeamCity*
|
||||
|
||||
# DotCover is a Code Coverage Tool
|
||||
*.dotCover
|
||||
|
||||
# AxoCover is a Code Coverage Tool
|
||||
.axoCover/*
|
||||
!.axoCover/settings.json
|
||||
|
||||
# Coverlet is a free, cross platform Code Coverage Tool
|
||||
coverage*.json
|
||||
coverage*.xml
|
||||
coverage*.info
|
||||
|
||||
# Visual Studio code coverage results
|
||||
*.coverage
|
||||
*.coveragexml
|
||||
|
||||
# NCrunch
|
||||
_NCrunch_*
|
||||
.*crunch*.local.xml
|
||||
nCrunchTemp_*
|
||||
|
||||
# MightyMoose
|
||||
*.mm.*
|
||||
AutoTest.Net/
|
||||
|
||||
# Web workbench (sass)
|
||||
.sass-cache/
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress/
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish/
|
||||
|
||||
# Publish Web Output
|
||||
*.[Pp]ublish.xml
|
||||
*.azurePubxml
|
||||
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||
# but database connection strings (with potential passwords) will be unencrypted
|
||||
*.pubxml
|
||||
*.publishproj
|
||||
|
||||
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||
# in these scripts will be unencrypted
|
||||
PublishScripts/
|
||||
|
||||
# NuGet Packages
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
**/[Pp]ackages/*
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
#!**/[Pp]ackages/repositories.config
|
||||
# NuGet v3's project.json files produces more ignorable files
|
||||
*.nuget.props
|
||||
*.nuget.targets
|
||||
|
||||
# Microsoft Azure Build Output
|
||||
csx/
|
||||
*.build.csdef
|
||||
|
||||
# Microsoft Azure Emulator
|
||||
ecf/
|
||||
rcf/
|
||||
|
||||
# Windows Store app package directories and files
|
||||
AppPackages/
|
||||
BundleArtifacts/
|
||||
Package.StoreAssociation.xml
|
||||
_pkginfo.txt
|
||||
*.appx
|
||||
*.appxbundle
|
||||
*.appxupload
|
||||
|
||||
# Visual Studio cache files
|
||||
# files ending in .cache can be ignored
|
||||
*.[Cc]ache
|
||||
# but keep track of directories ending in .cache
|
||||
!?*.[Cc]ache/
|
||||
|
||||
# Others
|
||||
ClientBin/
|
||||
~$*
|
||||
*~
|
||||
*.dbmdl
|
||||
*.dbproj.schemaview
|
||||
*.jfm
|
||||
*.pfx
|
||||
*.publishsettings
|
||||
orleans.codegen.cs
|
||||
|
||||
# Including strong name files can present a security risk
|
||||
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||
#*.snk
|
||||
|
||||
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||
#bower_components/
|
||||
|
||||
# RIA/Silverlight projects
|
||||
Generated_Code/
|
||||
|
||||
# Backup & report files from converting an old project file
|
||||
# to a newer Visual Studio version. Backup files are not needed,
|
||||
# because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
UpgradeLog*.htm
|
||||
ServiceFabricBackup/
|
||||
*.rptproj.bak
|
||||
|
||||
# SQL Server files
|
||||
*.mdf
|
||||
*.ldf
|
||||
*.ndf
|
||||
|
||||
# Business Intelligence projects
|
||||
*.rdl.data
|
||||
*.bim.layout
|
||||
*.bim_*.settings
|
||||
*.rptproj.rsuser
|
||||
*- [Bb]ackup.rdl
|
||||
*- [Bb]ackup ([0-9]).rdl
|
||||
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||
|
||||
# Microsoft Fakes
|
||||
FakesAssemblies/
|
||||
|
||||
# GhostDoc plugin setting file
|
||||
*.GhostDoc.xml
|
||||
|
||||
# Node.js Tools for Visual Studio
|
||||
.ntvs_analysis.dat
|
||||
node_modules/
|
||||
|
||||
# Visual Studio 6 build log
|
||||
*.plg
|
||||
|
||||
# Visual Studio 6 workspace options file
|
||||
*.opt
|
||||
|
||||
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||
*.vbw
|
||||
|
||||
# Visual Studio LightSwitch build output
|
||||
**/*.HTMLClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/GeneratedArtifacts
|
||||
**/*.DesktopClient/ModelManifest.xml
|
||||
**/*.Server/GeneratedArtifacts
|
||||
**/*.Server/ModelManifest.xml
|
||||
_Pvt_Extensions
|
||||
|
||||
# Paket dependency manager
|
||||
.paket/paket.exe
|
||||
paket-files/
|
||||
|
||||
# FAKE - F# Make
|
||||
.fake/
|
||||
|
||||
# CodeRush personal settings
|
||||
.cr/personal
|
||||
|
||||
# Python Tools for Visual Studio (PTVS)
|
||||
__pycache__/
|
||||
*.pyc
|
||||
|
||||
# Cake - Uncomment if you are using it
|
||||
# tools/**
|
||||
# !tools/packages.config
|
||||
|
||||
# Tabs Studio
|
||||
*.tss
|
||||
|
||||
# Telerik's JustMock configuration file
|
||||
*.jmconfig
|
||||
|
||||
# BizTalk build output
|
||||
*.btp.cs
|
||||
*.btm.cs
|
||||
*.odx.cs
|
||||
*.xsd.cs
|
||||
|
||||
# OpenCover UI analysis results
|
||||
OpenCover/
|
||||
|
||||
# Azure Stream Analytics local run output
|
||||
ASALocalRun/
|
||||
|
||||
# MSBuild Binary and Structured Log
|
||||
*.binlog
|
||||
|
||||
# NVidia Nsight GPU debugger configuration file
|
||||
*.nvuser
|
||||
|
||||
# MFractors (Xamarin productivity tool) working folder
|
||||
.mfractor/
|
||||
|
||||
# Local History for Visual Studio
|
||||
.localhistory/
|
||||
|
||||
# BeatPulse healthcheck temp database
|
||||
healthchecksdb
|
||||
|
||||
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||
MigrationBackup/
|
||||
|
||||
# Ionide (cross platform F# VS Code tools) working folder
|
||||
.ionide/
|
||||
|
||||
# Fody - auto-generated XML schema
|
||||
FodyWeavers.xsd
|
||||
/TEMP/nssidswap/nssidswap.cat
|
||||
/TEMP/nssidswap/nssidswap.inf
|
||||
/TEMP/nssidswap/nssidswap.sys
|
||||
/setup.inf
|
||||
/setup.rpt
|
||||
/v2.0.1.0/Signed_1152921505695688239.zip
|
||||
/v2.0.1.0/disk1/nssidswap_x64.cab
|
||||
/v2.0.1.0/drivers/nssidswap_x64/LICENSE
|
||||
/v2.0.1.0/drivers/nssidswap_x64/nssidswap.cat
|
||||
/v2.0.1.0/drivers/nssidswap_x64/nssidswap.inf
|
||||
/v2.0.1.0/drivers/nssidswap_x64/nssidswap.man
|
||||
/v2.0.1.0/drivers/nssidswap_x64/nssidswap.sys
|
||||
/v2.0.1.0/nssidswap_unsigned_v2.0.1.0.zip
|
||||
/v2.0.1.0/nssidswap_v2.0.1.0.zip
|
||||
/v2.0.2.0/Signed_1152921505695690331.zip
|
||||
/v2.0.2.0/disk1/nssidswap_x64.cab
|
||||
/v2.0.2.0/drivers/nssidswap_x64/LICENSE
|
||||
/v2.0.2.0/drivers/nssidswap_x64/nssidswap.cat
|
||||
/v2.0.2.0/drivers/nssidswap_x64/nssidswap.inf
|
||||
/v2.0.2.0/drivers/nssidswap_x64/nssidswap.man
|
||||
/v2.0.2.0/drivers/nssidswap_x64/nssidswap.sys
|
||||
/v2.0.2.0/nssidswap_v2.0.2.0.zip
|
40
LICENSE
Normal file
40
LICENSE
Normal file
@ -0,0 +1,40 @@
|
||||
|
||||
nssudeaudio - USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
|
||||
Copyright (c) 2022-2023, Nefarius Software Solutions e.U.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in bytecode or binary forms, without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions in bytecode or 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 includes repository READMEs for open-source projects
|
||||
interfacing with this product, websites or in-application credits.
|
||||
|
||||
* Neither the name of the nssudeaudio.sys nor the names of its contributors may
|
||||
be used to endorse or promote products derived from or distributed
|
||||
with this software without specific prior written permission.
|
||||
|
||||
* Bundling or otherwise redistributing copies of binaries signed by
|
||||
Nefarius Software Solutions e.U. is prohibited without specific prior
|
||||
written permission.
|
||||
|
||||
* Personal use for research, experiment, and testing for
|
||||
the benefit of public knowledge, personal study, private
|
||||
entertainment, hobby projects, amateur pursuits, or religious
|
||||
observance, without any anticipated commercial application,
|
||||
is use for a permitted purpose.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
7
README.md
Normal file
7
README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
|
||||
Demo USB class filter driver to [fix UDE compatibility with USBAUDIO.SYS](https://fosstodon.org/@Nefarius/110089542325783941) in the lab.
|
||||
|
||||
## Dependencies
|
||||
|
||||
[DmfBusFilterExtension](https://git.nefarius.at/nefarius/DmfBusFilterExtension)
|
44
nssudeaudio.sln
Normal file
44
nssudeaudio.sln
Normal file
@ -0,0 +1,44 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.4.33122.133
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nssudeaudiofix", "src\nssudeaudio.vcxproj", "{AE58270A-E8BC-4805-9A09-23E91D4A21D5}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{ABA785CC-A32A-48DE-9EDD-43BCB226530F}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
LICENSE = LICENSE
|
||||
nssidswap_ARM64.ddf = nssidswap_ARM64.ddf
|
||||
nssidswap_x64.ddf = nssidswap_x64.ddf
|
||||
nssidswap_x86.ddf = nssidswap_x86.ddf
|
||||
README.md = README.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|ARM64 = Debug|ARM64
|
||||
Debug|x64 = Debug|x64
|
||||
Release|ARM64 = Release|ARM64
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Debug|ARM64.Deploy.0 = Debug|ARM64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Debug|x64.Build.0 = Debug|x64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Debug|x64.Deploy.0 = Debug|x64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Release|ARM64.Build.0 = Release|ARM64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Release|ARM64.Deploy.0 = Release|ARM64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Release|x64.ActiveCfg = Release|x64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Release|x64.Build.0 = Release|x64
|
||||
{AE58270A-E8BC-4805-9A09-23E91D4A21D5}.Release|x64.Deploy.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {471FE4BF-6C4E-4A41-B16F-0FFA7BD410B3}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
18
nssudeaudio.sln.DotSettings
Normal file
18
nssudeaudio.sln.DotSettings
Normal file
@ -0,0 +1,18 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=bytecode/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=iosb/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=irql/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nefarius/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=nssudeaudio/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=ntstatus/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=NTSTRSAFE/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=PBUS/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=PCHILD/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=PDEVICE/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=PPARENT/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=PWDM/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=READM/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=ssidswap/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=ssudeaudio/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=USBAUDIO/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=USBDI/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
370
src/Device.c
Normal file
370
src/Device.c
Normal file
@ -0,0 +1,370 @@
|
||||
/*
|
||||
* nssudeaudio - USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
*
|
||||
* Copyright (c) 2022-2023, Nefarius Software Solutions e.U.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in bytecode or binary forms, without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions in bytecode or 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 includes repository READMEs for open-source projects
|
||||
* interfacing with this product, websites or in-application credits.
|
||||
*
|
||||
* * Neither the name of the nssudeaudio.sys nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from or distributed
|
||||
* with this software without specific prior written permission.
|
||||
*
|
||||
* * Bundling or otherwise redistributing copies of binaries signed by
|
||||
* Nefarius Software Solutions e.U. is prohibited without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* * Personal use for research, experiment, and testing for
|
||||
* the benefit of public knowledge, personal study, private
|
||||
* entertainment, hobby projects, amateur pursuits, or religious
|
||||
* observance, without any anticipated commercial application,
|
||||
* is use for a permitted purpose.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
||||
*/
|
||||
|
||||
|
||||
#include "Driver.h"
|
||||
#include "Device.tmh"
|
||||
|
||||
#include <usbbusif.h>
|
||||
|
||||
|
||||
static
|
||||
VOID
|
||||
UsbInterfaceReference(
|
||||
_In_ PVOID Context
|
||||
)
|
||||
{
|
||||
const PCHILD_DEVICE_CONTEXT pCtx = ChildDeviceGetContext(Context);
|
||||
|
||||
pCtx->OriginalInterface.InterfaceReference(pCtx->OriginalInterface.BusContext);
|
||||
}
|
||||
|
||||
static
|
||||
VOID
|
||||
UsbInterfaceDereference(
|
||||
_In_ PVOID Context
|
||||
)
|
||||
{
|
||||
const PCHILD_DEVICE_CONTEXT pCtx = ChildDeviceGetContext(Context);
|
||||
|
||||
pCtx->OriginalInterface.InterfaceDereference(pCtx->OriginalInterface.BusContext);
|
||||
}
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
USB_BUSIFFN
|
||||
UsbInterfaceQueryBusTime(
|
||||
IN PVOID BusContext,
|
||||
IN OUT PULONG CurrentUsbFrame
|
||||
)
|
||||
{
|
||||
FuncEntry(TRACE_DEVICE);
|
||||
|
||||
const PCHILD_DEVICE_CONTEXT pCtx = ChildDeviceGetContext(BusContext);
|
||||
|
||||
NTSTATUS status = pCtx->OriginalInterface.QueryBusTime(
|
||||
pCtx->OriginalInterface.BusContext,
|
||||
CurrentUsbFrame
|
||||
);
|
||||
|
||||
if (CurrentUsbFrame)
|
||||
{
|
||||
TraceInformation(
|
||||
TRACE_DEVICE,
|
||||
"UsbInterfaceQueryBusTime.CurrentUsbFrame = %d",
|
||||
*CurrentUsbFrame
|
||||
);
|
||||
}
|
||||
|
||||
// fake-succeed the call
|
||||
if (CurrentUsbFrame && status == STATUS_NOT_SUPPORTED)
|
||||
{
|
||||
*CurrentUsbFrame = 0;
|
||||
status = STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
FuncExit(TRACE_DEVICE, "status=%!STATUS!", status);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static
|
||||
NTSTATUS
|
||||
USB_BUSIFFN
|
||||
UsbInterfaceSubmitIsoOutUrb(
|
||||
IN PVOID BusContext,
|
||||
IN PURB Urb
|
||||
)
|
||||
{
|
||||
const PCHILD_DEVICE_CONTEXT pCtx = ChildDeviceGetContext(BusContext);
|
||||
|
||||
return pCtx->OriginalInterface.SubmitIsoOutUrb(
|
||||
pCtx->OriginalInterface.BusContext,
|
||||
Urb
|
||||
);
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
USB_BUSIFFN
|
||||
UsbInterfaceIsDeviceHighSpeed(
|
||||
IN PVOID BusContext
|
||||
)
|
||||
{
|
||||
const PCHILD_DEVICE_CONTEXT pCtx = ChildDeviceGetContext(BusContext);
|
||||
|
||||
return pCtx->OriginalInterface.IsDeviceHighSpeed(
|
||||
pCtx->OriginalInterface.BusContext
|
||||
);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
USB_BUSIFFN
|
||||
UsbInterfaceQueryBusInformation(
|
||||
IN PVOID BusContext,
|
||||
IN ULONG Level,
|
||||
IN OUT PVOID BusInformationBuffer,
|
||||
IN OUT PULONG BusInformationBufferLength,
|
||||
OUT PULONG BusInformationActualLength
|
||||
)
|
||||
{
|
||||
const PCHILD_DEVICE_CONTEXT pCtx = ChildDeviceGetContext(BusContext);
|
||||
|
||||
return pCtx->OriginalInterface.QueryBusInformation(
|
||||
pCtx->OriginalInterface.BusContext,
|
||||
Level,
|
||||
BusInformationBuffer,
|
||||
BusInformationBufferLength,
|
||||
BusInformationActualLength
|
||||
);
|
||||
}
|
||||
|
||||
VOID
|
||||
USB_BUSIFFN
|
||||
UsbInterfaceGetUSBDIVersion(
|
||||
IN PVOID BusContext,
|
||||
IN OUT PUSBD_VERSION_INFORMATION VersionInformation,
|
||||
IN OUT PULONG HcdCapabilities
|
||||
)
|
||||
{
|
||||
const PCHILD_DEVICE_CONTEXT pCtx = ChildDeviceGetContext(BusContext);
|
||||
|
||||
pCtx->OriginalInterface.GetUSBDIVersion(
|
||||
pCtx->OriginalInterface.BusContext,
|
||||
VersionInformation,
|
||||
HcdCapabilities
|
||||
);
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
EvtChildDeviceAdded(
|
||||
_In_ WDFDEVICE Device,
|
||||
_In_ DMFBUSCHILDDEVICE ChildDevice
|
||||
)
|
||||
{
|
||||
NTSTATUS status;
|
||||
WDF_OBJECT_ATTRIBUTES attributes;
|
||||
PCHILD_DEVICE_CONTEXT childContext = NULL;
|
||||
|
||||
FuncEntry(TRACE_DEVICE);
|
||||
|
||||
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, CHILD_DEVICE_CONTEXT);
|
||||
|
||||
if (NT_SUCCESS(status = WdfObjectAllocateContext(
|
||||
ChildDevice,
|
||||
&attributes,
|
||||
(void**)&childContext
|
||||
)))
|
||||
{
|
||||
childContext->Parent = Device;
|
||||
}
|
||||
else
|
||||
{
|
||||
TraceError(
|
||||
TRACE_DEVICE,
|
||||
"WdfObjectAllocateContext failed with status %!STATUS!",
|
||||
status
|
||||
);
|
||||
EventWriteFailedWithNTStatus(NULL, __FUNCTION__, L"WdfObjectAllocateContext", status);
|
||||
}
|
||||
|
||||
FuncExit(TRACE_DEVICE, "status=%!STATUS!", status);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
EvtChildDeviceQueryInterface(
|
||||
_In_ DMFBUSCHILDDEVICE ChildDevice,
|
||||
_In_ PIRP Irp
|
||||
)
|
||||
{
|
||||
FuncEntry(TRACE_DEVICE);
|
||||
|
||||
const PCHILD_DEVICE_CONTEXT pCtx = ChildDeviceGetContext(ChildDevice);
|
||||
const PIO_STACK_LOCATION currentStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
if (KeGetCurrentIrql() > PASSIVE_LEVEL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!pCtx)
|
||||
{
|
||||
TraceError(
|
||||
TRACE_DEVICE,
|
||||
"Child device context not yet allocated"
|
||||
);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// skip not interested
|
||||
if (!IsEqualGUID(currentStack->Parameters.QueryInterface.InterfaceType, &USB_BUS_INTERFACE_USBDI_GUID) ||
|
||||
currentStack->Parameters.QueryInterface.Version != 1)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
PUSB_BUS_INTERFACE_USBDI_V1 pUpperInterface = (PUSB_BUS_INTERFACE_USBDI_V1)currentStack->Parameters.QueryInterface.
|
||||
Interface;
|
||||
|
||||
TraceInformation(
|
||||
TRACE_DEVICE,
|
||||
"PRE QueryInterface.InterfaceType = %!GUID!",
|
||||
currentStack->Parameters.QueryInterface.InterfaceType
|
||||
);
|
||||
|
||||
TraceInformation(
|
||||
TRACE_DEVICE,
|
||||
"PRE QueryInterface.Version = %d",
|
||||
currentStack->Parameters.QueryInterface.Version
|
||||
);
|
||||
|
||||
KEVENT ke;
|
||||
IO_STATUS_BLOCK iosb;
|
||||
|
||||
RtlZeroMemory(&iosb, sizeof(IO_STATUS_BLOCK));
|
||||
|
||||
PUSB_BUS_INTERFACE_USBDI_V1 pUsbInterface = ExAllocatePool2(
|
||||
PagedPool,
|
||||
sizeof(USB_BUS_INTERFACE_USBDI_V1),
|
||||
NSS_POOL_TAG
|
||||
);
|
||||
|
||||
if (!pUsbInterface)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
RtlZeroMemory(pUsbInterface, sizeof(USB_BUS_INTERFACE_USBDI_V1));
|
||||
|
||||
const PDEVICE_OBJECT deviceObject = DMF_BusFilter_WdmAttachedDeviceGet(ChildDevice);
|
||||
|
||||
KeInitializeEvent(&ke, NotificationEvent, FALSE);
|
||||
|
||||
const PIRP qiIrp = IoBuildSynchronousFsdRequest(
|
||||
IRP_MJ_PNP,
|
||||
deviceObject,
|
||||
NULL,
|
||||
0,
|
||||
NULL,
|
||||
&ke,
|
||||
&iosb
|
||||
);
|
||||
qiIrp->IoStatus.Status = STATUS_NOT_SUPPORTED; // required initialize
|
||||
qiIrp->IoStatus.Information = 0;
|
||||
|
||||
const PIO_STACK_LOCATION qiStack = IoGetNextIrpStackLocation(qiIrp);
|
||||
|
||||
qiStack->MajorFunction = IRP_MJ_PNP;
|
||||
qiStack->MinorFunction = IRP_MN_QUERY_INTERFACE;
|
||||
|
||||
qiStack->Parameters.QueryInterface.InterfaceType = currentStack->Parameters.QueryInterface.InterfaceType;
|
||||
qiStack->Parameters.QueryInterface.Version = currentStack->Parameters.QueryInterface.Version;
|
||||
qiStack->Parameters.QueryInterface.Size = currentStack->Parameters.QueryInterface.Size;
|
||||
qiStack->Parameters.QueryInterface.Interface = (PINTERFACE)pUsbInterface;
|
||||
qiStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
|
||||
|
||||
const NTSTATUS status = IoCallDriver(deviceObject, qiIrp);
|
||||
|
||||
if (status == STATUS_PENDING)
|
||||
{
|
||||
KeWaitForSingleObject(&ke, Executive, KernelMode, FALSE, NULL);
|
||||
}
|
||||
|
||||
BOOLEAN ret = FALSE;
|
||||
|
||||
if (NT_SUCCESS(qiIrp->IoStatus.Status))
|
||||
{
|
||||
TraceInformation(
|
||||
TRACE_DEVICE,
|
||||
"IoCallDriver succeeded with status %!STATUS!",
|
||||
qiIrp->IoStatus.Status
|
||||
);
|
||||
|
||||
TraceInformation(
|
||||
TRACE_DEVICE,
|
||||
"POST usbInterface.Version = %d",
|
||||
pUsbInterface->Version
|
||||
);
|
||||
|
||||
TraceInformation(
|
||||
TRACE_DEVICE,
|
||||
"POST usbInterface.Size = %d",
|
||||
pUsbInterface->Size
|
||||
);
|
||||
|
||||
pCtx->OriginalInterface.Size = pUpperInterface->Size = pUsbInterface->Size;
|
||||
pCtx->OriginalInterface.Version = pUpperInterface->Version = pUsbInterface->Version;
|
||||
|
||||
// save original functions
|
||||
pCtx->OriginalInterface.InterfaceReference = pUsbInterface->InterfaceReference;
|
||||
pCtx->OriginalInterface.InterfaceDereference = pUsbInterface->InterfaceDereference;
|
||||
pCtx->OriginalInterface.GetUSBDIVersion = pUsbInterface->GetUSBDIVersion;
|
||||
pCtx->OriginalInterface.SubmitIsoOutUrb = pUsbInterface->SubmitIsoOutUrb;
|
||||
pCtx->OriginalInterface.QueryBusInformation = pUsbInterface->QueryBusInformation;
|
||||
pCtx->OriginalInterface.IsDeviceHighSpeed = pUsbInterface->IsDeviceHighSpeed;
|
||||
pCtx->OriginalInterface.QueryBusTime = pUsbInterface->QueryBusTime;
|
||||
|
||||
// report proxy functions
|
||||
pUpperInterface->InterfaceReference = UsbInterfaceReference;
|
||||
pUpperInterface->InterfaceDereference = UsbInterfaceDereference;
|
||||
pUpperInterface->GetUSBDIVersion = UsbInterfaceGetUSBDIVersion;
|
||||
pUpperInterface->SubmitIsoOutUrb = UsbInterfaceSubmitIsoOutUrb;
|
||||
pUpperInterface->QueryBusInformation = UsbInterfaceQueryBusInformation;
|
||||
pUpperInterface->IsDeviceHighSpeed = UsbInterfaceIsDeviceHighSpeed;
|
||||
pUpperInterface->QueryBusTime = UsbInterfaceQueryBusTime;
|
||||
|
||||
// keep original bus context
|
||||
pCtx->OriginalInterface.BusContext = pUsbInterface->BusContext;
|
||||
// replace context object so we get it in our hooked function
|
||||
pUpperInterface->BusContext = ChildDevice;
|
||||
|
||||
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||
// causes the module to complete the request
|
||||
ret = TRUE;
|
||||
}
|
||||
|
||||
ExFreePoolWithTag(pUsbInterface, NSS_POOL_TAG);
|
||||
|
||||
FuncExitNoReturn(TRACE_DEVICE);
|
||||
return ret;
|
||||
}
|
67
src/Device.h
Normal file
67
src/Device.h
Normal file
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* nssudeaudio - USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
*
|
||||
* Copyright (c) 2022-2023, Nefarius Software Solutions e.U.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in bytecode or binary forms, without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions in bytecode or 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 includes repository READMEs for open-source projects
|
||||
* interfacing with this product, websites or in-application credits.
|
||||
*
|
||||
* * Neither the name of the nssudeaudio.sys nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from or distributed
|
||||
* with this software without specific prior written permission.
|
||||
*
|
||||
* * Bundling or otherwise redistributing copies of binaries signed by
|
||||
* Nefarius Software Solutions e.U. is prohibited without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* * Personal use for research, experiment, and testing for
|
||||
* the benefit of public knowledge, personal study, private
|
||||
* entertainment, hobby projects, amateur pursuits, or religious
|
||||
* observance, without any anticipated commercial application,
|
||||
* is use for a permitted purpose.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
#include <usbbusif.h>
|
||||
|
||||
//
|
||||
// Child device context
|
||||
//
|
||||
typedef struct _CHILD_DEVICE_CONTEXT
|
||||
{
|
||||
WDFDEVICE Parent;
|
||||
|
||||
USB_BUS_INTERFACE_USBDI_V1 OriginalInterface;
|
||||
|
||||
} CHILD_DEVICE_CONTEXT, * PCHILD_DEVICE_CONTEXT;
|
||||
|
||||
WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(CHILD_DEVICE_CONTEXT, ChildDeviceGetContext)
|
||||
|
||||
|
||||
//
|
||||
// Bus filter module callbacks
|
||||
//
|
||||
|
||||
EVT_DMF_BusFilter_DeviceAdd EvtChildDeviceAdded;
|
||||
|
||||
EVT_DMF_BusFilter_DeviceQueryInterface EvtChildDeviceQueryInterface;
|
20
src/Dmf.props
Normal file
20
src/Dmf.props
Normal file
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Label="PropertySheets" />
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_PropertySheetDisplayName>Driver Module Framework</_PropertySheetDisplayName>
|
||||
<!-- By default, look for DMF in parent root directory, otherwise use environment variable value -->
|
||||
<DmfRootPath Condition="'$(DmfRootPath)' == ''">$(SolutionDir)..\</DmfRootPath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(DmfRootPath)\DMF\Modules.Library;$(DmfRootPath)\DMF\Modules.Template;$(DmfRootPath)\DMF\Modules.Library.Tests;$(DmfRootPath)\DMF\Framework;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies Condition="'$(DriverType)'=='KMDF'">$(DmfRootPath)\$(Configuration)\$(PlatformName)\lib\DmfK\DmfK.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\individual_libs\DmfKModules.Template\DmfKModules.Template.lib;%(AdditionalDependencies);</AdditionalDependencies>
|
||||
<AdditionalDependencies Condition="'$(DriverType)'=='UMDF'">$(DmfRootPath)\$(Configuration)\$(PlatformName)\lib\DmfU\DmfU.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\individual_libs\DmfUModules.Template\DmfUModules.Template.lib;%(AdditionalDependencies);</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup />
|
||||
</Project>
|
18
src/DmfBusFilterExtension.props
Normal file
18
src/DmfBusFilterExtension.props
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ImportGroup Label="PropertySheets" />
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_PropertySheetDisplayName>DMF Bus Filter Extension</_PropertySheetDisplayName>
|
||||
<DmfBusFilterExtensionRootPath Condition="'$(DmfBusFilterExtensionRootPath)' == ''">$(SolutionDir)..\</DmfBusFilterExtensionRootPath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(DmfBusFilterExtensionRootPath)\src;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies Condition="'$(DriverType)'=='KMDF'">$(DmfBusFilterExtensionRootPath)\bin\$(Configuration)\$(PlatformName)\DmfBusFilterExtension.lib;%(AdditionalDependencies);</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup />
|
||||
</Project>
|
149
src/Driver.c
Normal file
149
src/Driver.c
Normal file
@ -0,0 +1,149 @@
|
||||
/*
|
||||
* nssudeaudio - USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
*
|
||||
* Copyright (c) 2022-2023, Nefarius Software Solutions e.U.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in bytecode or binary forms, without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions in bytecode or 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 includes repository READMEs for open-source projects
|
||||
* interfacing with this product, websites or in-application credits.
|
||||
*
|
||||
* * Neither the name of the nssudeaudio.sys nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from or distributed
|
||||
* with this software without specific prior written permission.
|
||||
*
|
||||
* * Bundling or otherwise redistributing copies of binaries signed by
|
||||
* Nefarius Software Solutions e.U. is prohibited without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* * Personal use for research, experiment, and testing for
|
||||
* the benefit of public knowledge, personal study, private
|
||||
* entertainment, hobby projects, amateur pursuits, or religious
|
||||
* observance, without any anticipated commercial application,
|
||||
* is use for a permitted purpose.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
||||
*/
|
||||
|
||||
|
||||
#include "Driver.h"
|
||||
#include "Driver.tmh"
|
||||
|
||||
|
||||
#pragma code_seg("INIT")
|
||||
NTSTATUS
|
||||
DriverEntry(
|
||||
_In_ PDRIVER_OBJECT DriverObject,
|
||||
_In_ PUNICODE_STRING RegistryPath
|
||||
)
|
||||
{
|
||||
WPP_INIT_TRACING(DriverObject, RegistryPath);
|
||||
|
||||
EventRegisterNefarius_USB_Bus_Class_Filter_Driver_for_fixing_UDE_compatibility_with_USBAUDIO_SYS();
|
||||
|
||||
FuncEntry(TRACE_DRIVER);
|
||||
|
||||
WDFDRIVER driver = NULL;
|
||||
WDF_OBJECT_ATTRIBUTES attributes;
|
||||
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
|
||||
attributes.EvtCleanupCallback = EvtDriverContextCleanup;
|
||||
|
||||
WDF_DRIVER_CONFIG config;
|
||||
WDF_DRIVER_CONFIG_INIT(&config,
|
||||
DMF_BusFilter_DeviceAdd // provided by module
|
||||
);
|
||||
|
||||
NTSTATUS status = WdfDriverCreate(
|
||||
DriverObject,
|
||||
RegistryPath,
|
||||
&attributes,
|
||||
&config,
|
||||
&driver
|
||||
);
|
||||
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceError(
|
||||
TRACE_DRIVER,
|
||||
"WdfDriverCreate failed %!STATUS!",
|
||||
status
|
||||
);
|
||||
EventWriteFailedWithNTStatus(NULL, __FUNCTION__, L"WdfDriverCreate", status);
|
||||
goto errorExit;
|
||||
}
|
||||
|
||||
DMF_BusFilter_CONFIG filterConfig;
|
||||
|
||||
DMF_BusFilter_CONFIG_INIT(&filterConfig, DriverObject);
|
||||
|
||||
filterConfig.DeviceType = FILE_DEVICE_BUS_EXTENDER;
|
||||
|
||||
filterConfig.EvtDeviceAdd = EvtChildDeviceAdded;
|
||||
filterConfig.EvtDeviceQueryInterface = EvtChildDeviceQueryInterface;
|
||||
|
||||
status = DMF_BusFilter_Initialize(&filterConfig);
|
||||
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
TraceEvents(
|
||||
TRACE_LEVEL_ERROR,
|
||||
TRACE_DRIVER,
|
||||
"DMF_BusFilter_Initialize failed %!STATUS!",
|
||||
status
|
||||
);
|
||||
EventWriteFailedWithNTStatus(NULL, __FUNCTION__, L"DMF_BusFilter_Initialize", status);
|
||||
goto errorExit;
|
||||
}
|
||||
|
||||
EventWriteStartEvent(NULL, DriverObject, status);
|
||||
|
||||
FuncExit(TRACE_DRIVER, "status=%!STATUS!", status);
|
||||
|
||||
return status;
|
||||
|
||||
errorExit:
|
||||
EventUnregisterNefarius_USB_Bus_Class_Filter_Driver_for_fixing_UDE_compatibility_with_USBAUDIO_SYS();
|
||||
WPP_CLEANUP(DriverObject);
|
||||
return status;
|
||||
}
|
||||
#pragma code_seg()
|
||||
|
||||
//
|
||||
// Called on driver object disposal
|
||||
//
|
||||
#pragma code_seg("PAGED")
|
||||
VOID
|
||||
EvtDriverContextCleanup(
|
||||
_In_ WDFOBJECT DriverObject
|
||||
)
|
||||
|
||||
{
|
||||
PAGED_CODE();
|
||||
|
||||
FuncEntry(TRACE_DRIVER);
|
||||
|
||||
EventWriteUnloadEvent(NULL, DriverObject);
|
||||
|
||||
EventUnregisterNefarius_USB_Bus_Class_Filter_Driver_for_fixing_UDE_compatibility_with_USBAUDIO_SYS();
|
||||
|
||||
//
|
||||
// Stop WPP Tracing
|
||||
//
|
||||
WPP_CLEANUP(WdfDriverWdmGetDriverObject((WDFDRIVER)DriverObject));
|
||||
}
|
||||
#pragma code_seg()
|
72
src/Driver.h
Normal file
72
src/Driver.h
Normal file
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* nssudeaudio - USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
*
|
||||
* Copyright (c) 2022-2023, Nefarius Software Solutions e.U.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in bytecode or binary forms, without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions in bytecode or 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 includes repository READMEs for open-source projects
|
||||
* interfacing with this product, websites or in-application credits.
|
||||
*
|
||||
* * Neither the name of the nssudeaudio.sys nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from or distributed
|
||||
* with this software without specific prior written permission.
|
||||
*
|
||||
* * Bundling or otherwise redistributing copies of binaries signed by
|
||||
* Nefarius Software Solutions e.U. is prohibited without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* * Personal use for research, experiment, and testing for
|
||||
* the benefit of public knowledge, personal study, private
|
||||
* entertainment, hobby projects, amateur pursuits, or religious
|
||||
* observance, without any anticipated commercial application,
|
||||
* is use for a permitted purpose.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#pragma warning(disable:5040)
|
||||
#include <DmfModules.Library.h>
|
||||
#pragma warning(default:5040)
|
||||
|
||||
#include <Dmf_BusFilter.h>
|
||||
|
||||
#include <ntddk.h>
|
||||
#include <wdf.h>
|
||||
#define NTSTRSAFE_LIB
|
||||
#include <ntstrsafe.h>
|
||||
#include <initguid.h>
|
||||
#include <devpropdef.h>
|
||||
#include <devpkey.h>
|
||||
|
||||
#include "nssudeaudioETW.h"
|
||||
|
||||
#include "Trace.h"
|
||||
#include "Util.h"
|
||||
#include "Device.h"
|
||||
|
||||
#define MAX_ID_CHARS 200
|
||||
#define MAX_ID_SIZE (MAX_ID_CHARS * sizeof(WCHAR))
|
||||
#define NSS_POOL_TAG 'uSSN'
|
||||
|
||||
DRIVER_INITIALIZE DriverEntry;
|
||||
|
||||
EVT_WDF_OBJECT_CONTEXT_CLEANUP EvtDriverContextCleanup;
|
62
src/Trace.h
Normal file
62
src/Trace.h
Normal file
@ -0,0 +1,62 @@
|
||||
#pragma once
|
||||
|
||||
//
|
||||
// Define the tracing flags.
|
||||
//
|
||||
// Tracing GUID - {DA6816E8-ED3C-4593-91A1-2CE2DF70184C}
|
||||
//
|
||||
|
||||
#define WPP_CONTROL_GUIDS \
|
||||
WPP_DEFINE_CONTROL_GUID( \
|
||||
nssudeaudioTraceGuid, (da6816e8,ed3c,4593,91a1,2ce2df70184c), \
|
||||
\
|
||||
WPP_DEFINE_BIT(MYDRIVER_ALL_INFO) \
|
||||
WPP_DEFINE_BIT(DMF_TRACE) \
|
||||
WPP_DEFINE_BIT(TRACE_DRIVER) \
|
||||
WPP_DEFINE_BIT(TRACE_DEVICE) \
|
||||
WPP_DEFINE_BIT(TRACE_UTIL) \
|
||||
)
|
||||
|
||||
#define WPP_FLAG_LEVEL_LOGGER(flag, level) \
|
||||
WPP_LEVEL_LOGGER(flag)
|
||||
|
||||
#define WPP_FLAG_LEVEL_ENABLED(flag, level) \
|
||||
(WPP_LEVEL_ENABLED(flag) && \
|
||||
WPP_CONTROL(WPP_BIT_ ## flag).Level >= level)
|
||||
|
||||
#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) \
|
||||
WPP_LEVEL_LOGGER(flags)
|
||||
|
||||
#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) \
|
||||
(WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= lvl)
|
||||
|
||||
//
|
||||
// This comment block is scanned by the trace preprocessor to define our
|
||||
// Trace function.
|
||||
//
|
||||
// USEPREFIX and USESUFFIX strip all trailing whitespace, so we need to surround
|
||||
// FuncExit messages with brackets
|
||||
//
|
||||
// begin_wpp config
|
||||
// FUNC Trace{FLAG=MYDRIVER_ALL_INFO}(LEVEL, MSG, ...);
|
||||
// FUNC TraceEvents(LEVEL, FLAGS, MSG, ...);
|
||||
// FUNC FuncEntry{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS);
|
||||
// FUNC FuncEntryArguments{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS, MSG, ...);
|
||||
// FUNC FuncExit{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS, MSG, ...);
|
||||
// FUNC FuncExitVoid{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS);
|
||||
// FUNC TraceError{LEVEL=TRACE_LEVEL_ERROR}(FLAGS, MSG, ...);
|
||||
// FUNC TraceInformation{LEVEL=TRACE_LEVEL_INFORMATION}(FLAGS, MSG, ...);
|
||||
// FUNC TraceVerbose{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS, MSG, ...);
|
||||
// FUNC FuncExitNoReturn{LEVEL=TRACE_LEVEL_VERBOSE}(FLAGS);
|
||||
// USEPREFIX(FuncEntry, "%!STDPREFIX! [%!FUNC!] --> Entry");
|
||||
// USEPREFIX(FuncEntryArguments, "%!STDPREFIX! [%!FUNC!] --> Entry <");
|
||||
// USEPREFIX(FuncExit, "%!STDPREFIX! [%!FUNC!] <-- Exit <");
|
||||
// USESUFFIX(FuncExit, ">");
|
||||
// USEPREFIX(FuncExitVoid, "%!STDPREFIX! [%!FUNC!] <-- Exit");
|
||||
// USEPREFIX(TraceError, "%!STDPREFIX! [%!FUNC!] ERROR:");
|
||||
// USEPREFIX(TraceEvents, "%!STDPREFIX! [%!FUNC!] ");
|
||||
// USEPREFIX(TraceInformation, "%!STDPREFIX! [%!FUNC!] ");
|
||||
// USEPREFIX(TraceVerbose, "%!STDPREFIX! [%!FUNC!] ");
|
||||
// USEPREFIX(FuncExitNoReturn, "%!STDPREFIX! [%!FUNC!] <--");
|
||||
// end_wpp
|
||||
//
|
313
src/Util.c
Normal file
313
src/Util.c
Normal file
@ -0,0 +1,313 @@
|
||||
/*
|
||||
* nssudeaudio - USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
*
|
||||
* Copyright (c) 2022-2023, Nefarius Software Solutions e.U.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in bytecode or binary forms, without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions in bytecode or 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 includes repository READMEs for open-source projects
|
||||
* interfacing with this product, websites or in-application credits.
|
||||
*
|
||||
* * Neither the name of the nssudeaudio.sys nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from or distributed
|
||||
* with this software without specific prior written permission.
|
||||
*
|
||||
* * Bundling or otherwise redistributing copies of binaries signed by
|
||||
* Nefarius Software Solutions e.U. is prohibited without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* * Personal use for research, experiment, and testing for
|
||||
* the benefit of public knowledge, personal study, private
|
||||
* entertainment, hobby projects, amateur pursuits, or religious
|
||||
* observance, without any anticipated commercial application,
|
||||
* is use for a permitted purpose.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
||||
*/
|
||||
|
||||
|
||||
#include "Driver.h"
|
||||
#include "Util.tmh"
|
||||
|
||||
|
||||
//
|
||||
// Set a device property on the provided PDO
|
||||
//
|
||||
#pragma code_seg("PAGE")
|
||||
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||
NTSTATUS
|
||||
SetDeviceProperty(
|
||||
_In_ DMFBUSCHILDDEVICE Device,
|
||||
_In_ const DEVPROPKEY* PropertyKey,
|
||||
_In_ DEVPROPTYPE PropertyType,
|
||||
_In_ PWSTR Buffer
|
||||
)
|
||||
{
|
||||
FuncEntry(TRACE_UTIL);
|
||||
|
||||
NTSTATUS status = STATUS_SUCCESS;
|
||||
const PDEVICE_OBJECT pdo = DMF_BusFilter_WdmPhysicalDeviceGet(Device);
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
do {
|
||||
if (!pdo)
|
||||
{
|
||||
TraceError(
|
||||
TRACE_UTIL,
|
||||
"Failed to get PDO device object"
|
||||
);
|
||||
status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
break;
|
||||
}
|
||||
|
||||
size_t numChars = 0;
|
||||
WCHAR* retval = (WCHAR*)Buffer;
|
||||
WCHAR* szIter = (WCHAR*)Buffer;
|
||||
|
||||
switch (PropertyType)
|
||||
{
|
||||
case DEVPROP_TYPE_STRING_LIST:
|
||||
|
||||
while (szIter && *szIter && numChars + wcslen(szIter) + 2 <= MAX_ID_SIZE)
|
||||
{
|
||||
numChars += wcslen(szIter) + 1;
|
||||
szIter += wcslen(szIter) + 1;
|
||||
}
|
||||
|
||||
numChars++;
|
||||
|
||||
break;
|
||||
case DEVPROP_TYPE_STRING:
|
||||
|
||||
numChars = wcslen(retval) + 1;
|
||||
|
||||
break;
|
||||
default:
|
||||
status = STATUS_NOT_SUPPORTED;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!NT_SUCCESS(status))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
status = IoSetDevicePropertyData(
|
||||
pdo,
|
||||
PropertyKey,
|
||||
LOCALE_NEUTRAL,
|
||||
0,
|
||||
PropertyType,
|
||||
(ULONG)numChars * sizeof(WCHAR),
|
||||
(PVOID)Buffer
|
||||
);
|
||||
} while (FALSE);
|
||||
|
||||
FuncExit(TRACE_UTIL, "status=%!STATUS!", status);
|
||||
|
||||
return status;
|
||||
}
|
||||
#pragma code_seg()
|
||||
|
||||
//
|
||||
// Helper function to query device identifiers
|
||||
//
|
||||
#pragma code_seg("PAGE")
|
||||
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||
NTSTATUS BusQueryId(
|
||||
PDEVICE_OBJECT DeviceObject,
|
||||
BUS_QUERY_ID_TYPE IdType,
|
||||
PWCHAR Buffer,
|
||||
ULONG BufferLength
|
||||
)
|
||||
{
|
||||
NTSTATUS status;
|
||||
KEVENT ke;
|
||||
IO_STATUS_BLOCK iosb;
|
||||
PIRP irp;
|
||||
PIO_STACK_LOCATION stack;
|
||||
|
||||
FuncEntry(TRACE_UTIL);
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
const ULONG maxNumChars = BufferLength / sizeof(WCHAR);
|
||||
|
||||
KeInitializeEvent(&ke, NotificationEvent, FALSE);
|
||||
|
||||
RtlZeroMemory(&iosb, sizeof(IO_STATUS_BLOCK));
|
||||
irp = IoBuildSynchronousFsdRequest(
|
||||
IRP_MJ_PNP,
|
||||
DeviceObject,
|
||||
NULL,
|
||||
0,
|
||||
NULL,
|
||||
&ke,
|
||||
&iosb
|
||||
);
|
||||
irp->IoStatus.Status = STATUS_NOT_SUPPORTED; // required initialize
|
||||
stack = IoGetNextIrpStackLocation(irp);
|
||||
stack->MinorFunction = IRP_MN_QUERY_ID;
|
||||
stack->Parameters.QueryId.IdType = IdType;
|
||||
|
||||
status = IoCallDriver(DeviceObject, irp);
|
||||
|
||||
if (status == STATUS_PENDING)
|
||||
{
|
||||
//
|
||||
// Normally, we will not hit this, because QueryId should not be an expensive operation
|
||||
//
|
||||
KeWaitForSingleObject(&ke, Executive, KernelMode, FALSE, NULL);
|
||||
}
|
||||
|
||||
if (NT_SUCCESS(status))
|
||||
{
|
||||
if (iosb.Information)
|
||||
{
|
||||
size_t length = 0;
|
||||
WCHAR* retval = (WCHAR*)iosb.Information;
|
||||
WCHAR* szIter = (WCHAR*)iosb.Information;
|
||||
|
||||
switch (IdType) // NOLINT(clang-diagnostic-switch-enum)
|
||||
{
|
||||
//
|
||||
// Double-null terminated multi-strings
|
||||
//
|
||||
case BusQueryHardwareIDs:
|
||||
case BusQueryCompatibleIDs:
|
||||
|
||||
//
|
||||
// Calculate size in characters by finding last double-NULL characters
|
||||
//
|
||||
while (szIter && *szIter && length + wcslen(szIter) + 2 <= maxNumChars)
|
||||
{
|
||||
length += wcslen(szIter) + 1;
|
||||
szIter += wcslen(szIter) + 1;
|
||||
}
|
||||
|
||||
length++;
|
||||
|
||||
RtlCopyMemory(Buffer, retval, length * sizeof(WCHAR));
|
||||
ExFreePool(retval); // IRP_MN_QUERY_ID requires this
|
||||
break;
|
||||
//
|
||||
// Single line string
|
||||
//
|
||||
default:
|
||||
if (wcslen(retval) + 1 > maxNumChars)
|
||||
{
|
||||
ExFreePool(retval); // IRP_MN_QUERY_ID requires this
|
||||
status = STATUS_BUFFER_TOO_SMALL;
|
||||
break;
|
||||
}
|
||||
|
||||
RtlStringCchCopyNW(Buffer, maxNumChars, retval, wcslen(retval) + 1);
|
||||
ExFreePool(retval); // IRP_MN_QUERY_ID requires this
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
status = STATUS_INVALID_DEVICE_REQUEST;
|
||||
}
|
||||
}
|
||||
|
||||
FuncExit(TRACE_UTIL, "status=%!STATUS!", status);
|
||||
|
||||
return status;
|
||||
}
|
||||
#pragma code_seg()
|
||||
|
||||
//
|
||||
// Retrieves the device instance ID of the PDO
|
||||
//
|
||||
#pragma code_seg("PAGE")
|
||||
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||
NTSTATUS
|
||||
GetDeviceInstanceIdProperty(
|
||||
_In_ DMFBUSCHILDDEVICE ChildDevice,
|
||||
_Out_ WDFMEMORY* Value
|
||||
)
|
||||
{
|
||||
NTSTATUS status = STATUS_NOT_IMPLEMENTED;
|
||||
WCHAR buffer[MAX_ID_CHARS];
|
||||
ULONG requiredSize = 0;
|
||||
DEVPROPTYPE type = 0;
|
||||
WDF_OBJECT_ATTRIBUTES attributes;
|
||||
PUCHAR memBuffer = NULL;
|
||||
|
||||
FuncEntry(TRACE_UTIL);
|
||||
|
||||
PAGED_CODE();
|
||||
|
||||
PDEVICE_OBJECT pdo = DMF_BusFilter_WdmPhysicalDeviceGet(ChildDevice);
|
||||
|
||||
do
|
||||
{
|
||||
if (!NT_SUCCESS(status = IoGetDevicePropertyData(
|
||||
pdo,
|
||||
&DEVPKEY_Device_InstanceId,
|
||||
LOCALE_NEUTRAL,
|
||||
0,
|
||||
MAX_ID_CHARS,
|
||||
buffer,
|
||||
&requiredSize,
|
||||
&type
|
||||
)))
|
||||
{
|
||||
TraceError(
|
||||
TRACE_UTIL,
|
||||
"IoGetDevicePropertyData failed with status %!STATUS!",
|
||||
status
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
|
||||
attributes.ParentObject = ChildDevice;
|
||||
|
||||
//
|
||||
// Create context memory
|
||||
//
|
||||
if (!NT_SUCCESS(status = WdfMemoryCreate(
|
||||
&attributes,
|
||||
NonPagedPoolNx,
|
||||
NSS_POOL_TAG,
|
||||
requiredSize,
|
||||
Value,
|
||||
(void**)&memBuffer
|
||||
)))
|
||||
{
|
||||
TraceError(
|
||||
TRACE_UTIL,
|
||||
"WdfMemoryCreate failed with status %!STATUS!",
|
||||
status
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
RtlCopyMemory(memBuffer, buffer, requiredSize);
|
||||
|
||||
} while (FALSE);
|
||||
|
||||
FuncExit(TRACE_UTIL, "status=%!STATUS!", status);
|
||||
|
||||
return status;
|
||||
}
|
||||
#pragma code_seg()
|
69
src/Util.h
Normal file
69
src/Util.h
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* nssudeaudio - USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
*
|
||||
* Copyright (c) 2022-2023, Nefarius Software Solutions e.U.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in bytecode or binary forms, without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions in bytecode or 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 includes repository READMEs for open-source projects
|
||||
* interfacing with this product, websites or in-application credits.
|
||||
*
|
||||
* * Neither the name of the nssudeaudio.sys nor the names of its contributors may
|
||||
* be used to endorse or promote products derived from or distributed
|
||||
* with this software without specific prior written permission.
|
||||
*
|
||||
* * Bundling or otherwise redistributing copies of binaries signed by
|
||||
* Nefarius Software Solutions e.U. is prohibited without specific prior
|
||||
* written permission.
|
||||
*
|
||||
* * Personal use for research, experiment, and testing for
|
||||
* the benefit of public knowledge, personal study, private
|
||||
* entertainment, hobby projects, amateur pursuits, or religious
|
||||
* observance, without any anticipated commercial application,
|
||||
* is use for a permitted purpose.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT HOLDER 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.
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||
NTSTATUS
|
||||
SetDeviceProperty(
|
||||
_In_ DMFBUSCHILDDEVICE Device,
|
||||
_In_ const DEVPROPKEY* PropertyKey,
|
||||
_In_ DEVPROPTYPE PropertyType,
|
||||
_In_ PWSTR Buffer
|
||||
);
|
||||
|
||||
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||
NTSTATUS
|
||||
BusQueryId(
|
||||
PDEVICE_OBJECT DeviceObject,
|
||||
BUS_QUERY_ID_TYPE IdType,
|
||||
PWCHAR Buffer,
|
||||
ULONG BufferLength
|
||||
);
|
||||
|
||||
_IRQL_requires_max_(PASSIVE_LEVEL)
|
||||
NTSTATUS
|
||||
GetDeviceInstanceIdProperty(
|
||||
_In_ DMFBUSCHILDDEVICE ChildDevice,
|
||||
_Out_ WDFMEMORY* Value
|
||||
);
|
62
src/nssudeaudio.inf
Normal file
62
src/nssudeaudio.inf
Normal file
@ -0,0 +1,62 @@
|
||||
;
|
||||
; Nefarius USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS
|
||||
;
|
||||
|
||||
[Version]
|
||||
Signature = "$WINDOWS NT$"
|
||||
Class = USB
|
||||
ClassGuid = {36FC9E60-C465-11CF-8056-444553540000}
|
||||
DriverPackageType = ClassFilter
|
||||
Provider = %ManufacturerName%
|
||||
CatalogFile = nssudeaudio.cat
|
||||
DriverVer =
|
||||
PnpLockdown = 1
|
||||
|
||||
|
||||
[SourceDisksNames]
|
||||
1 = %DiskName%,,,""
|
||||
|
||||
[SourceDisksFiles]
|
||||
nssudeaudio.sys = 1,,
|
||||
|
||||
[DestinationDirs]
|
||||
DefaultDestDir = 12
|
||||
nssudeaudio.DriverFiles = 12
|
||||
|
||||
[DefaultInstall.NT$ARCH$]
|
||||
OptionDesc = %nssudeaudioServiceDesc%
|
||||
CopyFiles = nssudeaudio.DriverFiles
|
||||
AddReg = nssudeaudio_AddReg
|
||||
|
||||
[DefaultUninstall.NT$ARCH$]
|
||||
LegacyUninstall = 1
|
||||
DelFiles = @nssudeaudio.sys
|
||||
DelReg = nssudeaudio_DelReg
|
||||
|
||||
[nssudeaudio_AddReg]
|
||||
;Add nssudeaudio to UpperFilters
|
||||
HKLM, System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}, UpperFilters, 0x00010008, nssudeaudio
|
||||
|
||||
[nssudeaudio_DelReg]
|
||||
;Delete nssudeaudio from UpperFilters
|
||||
HKLM, System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}, UpperFilters, 0x00018002, nssudeaudio
|
||||
|
||||
[nssudeaudio.DriverFiles]
|
||||
nssudeaudio.sys
|
||||
|
||||
[DefaultInstall.NT$ARCH$.Services]
|
||||
AddService = %nssudeaudioServiceName%,,nssudeaudio.Service
|
||||
|
||||
[nssudeaudio.Service]
|
||||
DisplayName = %nssudeaudioServiceName%
|
||||
Description = %nssudeaudioServiceDesc%
|
||||
ServiceBinary = %12%\nssudeaudio.sys
|
||||
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
|
||||
StartType = 3 ; SERVICE_DEMAND_START
|
||||
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
|
||||
|
||||
[Strings]
|
||||
ManufacturerName = "Nefarius Software Solutions e.U."
|
||||
DiskName = "nssudeaudio Installation Disk"
|
||||
nssudeaudioServiceDesc = "Nefarius USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS"
|
||||
nssudeaudioServiceName = "nssudeaudio"
|
44
src/nssudeaudio.man
Normal file
44
src/nssudeaudio.man
Normal file
@ -0,0 +1,44 @@
|
||||
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
|
||||
<instrumentationManifest xmlns="http://schemas.microsoft.com/win/2004/08/events" xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd">
|
||||
<instrumentation>
|
||||
<events>
|
||||
<provider guid="{b78bd021-6464-4c9e-ba88-f4a97a14803f}"
|
||||
messageFileName="%WinDir%\System32\drivers\nssudeaudio.sys"
|
||||
name="Nefarius USB Bus Class Filter Driver for fixing UDE compatibility with USBAUDIO.SYS"
|
||||
resourceFileName="%WinDir%\System32\drivers\nssudeaudio.sys"
|
||||
symbol="DriverControlGuid">
|
||||
<channels>
|
||||
<importChannel chid="SYSTEM" name="System"/>
|
||||
</channels>
|
||||
<templates>
|
||||
<template tid="tid_load_template">
|
||||
<data inType="win:Pointer" name="DriverObjPtr" outType="win:HexInt64"/>
|
||||
<data inType="win:UInt32" name="Status" outType="win:NTSTATUS"/>
|
||||
</template>
|
||||
<template tid="tid_unload_template">
|
||||
<data inType="win:Pointer" name="DriverObjPtr" outType="win:HexInt64"/>
|
||||
</template>
|
||||
<template tid="tid_failed_with_ntstatus">
|
||||
<data inType="win:AnsiString" name="ScopeName" outType="win:Utf8"/>
|
||||
<data inType="win:UnicodeString" name="FunctionName" outType="xs:string"/>
|
||||
<data inType="win:UInt32" name="Status" outType="win:NTSTATUS"/>
|
||||
</template>
|
||||
</templates>
|
||||
<events>
|
||||
<event value="1" channel="SYSTEM" level="win:Informational" message="$(string.StartEvent.EventMessage)" opcode="win:Start" symbol="StartEvent" template="tid_load_template"/>
|
||||
<event value="2" channel="SYSTEM" level="win:Informational" message="$(string.UnloadEvent.EventMessage)" opcode="win:Stop" symbol="UnloadEvent" template="tid_unload_template"/>
|
||||
<event value="3" channel="SYSTEM" level="win:Error" message="$(string.FailedWithNTStatus.EventMessage)" opcode="win:Info" symbol="FailedWithNTStatus" template="tid_failed_with_ntstatus"/>
|
||||
</events>
|
||||
</provider>
|
||||
</events>
|
||||
</instrumentation>
|
||||
<localization xmlns="http://schemas.microsoft.com/win/2004/08/events">
|
||||
<resources culture="en-US">
|
||||
<stringTable>
|
||||
<string id="StartEvent.EventMessage" value="Driver loaded (obj: %1, status: %2)"/>
|
||||
<string id="UnloadEvent.EventMessage" value="Driver unloaded (obj: %1)"/>
|
||||
<string id="FailedWithNTStatus.EventMessage" value="[%1] %2 failed with NTSTATUS %3"/>
|
||||
</stringTable>
|
||||
</resources>
|
||||
</localization>
|
||||
</instrumentationManifest>
|
49
src/nssudeaudio.rc
Normal file
49
src/nssudeaudio.rc
Normal file
@ -0,0 +1,49 @@
|
||||
//
|
||||
// Include the necessary resources
|
||||
//
|
||||
#include <winver.h>
|
||||
#include <ntdef.h>
|
||||
|
||||
#ifdef RC_INVOKED
|
||||
|
||||
//
|
||||
// Set up debug information
|
||||
//
|
||||
#if DBG
|
||||
#define VER_DBG VS_FF_DEBUG
|
||||
#else
|
||||
#define VER_DBG 0
|
||||
#endif
|
||||
|
||||
// ------- version info -------------------------------------------------------
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 2,0,2,0
|
||||
PRODUCTVERSION 2,0,2,0
|
||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||
FILEFLAGS VER_DBG
|
||||
FILEOS VOS_NT
|
||||
FILETYPE VFT_DRV
|
||||
FILESUBTYPE VFT2_DRV_SYSTEM
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "Nefarius USB Devices filter driver"
|
||||
VALUE "CompanyName", "Nefarius Software Solutions e.U."
|
||||
VALUE "FileDescription", "Nefarius USB Devices filter driver"
|
||||
VALUE "FileVersion", "2.0.2.0"
|
||||
VALUE "InternalName", "Nefarius USB Devices filter driver"
|
||||
VALUE "LegalCopyright", "(C) 2022 Nefarius Software Solutions e.U."
|
||||
VALUE "OriginalFilename", "nssudeaudio.sys"
|
||||
VALUE "ProductName", "Nefarius USB Devices filter driver"
|
||||
VALUE "ProductVersion", "2.0.2.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x0409,1200
|
||||
END
|
||||
END
|
||||
#endif
|
206
src/nssudeaudio.vcxproj
Normal file
206
src/nssudeaudio.vcxproj
Normal file
@ -0,0 +1,206 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|ARM64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>ARM64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|ARM64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>ARM64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{AE58270A-E8BC-4805-9A09-23E91D4A21D5}</ProjectGuid>
|
||||
<TemplateGuid>{1bc93793-694f-48fe-9372-81e2b05556fd}</TemplateGuid>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<MinimumVisualStudioVersion>12.0</MinimumVisualStudioVersion>
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform Condition="'$(Platform)' == ''">x64</Platform>
|
||||
<RootNamespace>nssudeaudio</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<TargetVersion>Windows10</TargetVersion>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
|
||||
<ConfigurationType>Driver</ConfigurationType>
|
||||
<DriverType>KMDF</DriverType>
|
||||
<DriverTargetPlatform>Universal</DriverTargetPlatform>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<TargetVersion>Windows10</TargetVersion>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
|
||||
<ConfigurationType>Driver</ConfigurationType>
|
||||
<DriverType>KMDF</DriverType>
|
||||
<DriverTargetPlatform>Universal</DriverTargetPlatform>
|
||||
<SignMode>Off</SignMode>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'" Label="Configuration">
|
||||
<TargetVersion>Windows10</TargetVersion>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
|
||||
<ConfigurationType>Driver</ConfigurationType>
|
||||
<DriverType>KMDF</DriverType>
|
||||
<DriverTargetPlatform>Universal</DriverTargetPlatform>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'" Label="Configuration">
|
||||
<TargetVersion>Windows10</TargetVersion>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>WindowsKernelModeDriver10.0</PlatformToolset>
|
||||
<ConfigurationType>Driver</ConfigurationType>
|
||||
<DriverType>KMDF</DriverType>
|
||||
<DriverTargetPlatform>Universal</DriverTargetPlatform>
|
||||
<SignMode>Off</SignMode>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="DMF.props" />
|
||||
<Import Project="DmfBusFilterExtension.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||
<Inf2CatUseLocalTime>true</Inf2CatUseLocalTime>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||
<Inf2CatUseLocalTime>true</Inf2CatUseLocalTime>
|
||||
<RunCodeAnalysis>true</RunCodeAnalysis>
|
||||
<OutDir>$(SolutionDir)bin\$(DDKPlatform)\</OutDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||
<Inf2CatUseLocalTime>true</Inf2CatUseLocalTime>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||
<DebuggerFlavor>DbgengKernelDebugger</DebuggerFlavor>
|
||||
<Inf2CatUseLocalTime>true</Inf2CatUseLocalTime>
|
||||
<RunCodeAnalysis>true</RunCodeAnalysis>
|
||||
<OutDir>$(SolutionDir)bin\$(DDKPlatform)\</OutDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<DriverSign>
|
||||
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
|
||||
</DriverSign>
|
||||
<ClCompile>
|
||||
<WppEnabled>true</WppEnabled>
|
||||
<WppRecorderEnabled>true</WppRecorderEnabled>
|
||||
<WppScanConfigurationData>Trace.h</WppScanConfigurationData>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>wdmsec.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\lib\DmfK\DmfK.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\individual_libs\DmfKModules.Template\DmfKModules.Template.lib;%(AdditionalDependencies);</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<DriverSign>
|
||||
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
|
||||
</DriverSign>
|
||||
<ClCompile>
|
||||
<WppEnabled>true</WppEnabled>
|
||||
<WppRecorderEnabled>true</WppRecorderEnabled>
|
||||
<WppScanConfigurationData>Trace.h</WppScanConfigurationData>
|
||||
</ClCompile>
|
||||
<Inf>
|
||||
<TimeStamp>2.0.2.0</TimeStamp>
|
||||
</Inf>
|
||||
<Link>
|
||||
<AdditionalDependencies>wdmsec.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\lib\DmfK\DmfK.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\individual_libs\DmfKModules.Template\DmfKModules.Template.lib;%(AdditionalDependencies);</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
|
||||
<DriverSign>
|
||||
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
|
||||
</DriverSign>
|
||||
<ClCompile>
|
||||
<WppEnabled>true</WppEnabled>
|
||||
<WppRecorderEnabled>true</WppRecorderEnabled>
|
||||
<WppScanConfigurationData>Trace.h</WppScanConfigurationData>
|
||||
</ClCompile>
|
||||
<Inf>
|
||||
<TimeStamp>2.0.2.0</TimeStamp>
|
||||
</Inf>
|
||||
<Link>
|
||||
<AdditionalDependencies>wdmsec.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\lib\DmfK\DmfK.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\individual_libs\DmfKModules.Template\DmfKModules.Template.lib;%(AdditionalDependencies);</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
|
||||
<DriverSign>
|
||||
<FileDigestAlgorithm>sha256</FileDigestAlgorithm>
|
||||
</DriverSign>
|
||||
<ClCompile>
|
||||
<WppEnabled>true</WppEnabled>
|
||||
<WppRecorderEnabled>true</WppRecorderEnabled>
|
||||
<WppScanConfigurationData>Trace.h</WppScanConfigurationData>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<AdditionalDependencies>wdmsec.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\lib\DmfK\DmfK.lib;$(DmfRootPath)\$(Configuration)\$(PlatformName)\individual_libs\DmfKModules.Template\DmfKModules.Template.lib;%(AdditionalDependencies);</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<Inf Include="nssudeaudio.inf" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<FilesToPackage Include="$(TargetPath)" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Device.h" />
|
||||
<ClInclude Include="Driver.h" />
|
||||
<ClInclude Include="Trace.h" />
|
||||
<ClInclude Include="Util.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Device.c" />
|
||||
<ClCompile Include="Driver.c" />
|
||||
<ClCompile Include="Util.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="nssudeaudio.rc" />
|
||||
<ResourceCompile Include="$(IntDir)nssudeaudioETW.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<MessageCompile Include="nssudeaudio.man">
|
||||
<GenerateKernelModeLoggingMacros Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</GenerateKernelModeLoggingMacros>
|
||||
<UseBaseNameOfInput Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</UseBaseNameOfInput>
|
||||
<GenerateKernelModeLoggingMacros Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</GenerateKernelModeLoggingMacros>
|
||||
<UseBaseNameOfInput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</UseBaseNameOfInput>
|
||||
<GenerateKernelModeLoggingMacros Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</GenerateKernelModeLoggingMacros>
|
||||
<UseBaseNameOfInput Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">true</UseBaseNameOfInput>
|
||||
<GenerateKernelModeLoggingMacros Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</GenerateKernelModeLoggingMacros>
|
||||
<UseBaseNameOfInput Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">true</UseBaseNameOfInput>
|
||||
<GenerateKernelModeLoggingMacros Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</GenerateKernelModeLoggingMacros>
|
||||
<UseBaseNameOfInput Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</UseBaseNameOfInput>
|
||||
<GenerateKernelModeLoggingMacros Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</GenerateKernelModeLoggingMacros>
|
||||
<UseBaseNameOfInput Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</UseBaseNameOfInput>
|
||||
<GenerateKernelModeLoggingMacros Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</GenerateKernelModeLoggingMacros>
|
||||
<UseBaseNameOfInput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</UseBaseNameOfInput>
|
||||
<GenerateKernelModeLoggingMacros Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</GenerateKernelModeLoggingMacros>
|
||||
<UseBaseNameOfInput Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</UseBaseNameOfInput>
|
||||
<GeneratedFilesBaseName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(Filename)ETW</GeneratedFilesBaseName>
|
||||
<GeneratedFilesBaseName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(Filename)ETW</GeneratedFilesBaseName>
|
||||
<GeneratedFilesBaseName Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">%(Filename)ETW</GeneratedFilesBaseName>
|
||||
<GeneratedFilesBaseName Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">%(Filename)ETW</GeneratedFilesBaseName>
|
||||
<GeneratedFilesBaseName Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">%(Filename)ETW</GeneratedFilesBaseName>
|
||||
<GeneratedFilesBaseName Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">%(Filename)ETW</GeneratedFilesBaseName>
|
||||
<GeneratedFilesBaseName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(Filename)ETW</GeneratedFilesBaseName>
|
||||
<GeneratedFilesBaseName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(Filename)ETW</GeneratedFilesBaseName>
|
||||
</MessageCompile>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
62
src/nssudeaudio.vcxproj.filters
Normal file
62
src/nssudeaudio.vcxproj.filters
Normal file
@ -0,0 +1,62 @@
|
||||
<?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;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;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>
|
||||
<Filter Include="Driver Files">
|
||||
<UniqueIdentifier>{8E41214B-6785-4CFE-B992-037D68949A14}</UniqueIdentifier>
|
||||
<Extensions>inf;inv;inx;mof;mc;</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Inf Include="nssudeaudio.inf">
|
||||
<Filter>Driver Files</Filter>
|
||||
</Inf>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Driver.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Device.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Util.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Driver.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Trace.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Device.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Util.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="nssudeaudio.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
<ResourceCompile Include="$(IntDir)nssudeaudioETW.rc">
|
||||
<Filter>Resource Files</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<MessageCompile Include="nssudeaudio.man" />
|
||||
</ItemGroup>
|
||||
</Project>
|
Loading…
Reference in New Issue
Block a user