Skip to content

Commit 40f6148

Browse files
authored
Merge branch 'feature/wsl-for-apps' into user/shawn/buildUX
2 parents ee11459 + a05c9f8 commit 40f6148

60 files changed

Lines changed: 2482 additions & 1139 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ set(COMMON_LINK_LIBRARIES
285285
Shlwapi.lib
286286
synchronization.lib
287287
Bcrypt.lib
288+
Crypt32.lib
288289
icu.lib)
289290

290291
set(MSI_LINK_LIBRARIES

cmake/FindIDL.cmake

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ function(add_idl target idl_files_with_proxy idl_files_no_proxy)
1313
string(TOLOWER ${TARGET_PLATFORM} IDL_ENV)
1414
set(PREVIOUS_OUTPUT "")
1515

16+
set(IDL_DLLDATA ${OUTPUT_DIR}/dlldata_${TARGET_PLATFORM}.c)
17+
18+
list(LENGTH idl_files_with_proxy PROXY_IDL_COUNT)
19+
set(PROXY_IDL_INDEX 0)
20+
1621
foreach(idl_file ${idl_files_with_proxy})
1722

1823
cmake_path(GET idl_file STEM IDL_NAME)
@@ -24,8 +29,14 @@ function(add_idl target idl_files_with_proxy idl_files_no_proxy)
2429
# "fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'ARM64'"
2530
set(IDL_I ${OUTPUT_DIR}/${IDL_NAME}_i_${TARGET_PLATFORM}.c)
2631
set(IDL_P ${OUTPUT_DIR}/${IDL_NAME}_p_${TARGET_PLATFORM}.c)
27-
set(IDL_DLLDATA ${OUTPUT_DIR}/dlldata_${TARGET_PLATFORM}.c)
28-
set(MIDL_OUTPUT ${IDL_HEADER} ${IDL_I} ${IDL_P} ${IDL_DLLDATA})
32+
33+
# Only list dlldata as a tracked output of the last MIDL command.
34+
math(EXPR PROXY_IDL_INDEX "${PROXY_IDL_INDEX} + 1")
35+
if(PROXY_IDL_INDEX EQUAL PROXY_IDL_COUNT)
36+
set(MIDL_OUTPUT ${IDL_HEADER} ${IDL_I} ${IDL_P} ${IDL_DLLDATA})
37+
else()
38+
set(MIDL_OUTPUT ${IDL_HEADER} ${IDL_I} ${IDL_P})
39+
endif()
2940

3041
add_custom_command(
3142
OUTPUT ${MIDL_OUTPUT}
@@ -51,7 +62,7 @@ function(add_idl target idl_files_with_proxy idl_files_no_proxy)
5162

5263
add_custom_command(
5364
OUTPUT ${IDL_HEADER}
54-
COMMAND midl /nologo /target NT100 /env "${IDL_ENV}" /Zp8 /char unsigned /ms_ext /c_ext /h ${IDL_HEADER} ${idl_file} ${IDL_DEFINITIONS}
65+
COMMAND midl /nologo /target NT100 /env "${IDL_ENV}" /Zp8 /char unsigned /ms_ext /c_ext /h ${IDL_HEADER} /iid nul /proxy nul /dlldata nul ${idl_file} ${IDL_DEFINITIONS}
5566
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
5667
DEPENDS ${idl_file}
5768
MAIN_DEPENDENCY ${idl_file}
@@ -63,6 +74,11 @@ function(add_idl target idl_files_with_proxy idl_files_no_proxy)
6374

6475
endforeach()
6576

66-
add_custom_target(${target} DEPENDS ${TARGET_OUTPUTS} SOURCES ${idl_files_with_proxy} ${idl_files_no_proxy})
77+
# Touch the stamp file so Visual Studio's incremental build can track the
78+
# target as up-to-date.
79+
add_custom_target(${target}
80+
COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}
81+
DEPENDS ${TARGET_OUTPUTS}
82+
SOURCES ${idl_files_with_proxy} ${idl_files_no_proxy})
6783

6884
endfunction()

localization/strings/en-US/Resources.resw

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,6 @@ Install using 'wsl.exe {} <Distro>'.
217217
To get a list of valid distributions, use 'wsl.exe --list --online'.</value>
218218
<comment>{FixedPlaceholder="{}"}{Locked="--list "}{Locked="--online'"}Command line arguments, file names and string inserts should not be translated</comment>
219219
</data>
220-
<data name="MessageInstanceTerminated" xml:space="preserve">
221-
<value>The Windows Subsystem for Linux instance has terminated.</value>
222-
</data>
223220
<data name="MessageInvalidCommandLine" xml:space="preserve">
224221
<value>Invalid command line argument: {}
225222
Please use '{} --help' to get a list of supported arguments.</value>
@@ -853,6 +850,10 @@ For information please visit https://aka.ms/wslinstall</value>
853850
<value>Failed to create the swap disk in '{}': {}</value>
854851
<comment>{FixedPlaceholder="{}"}Command line arguments, file names and string inserts should not be translated</comment>
855852
</data>
853+
<data name="MessageFailedToCreateDisk" xml:space="preserve">
854+
<value>Failed to create disk '{}': {}</value>
855+
<comment>{FixedPlaceholder="{}"}Command line arguments, file names and string inserts should not be translated</comment>
856+
</data>
856857
<data name="MessageNestedVirtualizationNotSupported" xml:space="preserve">
857858
<value>Nested virtualization is not supported on this machine.</value>
858859
</data>
@@ -1935,6 +1936,15 @@ Usage:
19351936
<value>Session termination failed: '{}'</value>
19361937
<comment>{FixedPlaceholder="{}"}Command line arguments, file names and string inserts should not be translated</comment>
19371938
</data>
1939+
<data name="MessageWslcDefaultSessionNotFound" xml:space="preserve">
1940+
<value>Default session not found</value>
1941+
</data>
1942+
<data name="MessageWslcOpenDefaultSessionFailed" xml:space="preserve">
1943+
<value>Failed to open default session</value>
1944+
</data>
1945+
<data name="MessageWslcTerminateDefaultSessionFailed" xml:space="preserve">
1946+
<value>Default session termination failed</value>
1947+
</data>
19381948
<data name="MessageWslcShellExited" xml:space="preserve">
19391949
<value>{} exited with: {}</value>
19401950
<comment>{FixedPlaceholder="{}"}{FixedPlaceholder="{}"}Command line arguments, file names and string inserts should not be translated</comment>
@@ -2126,6 +2136,10 @@ For privacy information about this product please visit https://aka.ms/privacy.<
21262136
<value>Failed to create volume '{}': {}</value>
21272137
<comment>{FixedPlaceholder="{}"}Command line arguments, file names and string inserts should not be translated</comment>
21282138
</data>
2139+
<data name = "MessageWslcPortInUse" xml:space = "preserve" >
2140+
<value>Port {} is already in use, cannot start container {}</value>
2141+
<comment>{FixedPlaceholder="{}"}Command line arguments, file names and string inserts should not be translated</comment>
2142+
</data>
21292143
<data name = "MessageWslcBothDockerAndContainerFileFound" xml:space = "preserve" >
21302144
<value>Both Dockerfile and Containerfile found. Use -f to select the file to use</value>
21312145
<comment>{FixedPlaceholder="Dockerfile"}{FixedPlaceholder="Containerfile"}{FixedPlaceholder="-f"}Command line arguments, file names and string inserts should not be translated</comment>

packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<package id="Microsoft.WSL.DeviceHost" version="1.2.10-0" />
2222
<package id="Microsoft.WSL.Kernel" version="6.6.114.1-1" targetFramework="native" />
2323
<package id="Microsoft.WSL.LinuxSdk" version="1.20.0" targetFramework="native" />
24-
<package id="Microsoft.WSL.TestData" version="0.3.0" />
24+
<package id="Microsoft.WSL.TestData" version="0.4.0" />
2525
<package id="Microsoft.WSL.TestDistro" version="2.7.1-1" />
2626
<package id="Microsoft.WSLg" version="1.0.76" />
2727
<package id="Microsoft.Xaml.Behaviors.WinUI.Managed" version="3.0.0" />

src/windows/WslcSDK/wslcsdk.cpp

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,6 @@ try
685685
containerOptions.ContainerNetwork.ContainerNetworkType = internalContainerSettings->networking;
686686

687687
// TODO: No user access
688-
// containerOptions.Entrypoint;
689688
// containerOptions.Labels;
690689
// containerOptions.LabelsCount;
691690
// containerOptions.StopSignal;
@@ -1186,8 +1185,7 @@ try
11861185

11871186
auto progressCallback = ProgressCallback::CreateIf(options);
11881187

1189-
// TODO: Auth
1190-
return errorInfoWrapper.CaptureResult(internalType->session->PullImage(options->uri, nullptr, progressCallback.get()));
1188+
return errorInfoWrapper.CaptureResult(internalType->session->PullImage(options->uri, options->registryAuth, progressCallback.get()));
11911189
}
11921190
CATCH_RETURN();
11931191

@@ -1282,6 +1280,72 @@ try
12821280
}
12831281
CATCH_RETURN();
12841282

1283+
STDAPI WslcTagSessionImage(_In_ WslcSession session, _In_ const WslcTagImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage)
1284+
try
1285+
{
1286+
ErrorInfoWrapper errorInfoWrapper{errorMessage};
1287+
auto internalType = CheckAndGetInternalType(session);
1288+
RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(ERROR_INVALID_STATE), internalType->session);
1289+
RETURN_HR_IF_NULL(E_POINTER, options);
1290+
RETURN_HR_IF_NULL(E_INVALIDARG, options->image);
1291+
RETURN_HR_IF_NULL(E_INVALIDARG, options->repo);
1292+
RETURN_HR_IF_NULL(E_INVALIDARG, options->tag);
1293+
1294+
WSLCTagImageOptions runtimeOptions{};
1295+
runtimeOptions.Image = options->image;
1296+
runtimeOptions.Repo = options->repo;
1297+
runtimeOptions.Tag = options->tag;
1298+
1299+
return errorInfoWrapper.CaptureResult(internalType->session->TagImage(&runtimeOptions));
1300+
}
1301+
CATCH_RETURN();
1302+
1303+
STDAPI WslcPushSessionImage(_In_ WslcSession session, _In_ const WslcPushImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage)
1304+
try
1305+
{
1306+
ErrorInfoWrapper errorInfoWrapper{errorMessage};
1307+
auto internalType = CheckAndGetInternalType(session);
1308+
RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(ERROR_INVALID_STATE), internalType->session);
1309+
RETURN_HR_IF_NULL(E_POINTER, options);
1310+
RETURN_HR_IF_NULL(E_INVALIDARG, options->image);
1311+
RETURN_HR_IF_NULL(E_INVALIDARG, options->registryAuth);
1312+
1313+
auto progressCallback = ProgressCallback::CreateIf(options);
1314+
1315+
return errorInfoWrapper.CaptureResult(internalType->session->PushImage(options->image, options->registryAuth, progressCallback.get()));
1316+
}
1317+
CATCH_RETURN();
1318+
1319+
STDAPI WslcSessionAuthenticate(
1320+
_In_ WslcSession session,
1321+
_In_z_ PCSTR serverAddress,
1322+
_In_z_ PCSTR username,
1323+
_In_z_ PCSTR password,
1324+
_Outptr_result_z_ PSTR* identityToken,
1325+
_Outptr_opt_result_z_ PWSTR* errorMessage)
1326+
try
1327+
{
1328+
ErrorInfoWrapper errorInfoWrapper{errorMessage};
1329+
auto internalType = CheckAndGetInternalType(session);
1330+
RETURN_HR_IF_NULL(HRESULT_FROM_WIN32(ERROR_INVALID_STATE), internalType->session);
1331+
RETURN_HR_IF_NULL(E_POINTER, serverAddress);
1332+
RETURN_HR_IF_NULL(E_POINTER, username);
1333+
RETURN_HR_IF_NULL(E_POINTER, password);
1334+
RETURN_HR_IF_NULL(E_POINTER, identityToken);
1335+
1336+
*identityToken = nullptr;
1337+
1338+
wil::unique_cotaskmem_ansistring token;
1339+
auto hr = errorInfoWrapper.CaptureResult(internalType->session->Authenticate(serverAddress, username, password, &token));
1340+
if (SUCCEEDED(hr))
1341+
{
1342+
*identityToken = token.release();
1343+
}
1344+
1345+
return errorInfoWrapper;
1346+
}
1347+
CATCH_RETURN();
1348+
12851349
STDAPI WslcListSessionImages(_In_ WslcSession session, _Outptr_result_buffer_(*count) WslcImageInfo** images, _Out_ uint32_t* count)
12861350
try
12871351
{

src/windows/WslcSDK/wslcsdk.def

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ WslcSetSessionSettingsTimeout
2323
WslcSetSessionSettingsVhd
2424

2525
WslcTerminateSession
26+
WslcSessionAuthenticate
2627
WslcPullSessionImage
2728
WslcImportSessionImage
2829
WslcImportSessionImageFromFile
@@ -32,6 +33,8 @@ WslcDeleteSessionImage
3233
WslcListSessionImages
3334
WslcCreateSessionVhdVolume
3435
WslcDeleteSessionVhdVolume
36+
WslcTagSessionImage
37+
WslcPushSessionImage
3538

3639
WslcSetContainerSettingsDomainName
3740
WslcSetContainerSettingsName

src/windows/WslcSDK/wslcsdk.h

Lines changed: 53 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -392,11 +392,6 @@ typedef struct WslcImageProgressMessage
392392
_Out_ WslcImageProgressDetail detail;
393393
} WslcImageProgressMessage;
394394

395-
typedef struct WslcRegistryAuthenticationInformation
396-
{
397-
// TBD
398-
} WslcRegistryAuthenticationInformation;
399-
400395
// pointer-to-function typedef (unambiguous)
401396
typedef HRESULT(CALLBACK* WslcContainerImageProgressCallback)(const WslcImageProgressMessage* progress, PVOID context);
402397

@@ -406,7 +401,7 @@ typedef struct WslcPullImageOptions
406401
_In_z_ PCSTR uri;
407402
WslcContainerImageProgressCallback progressCallback;
408403
PVOID progressCallbackContext;
409-
_In_opt_ const WslcRegistryAuthenticationInformation* authInfo;
404+
_In_opt_z_ PCSTR registryAuth;
410405
} WslcPullImageOptions;
411406

412407
STDAPI WslcPullSessionImage(_In_ WslcSession session, _In_ const WslcPullImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage);
@@ -457,6 +452,58 @@ typedef struct WslcImageInfo
457452

458453
STDAPI WslcDeleteSessionImage(_In_ WslcSession session, _In_z_ PCSTR nameOrId, _Outptr_opt_result_z_ PWSTR* errorMessage);
459454

455+
typedef struct WslcTagImageOptions
456+
{
457+
_In_z_ PCSTR image; // Source image name or ID.
458+
_In_z_ PCSTR repo; // Target repository name.
459+
_In_z_ PCSTR tag; // Target tag name.
460+
} WslcTagImageOptions;
461+
462+
STDAPI WslcTagSessionImage(_In_ WslcSession session, _In_ const WslcTagImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage);
463+
464+
typedef struct WslcPushImageOptions
465+
{
466+
_In_z_ PCSTR image;
467+
_In_z_ PCSTR registryAuth; // Base64-encoded X-Registry-Auth header value.
468+
_In_opt_ WslcContainerImageProgressCallback progressCallback;
469+
_In_opt_ PVOID progressCallbackContext;
470+
} WslcPushImageOptions;
471+
472+
STDAPI WslcPushSessionImage(_In_ WslcSession session, _In_ const WslcPushImageOptions* options, _Outptr_opt_result_z_ PWSTR* errorMessage);
473+
474+
// Authenticates with a container registry and returns an identity token.
475+
//
476+
// Parameters:
477+
// session
478+
// A valid WslcSession handle.
479+
//
480+
// serverAddress
481+
// The registry server address (e.g. "127.0.0.1:5000").
482+
//
483+
// username
484+
// The username for authentication.
485+
//
486+
// password
487+
// The password for authentication.
488+
//
489+
// identityToken
490+
// On success, receives a pointer to a null-terminated ANSI string
491+
// containing the identity token.
492+
//
493+
// The string is allocated using CoTaskMemAlloc. The caller takes
494+
// ownership of the returned memory and must free it by calling
495+
// CoTaskMemFree when it is no longer needed.
496+
//
497+
// Return Value:
498+
// S_OK on success. Otherwise, an HRESULT error code indicating the failure.
499+
STDAPI WslcSessionAuthenticate(
500+
_In_ WslcSession session,
501+
_In_z_ PCSTR serverAddress,
502+
_In_z_ PCSTR username,
503+
_In_z_ PCSTR password,
504+
_Outptr_result_z_ PSTR* identityToken,
505+
_Outptr_opt_result_z_ PWSTR* errorMessage);
506+
460507
// Retrieves the list of container images
461508
// Parameters:
462509
// session

src/windows/common/CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ set(SOURCES
4949
WslTelemetry.cpp
5050
wslutil.cpp
5151
install.cpp
52+
WSLCUserSettings.cpp
5253
)
5354

5455
set(HEADERS
@@ -130,11 +131,19 @@ set(HEADERS
130131
WslSecurity.h
131132
WslTelemetry.h
132133
wslutil.h
134+
EnumVariantMap.h
135+
WSLCUserSettings.h
136+
WSLCSessionDefaults.h
133137
)
134138

135139
add_library(common STATIC ${SOURCES} ${HEADERS})
136-
add_dependencies(common wslserviceidl localization wslservicemc wslinstalleridl)
140+
add_dependencies(common wslserviceidl localization wslservicemc wslinstalleridl yaml-cpp)
137141

138142
target_precompile_headers(common PRIVATE precomp.h)
139143
set_target_properties(common PROPERTIES FOLDER windows)
140144
target_include_directories(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/../service/mc/${TARGET_PLATFORM}/${CMAKE_BUILD_TYPE})
145+
146+
# WSLCUserSettings.cpp uses yaml-cpp headers.
147+
set_source_files_properties(WSLCUserSettings.cpp PROPERTIES
148+
INCLUDE_DIRECTORIES "${yaml-cpp_SOURCE_DIR}/include"
149+
COMPILE_DEFINITIONS "YAML_CPP_STATIC_DEFINE")

src/windows/common/WSLCContainerLauncher.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Module Name:
1111
This file contains the implementation for WSLCContainerLauncher.
1212
1313
--*/
14+
15+
#include "precomp.h"
1416
#include "WSLCContainerLauncher.h"
1517

1618
using wsl::windows::common::ClientRunningWSLCProcess;

0 commit comments

Comments
 (0)