windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/wam/object/wamxinfo.hxx
2020-09-26 16:20:57 +08:00

948 lines
25 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1995-1996 Microsoft Corporation
Module Name :
wamxinfo.hxx (formerly seinfo.hxx)
Abstract:
Declaration of WAM_EXEC_INFO Object
Author:
Murali R. Krishnan ( MuraliK ) 17-July-1996
Environment:
User Mode - Win32
Project:
W3 Services DLL
Revision History:
--*/
# ifndef _WAMXINFO_HXX_
# define _WAMXINFO_HXX_
/************************************************************
* Include Headers
************************************************************/
# include "isapip.hxx"
# include "wamxbase.hxx"
# include "iisext.h"
# include "string.hxx"
# include "WReqCore.hxx"
# include "wamobj.hxx"
# include "acache.hxx"
# include <reftrace.h>
//
// This is private hack for us done by COM team
//
const IID IID_IComDispatchInfo =
{0x000001d9,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
MIDL_INTERFACE("000001d9-0000-0000-C000-000000000046")
IComDispatchInfo : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE EnableComInits(
/* [out] */ void __RPC_FAR *__RPC_FAR *ppvCookie) = 0;
virtual HRESULT STDMETHODCALLTYPE DisableComInits(
/* [in] */ void __RPC_FAR *pvCookie) = 0;
};
//
// (Un)DoRevertHack
//
// To prevent RPC token cache from growing without limit (and aging), we
// need to revert to self before calling back to inetinfo.exe.
//
// Now there is a new need to do this. As it turns out the performance
// hit we take from RPC caching these tokens is very significant.
// Ultimately we might want to implement a caching scheme ourselves so
// that the token we use is always the same for the same user identity,
// but that is a big change and this (although ugly) works
// and has been tested for months.
//
inline VOID DoRevertHack( HANDLE * phToken )
{
NTSTATUS Status;
HANDLE NewToken = NULL;
if ( !*phToken )
{
return;
}
*phToken = INVALID_HANDLE_VALUE;
Status = NtOpenThreadToken( NtCurrentThread(),
TOKEN_IMPERSONATE,
TRUE,
phToken );
if ( NT_SUCCESS( Status ) )
{
NtSetInformationThread( NtCurrentThread(),
ThreadImpersonationToken,
(PVOID)&NewToken,
(ULONG)sizeof(HANDLE) );
}
else
{
*phToken = INVALID_HANDLE_VALUE;
}
}
inline VOID UndoRevertHack( HANDLE * phToken )
{
if ( !*phToken || ( *phToken == INVALID_HANDLE_VALUE ) )
{
return;
}
NtSetInformationThread( NtCurrentThread(),
ThreadImpersonationToken,
(PVOID) phToken,
(ULONG) sizeof( HANDLE ) );
NtClose( *phToken );
*phToken = INVALID_HANDLE_VALUE;
}
/************************************************************
* Forward References
************************************************************/
interface IWamRequest;
/************************************************************
* Useful shorthand
************************************************************/
#define WRC_GET_SZ pWamExecInfo->_WamReqCore.GetSz
#define WRC_GET_CCH pWamExecInfo->_WamReqCore.GetCch
#define WRC_GET_FIX pWamExecInfo->_WamReqCore.m_WamReqCoreFixed
//
// WAM_EXEC_INFO from ECB
//
inline
WAM_EXEC_INFO *
QueryPWAM_EXEC_INFOfromPECB( EXTENSION_CONTROL_BLOCK *pECB )
{
return ( (WAM_EXEC_INFO *) ( pECB->ConnID ) );
}
/************************************************************
* Type Definitions
************************************************************/
class HTTP_REQUEST; // Forward reference
class HSE_BASE; // Forward reference
struct EXEC_DESCRIPTOR; // Forward reference
#define WAM_EXEC_INFO_SIGNATURE (DWORD )'NIXW' // "WXIN" in debug
#define WAM_EXEC_INFO_SIGNATURE_FREE (DWORD )'fIXW' // "WXIf" in debug
/*++
class WAM_EXEC_INFO
o defines the Server Extension Information object.
It contains all the information related to server extension
calls made for a request.
--*/
class WAM_EXEC_INFO : public WAM_EXEC_BASE
{
public:
WAM_REQ_CORE _WamReqCore;
private:
static ALLOC_CACHE_HANDLER * sm_pachExecInfo;
public:
// Init during DoGlobalInitializations
static SV_CACHE_MAP * sm_pSVCacheMap;
private:
BOOL m_fCoInitSucceded;
// Flag indicates that we are doing a disconnected cleanup, ie that
// SendEntireResponseAndCleanup has been called, so the WAM_REQUEST
// is no longer valid. Only AddRefs and Releases of the WAM_REQUEST
// should be done once this flag is set.
BOOL m_fDisconnected;
// DEBUG ONLY MEMBERS - Don't add any member variables after this point
// or you will be a biscuit head!
#if DBG
PTRACE_LOG m_pDbgRefTraceLog;
static PTRACE_LOG sm_pDbgRefTraceLog;
#endif
public:
// Constructor/Destructor
WAM_EXEC_INFO
(
PWAM pWam
);
~WAM_EXEC_INFO();
HRESULT InitWamExecInfo
(
IWamRequest * pIWamRequest,
DWORD cbWrcStrings,
OOP_CORE_STATE * pOopCoreState
);
HRESULT GetInfoForName
(
IWamRequest * pIWamRequest,
const unsigned char * szVarName,
unsigned char * pchBuffer,
DWORD cchBuffer,
DWORD * pcchRequired
);
VOID Reset( );
BOOL TransmitFile( LPHSE_TF_INFO pHseTf);
BOOL AsyncReadClient( IN OUT PVOID pvBuff,
IN DWORD * pcbBytes,
IN DWORD dwFlags );
BOOL ProcessAsyncReadOop( DWORD dwStatus,
DWORD cbRead,
unsigned char * lpDataRead
);
BOOL ProcessAsyncIO( DWORD dwStatus, DWORD cbWritten );
VOID InitAsyncIO( DWORD dwIOType );
VOID UninitAsyncIO();
PWAM QueryPWam() const;
BOOL IsValid();
BOOL IsChild() const;
BOOL NoHeaders() const;
ULONG AddRef( );
void CleanupAndRelease( BOOL fFullCleanup );
ULONG Release( );
// IWamRequest OOP caching per thread
dllexp
HRESULT ISAThreadNotify( BOOL fStart );
// Access to ECB and its members
inline EXTENSION_CONTROL_BLOCK *QueryPECB();
inline DWORD QueryDwHttpStatusCode();
inline VOID SetDwHttpStatusCode(DWORD);
inline LPSTR QueryPszLogData();
inline LPSTR QueryPszMethod();
inline DWORD QueryCchMethod();
inline LPSTR QueryPszQueryString();
inline DWORD QueryCchQueryString();
inline LPSTR QueryPszPathInfo();
inline DWORD QueryCchPathInfo();
inline LPSTR QueryPszPathTranslated();
inline DWORD QueryCchPathTranslated();
inline DWORD QueryCbTotalBytes();
inline DWORD QueryCbAvailable();
inline LPBYTE QueryPbData();
inline LPSTR QueryPszContentType();
inline DWORD QueryCchContentType();
// Access to additional frequently used members not
// in the original ECB
inline HANDLE QueryImpersonationToken();
inline LPSTR QueryPszApplnMDPath();
inline DWORD QueryCchApplnMDPath();
inline DWORD QueryHttpVersionMajor();
inline DWORD QueryHttpVersionMinor();
inline LPSTR QueryPszUserAgent();
inline DWORD QueryCchUserAgent();
inline LPSTR QueryPszCookie();
inline DWORD QueryCchCookie();
inline LPSTR QueryPszExpires();
inline DWORD QueryCchExpires();
inline DWORD QueryInstanceId();
// Smart caching ISAPI (ASP) can use the following methods:
// (requires cached m_pIWamReqSmartISA to be always available)
inline BOOL GetServerVariable( LPSTR szVarName,
LPVOID pvBuffer,
LPDWORD pdwSize );
inline BOOL SyncWriteClient( LPVOID pvBuffer, LPDWORD pdwBytes );
inline BOOL SyncReadClient( LPVOID pvBuffer, LPDWORD pdwBytes );
// Some SSF requests isolated into separate inlines
inline BOOL SendHeader( LPVOID pvStatus,
DWORD cchStatus,
LPVOID pvHeader,
DWORD cchHeader,
BOOL fIsaKeepConn );
inline BOOL SendEntireResponseOop(
IN HSE_SEND_ENTIRE_RESPONSE_INFO * pHseResponseInfo
);
inline BOOL FDisconnected() { return m_fDisconnected; }
inline BOOL SendEntireResponse(
HSE_SEND_ENTIRE_RESPONSE_INFO * pHseResponseInfo
);
inline BOOL MapUrlToPath( LPVOID pvBuffer, LPDWORD pdwBytes );
inline BOOL AppendLogParameter( LPVOID pvBuffer );
// Loop-back for SSF requests not supported explicitely
inline BOOL ServerSupportFunction( DWORD dwHSERequest,
LPVOID pvData,
LPDWORD pdwSize,
LPDWORD pdwDataType );
inline HRESULT GetAspMDData(
IN unsigned char * pszMDPath
, IN DWORD dwMDIdentifier
, IN DWORD dwMDAttributes
, IN DWORD dwMDUserType
, IN DWORD dwMDDataType
, IN DWORD dwMDDataLen
, IN DWORD dwMDDataTag
, OUT unsigned char * pbMDData
, OUT DWORD * pdwRequiredBufferSize
);
inline HRESULT GetAspMDAllData(
IN LPVOID pszMDPath
, IN DWORD dwMDUserType
, IN DWORD dwDefaultBufferSize
, OUT LPVOID pvBuffer
, OUT DWORD * pdwRequiredBufferSize
, OUT DWORD * pdwNumDataEntries
);
inline BOOL GetCustomError(
DWORD dwError,
DWORD dwSubError,
DWORD dwBufferSize,
void *pvBuffer,
DWORD *pdwRequiredBufferSize,
BOOL *pfIsFileError
);
inline BOOL TestConnection(
BOOL *pfIsConnected
);
inline BOOL LogEvent(
DWORD dwEventId,
unsigned char * szText
);
#if DBG
ULONG DbgRefCount(VOID) const { return _cRefs; }
#endif // DBG
VOID Print( VOID) const;
public:
static void * operator new (size_t s);
static void operator delete(void * psi);
static BOOL InitClass( VOID);
static VOID CleanupClass( VOID);
VOID CleanupWamExecInfo( );
}; // class WAM_EXEC_INFO
//
// WAM_EXEC_INFO inlines
//
inline PWAM WAM_EXEC_INFO::QueryPWam() const {
return ( m_pWam );
}
inline BOOL WAM_EXEC_INFO::IsChild() const {
return ( _dwChildExecFlags != 0 );
}
inline BOOL WAM_EXEC_INFO::NoHeaders() const {
return (( _dwChildExecFlags & HSE_EXEC_NO_HEADERS ) != 0);
}
inline EXTENSION_CONTROL_BLOCK *WAM_EXEC_INFO::QueryPECB() {
return ( &ecb );
}
// inlines to get to ECB members
//
inline DWORD WAM_EXEC_INFO::QueryDwHttpStatusCode() {
return ( ecb.dwHttpStatusCode );
}
inline VOID WAM_EXEC_INFO::SetDwHttpStatusCode(DWORD dwStatus) {
ecb.dwHttpStatusCode = dwStatus;
}
inline LPSTR WAM_EXEC_INFO::QueryPszLogData() {
return ( ecb.lpszLogData );
}
inline LPSTR WAM_EXEC_INFO::QueryPszMethod() {
return ( ecb.lpszMethod );
}
inline DWORD WAM_EXEC_INFO::QueryCchMethod() {
return ( _WamReqCore.GetCch( WRC_I_METHOD ) );
}
inline LPSTR WAM_EXEC_INFO::QueryPszQueryString() {
return ( ecb.lpszQueryString );
}
inline DWORD WAM_EXEC_INFO::QueryCchQueryString() {
return ( _WamReqCore.GetCch( WRC_I_QUERY ) );
}
inline LPSTR WAM_EXEC_INFO::QueryPszPathInfo() {
return ( ecb.lpszPathInfo );
}
inline DWORD WAM_EXEC_INFO::QueryCchPathInfo() {
return ( _WamReqCore.GetCch( WRC_I_PATHINFO ) );
}
inline LPSTR WAM_EXEC_INFO::QueryPszPathTranslated() {
return ( ecb.lpszPathTranslated );
}
inline DWORD WAM_EXEC_INFO::QueryCchPathTranslated() {
return ( _WamReqCore.GetCch( WRC_I_PATHTRANS ) );
}
inline DWORD WAM_EXEC_INFO::QueryCbTotalBytes() {
return ( ecb.cbTotalBytes );
}
inline DWORD WAM_EXEC_INFO::QueryCbAvailable() {
return ( ecb.cbAvailable );
}
inline LPBYTE WAM_EXEC_INFO::QueryPbData() {
return ( ecb.lpbData );
}
inline LPSTR WAM_EXEC_INFO::QueryPszContentType() {
return ( ecb.lpszContentType );
}
inline DWORD WAM_EXEC_INFO::QueryCchContentType() {
return ( _WamReqCore.GetCch( WRC_I_CONTENTTYPE ) );
}
// inlines to bypass ISPLOCAL logic for caching ISAPIs
//
inline HANDLE WAM_EXEC_INFO::QueryImpersonationToken() {
return ( _WamReqCore.m_WamReqCoreFixed.m_hUserToken );
}
inline LPSTR WAM_EXEC_INFO::QueryPszApplnMDPath() {
return ( _WamReqCore.GetSz( WRC_I_APPLMDPATH ) );
}
inline DWORD WAM_EXEC_INFO::QueryCchApplnMDPath() {
return ( _WamReqCore.GetCch( WRC_I_APPLMDPATH ) );
}
inline DWORD WAM_EXEC_INFO::QueryHttpVersionMajor() {
return ( ( _WamReqCore.m_WamReqCoreFixed.m_dwHttpVersion >> 16 ) & 0xFFFF );
}
inline DWORD WAM_EXEC_INFO::QueryHttpVersionMinor() {
return ( _WamReqCore.m_WamReqCoreFixed.m_dwHttpVersion & 0xFFFF );
}
inline LPSTR WAM_EXEC_INFO::QueryPszUserAgent() {
return ( _WamReqCore.GetSz( WRC_I_USERAGENT ) );
}
inline DWORD WAM_EXEC_INFO::QueryCchUserAgent() {
return ( _WamReqCore.GetCch( WRC_I_USERAGENT ) );
}
inline LPSTR WAM_EXEC_INFO::QueryPszCookie() {
return ( _WamReqCore.GetSz( WRC_I_COOKIE ) );
}
inline DWORD WAM_EXEC_INFO::QueryCchCookie() {
return ( _WamReqCore.GetCch( WRC_I_COOKIE ) );
}
inline LPSTR WAM_EXEC_INFO::QueryPszExpires() {
return ( _WamReqCore.GetSz( WRC_I_EXPIRES ) );
}
inline DWORD WAM_EXEC_INFO::QueryCchExpires() {
return ( _WamReqCore.GetCch( WRC_I_EXPIRES ) );
}
inline DWORD WAM_EXEC_INFO::QueryInstanceId() {
return ( _WamReqCore.m_WamReqCoreFixed.m_dwInstanceId );
}
inline BOOL WAM_EXEC_INFO::GetServerVariable(
LPSTR szVarName,
LPVOID pvBuffer,
LPDWORD pdwSize
)
{
BOOL bRet;
// Needed to remove the "smart isa" optimization
bRet = ecb.GetServerVariable( (HCONN)this,
szVarName,
pvBuffer,
pdwSize
);
return bRet;
}
inline BOOL WAM_EXEC_INFO::SyncWriteClient(
LPVOID pvBuffer,
LPDWORD pdwBytes
) {
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
if ( *pdwBytes == 0 ) {
return TRUE;
}
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr = m_pIWamReqSmartISA->SyncWriteClient(
*pdwBytes,
(unsigned char *) pvBuffer,
pdwBytes,
HSE_IO_SYNC);
UndoRevertHack( &hCurrentUser );
return ( BoolFromHresult( hr ) );
}
inline BOOL WAM_EXEC_INFO::SyncReadClient(
LPVOID pvBuffer,
LPDWORD pdwBytes
) {
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr = m_pIWamReqSmartISA->SyncReadClient(
(unsigned char *) pvBuffer,
*pdwBytes,
pdwBytes );
UndoRevertHack( &hCurrentUser );
return ( BoolFromHresult( hr ) );
}
inline BOOL WAM_EXEC_INFO::SendHeader(
LPVOID pvStatus,
DWORD cchStatus,
LPVOID pvHeader,
DWORD cchHeader,
BOOL fIsaKeepConn
) {
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
DBG_ASSERT( cchStatus == (DWORD) lstrlen( (const char*) pvStatus) + 1 );
DBG_ASSERT( cchHeader == (DWORD) lstrlen( (const char*) pvHeader) + 1 );
HRESULT hr = NOERROR;
if ( NoHeaders() ) {
return TRUE;
}
if ( fIsaKeepConn ) {
_dwIsaKeepConn = KEEPCONN_TRUE;
} else {
_dwIsaKeepConn = KEEPCONN_FALSE;
}
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
hr = m_pIWamReqSmartISA->SendHeader(
(unsigned char *) pvStatus,
cchStatus,
(unsigned char *) pvHeader,
cchHeader,
_dwIsaKeepConn );
UndoRevertHack( &hCurrentUser );
return ( BoolFromHresult( hr ) );
}
inline BOOL WAM_EXEC_INFO::SendEntireResponse(
HSE_SEND_ENTIRE_RESPONSE_INFO * pHseResponseInfo
) {
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
HRESULT hr = NOERROR;
if ( !m_fInProcess ) {
//
// CONSIDER oop support
//
SetLastError( ERROR_INVALID_FUNCTION );
return FALSE;
}
if ( pHseResponseInfo->HeaderInfo.fKeepConn ) {
_dwIsaKeepConn = KEEPCONN_TRUE;
} else {
_dwIsaKeepConn = KEEPCONN_FALSE;
}
hr = m_pIWamReqSmartISA->SendEntireResponse(
(unsigned char *) pHseResponseInfo
);
return ( BoolFromHresult( hr ) );
}
inline
BOOL
WAM_EXEC_INFO::SendEntireResponseOop(
IN HSE_SEND_ENTIRE_RESPONSE_INFO * pHseResponseInfo
)
{
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
DBG_ASSERT( m_fDisconnected == FALSE );
DBG_ASSERT( pHseResponseInfo );
DBG_ASSERT( !m_fInProcess );
_dwIsaKeepConn = (pHseResponseInfo->HeaderInfo.fKeepConn)
? KEEPCONN_TRUE : KEEPCONN_FALSE;
OOP_RESPONSE_INFO oopResponseInfo;
DWORD cBuffersToSend = pHseResponseInfo->cWsaBuf - 1;
// Init response info
oopResponseInfo.cBuffers = cBuffersToSend;
oopResponseInfo.rgBuffers =
(OOP_RESPONSE_BUFFER *)(_alloca( cBuffersToSend * sizeof(OOP_RESPONSE_BUFFER) ));
for( DWORD i = 0; i < cBuffersToSend; ++i )
{
oopResponseInfo.rgBuffers[i].cbBuffer = pHseResponseInfo->rgWsaBuf[i+1].len;
oopResponseInfo.rgBuffers[i].pbBuffer = (LPBYTE)pHseResponseInfo->rgWsaBuf[i+1].buf;
}
HANDLE hCurrentUser = INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr =
m_pIWamReqSmartISA->SendEntireResponseAndCleanup(
(LPBYTE)pHseResponseInfo->HeaderInfo.pszStatus,
pHseResponseInfo->HeaderInfo.cchStatus,
(LPBYTE)pHseResponseInfo->HeaderInfo.pszHeader,
pHseResponseInfo->HeaderInfo.cchHeader,
&oopResponseInfo,
(unsigned char *)ecb.lpszLogData,
strlen(ecb.lpszLogData) + 1,
_dwIsaKeepConn,
&m_fDisconnected
);
UndoRevertHack( &hCurrentUser );
DBG_CODE(
if( SUCCEEDED(hr) )
{
DBG_ASSERT( m_fDisconnected );
}
else
{
DBGPRINTF(( DBG_CONTEXT,
"WAM_EXEC_INFO[%p]::SendEntireResponseAndCleanup() "
"Failed hr=%08x, m_fDisconnected(%x)\n",
this,
hr,
m_fDisconnected
));
DBG_ASSERT( !m_fDisconnected );
}
);
return BoolFromHresult( hr );
}
inline BOOL WAM_EXEC_INFO::MapUrlToPath(
LPVOID pvBuffer,
LPDWORD pdwBytes
) {
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr = m_pIWamReqSmartISA->LookupVirtualRoot(
(unsigned char *) pvBuffer,
*pdwBytes,
pdwBytes );
UndoRevertHack( &hCurrentUser );
return ( BoolFromHresult( hr ) );
}
inline BOOL WAM_EXEC_INFO::AppendLogParameter(
LPVOID pvBuffer
) {
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr = m_pIWamReqSmartISA->AppendLogParameter(
(unsigned char *) pvBuffer );
UndoRevertHack( &hCurrentUser );
return ( BoolFromHresult( hr ) );
}
// SSF for requests not supported explicitely
inline BOOL WAM_EXEC_INFO::ServerSupportFunction(
DWORD dwHSERequest,
LPVOID pvData,
LPDWORD pdwSize,
LPDWORD pdwDataType
) {
BOOL bRet;
// Some of the SSF requests are supported individually as
// separate methods above. This is a catch-all for the
// remaining methods. Please note that because this is
// an inline, it is not any slower than calling the ECB's SSF
bRet = ( ecb.ServerSupportFunction(
(HCONN)this,
dwHSERequest,
pvData,
pdwSize,
pdwDataType ) );
return bRet;
}
inline HRESULT WAM_EXEC_INFO::GetAspMDData(
IN unsigned char * pszMDPath
, IN DWORD dwMDIdentifier
, IN DWORD dwMDAttributes
, IN DWORD dwMDUserType
, IN DWORD dwMDDataType
, IN DWORD dwMDDataLen
, IN DWORD dwMDDataTag
, OUT unsigned char * pbMDData
, OUT DWORD * pdwRequiredBufferSize
)
{
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr = m_pIWamReqSmartISA->GetAspMDData(
(unsigned char *) pszMDPath
, dwMDIdentifier
, dwMDAttributes
, dwMDUserType
, dwMDDataType
, dwMDDataLen
, dwMDDataTag
, pbMDData
, pdwRequiredBufferSize
);
UndoRevertHack( &hCurrentUser );
return ( hr );
}
inline HRESULT WAM_EXEC_INFO::GetAspMDAllData(
IN LPVOID pszMDPath
, IN DWORD dwMDUserType
, IN DWORD dwDefaultBufferSize
, OUT LPVOID pvBuffer
, OUT DWORD * pdwRequiredBufferSize
, OUT DWORD * pdwNumDataEntries
)
{
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr = m_pIWamReqSmartISA->GetAspMDAllData(
(unsigned char *) pszMDPath
, dwMDUserType
, dwDefaultBufferSize
, (unsigned char *) pvBuffer
, pdwRequiredBufferSize
, pdwNumDataEntries
);
UndoRevertHack( &hCurrentUser );
return ( hr );
}
inline BOOL WAM_EXEC_INFO::GetCustomError(
DWORD dwError,
DWORD dwSubError,
DWORD dwBufferSize,
void *pvBuffer,
DWORD *pdwRequiredBufferSize,
BOOL *pfIsFileError
)
{
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr = m_pIWamReqSmartISA->GetCustomError(
dwError,
dwSubError,
dwBufferSize,
(unsigned char *)pvBuffer,
pdwRequiredBufferSize,
pfIsFileError
);
UndoRevertHack( &hCurrentUser );
return ( BoolFromHresult( hr ) );
}
inline BOOL WAM_EXEC_INFO::TestConnection(
BOOL *pfIsConnected
)
{
DBG_ASSERT( m_pIWamReqSmartISA != NULL );
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
HRESULT hr = m_pIWamReqSmartISA->TestConnection( pfIsConnected );
UndoRevertHack( &hCurrentUser );
return ( BoolFromHresult( hr ) );
}
inline BOOL WAM_EXEC_INFO::LogEvent(
DWORD dwEventId,
unsigned char * szText
)
{
// Normally only asp has access to these methods, but LogEvent
// is called when an exception is thrown from any extension
// proc, so we need to make sure it has a valid IWamRequest
HRESULT hr = NOERROR;
IWamRequest * pIWamRequest = 0;
hr = GetIWamRequest( &pIWamRequest );
if( SUCCEEDED(hr) && pIWamRequest )
{
HANDLE hCurrentUser = m_fInProcess ? NULL : INVALID_HANDLE_VALUE;
DoRevertHack( &hCurrentUser );
hr = pIWamRequest->LogEvent( dwEventId, szText );
ReleaseIWamRequest( pIWamRequest );
UndoRevertHack( &hCurrentUser );
}
return ( BoolFromHresult( hr ) );
}
#if DBG
# define DBG_WAMREQ_REFCOUNTS( args ) DbgWamreqRefcounts args
void
DbgWamreqRefcounts
(
char* szPrefix,
WAM_EXEC_INFO * pWamExecInfo,
long cRefsWamRequest = -1, // pass -1 to not assert
long cRefsWamReqContext = -1 // pass -1 to not assert
);
#else // DBG
# define DBG_WAMREQ_REFCOUNTS( args ) /* Nothing */
#endif // DBG
DWORD WAMExceptionFilter(
EXCEPTION_POINTERS *xp,
DWORD dwEventId,
WAM_EXEC_INFO *p
);
# endif // _WAMXINFO_HXX_
/************************ End of File ***********************/