├── aosc-os.ico
├── resource.rc
├── my_gets.h
├── WSAOSC.vcxproj.filters
├── WSAOSC.sln
├── README.md
├── WSAOSC.vcxproj
├── .gitignore
├── wslutil.h
├── main.c
└── LICENSE
/aosc-os.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AOSC-Archive/WSAOSC/HEAD/aosc-os.ico
--------------------------------------------------------------------------------
/resource.rc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AOSC-Archive/WSAOSC/HEAD/resource.rc
--------------------------------------------------------------------------------
/my_gets.h:
--------------------------------------------------------------------------------
1 | void my_gets_s(char* str, rsize_t n)
2 | {
3 | int c = getchar();
4 | while (c != '\n' && c != EOF)
5 | {
6 | if (n > 1)
7 | {
8 | --n;
9 | *str++ = c;
10 | }
11 |
12 | c = getchar();
13 | }
14 |
15 | *str = '\0';
16 | }
17 |
--------------------------------------------------------------------------------
/WSAOSC.vcxproj.filters:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/WSAOSC.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio 15
4 | VisualStudioVersion = 15.0.27130.2027
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WSAOSC", "WSAOSC.vcxproj", "{33007657-31D8-44BD-A464-7AB4081478D7}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|x64 = Debug|x64
11 | Release|x64 = Release|x64
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {33007657-31D8-44BD-A464-7AB4081478D7}.Debug|x64.ActiveCfg = Debug|x64
15 | {33007657-31D8-44BD-A464-7AB4081478D7}.Debug|x64.Build.0 = Debug|x64
16 | {33007657-31D8-44BD-A464-7AB4081478D7}.Release|x64.ActiveCfg = Release|x64
17 | {33007657-31D8-44BD-A464-7AB4081478D7}.Release|x64.Build.0 = Release|x64
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {5357DBB0-0F38-4D04-B4FA-C7468094ED3D}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # WSAOSC-ng
2 | AOSC OS on WSL (Windows Subsystem for Linux)
3 |
4 | # Get Started
5 | 1. Enable WSL. (https://aka.ms/wslinstall).
6 | 2. Grab a WSAOSC binary from [releases](https://github.com/AOSC-Dev/WSAOSC/releases).
7 | 3. Grab AOSC OS **kernel-less** tarball. (https://aosc.io/os-download, we recommend the "Container" variant).
8 | 4. Decompress .tar.xz to get .tar file. (Using 7-Zip or xz command).
9 | 5. Rename .tar file to `install.tar.gz` and move it to aosc-os.exe path.
10 | 6. Run aosc-os.exe. AOSC OS will install in the same path.
11 |
12 | # Compile Manually
13 | ## Windows
14 | Open `WSAOSC.sln` in Visual Studio and compile.
15 |
16 | or
17 |
18 | Open VS command line tools, cd to WSAOSC directory and run: `msbuild WSAOSC.sln /p:Configuration=Release`
19 |
20 | (change `Release` to `Debug` if you need debug version.)
21 |
22 | ## Linux
23 | Install [mingw-w64](http://mingw-w64.org), cd to WSAOSC directory and run: `x86_64-w64-mingw32-gcc main.c -lole32 -O3`
24 |
25 | # Known issue
26 | - I/O performance is not ideal. Disabling Windows Defender and Windows Indexing Service for the rootfs directory may mitigate this issue.
27 |
28 | # License
29 | GNU General Public License V3
30 |
--------------------------------------------------------------------------------
/WSAOSC.vcxproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | x64
7 |
8 |
9 | Release
10 | x64
11 |
12 |
13 |
14 | 15.0
15 | {33007657-31D8-44BD-A464-7AB4081478D7}
16 | Win32Proj
17 | WSAOSC
18 | 10.0.16299.0
19 |
20 |
21 |
22 | Application
23 | true
24 | v141
25 | Unicode
26 |
27 |
28 | Application
29 | false
30 | v141
31 | true
32 | Unicode
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | true
48 | aosc-os
49 |
50 |
51 | false
52 | aosc-os
53 |
54 |
55 |
56 | Level3
57 | Disabled
58 | _DEBUG;_CONSOLE;%(PreprocessorDefinitions)
59 | true
60 | true
61 |
62 |
63 | true
64 | Console
65 |
66 |
67 |
68 |
69 | Level3
70 | MaxSpeed
71 | true
72 | true
73 | NDEBUG;_CONSOLE;%(PreprocessorDefinitions)
74 | true
75 | true
76 |
77 |
78 | true
79 | true
80 | true
81 | Console
82 | libvcruntime.lib;%(AdditionalDependencies)
83 | vcruntime.lib
84 | 10
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | x64/
19 | x86/
20 | bld/
21 | [Bb]in/
22 | [Oo]bj/
23 | [Ll]og/
24 |
25 | # Visual Studio 2015 cache/options directory
26 | .vs/
27 | # Uncomment if you have tasks that create the project's static files in wwwroot
28 | #wwwroot/
29 |
30 | # MSTest test Results
31 | [Tt]est[Rr]esult*/
32 | [Bb]uild[Ll]og.*
33 |
34 | # NUNIT
35 | *.VisualState.xml
36 | TestResult.xml
37 |
38 | # Build Results of an ATL Project
39 | [Dd]ebugPS/
40 | [Rr]eleasePS/
41 | dlldata.c
42 |
43 | # DNX
44 | project.lock.json
45 | project.fragment.lock.json
46 | artifacts/
47 |
48 | *_i.c
49 | *_p.c
50 | *_i.h
51 | *.ilk
52 | *.meta
53 | *.obj
54 | *.pch
55 | *.pdb
56 | *.pgc
57 | *.pgd
58 | *.rsp
59 | *.sbr
60 | *.tlb
61 | *.tli
62 | *.tlh
63 | *.tmp
64 | *.tmp_proj
65 | *.log
66 | *.vspscc
67 | *.vssscc
68 | .builds
69 | *.pidb
70 | *.svclog
71 | *.scc
72 |
73 | # Chutzpah Test files
74 | _Chutzpah*
75 |
76 | # Visual C++ cache files
77 | ipch/
78 | *.aps
79 | *.ncb
80 | *.opendb
81 | *.opensdf
82 | *.sdf
83 | *.cachefile
84 | *.VC.db
85 | *.VC.VC.opendb
86 |
87 | # Visual Studio profiler
88 | *.psess
89 | *.vsp
90 | *.vspx
91 | *.sap
92 |
93 | # TFS 2012 Local Workspace
94 | $tf/
95 |
96 | # Guidance Automation Toolkit
97 | *.gpState
98 |
99 | # ReSharper is a .NET coding add-in
100 | _ReSharper*/
101 | *.[Rr]e[Ss]harper
102 | *.DotSettings.user
103 |
104 | # JustCode is a .NET coding add-in
105 | .JustCode
106 |
107 | # TeamCity is a build add-in
108 | _TeamCity*
109 |
110 | # DotCover is a Code Coverage Tool
111 | *.dotCover
112 |
113 | # NCrunch
114 | _NCrunch_*
115 | .*crunch*.local.xml
116 | nCrunchTemp_*
117 |
118 | # MightyMoose
119 | *.mm.*
120 | AutoTest.Net/
121 |
122 | # Web workbench (sass)
123 | .sass-cache/
124 |
125 | # Installshield output folder
126 | [Ee]xpress/
127 |
128 | # DocProject is a documentation generator add-in
129 | DocProject/buildhelp/
130 | DocProject/Help/*.HxT
131 | DocProject/Help/*.HxC
132 | DocProject/Help/*.hhc
133 | DocProject/Help/*.hhk
134 | DocProject/Help/*.hhp
135 | DocProject/Help/Html2
136 | DocProject/Help/html
137 |
138 | # Click-Once directory
139 | publish/
140 |
141 | # Publish Web Output
142 | *.[Pp]ublish.xml
143 | *.azurePubxml
144 | # TODO: Comment the next line if you want to checkin your web deploy settings
145 | # but database connection strings (with potential passwords) will be unencrypted
146 | #*.pubxml
147 | *.publishproj
148 |
149 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
150 | # checkin your Azure Web App publish settings, but sensitive information contained
151 | # in these scripts will be unencrypted
152 | PublishScripts/
153 |
154 | # NuGet Packages
155 | *.nupkg
156 | # The packages folder can be ignored because of Package Restore
157 | **/packages/*
158 | # except build/, which is used as an MSBuild target.
159 | !**/packages/build/
160 | # Uncomment if necessary however generally it will be regenerated when needed
161 | #!**/packages/repositories.config
162 | # NuGet v3's project.json files produces more ignoreable files
163 | *.nuget.props
164 | *.nuget.targets
165 |
166 | # Microsoft Azure Build Output
167 | csx/
168 | *.build.csdef
169 |
170 | # Microsoft Azure Emulator
171 | ecf/
172 | rcf/
173 |
174 | # Windows Store app package directories and files
175 | AppPackages/
176 | BundleArtifacts/
177 | Package.StoreAssociation.xml
178 | _pkginfo.txt
179 |
180 | # Visual Studio cache files
181 | # files ending in .cache can be ignored
182 | *.[Cc]ache
183 | # but keep track of directories ending in .cache
184 | !*.[Cc]ache/
185 |
186 | # Others
187 | ClientBin/
188 | ~$*
189 | *~
190 | *.dbmdl
191 | *.dbproj.schemaview
192 | *.jfm
193 | *.pfx
194 | *.publishsettings
195 | node_modules/
196 | orleans.codegen.cs
197 |
198 | # Since there are multiple workflows, uncomment next line to ignore bower_components
199 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
200 | #bower_components/
201 |
202 | # RIA/Silverlight projects
203 | Generated_Code/
204 |
205 | # Backup & report files from converting an old project file
206 | # to a newer Visual Studio version. Backup files are not needed,
207 | # because we have git ;-)
208 | _UpgradeReport_Files/
209 | Backup*/
210 | UpgradeLog*.XML
211 | UpgradeLog*.htm
212 |
213 | # SQL Server files
214 | *.mdf
215 | *.ldf
216 |
217 | # Business Intelligence projects
218 | *.rdl.data
219 | *.bim.layout
220 | *.bim_*.settings
221 |
222 | # Microsoft Fakes
223 | FakesAssemblies/
224 |
225 | # GhostDoc plugin setting file
226 | *.GhostDoc.xml
227 |
228 | # Node.js Tools for Visual Studio
229 | .ntvs_analysis.dat
230 |
231 | # Visual Studio 6 build log
232 | *.plg
233 |
234 | # Visual Studio 6 workspace options file
235 | *.opt
236 |
237 | # Visual Studio LightSwitch build output
238 | **/*.HTMLClient/GeneratedArtifacts
239 | **/*.DesktopClient/GeneratedArtifacts
240 | **/*.DesktopClient/ModelManifest.xml
241 | **/*.Server/GeneratedArtifacts
242 | **/*.Server/ModelManifest.xml
243 | _Pvt_Extensions
244 |
245 | # Paket dependency manager
246 | .paket/paket.exe
247 | paket-files/
248 |
249 | # FAKE - F# Make
250 | .fake/
251 |
252 | # JetBrains Rider
253 | .idea/
254 | *.sln.iml
255 |
256 | # CodeRush
257 | .cr/
258 |
259 | # Python Tools for Visual Studio (PTVS)
260 | __pycache__/
261 | *.pyc
--------------------------------------------------------------------------------
/wslutil.h:
--------------------------------------------------------------------------------
1 | #ifndef _WSL_UTIL
2 | #define _WSL_UTIL
3 |
4 | /* Determines if a distribution is already registered */
5 | typedef BOOL (WINAPI *fnWslIsDistributionRegistered)(PCWSTR distributionName);
6 | fnWslIsDistributionRegistered _WslIsDistributionRegistered;
7 |
8 | /* Registers a new distribution given the information provided. */
9 | typedef HRESULT (WINAPI *fnWslRegisterDistribution)(PCWSTR distributionName, PCWSTR tarGzFilename);
10 | fnWslRegisterDistribution _WslRegisterDistribution;
11 |
12 | /* Unregisters the specified distribution */
13 | typedef HRESULT (WINAPI *fnWslUnregisterDistribution)(PCWSTR distributionName);
14 | fnWslUnregisterDistribution _WslUnregisterDistribution;
15 |
16 | /* Flags specifying WSL behavior */
17 | typedef enum
18 | {
19 | WSL_DISTRIBUTION_FLAGS_NONE = 0x0,
20 | WSL_DISTRIBUTION_FLAGS_ENABLE_INTEROP = 0x1,
21 | WSL_DISTRIBUTION_FLAGS_APPEND_NT_PATH = 0x2,
22 | WSL_DISTRIBUTION_FLAGS_ENABLE_DRIVE_MOUNTING = 0x4
23 | } WSL_DISTRIBUTION_FLAGS;
24 |
25 | #define WSL_DISTRIBUTION_FLAGS_VALID (WSL_DISTRIBUTION_FLAGS_ENABLE_INTEROP | WSL_DISTRIBUTION_FLAGS_APPEND_NT_PATH | WSL_DISTRIBUTION_FLAGS_ENABLE_DRIVE_MOUNTING)
26 | #define WSL_DISTRIBUTION_FLAGS_DEFAULT (WSL_DISTRIBUTION_FLAGS_ENABLE_INTEROP | WSL_DISTRIBUTION_FLAGS_APPEND_NT_PATH | WSL_DISTRIBUTION_FLAGS_ENABLE_DRIVE_MOUNTING)
27 |
28 | /* Configure the given distribution */
29 | typedef HRESULT (WINAPI *fnWslConfigureDistribution)(PCWSTR distributionName, ULONG defaultUID, WSL_DISTRIBUTION_FLAGS wslDistributionFlags);
30 | fnWslConfigureDistribution _WslConfigureDistribution;
31 |
32 | /* Get the given distribution's configuration info */
33 | typedef HRESULT (WINAPI *fnWslGetDistributionConfiguration)(PCWSTR distributionName, ULONG * distributionVersion, ULONG * defaultUID, WSL_DISTRIBUTION_FLAGS * wslDistributionFlags, PSTR ** defaultEnvironmentVariables, ULONG * defaultEnvironmentVariableCount);
34 | fnWslGetDistributionConfiguration _WslGetDistributionConfiguration;
35 |
36 | typedef HRESULT (WINAPI *fnWslLaunchInteractive)(PCWSTR distributionName, PCWSTR command, BOOL useCurrentWorkingDirectory, DWORD * exitCode);
37 | fnWslLaunchInteractive _WslLaunchInteractive;
38 |
39 | typedef HRESULT (WINAPI *fnWslLaunch)(PCWSTR distributionName, PCWSTR command, BOOL useCurrentWorkingDirectory, HANDLE stdIn, HANDLE stdOut, HANDLE stdErr, HANDLE * process);
40 | fnWslLaunch _WslLaunch;
41 |
42 | bool load_wsl_api(void)
43 | {
44 | HMODULE wsl_handle = LoadLibraryExW(L"wslapi.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32);
45 | if (!wsl_handle)
46 | return false;
47 |
48 | _WslIsDistributionRegistered = (fnWslIsDistributionRegistered)GetProcAddress(wsl_handle, "WslIsDistributionRegistered");
49 | _WslRegisterDistribution = (fnWslRegisterDistribution)GetProcAddress(wsl_handle, "WslRegisterDistribution");
50 | _WslUnregisterDistribution = (fnWslUnregisterDistribution)GetProcAddress(wsl_handle, "WslUnregisterDistribution");
51 | _WslConfigureDistribution = (fnWslConfigureDistribution)GetProcAddress(wsl_handle, "WslConfigureDistribution");
52 | _WslGetDistributionConfiguration = (fnWslGetDistributionConfiguration)GetProcAddress(wsl_handle, "WslGetDistributionConfiguration");
53 | _WslLaunchInteractive = (fnWslLaunchInteractive)GetProcAddress(wsl_handle, "WslLaunchInteractive");
54 | _WslLaunch = (fnWslLaunch)GetProcAddress(wsl_handle, "WslLaunch");
55 |
56 | if (!_WslIsDistributionRegistered ||
57 | !_WslRegisterDistribution ||
58 | !_WslUnregisterDistribution ||
59 | !_WslConfigureDistribution ||
60 | !_WslGetDistributionConfiguration ||
61 | !_WslLaunchInteractive ||
62 | !_WslLaunch)
63 | return false;
64 |
65 | return true;
66 | }
67 |
68 | bool get_wsl_distro_config(const wchar_t *distor_name, ULONG *default_uid, WSL_DISTRIBUTION_FLAGS *distor_flags)
69 | {
70 | ULONG distor_version, _default_uid, env_count;
71 | WSL_DISTRIBUTION_FLAGS _distor_flags;
72 | PSTR *env;
73 | HRESULT hr = _WslGetDistributionConfiguration(distor_name, &distor_version, &_default_uid, &_distor_flags, &env, &env_count);
74 | if (FAILED(hr))
75 | return false;
76 |
77 | for (ULONG i = 0; i < env_count; i++)
78 | CoTaskMemFree(env[i]);
79 | CoTaskMemFree(env);
80 |
81 | if (default_uid)
82 | *default_uid = _default_uid;
83 |
84 | if (distor_flags)
85 | *distor_flags = _distor_flags;
86 |
87 | return true;
88 | }
89 |
90 | ULONG uid_from_username(const wchar_t *distor_name, const wchar_t *username)
91 | {
92 | HANDLE read_pipe, write_pipe;
93 | SECURITY_ATTRIBUTES sec_attr;
94 | sec_attr.nLength = sizeof(SECURITY_ATTRIBUTES);
95 | sec_attr.lpSecurityDescriptor = NULL;
96 | sec_attr.bInheritHandle = TRUE;
97 |
98 | if (CreatePipe(&read_pipe, &write_pipe, &sec_attr, 0))
99 | {
100 | wchar_t command[64];
101 | swprintf(command, ARRAYSIZE(command), L"id -u %s", username);
102 |
103 | HANDLE handle_stdin = GetStdHandle(STD_INPUT_HANDLE);
104 | HANDLE handle_stderr = GetStdHandle(STD_ERROR_HANDLE);
105 | HANDLE process_handle;
106 | HRESULT hr = _WslLaunch(distor_name, command, FALSE, handle_stdin, write_pipe, handle_stderr, &process_handle);
107 | if (SUCCEEDED(hr))
108 | {
109 | DWORD exit_code;
110 | WaitForSingleObject(process_handle, INFINITE);
111 | GetExitCodeProcess(process_handle, &exit_code);
112 | CloseHandle(process_handle);
113 |
114 | if (exit_code == 0)
115 | {
116 | char uid_string[16];
117 | DWORD byte_read;
118 | if (ReadFile(read_pipe, uid_string, 15, &byte_read, NULL))
119 | {
120 | CloseHandle(read_pipe);
121 | CloseHandle(write_pipe);
122 |
123 | uid_string[byte_read] = '\0';
124 | ULONG uid = strtoul(uid_string, NULL, 10);
125 |
126 | return uid;
127 | }
128 | }
129 | }
130 | }
131 | return ULONG_MAX;
132 | }
133 |
134 | #endif /* _WSL_UTIL */
135 |
--------------------------------------------------------------------------------
/main.c:
--------------------------------------------------------------------------------
1 | #define WIN32_LEAN_AND_MEAN
2 | #include
3 | #include
4 | #include
5 |
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include
11 |
12 | #ifdef _MSC_VER
13 | #define _CRT_SECURE_NO_WARNINGS
14 | #pragma warning(disable:4996)
15 | #endif /* _MSC_VER */
16 |
17 | #include "wslutil.h"
18 | #include "my_gets.h"
19 |
20 | #define DISTOR_NAME L"AOSC-OS"
21 |
22 | void print_help(void)
23 | {
24 | puts(
25 | "AOSC OS for WSL Utility 0.1.1\n"
26 | "Usage: aosc-os []\n\n"
27 | "Commands:\n"
28 | " run/exec [] - Run command line in WSL.\n\n"
29 | " config [