From 36d1362deb41dd8f1698295132916023772df850 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Tue, 7 Jan 2020 14:49:33 -0800 Subject: [PATCH] 1. Updated win-dispatcher to support dispatching to current user 2. Updated win-virtual-terminal.js to correctly use ClosePseudoConsole() --- microscript/ILibDuktape_Polyfills.c | 2 +- modules/win-dispatcher.js | 14 ++++++++++++-- modules/win-virtual-terminal.js | 30 +++++++++++++++++++++++++---- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 2264ac2..5b4db66 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2051,7 +2051,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addModule('win-bcd', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KZnVuY3Rpb24gZ2V0S2V5cygpDQp7DQogICAgdmFyIHJldCA9IHt9Ow0KICAgIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICJcXFN5c3RlbTMyXFxiY2RlZGl0LmV4ZSIsIFsnYmNkZWRpdCcsICcvZW51bScsICd7Y3VycmVudH0nXSk7DQogICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOyBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB0aGlzLnN0ciArPSBjLnRvU3RyaW5nKCk7IH0pOw0KICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uICgpIHsgfSk7DQogICAgY2hpbGQud2FpdEV4aXQoKTsNCg0KICAgIHZhciBsaW5lcyA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpLnNwbGl0KCdcclxuJyk7DQogICAgbGluZXMuc2hpZnQoKTsgbGluZXMuc2hpZnQoKTsNCg0KICAgIGZvciAodmFyIGkgaW4gbGluZXMpDQogICAgew0KICAgICAgICB2YXIgdG9rZW5zID0gbGluZXNbaV0uc3BsaXQoJyAnKTsNCiAgICAgICAgdmFyIGtleSA9IHRva2Vucy5zaGlmdCgpOw0KICAgICAgICB2YXIgdmFsdWUgPSB0b2tlbnMuam9pbignICcpLnRyaW0oKTsNCiAgICAgICAgcmV0W2tleV0gPSB2YWx1ZTsNCiAgICB9DQogICAgcmV0dXJuIChyZXQpOw0KfQ0KZnVuY3Rpb24gZ2V0S2V5KGtleSkNCnsNCiAgICByZXR1cm4gKHRoaXMuZ2V0S2V5cygpW2tleV0pOw0KfQ0KZnVuY3Rpb24gc2V0S2V5KGtleSwgdmFsdWUpDQp7DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICJcXFN5c3RlbTMyXFxiY2RlZGl0LmV4ZSIsIFsnYmNkZWRpdCcsICcvc2V0JywgJ3tjdXJyZW50fScsIGtleSwgdmFsdWVdKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KfQ0KZnVuY3Rpb24gZGVsZXRlS2V5KGtleSkNCnsNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgIlxcU3lzdGVtMzJcXGJjZGVkaXQuZXhlIiwgWydiY2RlZGl0JywgJy9kZWxldGV2YWx1ZScsICd7Y3VycmVudH0nLCBrZXldKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKCkgeyB9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KfQ0KDQpmdW5jdGlvbiBlbmFibGVTYWZlTW9kZVNlcnZpY2Uoc2VydmljZU5hbWUpDQp7DQogICAgcmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuV3JpdGVLZXkocmVxdWlyZSgnd2luLXJlZ2lzdHJ5JykuSEtFWS5Mb2NhbE1hY2hpbmUsICdTWVNURU1cXEN1cnJlbnRDb250cm9sU2V0XFxDb250cm9sXFxTYWZlYm9vdFxcTmV0d29ya1xcJyArIHNlcnZpY2VOYW1lLCBudWxsLCAnU2VydmljZScpOw0KfQ0KZnVuY3Rpb24gZGlzYWJsZVNhZmVNb2RlU2VydmljZShzZXJ2aWNlTmFtZSkNCnsNCiAgICB0cnkNCiAgICB7DQogICAgICAgIHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLkRlbGV0ZUtleShyZXF1aXJlKCd3aW4tcmVnaXN0cnknKS5IS0VZLkxvY2FsTWFjaGluZSwgJ1NZU1RFTVxcQ3VycmVudENvbnRyb2xTZXRcXENvbnRyb2xcXFNhZmVib290XFxOZXR3b3JrXFwnICsgc2VydmljZU5hbWUpOw0KICAgIH0NCiAgICBjYXRjaCh4KQ0KICAgIHsNCiAgICB9DQp9DQoNCmZ1bmN0aW9uIHJlc3RhcnQoZGVsYXkpDQp7DQogICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKHByb2Nlc3MuZW52Wyd3aW5kaXInXSArICJcXFN5c3RlbTMyXFxzaHV0ZG93bi5leGUiLCBbJ3NodXRkb3duJywgJy9yJywgJy90JywgZGVsYXkhPW51bGw/ZGVsYXkudG9TdHJpbmcoKTonMCddKTsNCiAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7IGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjKSB7IHRoaXMuc3RyICs9IGMudG9TdHJpbmcoKTsgfSk7DQogICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGMpIHsgY29uc29sZS5sb2coYy50b1N0cmluZygpKTt9KTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KfQ0KDQppZiAocmVxdWlyZSgnX0dlbmVyaWNNYXJzaGFsJykuUG9pbnRlclNpemUgPT0gNCAmJiByZXF1aXJlKCdvcycpLmFyY2goKSA9PSAneDY0JykNCnsNCiAgICB0aHJvdyAoJ3dpbi1iY2Qgb24gYSA2NCBiaXQgUGxhdGZvcm0gY2FuIG9ubHkgYmUgYWNjZXNzZWQgZnJvbSBhIDY0IGJpdCBwcm9jZXNzJyk7DQp9DQplbHNlDQp7DQogICAgbW9kdWxlLmV4cG9ydHMgPQ0KICAgICAgICB7DQogICAgICAgICAgICBnZXRLZXlzOiBnZXRLZXlzLCBzZXRLZXk6IHNldEtleSwgZGVsZXRlS2V5OiBkZWxldGVLZXksIGVuYWJsZVNhZmVNb2RlU2VydmljZTogZW5hYmxlU2FmZU1vZGVTZXJ2aWNlLA0KICAgICAgICAgICAgZGlzYWJsZVNhZmVNb2RlU2VydmljZTogZGlzYWJsZVNhZmVNb2RlU2VydmljZSwgZ2V0S2V5OiBnZXRLZXksIHJlc3RhcnQ6IHJlc3RhcnQNCiAgICAgICAgfTsNCn0NCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUuZXhwb3J0cywgImJvb3RNb2RlIiwNCiAgICB7DQogICAgICAgIGdldDogZnVuY3Rpb24oKQ0KICAgICAgICB7DQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgdiA9IHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLlF1ZXJ5S2V5KHJlcXVpcmUoJ3dpbi1yZWdpc3RyeScpLkhLRVkuTG9jYWxNYWNoaW5lLCAnU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcQ29udHJvbFxcU2FmZWJvb3RcXE9wdGlvbicsICdPcHRpb25WYWx1ZScpOw0KICAgICAgICAgICAgICAgIHN3aXRjaCh2KQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnU0FGRV9NT0RFX05FVFdPUksnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnU0FGRV9NT0RFJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuICh2KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNhdGNoKHgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgcmV0dXJuICgnTk9STUFMJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTs=', 'base64').toString());"); // win-dispatcher a helper to run JavaScript as a particular user. Refer to modules/win-dispatcher.js - duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KDQpmdW5jdGlvbiBkaXNwYXRjaChvcHRpb25zKQ0Kew0KICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy51c2VyIHx8ICFvcHRpb25zLm1vZHVsZXMgfHwgIW9wdGlvbnMubGF1bmNoIHx8ICFvcHRpb25zLmxhdW5jaC5tb2R1bGUgfHwgIW9wdGlvbnMubGF1bmNoLm1ldGhvZCB8fCAhb3B0aW9ucy5sYXVuY2guYXJncykgeyB0aHJvdyAoJ0ludmFsaWQgUGFyYW1ldGVycycpOyB9DQoNCiAgICB2YXIgaXBjSW50ZWdlcg0KICAgIHZhciByZXQgPSB7IG9wdGlvbnM6IG9wdGlvbnMgfTsNCiAgICByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXIuY2FsbChyZXQsIHRydWUpLmNyZWF0ZUV2ZW50KCdjb25uZWN0aW9uJyk7DQoNCiAgICByZXQuX2lwYyA9IHJlcXVpcmUoJ25ldCcpLmNyZWF0ZVNlcnZlcigpOyByZXQuX2lwYy5wYXJlbnQgPSByZXQ7DQogICAgcmV0Ll9pcGMub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkgeyBjb25zb2xlLmxvZygnc2VydmVyIGNsb3NlZCcpOyB9KTsNCiAgICB3aGlsZSAodHJ1ZSkNCiAgICB7DQogICAgICAgIGlwY0ludGVnZXIgPSByZXF1aXJlKCd0bHMnKS5nZW5lcmF0ZVJhbmRvbUludGVnZXIoJzEwMDAnLCAnOTk5OScpOw0KICAgICAgICByZXQuX2lwY1BhdGggPSAnXFxcXC5cXHBpcGVcXHRhc2tSZWRpcmVjdGlvbi0nICsgaXBjSW50ZWdlcjsNCiAgICAgICAgDQogICAgICAgIHRyeQ0KICAgICAgICB7DQogICAgICAgICAgICByZXQuX2lwYy5saXN0ZW4oeyBwYXRoOiByZXQuX2lwY1BhdGgsIHdyaXRhYmxlQWxsOiB0cnVlIH0pOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgY2F0Y2ggKHgpDQogICAgICAgIHsNCiAgICAgICAgfQ0KICAgIH0NCiAgICB2YXIgc3RyID0gQnVmZmVyLmZyb20oInJlcXVpcmUoJ3dpbi1jb25zb2xlJykuaGlkZSgpO3JlcXVpcmUoJ3dpbi1kaXNwYXRjaGVyJykuY29ubmVjdCgnIiArIGlwY0ludGVnZXIgKyAiJyk7IikudG9TdHJpbmcoJ2Jhc2U2NCcpOw0KDQogICAgcmV0Ll9pcGMub25jZSgnY29ubmVjdGlvbicsIGZ1bmN0aW9uIG9uQ29ubmVjdChzKQ0KICAgIHsNCiAgICAgICAgdGhpcy5wYXJlbnQuX2NsaWVudCA9IHM7DQogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQuX3BhcmVudCA9IHRoaXM7DQogICAgICAgIHZhciBkLCBoID0gQnVmZmVyLmFsbG9jKDQpOw0KDQogICAgICAgIGZvciAodmFyIG0gaW4gdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzKQ0KICAgICAgICB7DQogICAgICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnYWRkTW9kdWxlJywgdmFsdWU6IHsgbmFtZTogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLm5hbWUsIGpzOiB0aGlzLnBhcmVudC5vcHRpb25zLm1vZHVsZXNbbV0uc2NyaXB0IH0gfSkpOw0KICAgICAgICAgICAgaC53cml0ZVVJbnQzMkxFKGQubGVuZ3RoICsgNCk7DQogICAgICAgICAgICBzLndyaXRlKGgpOw0KICAgICAgICAgICAgcy53cml0ZShkKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGQgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeSh7IGNvbW1hbmQ6ICdsYXVuY2gnLCB2YWx1ZTogeyBtb2R1bGU6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLm1vZHVsZSwgbWV0aG9kOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tZXRob2QsIGFyZ3M6IHRoaXMucGFyZW50Lm9wdGlvbnMubGF1bmNoLmFyZ3MgfSB9KSk7DQogICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICBzLndyaXRlKGgpOw0KICAgICAgICBzLndyaXRlKGQpOw0KICAgICAgICBzLm9uY2UoJ2VuZCcsIGZ1bmN0aW9uICgpIHsgdGhpcy5fcGFyZW50LmNsb3NlKCk7IH0pOw0KICAgICAgICB0aGlzLnBhcmVudC5lbWl0KCdjb25uZWN0aW9uJywgcyk7DQogICAgfSk7DQoNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXGNtZC5leGUnLCBbJ2NtZCddKTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnU0NIVEFTS1MgL0NSRUFURSAvRiAvVE4gTWVzaFVzZXJUYXNrIC9TQyBPTkNFIC9TVCAwMDowMCAvUlUgJyArIG9wdGlvbnMudXNlciArICcgL1RSICInICsgcHJvY2Vzcy5leGVjUGF0aCArICcgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvUlVOIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxyXG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KDQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBjb25uZWN0KGlwYykNCnsNCiAgICB2YXIgaXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGM7DQoNCiAgICBnbG9iYWwuaXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSAnYWRkTW9kdWxlJzoNCiAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKGNtZC52YWx1ZS5uYW1lLCBjbWQudmFsdWUuanMpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdsYXVuY2gnOg0KICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gcmVxdWlyZShjbWQudmFsdWUubW9kdWxlKTsNCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLl9wcm94eVN0cmVhbSA9IG9ialtjbWQudmFsdWUubWV0aG9kXS5hcHBseShvYmosIGNtZC52YWx1ZS5hcmdzKTsNCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLl9wcm94eVN0cmVhbS5waXBlKHRoaXMsIHsgZW5kOiBmYWxzZSB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlKGdsb2JhbC5fcHJveHlTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTsNCg0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICB9KTsNCiAgICB9KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSB7IGRpc3BhdGNoOiBkaXNwYXRjaCwgY29ubmVjdDogY29ubmVjdCB9Ow0KDQo=', 'base64').toString());"); + duk_peval_string_noresult(ctx, "addModule('win-dispatcher', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8NCg0KDQpmdW5jdGlvbiBkaXNwYXRjaChvcHRpb25zKQ0Kew0KICAgIGlmICghb3B0aW9ucyB8fCAhb3B0aW9ucy5tb2R1bGVzIHx8ICFvcHRpb25zLmxhdW5jaCB8fCAhb3B0aW9ucy5sYXVuY2gubW9kdWxlIHx8ICFvcHRpb25zLmxhdW5jaC5tZXRob2QgfHwgIW9wdGlvbnMubGF1bmNoLmFyZ3MpIHsgdGhyb3cgKCdJbnZhbGlkIFBhcmFtZXRlcnMnKTsgfQ0KDQogICAgdmFyIGlwY0ludGVnZXINCiAgICB2YXIgcmV0ID0geyBvcHRpb25zOiBvcHRpb25zIH07DQogICAgcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyLmNhbGwocmV0LCB0cnVlKS5jcmVhdGVFdmVudCgnY29ubmVjdGlvbicpOw0KDQogICAgcmV0Ll9pcGMgPSByZXF1aXJlKCduZXQnKS5jcmVhdGVTZXJ2ZXIoKTsgcmV0Ll9pcGMucGFyZW50ID0gcmV0Ow0KICAgIHJldC5faXBjLm9uKCdjbG9zZScsIGZ1bmN0aW9uICgpIHsgY29uc29sZS5sb2coJ3NlcnZlciBjbG9zZWQnKTsgfSk7DQogICAgd2hpbGUgKHRydWUpDQogICAgew0KICAgICAgICBpcGNJbnRlZ2VyID0gcmVxdWlyZSgndGxzJykuZ2VuZXJhdGVSYW5kb21JbnRlZ2VyKCcxMDAwJywgJzk5OTknKTsNCiAgICAgICAgcmV0Ll9pcGNQYXRoID0gJ1xcXFwuXFxwaXBlXFx0YXNrUmVkaXJlY3Rpb24tJyArIGlwY0ludGVnZXI7DQogICAgICAgIA0KICAgICAgICB0cnkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0Ll9pcGMubGlzdGVuKHsgcGF0aDogcmV0Ll9pcGNQYXRoLCB3cml0YWJsZUFsbDogdHJ1ZSB9KTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIGNhdGNoICh4KQ0KICAgICAgICB7DQogICAgICAgIH0NCiAgICB9DQogICAgdmFyIHN0ciA9IEJ1ZmZlci5mcm9tKCJyZXF1aXJlKCd3aW4tY29uc29sZScpLmhpZGUoKTtyZXF1aXJlKCd3aW4tZGlzcGF0Y2hlcicpLmNvbm5lY3QoJyIgKyBpcGNJbnRlZ2VyICsgIicpOyIpLnRvU3RyaW5nKCdiYXNlNjQnKTsNCg0KICAgIHJldC5faXBjLm9uY2UoJ2Nvbm5lY3Rpb24nLCBmdW5jdGlvbiBvbkNvbm5lY3QocykNCiAgICB7DQogICAgICAgIHRoaXMucGFyZW50Ll9jbGllbnQgPSBzOw0KICAgICAgICB0aGlzLnBhcmVudC5fY2xpZW50Ll9wYXJlbnQgPSB0aGlzOw0KICAgICAgICB2YXIgZCwgaCA9IEJ1ZmZlci5hbGxvYyg0KTsNCg0KICAgICAgICBmb3IgKHZhciBtIGluIHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlcykNCiAgICAgICAgew0KICAgICAgICAgICAgZCA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHsgY29tbWFuZDogJ2FkZE1vZHVsZScsIHZhbHVlOiB7IG5hbWU6IHRoaXMucGFyZW50Lm9wdGlvbnMubW9kdWxlc1ttXS5uYW1lLCBqczogdGhpcy5wYXJlbnQub3B0aW9ucy5tb2R1bGVzW21dLnNjcmlwdCB9IH0pKTsNCiAgICAgICAgICAgIGgud3JpdGVVSW50MzJMRShkLmxlbmd0aCArIDQpOw0KICAgICAgICAgICAgcy53cml0ZShoKTsNCiAgICAgICAgICAgIHMud3JpdGUoZCk7DQogICAgICAgIH0NCg0KICAgICAgICBkID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoeyBjb21tYW5kOiAnbGF1bmNoJywgdmFsdWU6IHsgbW9kdWxlOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5tb2R1bGUsIG1ldGhvZDogdGhpcy5wYXJlbnQub3B0aW9ucy5sYXVuY2gubWV0aG9kLCBhcmdzOiB0aGlzLnBhcmVudC5vcHRpb25zLmxhdW5jaC5hcmdzIH0gfSkpOw0KICAgICAgICBoLndyaXRlVUludDMyTEUoZC5sZW5ndGggKyA0KTsNCiAgICAgICAgcy53cml0ZShoKTsNCiAgICAgICAgcy53cml0ZShkKTsNCiAgICAgICAgcy5vbmNlKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHRoaXMuX3BhcmVudC5jbG9zZSgpOyB9KTsNCiAgICAgICAgdGhpcy5wYXJlbnQuZW1pdCgnY29ubmVjdGlvbicsIHMpOw0KICAgIH0pOw0KDQoNCiAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUocHJvY2Vzcy5lbnZbJ3dpbmRpciddICsgJ1xcc3lzdGVtMzJcXGNtZC5leGUnLCBbJ2NtZCddKTsNCiAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykgeyB9KTsNCg0KICAgIGlmIChvcHRpb25zLnVzZXIpDQogICAgew0KICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnU0NIVEFTS1MgL0NSRUFURSAvRiAvVE4gTWVzaFVzZXJUYXNrIC9TQyBPTkNFIC9TVCAwMDowMCAvUlUgJyArIG9wdGlvbnMudXNlciArICcgL1RSICInICsgcHJvY2Vzcy5leGVjUGF0aCArICcgLWI2NGV4ZWMgJyArIHN0ciArICciXHJcbicpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgnU0NIVEFTS1MgL0NSRUFURSAvRiAvVE4gTWVzaFVzZXJUYXNrIC9TQyBPTkNFIC9TVCAwMDowMCAvVFIgIicgKyBwcm9jZXNzLmV4ZWNQYXRoICsgJyAtYjY0ZXhlYyAnICsgc3RyICsgJyJcclxuJyk7DQogICAgfQ0KICAgIGNoaWxkLnN0ZGluLndyaXRlKCdTQ0hUQVNLUyAvUlVOIC9UTiBNZXNoVXNlclRhc2tcclxuJyk7DQogICAgY2hpbGQuc3RkaW4ud3JpdGUoJ1NDSFRBU0tTIC9ERUxFVEUgL0YgL1ROIE1lc2hVc2VyVGFza1xyXG4nKTsNCiAgICBjaGlsZC5zdGRpbi53cml0ZSgnZXhpdFxyXG4nKTsNCiAgICBjaGlsZC53YWl0RXhpdCgpOw0KICAgIA0KDQogICAgcmV0dXJuIChyZXQpOw0KfQ0KDQpmdW5jdGlvbiBjb25uZWN0KGlwYykNCnsNCiAgICB2YXIgaXBjUGF0aCA9ICdcXFxcLlxccGlwZVxcdGFza1JlZGlyZWN0aW9uLScgKyBpcGM7DQoNCiAgICBnbG9iYWwuaXBjQ2xpZW50ID0gcmVxdWlyZSgnbmV0JykuY3JlYXRlQ29ubmVjdGlvbih7IHBhdGg6IGlwY1BhdGggfSwgZnVuY3Rpb24gKCkNCiAgICB7DQogICAgICAgIHRoaXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoYykNCiAgICAgICAgew0KICAgICAgICAgICAgdmFyIGNMZW4gPSBjLnJlYWRVSW50MzJMRSgwKTsNCiAgICAgICAgICAgIGlmIChjTGVuID4gYy5sZW5ndGgpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdGhpcy51bnNoaWZ0KGMpOw0KICAgICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdmFyIGNtZCA9IEpTT04ucGFyc2UoYy5zbGljZSg0LCBjTGVuKS50b1N0cmluZygpKTsNCiAgICAgICAgICAgIHN3aXRjaCAoY21kLmNvbW1hbmQpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSAnYWRkTW9kdWxlJzoNCiAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKGNtZC52YWx1ZS5uYW1lLCBjbWQudmFsdWUuanMpOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICdsYXVuY2gnOg0KICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gcmVxdWlyZShjbWQudmFsdWUubW9kdWxlKTsNCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLl9wcm94eVN0cmVhbSA9IG9ialtjbWQudmFsdWUubWV0aG9kXS5hcHBseShvYmosIGNtZC52YWx1ZS5hcmdzKTsNCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsLl9wcm94eVN0cmVhbS5waXBlKHRoaXMsIHsgZW5kOiBmYWxzZSB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXBlKGdsb2JhbC5fcHJveHlTdHJlYW0sIHsgZW5kOiBmYWxzZSB9KTsNCg0KICAgICAgICAgICAgICAgICAgICBnbG9iYWwuX3Byb3h5U3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7IHByb2Nlc3MuZXhpdCgpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZW5kJywgZnVuY3Rpb24gKCkgeyBwcm9jZXNzLmV4aXQoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoY0xlbiA8IGMubGVuZ3RoKSB7IHRoaXMudW5zaGlmdChjLnNsaWNlKGNMZW4pKTsgfQ0KICAgICAgICB9KTsNCiAgICB9KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSB7IGRpc3BhdGNoOiBkaXNwYXRjaCwgY29ubmVjdDogY29ubmVjdCB9Ow0KDQo=', 'base64').toString());"); #endif #ifdef _FREEBSD diff --git a/modules/win-dispatcher.js b/modules/win-dispatcher.js index acd0b8a..1c6459c 100644 --- a/modules/win-dispatcher.js +++ b/modules/win-dispatcher.js @@ -17,7 +17,7 @@ limitations under the License. function dispatch(options) { - if (!options || !options.user || !options.modules || !options.launch || !options.launch.module || !options.launch.method || !options.launch.args) { throw ('Invalid Parameters'); } + if (!options || !options.modules || !options.launch || !options.launch.module || !options.launch.method || !options.launch.args) { throw ('Invalid Parameters'); } var ipcInteger var ret = { options: options }; @@ -63,14 +63,24 @@ function dispatch(options) this.parent.emit('connection', s); }); + var child = require('child_process').execFile(process.env['windir'] + '\\system32\\cmd.exe', ['cmd']); child.stderr.on('data', function (c) { }); child.stdout.on('data', function (c) { }); - child.stdin.write('SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 /RU ' + options.user + ' /TR "' + process.execPath + ' -b64exec ' + str + '"\r\n'); + + if (options.user) + { + child.stdin.write('SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 /RU ' + options.user + ' /TR "' + process.execPath + ' -b64exec ' + str + '"\r\n'); + } + else + { + child.stdin.write('SCHTASKS /CREATE /F /TN MeshUserTask /SC ONCE /ST 00:00 /TR "' + process.execPath + ' -b64exec ' + str + '"\r\n'); + } child.stdin.write('SCHTASKS /RUN /TN MeshUserTask\r\n'); child.stdin.write('SCHTASKS /DELETE /F /TN MeshUserTask\r\n'); child.stdin.write('exit\r\n'); child.waitExit(); + return (ret); } diff --git a/modules/win-virtual-terminal.js b/modules/win-virtual-terminal.js index 883d207..aa7ab09 100644 --- a/modules/win-virtual-terminal.js +++ b/modules/win-virtual-terminal.js @@ -47,9 +47,12 @@ function vt() var GM = require('_GenericMarshal'); var k32 = GM.CreateNativeProxy('kernel32.dll'); + k32.CreateMethod('CancelIoEx'); k32.CreateMethod('CreatePipe'); k32.CreateMethod('CreateProcessW'); k32.CreateMethod('CreatePseudoConsole'); + k32.CreateMethod('CloseHandle'); + k32.CreateMethod('ClosePseudoConsole'); k32.CreateMethod('GetProcessHeap'); k32.CreateMethod('HeapAlloc'); k32.CreateMethod('InitializeProcThreadAttributeList'); @@ -101,16 +104,34 @@ function vt() { if (this.terminal._process) { - this.terminal.k32.TerminateProcess(this.terminal._process, 0); this.terminal._process = null; - this.terminal.k32.ReadFile.async.abort(); + k32.ClosePseudoConsole(this._obj._h.Deref()); } flush(); } }); + ds._obj = ret; ret._waiter = require('DescriptorEvents').addDescriptor(pi.Deref(0)); ret._waiter.ds = ds; - ret._waiter.on('signaled', function () { this.ds.push(null); }); + ret._waiter._obj = ret; + ret._waiter.on('signaled', function () + { + k32.CancelIoEx(this._obj._output.Deref(), 0); + + // Child process has exited + this.ds.push(null); + + if (this._obj._process) + { + this._obj._process = null; + k32.ClosePseudoConsole(this._obj._h.Deref()); + } + k32.CloseHandle(this._obj._input.Deref()); + k32.CloseHandle(this._obj._output.Deref()); + + k32.CloseHandle(this._obj._consoleInput.Deref()); + k32.CloseHandle(this._obj._consoleOutput.Deref()); + }); ds.terminal = ret; ds._rpbuf = GM.CreateVariable(4096); @@ -121,6 +142,8 @@ function vt() this._rp.then(function () { var len = this.parent._rpbufRead.toBuffer().readUInt32LE(); + if (len <= 0) { return; } + this.parent.push(this.parent._rpbuf.toBuffer().slice(0, len)); this.parent.__read(); }); @@ -131,7 +154,6 @@ function vt() } else { - console.log('FAILED!'); } }