272 lines
6.3 KiB
C++
272 lines
6.3 KiB
C++
// Copyright (c) .NET Foundation. All rights reserved.
|
|
// Licensed under the MIT License. See License.txt in the project root for license information.
|
|
|
|
#pragma once
|
|
|
|
#define MIN_PORT 1025
|
|
#define MAX_PORT 48000
|
|
#define MAX_RETRY 10
|
|
#define MAX_ACTIVE_CHILD_PROCESSES 16
|
|
#define LOCALHOST "127.0.0.1"
|
|
#define ASPNETCORE_PORT_STR L"ASPNETCORE_PORT"
|
|
#define ASPNETCORE_PORT_ENV_STR L"ASPNETCORE_PORT="
|
|
#define ASPNETCORE_APP_PATH_ENV_STR L"ASPNETCORE_APPL_PATH="
|
|
#define ASPNETCORE_APP_TOKEN_ENV_STR L"ASPNETCORE_TOKEN="
|
|
#define ASPNETCORE_APP_PATH_ENV_STR L"ASPNETCORE_APPL_PATH="
|
|
|
|
class PROCESS_MANAGER;
|
|
|
|
class SERVER_PROCESS
|
|
{
|
|
public:
|
|
SERVER_PROCESS();
|
|
|
|
HRESULT
|
|
Initialize(
|
|
_In_ PROCESS_MANAGER *pProcessManager,
|
|
_In_ STRU *pszProcessExePath,
|
|
_In_ STRU *pszArguments,
|
|
_In_ DWORD dwStartupTimeLimitInMS,
|
|
_In_ DWORD dwShtudownTimeLimitInMS,
|
|
_In_ BOOL fWindowsAuthEnabled,
|
|
_In_ BOOL fBasicAuthEnabled,
|
|
_In_ BOOL fAnonymousAuthEnabled,
|
|
_In_ ENVIRONMENT_VAR_HASH* pEnvironmentVariables,
|
|
_In_ BOOL fStdoutLogEnabled,
|
|
_In_ STRU *pstruStdoutLogFile,
|
|
_In_ STRU *pszAppPhysicalPath,
|
|
_In_ STRU *pszAppPath,
|
|
_In_ STRU *pszAppVirtualPath
|
|
);
|
|
|
|
HRESULT
|
|
StartProcess( VOID );
|
|
|
|
HRESULT
|
|
SetWindowsAuthToken(
|
|
_In_ HANDLE hToken,
|
|
_Out_ LPHANDLE pTargeTokenHandle
|
|
);
|
|
|
|
BOOL
|
|
IsReady(
|
|
VOID
|
|
)
|
|
{
|
|
return m_fReady;
|
|
}
|
|
|
|
VOID
|
|
StopProcess(
|
|
VOID
|
|
);
|
|
|
|
DWORD
|
|
GetPort()
|
|
{
|
|
return m_dwPort;
|
|
}
|
|
|
|
VOID
|
|
ReferenceServerProcess(
|
|
VOID
|
|
)
|
|
{
|
|
InterlockedIncrement(&m_cRefs);
|
|
}
|
|
|
|
VOID
|
|
DereferenceServerProcess(
|
|
VOID
|
|
)
|
|
{
|
|
_ASSERT(m_cRefs != 0 );
|
|
if (InterlockedDecrement(&m_cRefs) == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
}
|
|
|
|
virtual
|
|
~SERVER_PROCESS();
|
|
|
|
static
|
|
VOID
|
|
CALLBACK
|
|
ProcessHandleCallback(
|
|
_In_ PVOID pContext,
|
|
_In_ BOOL
|
|
);
|
|
|
|
HRESULT
|
|
HandleProcessExit(
|
|
VOID
|
|
);
|
|
|
|
FORWARDER_CONNECTION*
|
|
QueryWinHttpConnection(
|
|
VOID
|
|
)
|
|
{
|
|
return m_pForwarderConnection;
|
|
}
|
|
|
|
LPCSTR
|
|
QueryGuid()
|
|
{
|
|
return m_straGuid.QueryStr();
|
|
};
|
|
|
|
VOID
|
|
SendSignal(
|
|
VOID
|
|
);
|
|
|
|
private:
|
|
VOID
|
|
CleanUp();
|
|
|
|
BOOL
|
|
IsDebuggerIsAttached(
|
|
VOID
|
|
);
|
|
|
|
HRESULT
|
|
StopAllProcessesInJobObject(
|
|
VOID
|
|
);
|
|
|
|
HRESULT
|
|
SetupStdHandles(
|
|
_Inout_ LPSTARTUPINFOW pStartupInfo
|
|
);
|
|
|
|
HRESULT
|
|
CheckIfServerIsUp(
|
|
_In_ DWORD dwPort,
|
|
_Out_ DWORD * pdwProcessId,
|
|
_Out_ BOOL * pfReady
|
|
);
|
|
|
|
HRESULT
|
|
RegisterProcessWait(
|
|
_In_ PHANDLE phWaitHandle,
|
|
_In_ HANDLE hProcessToWaitOn
|
|
);
|
|
|
|
HRESULT
|
|
GetChildProcessHandles(
|
|
VOID
|
|
);
|
|
|
|
HRESULT
|
|
SetupListenPort(
|
|
ENVIRONMENT_VAR_HASH *pEnvironmentVarTable
|
|
);
|
|
|
|
HRESULT
|
|
SetupAppPath(
|
|
ENVIRONMENT_VAR_HASH* pEnvironmentVarTable
|
|
);
|
|
|
|
HRESULT
|
|
SetupAppToken(
|
|
ENVIRONMENT_VAR_HASH* pEnvironmentVarTable
|
|
);
|
|
|
|
HRESULT
|
|
OutputEnvironmentVariables(
|
|
MULTISZ* pmszOutput,
|
|
ENVIRONMENT_VAR_HASH* pEnvironmentVarTable
|
|
);
|
|
|
|
HRESULT
|
|
SetupCommandLine(
|
|
STRU* pstrCommandLine
|
|
);
|
|
|
|
HRESULT
|
|
PostStartCheck(
|
|
VOID
|
|
);
|
|
|
|
HRESULT
|
|
GetRandomPort(
|
|
DWORD* pdwPickedPort,
|
|
DWORD dwExcludedPort
|
|
);
|
|
|
|
static
|
|
VOID
|
|
SendShutDownSignal(
|
|
LPVOID lpParam
|
|
);
|
|
|
|
VOID
|
|
SendShutDownSignalInternal(
|
|
VOID
|
|
);
|
|
|
|
HRESULT
|
|
SendShutdownHttpMessage(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
TerminateBackendProcess(
|
|
VOID
|
|
);
|
|
|
|
FORWARDER_CONNECTION *m_pForwarderConnection;
|
|
BOOL m_fStdoutLogEnabled;
|
|
BOOL m_fWindowsAuthEnabled;
|
|
BOOL m_fBasicAuthEnabled;
|
|
BOOL m_fAnonymousAuthEnabled;
|
|
|
|
STTIMER m_Timer;
|
|
SOCKET m_socket;
|
|
|
|
STRU m_struLogFile;
|
|
STRU m_struFullLogFile;
|
|
STRU m_ProcessPath;
|
|
STRU m_Arguments;
|
|
STRU m_struAppVirtualPath; // e.g., '/' for site
|
|
STRU m_struAppFullPath; // e.g., /LM/W3SVC/4/ROOT/Inproc
|
|
STRU m_struPhysicalPath; // e.g., c:/test/mysite
|
|
STRU m_struPort;
|
|
STRU m_struCommandLine;
|
|
|
|
volatile LONG m_lStopping;
|
|
volatile BOOL m_fReady;
|
|
mutable LONG m_cRefs;
|
|
|
|
DWORD m_dwPort;
|
|
DWORD m_dwStartupTimeLimitInMS;
|
|
DWORD m_dwShutdownTimeLimitInMS;
|
|
DWORD m_cChildProcess;
|
|
DWORD m_dwChildProcessIds[MAX_ACTIVE_CHILD_PROCESSES];
|
|
DWORD m_dwProcessId;
|
|
DWORD m_dwListeningProcessId;
|
|
|
|
STRA m_straGuid;
|
|
|
|
HANDLE m_hJobObject;
|
|
HANDLE m_hStdoutHandle;
|
|
//
|
|
// m_hProcessHandle is the handle to process this object creates.
|
|
//
|
|
HANDLE m_hProcessHandle;
|
|
HANDLE m_hListeningProcessHandle;
|
|
HANDLE m_hProcessWaitHandle;
|
|
HANDLE m_hShutdownHandle;
|
|
//
|
|
// m_hChildProcessHandle is the handle to process created by
|
|
// m_hProcessHandle process if it does.
|
|
//
|
|
HANDLE m_hChildProcessHandles[MAX_ACTIVE_CHILD_PROCESSES];
|
|
HANDLE m_hChildProcessWaitHandles[MAX_ACTIVE_CHILD_PROCESSES];
|
|
|
|
PROCESS_MANAGER *m_pProcessManager;
|
|
ENVIRONMENT_VAR_HASH *m_pEnvironmentVarTable ;
|
|
};
|