aspnetcore/src/RequestHandler/outofprocess/serverprocess.h

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 ;
};