|
|
/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
thrdinfo.h
Abstract:
Per-thread structure definitions/macros
Author:
Richard L Firth (rfirth) 16-Feb-1995
Revision History:
16-Feb-1995 rfirth Created
--*/
#if defined(__cplusplus)
extern "C" { #endif
//
// manifests
//
#define INTERNET_THREAD_INFO_SIGNATURE 'drhT' // "Thrd"
//
// forward references
//
class CFsm;
//
// types
//
//
// INTERNET_THREAD_INFO - per-thread information, handily referenced via a TLS
// slot
//
typedef struct _INTERNET_THREAD_INFO {
//
// List - doubly linked list that we delete on DLL_PROCESS_DETACH
//
LIST_ENTRY List;
#if INET_DEBUG
//
// Signature - lets us know that this structure is probably an
// INTERNET_THREAD_INFO
//
DWORD Signature;
#endif
//
// ThreadId - used to identify this thread within a process
//
DWORD ThreadId;
//
// ErrorNumber - arbitrary error code, supplied in InternetSetLastError
//
DWORD ErrorNumber;
//
// hErrorText - we store the last error text on a per-thread basis. This
// handle identifies a moveable buffer
//
HLOCAL hErrorText;
//
// ErrorTextLength - length of the error text in hErrorText
//
DWORD ErrorTextLength;
//
// hObject - the current Internet object handle being used in this API. We
// need this to maintain context e.g. when we want to get timeout values
//
HINTERNET hObject;
//
// hObjectMapped - this is the address of the real object mapped to hObject
//
HINTERNET hObjectMapped;
//
// IsAsyncWorkerThread - TRUE if this thread is an async worker thread
//
BOOL IsAsyncWorkerThread;
//
// InCallback - TRUE if we have made an app callback. Used to detect
// re-entrancy
//
BOOL InCallback;
//
// fExitThread - This is the last thread we're waiting for termination of.
//
BOOL fExitThread; //
// NestedRequests - incremented when we detect that we're processing an API
// in the async worker thread context. If this API then calls other APIs,
// then we need to treat (mapped) handles differently in the called APIs
//
DWORD NestedRequests;
//
// dwMappedErrorCode - the real error code returned by e.g. a winsock API,
// before it was mapped to a WinInet error
//
DWORD dwMappedErrorCode;
//
// Fsm - currently executing Finite State Machine
//
CFsm * Fsm;
#ifdef ENABLE_DEBUG
//
// IsAsyncSchedulerThread - TRUE if this INTERNET_THREAD_INFO belongs to the
// one-and-only async scheduler thread
//
BOOL IsAsyncSchedulerThread;
//
// per-thread debug variables
//
//
// Pointer to LIFO (stack) of INTERNET_DEBUG_RECORDs. Used to generate
// indented call-tracing for diagnostics
//
LPINTERNET_DEBUG_RECORD Stack;
//
// CallDepth - nesting level for calls
//
int CallDepth;
//
// IndentIncrement - the current indent level. Number of spaces
//
int IndentIncrement;
//
// StartTime and StopTime - used for timing calls to e.g. send(), recv()
//
DWORD StartTime; DWORD StopTime;
DWORD MajorCategoryFlags; DWORD MinorCategoryFlags;
#endif // #ifdef ENABLE_DEBUG
} INTERNET_THREAD_INFO, *LPINTERNET_THREAD_INFO;
//
// macros
//
//
// InternetClearLastError - frees the response text buffer for this thread
//
#define InternetClearLastError() \
InternetSetLastError(0, NULL, 0, 0)
//
// InternetResetObjectHandle - resets the per-thread current object handle
//
#define InternetResetObjectHandle() \
InternetSetObjectHandle(NULL)
//
// _InternetIncNestingCount - increments nesting level count
//
#define _InternetIncNestingCount() \
lpThreadInfo->NestedRequests++;
// ** debug version
//#define _InternetIncNestingCount() \ // if ( lpThreadInfo->NestedRequests > 0xffff ) { \ // OutputDebugString("InternetIncNestingCount, inc over threshold, contact arthurbi, x68073 (sechs)\n"); \ // DebugBreak(); \ // } \ // lpThreadInfo->NestedRequests++;
//
// _InternetDecNestingCount - decrements nesting level count
//
#define _InternetDecNestingCount(dwNestingLevel) \
lpThreadInfo->NestedRequests -= dwNestingLevel;
// ** debug version
//#define _InternetDecNestingCount(dwNestingLevel) \ // if ( lpThreadInfo->NestedRequests == 0 ) { \ // OutputDebugString("InternetDecNestingCount, attempting to dec 0, contact arthurbi, x68073 (sieben)\n"); \ // DebugBreak(); \ // } \ // if ( dwNestingLevel != 1 && dwNestingLevel != 0 ) { \ // OutputDebugString("InternetDecNestingCount, invalid nesting level, contact arthurbi, x68073 (acht)\n"); \ // DebugBreak(); \ // } \ // lpThreadInfo->NestedRequests -= dwNestingLevel;
//
// _InternetSetObjectHandle - set the object handle given the thread info block
//
#define _InternetSetObjectHandle(lpThreadInfo, hInternet, hMapped) \
DEBUG_PRINT(HTTP, \ INFO, \ ("Setting new obj handle on thrd=%x, old=%x, new=%x (map: old=%x, new=%x)\n", \ lpThreadInfo, \ lpThreadInfo->hObject, \ hInternet, \ lpThreadInfo->hObjectMapped, \ hMapped \ )); \ lpThreadInfo->hObject = hInternet; \ lpThreadInfo->hObjectMapped = hMapped;
//
// _InternetClearLastError - clear the last error info given the thread info
// block
//
#define _InternetClearLastError(lpThreadInfo) \
_InternetSetLastError(lpThreadInfo, 0, NULL, 0, 0)
//
// _InternetResetObjectHandle - clear the object handle given the thread info
// block
//
#define _InternetResetObjectHandle(lpThreadInfo) \
_InternetSetObjectHandle(lpThreadInfo, NULL, NULL)
//
// _InternetGetObjectHandle - retrieves the object handle from the per-thread
// info block
//
#define _InternetGetObjectHandle(lpThreadInfo) \
lpThreadInfo->hObject
//
// _InternetGetMappedObjectHandle - retrieves the mapped object handle from the
// per-thread info block
//
#define _InternetGetMappedObjectHandle(lpThreadInfo) \
lpThreadInfo->hObjectMapped
//
// InternetDisableAsync - turns off the async worker thread indication in the
// thread info block
//
#define _InternetDisableAsync(lpThreadInfo) \
_InternetSetAsync(FALSE)
//
// InternetEnableAsync - turns off the async worker thread indication in the
// thread info block
//
#define _InternetEnableAsync(lpThreadInfo, Val) \
_InternetSetAsync(TRUE)
//
// _InternetGetAsync - returns the async worker thread indication from the
// thread info block
//
#define _InternetGetAsync(lpThreadInfo) \
lpThreadInfo->IsAsyncWorkerThread
//
// _InternetSetAsync - turns on or off the async worker thread indication in the
// thread info block
//
#define _InternetSetAsync(lpThreadInfo, Val) \
lpThreadInfo->IsAsyncWorkerThread = Val
#define _InternetGetInCallback(lpThreadInfo) \
lpThreadInfo->InCallback
#define _InternetSetInCallback(lpThreadInfo) \
lpThreadInfo->InCallback = TRUE
#define _InternetResetInCallback(lpThreadInfo) \
lpThreadInfo->InCallback = FALSE
#if INET_DEBUG
#define CHECK_INTERNET_THREAD_INFO(lpThreadInfo) \
INET_ASSERT(lpThreadInfo->Signature == INTERNET_THREAD_INFO_SIGNATURE)
#else
#define CHECK_INTERNET_THREAD_INFO(lpThreadInfo) \
/* NOTHING */
#endif
//
// prototypes
//
#define UI_ACTION_CODE_NONE_TAKEN 0
#define UI_ACTION_CODE_BLOCKED_FOR_INTERNET_HANDLE 1
#define UI_ACTION_CODE_BLOCKED_FOR_USER_INPUT 2
#define UI_ACTION_CODE_USER_ACTION_COMPLETED 3
LPINTERNET_THREAD_INFO InternetCreateThreadInfo( IN BOOL SetTls );
VOID InternetDestroyThreadInfo( VOID );
VOID InternetFreeThreadInfo( IN LPINTERNET_THREAD_INFO lpThreadInfo );
VOID InternetTerminateThreadInfo( VOID );
LPINTERNET_THREAD_INFO InternetGetThreadInfo( VOID );
VOID InternetSetThreadInfo( IN LPINTERNET_THREAD_INFO lpThreadInfo );
DWORD InternetIndicateStatusAddress( IN DWORD dwInternetStatus, IN LPSOCKADDR lpSockAddr, IN DWORD dwSockAddrLength );
DWORD InternetIndicateStatusString( IN DWORD dwInternetStatus, IN LPSTR lpszStatusInfo, IN BOOL bCopyBuffer=FALSE, IN BOOL bConvertToUnicode=TRUE );
DWORD InternetIndicateStatus( IN DWORD dwInternetStatus, IN LPVOID lpBuffer, IN DWORD dwBufferLength, IN BOOL bCopyBuffer=FALSE, IN BOOL bConvertToUnicode=FALSE );
DWORD InternetIndicateStatusNewHandle( IN LPVOID hInternetMapped );
DWORD InternetSetLastError( IN DWORD ErrorNumber, IN LPSTR ErrorText, IN DWORD ErrorTextLength, IN DWORD Flags );
#define SLE_APPEND 0x00000001
#define SLE_ZERO_TERMINATE 0x00000002
DWORD _InternetSetLastError( IN LPINTERNET_THREAD_INFO lpThreadInfo, IN DWORD ErrorNumber, IN LPSTR ErrorText, IN DWORD ErrorTextLength, IN DWORD Flags );
LPSTR InternetLockErrorText( VOID );
VOID InternetUnlockErrorText( VOID );
VOID InternetSetObjectHandle( IN HINTERNET hInternet, IN HINTERNET hInternetMapped );
HINTERNET InternetGetObjectHandle( VOID );
HINTERNET InternetGetMappedObjectHandle( VOID );
//
// external data
//
extern SERIALIZED_LIST ThreadInfoList;
#if defined(__cplusplus)
} #endif
|