src/vs/platform/extensions/electron-main/extensionHostStarter.ts/UtilityExtensionHostProcess/start
class UtilityExtensionHostProcess:	start(opts: IExtensionHostProcessOptions): void {
		const codeWindow = this._windowsMainService.getWindowById(opts.responseWindowId);
		if (!codeWindow) {
			this._logService.info(`UtilityProcess<${this.id}>: Refusing to create new Extension Host UtilityProcess because requesting window cannot be found...`);
			return;
		}

		const responseWindow = codeWindow.win;
		if (!responseWindow || responseWindow.isDestroyed() || responseWindow.webContents.isDestroyed()) {
			this._logService.info(`UtilityProcess<${this.id}>: Refusing to create new Extension Host UtilityProcess because requesting window cannot be found...`);
			return;
		}

		const serviceName = `extensionHost${this.id}`;
		const modulePath = FileAccess.asFileUri('bootstrap-fork.js', require).fsPath;
		const args: string[] = ['--type=extensionHost', '--skipWorkspaceStorageLock'];
		const execArgv: string[] = opts.execArgv || [];
		const env: { [key: string]: any } = { ...opts.env };

		// Make sure all values are strings, otherwise the process will not start
		for (const key of Object.keys(env)) {
			env[key] = String(env[key]);
		}

		this._logService.info(`UtilityProcess<${this.id}>: Creating new...`);

		this._process = new UtilityProcess(modulePath, args, { serviceName, env, execArgv });

		this._register(Event.fromNodeEventEmitter<void>(this._process, 'spawn')(() => {
			this._logService.info(`UtilityProcess<${this.id}>: received spawn event.`);
		}));
		this._register(Event.fromNodeEventEmitter<number | undefined>(this._process, 'exit')((code: number | undefined) => {
			code = code || 0;
			this._logService.info(`UtilityProcess<${this.id}>: received exit event with code ${code}.`);
			this._hasExited = true;
			this._onExit.fire({ pid: this._process!.pid!, code, signal: '' });
		}));
		const listener = (event: electron.Event, details: electron.Details) => {
			if (details.type !== 'Utility') {
				return;
			}
			// Despite the fact that we pass the argument `seviceName`,
			// the details have a field called `name` where this value appears
			if (details.name === serviceName) {
				this._logService.info(`UtilityProcess<${this.id}>: terminated unexpectedly with code ${details.exitCode}.`);
				this._hasExited = true;
				this._onExit.fire({ pid: this._process!.pid!, code: details.exitCode, signal: '' });
			}
		};
		electron.app.on('child-process-gone', listener);
		this._register(toDisposable(() => {
			electron.app.off('child-process-gone', listener);
		}));

		const { port1, port2 } = new electron.MessageChannelMain();

		this._process.postMessage('port', null, [port2]);
		responseWindow.webContents.postMessage(opts.responseChannel, opts.responseNonce, [port1]);
	}