1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
# How to build locally
## Step 1: Install Tools
```powershell
winget install --id Microsoft.Powershell --source winget
winget install --id Git.Git --source winget
```
For using WDK NuGet feed based build additionally:
```powershell
winget install --id Microsoft.NuGet --source winget
```
---
## Step 2: Optional: Disable Strong Name Validation
When: This step is only required if you will be using pre-release versions of the WDK.
As per https://learn.microsoft.com/en-us/windows-hardware/drivers/installing-preview-versions-wdk :
Run the following commands from an elevated command prompt to disable strong name validation:
```
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\*,31bf3856ad364e35 /v TestPublicKey /t REG_SZ /d 00240000048000009400000006020000002400005253413100040000010001003f8c902c8fe7ac83af7401b14c1bd103973b26dfafb2b77eda478a2539b979b56ce47f36336741b4ec52bbc51fecd51ba23810cec47070f3e29a2261a2d1d08e4b2b4b457beaa91460055f78cc89f21cd028377af0cc5e6c04699b6856a1e49d5fad3ef16d3c3d6010f40df0a7d6cc2ee11744b5cfb42e0f19a52b8a29dc31b0 /f
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\*,31bf3856ad364e35 /v TestPublicKey /t REG_SZ /d 00240000048000009400000006020000002400005253413100040000010001003f8c902c8fe7ac83af7401b14c1bd103973b26dfafb2b77eda478a2539b979b56ce47f36336741b4ec52bbc51fecd51ba23810cec47070f3e29a2261a2d1d08e4b2b4b457beaa91460055f78cc89f21cd028377af0cc5e6c04699b6856a1e49d5fad3ef16d3c3d6010f40df0a7d6cc2ee11744b5cfb42e0f19a52b8a29dc31b0 /f
```
---
## Step 3: Optional: Install Microsoft .NET Framework 4.7.2 Targeting Pack and Microsoft .NET Framework 4.8.1 SDK
When: This step is only required to build sample usb\usbview .
### Option A: Install VS Components
Easy: If you will install Visual Studio (see later) you may at that point select to add both of following individual components:
* .NET Framework 4.7.2 targeting pack
* .NET Framework 4.8.1 SDK
### Option B: Use EWDK
Easy: If you use EWDK, then all necessary prequisites are included.
### Option C: Install Developer Pack
Hardest: Install from https://aka.ms/msbuild/developerpacks -> '.NET Framework' -> 'Supported versions' both of following packages:
* .NET Framework 4.7.2 -> Developer Pack
* .NET Framework 4.8.1 -> Developer Pack
This will install following Apps:
* Microsoft .NET Framework 4.7.2 SDK
* Microsoft .NET Framework 4.7.2 Targeting Pack
* Microsoft .NET Framework 4.7.2 Targeting Pack (ENU)
* Microsoft .NET Framework 4.8.1 SDK
* Microsoft .NET Framework 4.8.1 Targeting Pack
* Microsoft .NET Framework 4.8.1 Targeting Pack (ENU)
---
## Step 4: Clone Windows Driver Samples and checkout relevant branch
```powershell
cd "path\to\your\repos"
git clone --recurse-submodules "https://github.com/microsoft/Windows-driver-samples.git"
cd ".\Windows-driver-samples"
```
If you are planning to use in-market WDK, then you would typically want to use the 'main' branch:
```
git checkout main
```
If you are planning to use a WDK Preview or WDK EEAP release, then you would typically want to use the 'develop' branch:
```
git checkout develop
```
---
## Step 5: Create a "driver build environment"
To build the Windows Driver Samples you need a "driver build environment". In essence an environment that consist of following prerequisites:
* Visual Studio Build Tools including tools such as for example cl.exe and link.exe .
* The Windows Software Development Kit.
* The Windows Driver Kit.
### Option A: Use WDK NuGet Packages
* See [Download the Windows Driver Kit (WDK)](https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) for instructions on how to install Visual Studio, but only complete `Step 1`. You do not need to install the SDK or the WDK.
* Launch a "Developer Command Prompt for VS 2022".
* Restore WDK packages from feed :
```powershell
cd "path\to\your\repos\Windows-driver-samples"
nuget restore -PackagesDirectory ".\packages"
```
* When this is done you should have a .\packages folder that looks like example below:
```powershell
cd "path\to\your\repos\Windows-driver-samples"
dir /b packages
Microsoft.Windows.SDK.CPP.10.0.26000.1
Microsoft.Windows.SDK.CPP.x64.10.0.26000.1
Microsoft.Windows.SDK.CPP.arm64.10.0.26000.1
Microsoft.Windows.WDK.x64.10.0.26000.1
Microsoft.Windows.WDK.arm64.10.0.26000.1
```
### Option B: Use the Windows Driver Kit
* Here you will install each of above prerequisites one at a time.
* See [Download the Windows Driver Kit (WDK)](https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) for instructions on how to install Visual Studio, SDK, and WDK.
* Launch a "Developer Command Prompt for VS 2022".
### Option C: Use an Enterprise WDK
* You can also simply use the Enterprise WDK (EWDK), a standalone, self-contained command-line environment for building drivers that contains all prerequisites in one combined ISO.
* See [Download the Windows Driver Kit (WDK)](https://learn.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk) for instructions on how to download the EWDK.
* Mount ISO image
* Open a terminal
* `.\LaunchBuildEnv`
---
## Step 6: Check all samples builds with expected results for all flavors
```powershell
pwsh
.\Build-AllSamples
```
Above builds all samples for all configurations and platforms.
You can refine what exact samples to build, what configurations, and platforms to build. build Here are a few examples:
```powershell
# Get Help:
Get-Help .\Build-AllSamples
# Build all solutions for all flavors with builds running in parallel:
.\Build-AllSamples
# Build with Verbose output (print start and finish of each sample):
.\Build-AllSamples -Verbose
# Build without massive parallism (slow, but good debugging):
.\Build-AllSamples -ThrottleLimit 1
# Build the solutions in the tools folder for all flavors:
.\Build-AllSamples -Samples '^tools.' -Configurations 'Debug','Release' -Platforms 'x64','arm64'
# Build the solutions in the tools folder for only 'Debug|x64':
.\Build-AllSamples -Samples '^tools.' -Configurations 'Debug' -Platforms 'x64'
```
Example of expected output:
```
Build Environment: NuGet
Build Number: 26100
Samples: 132
Configurations: 2 (Debug Release)
Platforms: 2 (x64 arm64)
InfVerif_AdditionalOptions: /samples
Combinations: 528
LogicalProcessors: 12
ThrottleFactor: 5
ThrottleLimit: 60
WDS_WipeOutputs:
Disk Remaining (GB): ...
T: Combinations
B: Built
R: Build is running currently
P: Build is pending an available build slot
S: Built and result was 'Succeeded'
E: Built and result was 'Excluded'
U: Built and result was 'Unsupported' (Platform and Configuration combination)
F: Built and result was 'Failed'
O: Built and result was 'Sporadic'
Building all combinations...
Built all combinations.
Elapsed time: 12 minutes, 42 seconds.
Disk Remaining (GB): ...
Samples: 132
Configurations: 2 (Debug Release)
Platforms: 2 (x64 arm64)
Combinations: 528
Succeeded: 526
Excluded: 0
Unsupported: 2
Failed: 0
Sporadic: 0
Log files directory: .\_logs
Overview report: .\_overview.htm
```
---
## 7: NuGet - Additional Notes
To restore a specific version of our WDK NuGet packages:
Follow these steps before running "nuget restore" command:
* Open the .\packages.config file and update the full version (including the branch if required) in all three entries.
* Open the .\Directory.build.props file and update the version and build of the package with the same values as in previous step.
* Open .\Build-SampleSet and change the NuGet build number (used by .\exclusions.csv and for determining infverif flags)
* Now you can run "nuget restore"
A few examples of how to interact with nuget:
```powershell
# To add an alternative online NuGet source:
nuget sources add -Name "MyNuGetFeed" -Source "https://nugetserver.com/_packaging/feedname/nuget/v3/index.json"
# To add an alternative local NuGet source:
nuget sources add -Name "MyNuGetFeed" -Source "\\path\to\mylocalrepo"
# To remove an alternative NuGet source:
nuget sources remove -Name "MyNuGetFeed"
# To enumerate NuGet locals:
nuget locals all -list
# To clear NuGet locals:
nuget locals all -clear
```
|