Merge pull request #1292 from PowerShell/vors/powershell-native

Missed powershell native sources
This commit is contained in:
Sergei Vorobev 2016-07-06 12:22:55 -07:00 committed by GitHub
commit 423decfbc4
8 changed files with 605 additions and 1 deletions

View File

@ -20,5 +20,12 @@
"monad/nttargets/assemblies/nativemsh/pwrshplugin/pwrshheaders.h": "nativemsh/pwrshplugin/pwrshheaders.h",
"monad/nttargets/assemblies/nativemsh/pwrshplugin/pwrshplugin.h": "nativemsh/pwrshplugin/pwrshplugin.h",
"monad/nttargets/assemblies/nativemsh/pwrshplugin/pwrshplugindefs.h": "nativemsh/pwrshplugin/pwrshplugindefs.h",
"monad/nttargets/assemblies/nativemsh/pwrshplugin/pwrshplugin.def": "nativemsh/pwrshplugin/pwrshplugin.def"
"monad/nttargets/assemblies/nativemsh/pwrshplugin/pwrshplugin.def": "nativemsh/pwrshplugin/pwrshplugin.def",
"monad/nttargets/assemblies/nativemsh/pwrshexe/CssMainEntry.cpp": "nativemsh/pwrshexe/CssMainEntry.cpp",
"monad/nttargets/assemblies/nativemsh/pwrshexe/Monad.ico": "nativemsh/pwrshexe/Monad.ico",
"monad/nttargets/assemblies/nativemsh/pwrshexe/MshResources.rc": "nativemsh/pwrshexe/MshResources.rc",
"monad/nttargets/assemblies/nativemsh/pwrshexe/nativemsh.mc": "nativemsh/pwrshexe/NativeMsh.mc",
"monad/nttargets/assemblies/nativemsh/pwrshexe/PowerShell.exe.manifest": "nativemsh/pwrshexe/PowerShell.exe.manifest",
"monad/nttargets/assemblies/nativemsh/pwrshexe/PowerShell_securitybadge.ico": "nativemsh/pwrshexe/PowerShell_securitybadge.ico",
"monad/nttargets/assemblies/nativemsh/pwrshexe/version.rc": "nativemsh/pwrshexe/version.rc"
}

View File

@ -0,0 +1,267 @@
// ----------------------------------------------------------------------
//
// Microsoft Windows NT
// Copyright (C) Microsoft Corporation, 2005.
//
// File: CoreCLRHost.cpp
//
// Contents: Unmanaged startup point for powershell.exe console app.
//
// ----------------------------------------------------------------------
#include <windows.h>
#include <string>
#include <stdio.h>
#include "mscoree.h"
#include "NativeMsh.h"
#include "ClrHostWrapper.h"
#include "OutputWriter.h"
#include "WinSystemCallFacade.h"
namespace NativeMsh
{
// Define the function pointer for the powershell entry point.
typedef int (STDMETHODCALLTYPE *MonadRunHelperFp)(LPCWSTR consoleFilePath, LPCWSTR * args, int argc); // int UnmanagedPSEntry.Start(string consoleFilePath, string[] args, int argc)
// Define the function pointer for AssemblyLoadContext initializer.
typedef void (STDMETHODCALLTYPE *LoaderRunHelperFp)(LPCWSTR appPath);
bool TryRun(const int argc, const wchar_t* argv[], HostEnvironment &hostEnvironment, int &exitCode, bool verbose)
{
// Assume failure
exitCode = -1;
// All these objects will be destroyed when commonFuncs goes out of scope.
PwrshExeOutput* output = new PwrshExeOutput();
PwrshCommon commonFuncs(output, new WinSystemCallFacade());
ICLRRuntimeHost2Wrapper hostWrapper;
exitCode = commonFuncs.LaunchCoreCLR(&hostWrapper, hostEnvironment);
if (EXIT_CODE_SUCCESS != exitCode)
{
if (verbose)
::wprintf(L"Unable to launch CoreCLR\n");
return false;
}
if (!hostWrapper.IsInitialized()) // TODO: redundant?
{
if (verbose)
::wprintf(L"Unable to initialize CoreCLR\n");
return false;
}
exitCode = commonFuncs.CreateAppDomain(&hostWrapper, hostEnvironment.GetHostBinaryName(), hostEnvironment);
if (EXIT_CODE_SUCCESS != exitCode)
{
if (verbose)
::wprintf(L"Unable to create app domain\n");
return false;
}
//-------------------------------------------------------------
// Set the powershell custom assembly loader to be the default
LoaderRunHelperFp initDelegate = NULL;
HRESULT hr = hostWrapper.CreateDelegate(
hostWrapper.GetAppDomainId(),
L"Microsoft.PowerShell.CoreCLR.AssemblyLoadContext, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35",
L"System.Management.Automation.PowerShellAssemblyLoadContextInitializer",
L"SetPowerShellAssemblyLoadContext",
(INT_PTR*)&initDelegate);
if (FAILED(hr))
{
output->DisplayMessage(false, g_CREATING_MSH_ENTRANCE_FAILED, hr);
}
else
{
initDelegate(hostEnvironment.GetHostDirectoryPath());
}
//-------------------------------------------------------------
// Start the assembly
MonadRunHelperFp pfnDelegate = NULL;
hr = hostWrapper.CreateDelegate(
hostWrapper.GetAppDomainId(),
L"Microsoft.PowerShell.ConsoleHost, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35",
L"Microsoft.PowerShell.UnmanagedPSEntry",
L"Start",
(INT_PTR*)&pfnDelegate);
if (FAILED(hr))
{
output->DisplayMessage(false, g_CREATING_MSH_ENTRANCE_FAILED, hr);
}
else
{
exitCode = pfnDelegate(NULL, &argv[0], argc);
}
// Unload the AppDomain
if (verbose)
::wprintf(L"Unloading the AppDomain\n");
int utilExitCode = hostWrapper.CleanUpHostWrapper();
if (EXIT_CODE_SUCCESS != utilExitCode)
{
if (verbose)
{
if (g_UNLOAD_APPDOMAIN_FAILED == utilExitCode)
{
// TODO: If we want localization, these must be added to nativemsh.mc
::wprintf(L"Failed to unload the AppDomain. ERRORCODE: %u\n", utilExitCode);
}
else if (g_STOP_CLR_HOST_FAILED == utilExitCode)
{
::wprintf(L"Failed to stop the host. ERRORCODE: %u\n", utilExitCode);
}
else if (g_RELEASE_CLR_HOST_FAILED == utilExitCode)
{
::wprintf(L"Failed to release the host.ERRORCODE: %u\n", utilExitCode);
}
}
return false;
}
return true;
}
void showHelp() {
static PCWSTR coreCLRInstallDirectory = L"%windir%\\system32\\DotNetCore\\v1.0\\";
::wprintf(
L"USAGE: powershell [-Verbose] [-Debug] [-File <filePath> <args>] [-Command] <CommandLine>\r\n"
L"\r\n"
L" CoreCLR is searched for in the directory that powershell.exe is in,\r\n"
L" then in %s.\r\n",
coreCLRInstallDirectory
);
}
} // namespace NativeMsh
int __cdecl wmain(const int argc, const wchar_t* argv[])
{
// Parse the options from the command line
const wchar_t *verboseParameter = L"-Verbose";
const wchar_t *debugParameter = L"-Debug";
const wchar_t *versionParameter = L"-Version";
const wchar_t *psConsoleFileParameter = L"-PSConsoleFile";
const wchar_t *runtimeVersionParameter = L"-RuntimeVersion";
bool verbose = false;
bool debug = false;
bool helpRequested = false;
bool versionSpecified = false;
bool psConsoleFileSpecified = false;
bool runtimeVersionSpecified = false;
int newArgc = argc - 1;
const wchar_t **newArgv = argv + 1;
auto stringsMatch = [](const wchar_t * const userInput, const wchar_t * const parameter) -> bool {
size_t userInputLength = ::wcslen(userInput);
size_t parameterLength = ::wcslen(parameter);
// If the user input is longer than the parameter, they cannot be matched.
if (userInputLength > parameterLength) {
return false;
}
// Return true if the user input is a prefix of the parameter
return ::_wcsnicmp(userInput, parameter, userInputLength) == 0;
};
auto stringsEqual = [](const wchar_t * const a, const wchar_t * const b) -> bool {
return ::_wcsicmp(a, b) == 0;
};
// These parameters are considered 'native only' - they should NOT be passed to managed layer
auto skipParameter = [&](const wchar_t * arg) -> bool {
if (stringsMatch(arg, verboseParameter)) {
verbose = true;
}
else if (stringsEqual(arg, L"/?") || stringsEqual(arg, L"-?")) {
helpRequested = true;
}
else if (stringsMatch(arg, debugParameter))
{
debug = true;
}
else if (stringsEqual(arg, versionParameter))
{
versionSpecified = true;
}
else if (stringsMatch(arg, psConsoleFileParameter))
{
psConsoleFileSpecified = true;
}
else if (stringsMatch(arg, runtimeVersionParameter)) {
runtimeVersionSpecified = true;
}
else {
return false;
}
return true;
};
// Find the last 'native' parameter, and chomp everything up until it.
while (newArgc > 0 && skipParameter(newArgv[0]))
{
newArgc--;
newArgv++;
if (versionSpecified) {
// skip the next arg if there is one
versionSpecified = false;
if (newArgc > 0) {
newArgc--;
newArgv++;
}
}
if (psConsoleFileSpecified) {
// skip the next arg if there is one
psConsoleFileSpecified = false;
if (newArgc > 0) {
newArgc--;
newArgv++;
}
}
if (runtimeVersionSpecified) {
// skip the next arg if there is one
runtimeVersionSpecified = false;
if (newArgc > 0) {
newArgc--;
newArgv++;
}
}
}
if (debug)
{
::wprintf(L" Attach the debugger to powershell.exe and press any key to continue\n");
::getchar();
}
if (helpRequested)
{
NativeMsh::showHelp();
return -1;
}
else
{
int exitCode;
NativeMsh::HostEnvironment hostEnvironment;
auto success = TryRun(newArgc, newArgv, hostEnvironment, exitCode, verbose);
if (verbose)
::wprintf(L"Execution %s\n", (success ? L"succeeded" : L"failed"));
return exitCode;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -0,0 +1,46 @@
// Copyright (C) 2005 Microsoft Corporation
//
// resource script for msh.exe
//
#include <windows.h>
#define MANIFEST_RESOURCE_ID 1
MANIFEST_RESOURCE_ID RT_MANIFEST "powershell.exe.manifest"
MSH_MAIN ICON "monad.ico"
MSH_SECURITY ICON "powershell_securitybadge.ico"
STRINGTABLE DISCARDABLE
BEGIN
// Elements of our jump list, and file descriptions, and LNK
// descriptions
101 "Windows PowerShell ISE"
102 "Windows PowerShell ISE (x86)"
103 "Windows PowerShell Script"
104 "Windows PowerShell Data File"
105 "Windows PowerShell XML Document"
106 "Windows PowerShell Script Module"
107 "Windows PowerShell Console File"
108 "Run with PowerShell"
109 "Windows PowerShell"
110 "Windows PowerShell (x86)"
111 "Performs object-based (command-line) functions"
112 "Run as 32"
113 "Windows PowerShell Integrated Scripting Environment. Performs object-based (command-line) functions"
118 "Run as Administrator"
119 "Runs with administrator privileges"
120 "Windows PowerShell Cmdlet Definition XML Document"
121 "Windows PowerShell Session Configuration File"
122 "Run ISE as Administrator"
123 "Runs ISE with administrator privileges"
// Misc resources
// Friendly name for our OID mapping
124 "Document Encryption"
END
#include "nativemsh.rc"
#include "version.rc"

View File

@ -0,0 +1,235 @@
;// Copyright (C) Microsoft Corporation, 2000 - 2002
MessageId=1
SymbolicName=MISSING_COMMAND_LINE_ARGUMENT
Language=English
Missing argument for parameter %1!ls!.
.
MessageId=2
SymbolicName=INVALID_CONSOLE_FILE_PATH
Language=English
Windows PowerShell console file path "%1!ls!" is invalid.
.
MessageId=3
SymbolicName=CLR_VERSION_NOT_INSTALLED
Language=English
Version %1!ls! of the .NET Framework is not installed and it is required to run version %2!ls! of Windows PowerShell.
.
MessageId=4
SymbolicName=CORBINDTORUNTIME_FAILED
Language=English
CLR initialization failed with error %1!lx!.
.
MessageId=5
SymbolicName=STARTING_CLR_FAILED
Language=English
Starting the CLR failed with HRESULT %1!lx!.
.
MessageId=6
SymbolicName=GETTING_DEFAULT_DOMAIN_FAILED
Language=English
Internal Windows PowerShell error. Default CLR domain initialization failed with error %1!lx!.
.
MessageId=7
SymbolicName=CREATING_MSH_ENTRANCE_FAILED
Language=English
Internal Windows PowerShell error. Loading managed Windows PowerShell failed with error %1!lx!.
.
MessageId=8
SymbolicName=GETTING_DISPATCH_ID_FAILED
Language=English
Internal Windows PowerShell error. Retrieving Dispatch ID for managed Windows PowerShell entrance method failed with error %1!lx!.
.
MessageId=9
SymbolicName=INOVKING_MSH_ENTRANCE_FAILED
Language=English
Internal Windows PowerShell error. Invoking managed Windows PowerShell failed with error %1!lx!.
.
MessageId=10
SymbolicName=MANAGED_MSH_EXCEPTION
Language=English
Windows PowerShell terminated with the following error: %n %1!ls!
.
MessageId=11
SymbolicName=READ_XML_COM_INIT_FAILED
Language=English
Internal Windows PowerShell error. COM initialization failed while reading Windows PowerShell console file with error %1!lx!.
.
MessageId=12
SymbolicName=READ_XML_CREATE_DOMDOCUMENT_FAILED
Language=English
Internal Windows PowerShell error. DOMDocument creation for Windows PowerShell console file failed with error %1!lx!.
.
MessageId=13
SymbolicName=READ_XML_LOAD_FILE_FAILED
Language=English
Failed to load Windows PowerShell console file "%1!ls!".
.
MessageId=14
SymbolicName=EMPTY_REG_SZ_VALUE
Language=English
The value of the registry key %1!ls!\%2!ls! cannot be empty.
.
MessageId=15
SymbolicName=READ_XML_GET_CONSOLE_SCHEMA_VERSION_FAILED
Language=English
Cannot locate the required element ConsoleSchemaVersion in the Windows PowerShell console file "%1!ls!".
.
MessageId=16
SymbolicName=READ_XML_INVALID_CONSOLE_SCHEMA_VERSION
Language=English
A required element ConsoleSchemaVersion in Windows PowerShell console file "%1!ls!" is invalid.
.
MessageId=17
SymbolicName=INVALID_MONAD_VERSION
Language=English
"%1!ls!" is not a valid Windows PowerShell version. Specify a valid Windows PowerShell version of the format major.minor version.
.
MessageId=18
SymbolicName=READ_XML_GET_MONAD_VERSION_TEXT_FAILED
Language=English
Cannot read the Windows PowerShell version from Windows PowerShell console file "%1!ls!".
.
MessageId=19
SymbolicName=SEARCH_LATEST_REG_KEY_FAILED_WITH
Language=English
Encountered a problem reading the registry. Cannot read registry key %1!ls!. System error:%n %2!ls!.
.
MessageId=20
SymbolicName=OPEN_REG_KEY_FAILED_WITH
Language=English
Encountered a problem reading the registry. Cannot open registry key %1!ls!. System error:%n %2!ls!.
.
MessageId=21
SymbolicName=CLOSE_REG_KEY_FAILED_WITH
Language=English
Closing registry key %1!ls! causes the following Win32 error:%n %2!ls!
.
MessageId=22
SymbolicName=READ_REG_VALUE_FAILED_WITH
Language=English
Reading the value of registry key %1!ls!\%2!ls! causes the following Win32 error:%n %3!ls!
.
MessageId=23
SymbolicName=CREATE_MSHENGINE_REG_KEY_PATH_FAILED_WITH
Language=English
Encountered a problem creating the registry key path PowerShellEngine. System error:%n %1!ls!.
.
MessageId=24
SymbolicName=EXPECT_REG_SZ_VALUE
Language=English
Invalid registry key value. Value for registry key %1!ls!\%2!ls! must be REG_SZ.
.
MessageId=25
SymbolicName=MSH_VERSION_NOT_INSTALLED
Language=English
Cannot start Windows PowerShell version %1!ls! because it is not installed.
.
MessageId=26
SymbolicName=INCORRECT_CONSOLE_FILE_EXTENSION
Language=English
Windows PowerShell console file "%1!ls!" extension is not psc1. Windows PowerShell console file extension must be psc1.
.
MessageId=27
SymbolicName=INVALID_REG_MSHVERSION_VALUE
Language=English
The value of registry key %1!ls!\%2!ls! is an invalid .NET version. Valid version format is major.minor.build.revision.
.
MessageId=28
SymbolicName=INCOMPATIBLE_MINOR_VERSION
Language=English
Cannot start Windows PowerShell. No version of Windows PowerShell compatible to %1!ls! is installed.
.
MessageId=29
SymbolicName=NO_COMPLETELY_INSTALLED_FOUND_VERSION
Language=English
Cannot start Windows PowerShell. No correctly installed versions of Windows PowerShell found.
.
MessageId=30
SymbolicName=MISSING_REG_KEY
Language=English
Encountered a problem reading the registry. Cannot find registry key %1!ls!.
.
MessageId=31
SymbolicName=READ_XML_LOAD_FILE_FAILED_WITH_SPECIFIC_ERROR
Language=English
Failed to load Windows PowerShell console file "%1!ls!". WIN 32 error: %2!ls!
.
MessageId=32
SymbolicName=READ_XML_LOAD_FILE_FAILED_WITH_SPECIFIC_POSITION_ERROR
Language=English
Failed to load Windows PowerShell console file "%1!ls!": %2!ls!At line:%3!li! char:%4!li!
.
MessageId=33
SymbolicName=READ_XML_GET_EMPTY_MONAD_VERSION_TEXT
Language=English
Windows PowerShell version in the Windows PowerShell console file "%1!ls!" cannot be empty.
.
MessageId=34
SymbolicName=READ_XML_GET_PSCONSOLEFILE_FAILED
Language=English
Cannot locate the required element PSConsoleFile in the Windows PowerShell console file "%1!ls!".
.
MessageId=35
SymbolicName=NOTSUPPORTED_MONAD_VERSION
Language=English
The requested Windows PowerShell version %1!d! is not supported on WinPE. WinPE supports only Windows PowerShell %1!d!.
.
MessageId=36
SymbolicName=NONSTANDARD_CLR_VERSION
Language=English
Warning: Windows PowerShell was started with CLR version "%1!ls!". This CLR version has not been tested with Windows PowerShell and might not operate properly. For more information about supported versions of the CLR, see http://go.microsoft.com/fwlink/?LinkId=215538.%r%n
.
MessageId=37
SymbolicName=SHELLBANNER1
Language=English
Windows PowerShell
.
MessageId=38
SymbolicName=SHELLBANNER2
Language=English
Copyright (C) 2015 Microsoft Corporation. All rights reserved.
.
MessageId=39
SymbolicName=MISSING_REG_KEY1
Language=English
Encountered a problem reading the registry. Cannot find registry key %1!ls!. The Windows PowerShell %2!ls! engine is not installed on this computer.
.

View File

@ -0,0 +1,36 @@
<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<assembly
xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0"
>
<description>PowerShell</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--This Id value indicates the application supports Windows Vista/Server 2008 functionality -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--This Id value indicates the application supports Windows 7/Server 2008 R2 functionality-->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--This Id value indicates the application supports Windows 8/Server 2012 functionality-->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- This Id value indicates the application supports Windows Blue/Server 2012 R2 functionality-->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- This Id value indicates the application supports Windows Threshold functionality-->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
</windowsSettings>
</application>
</assembly>

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

View File

@ -0,0 +1,13 @@
//
// Copyright (C) Microsoft. All rights reserved.
//
#include <windows.h>
#include <ntverp.h>
#define VER_FILETYPE VFT_APP
#define VER_FILESUBTYPE VFT2_UNKNOWN
#define VER_FILEDESCRIPTION_STR "Windows PowerShell"
#define VER_INTERNALNAME_STR "POWERSHELL"
#define VER_ORIGINALFILENAME_STR "PowerShell.EXE"
#include <common.ver>