/******** * * Copyright (c) 1995 Process Software Corporation * * Copyright (c) 1995-1999 Microsoft Corporation * * * Module Name : HttpExt.h * * Abstract : * * This module contains the structure definitions and prototypes for the * HTTP Server Extension interface used to build ISAPI Applications * ******************/ #ifndef _HTTPEXT_H_ #define _HTTPEXT_H_ #include #ifdef __cplusplus extern "C" { #endif ;begin_internal /*++ Copyright (c) 1997-1999 Microsoft Corporation Module Name : iisextp.h Abstract: This module contains private HTTP server extension info Environment: Win32 User Mode --*/ #ifndef _IISEXTP_H_ #define _IISEXTP_H_ #include ;end_internal /************************************************************ * Manifest Constants ************************************************************/ #define HSE_VERSION_MAJOR 6 // major version of this spec #define HSE_VERSION_MINOR 0 // minor version of this spec #define HSE_LOG_BUFFER_LEN 80 #define HSE_MAX_EXT_DLL_NAME_LEN 256 #define HSE_VERSION MAKELONG( HSE_VERSION_MINOR, HSE_VERSION_MAJOR ) // // the following are the status codes returned by the Extension DLL // #define HSE_STATUS_SUCCESS 1 #define HSE_STATUS_SUCCESS_AND_KEEP_CONN 2 #define HSE_STATUS_PENDING 3 #define HSE_STATUS_ERROR 4 // // The following are the values to request services with the // ServerSupportFunction(). // Values from 0 to 1000 are reserved for future versions of the interface #define HSE_REQ_BASE 0 #define HSE_REQ_SEND_URL_REDIRECT_RESP ( HSE_REQ_BASE + 1 ) #define HSE_REQ_SEND_URL ( HSE_REQ_BASE + 2 ) #define HSE_REQ_SEND_RESPONSE_HEADER ( HSE_REQ_BASE + 3 ) #define HSE_REQ_DONE_WITH_SESSION ( HSE_REQ_BASE + 4 ) #define HSE_REQ_END_RESERVED 1000 // // These are Microsoft specific extensions // #define HSE_REQ_MAP_URL_TO_PATH (HSE_REQ_END_RESERVED+1) #define HSE_REQ_GET_SSPI_INFO (HSE_REQ_END_RESERVED+2) #define HSE_APPEND_LOG_PARAMETER (HSE_REQ_END_RESERVED+3) ;begin_internal // available // #define ??? (HSE_REQ_END_RESERVED+4) ;end_internal #define HSE_REQ_IO_COMPLETION (HSE_REQ_END_RESERVED+5) #define HSE_REQ_TRANSMIT_FILE (HSE_REQ_END_RESERVED+6) #define HSE_REQ_REFRESH_ISAPI_ACL (HSE_REQ_END_RESERVED+7) #define HSE_REQ_IS_KEEP_CONN (HSE_REQ_END_RESERVED+8) ;begin_internal // no longer supported #define HSE_REQ_GET_CERT_INFO (HSE_REQ_END_RESERVED+9) ;end_internal #define HSE_REQ_ASYNC_READ_CLIENT (HSE_REQ_END_RESERVED+10) #define HSE_REQ_GET_IMPERSONATION_TOKEN (HSE_REQ_END_RESERVED+11) #define HSE_REQ_MAP_URL_TO_PATH_EX (HSE_REQ_END_RESERVED+12) ;begin_internal // will be public in IIS 5.0 #define HSE_REQ_EXECUTE_CHILD (HSE_REQ_END_RESERVED+13) ;end_internal #define HSE_REQ_ABORTIVE_CLOSE (HSE_REQ_END_RESERVED+14) #define HSE_REQ_GET_CERT_INFO_EX (HSE_REQ_END_RESERVED+15) #define HSE_REQ_SEND_RESPONSE_HEADER_EX (HSE_REQ_END_RESERVED+16) #define HSE_REQ_CLOSE_CONNECTION (HSE_REQ_END_RESERVED+17) #define HSE_REQ_IS_CONNECTED (HSE_REQ_END_RESERVED+18) ;begin_internal #define HSE_REQ_GET_EXECUTE_FLAGS (HSE_REQ_END_RESERVED+19) ;end_internal #define HSE_REQ_EXTENSION_TRIGGER (HSE_REQ_END_RESERVED+20) ;begin_internal // UNDONE: should be public after IIS 5.0 BETA 2 #define HSE_REQ_GET_VIRTUAL_PATH_TOKEN (HSE_REQ_END_RESERVED+21) ;end_internal #define HSE_REQ_VECTOR_SEND (HSE_REQ_END_RESERVED+22) #define HSE_REQ_MAP_UNICODE_URL_TO_PATH (HSE_REQ_END_RESERVED+23) #define HSE_REQ_MAP_UNICODE_URL_TO_PATH_EX (HSE_REQ_END_RESERVED+24) #define HSE_REQ_EXEC_URL (HSE_REQ_END_RESERVED+26) #define HSE_REQ_GET_EXEC_URL_STATUS (HSE_REQ_END_RESERVED+27) #define HSE_REQ_SEND_CUSTOM_ERROR (HSE_REQ_END_RESERVED+28) ;begin_internal #define HSE_REQ_GET_CUSTOM_ERROR_PAGE (HSE_REQ_END_RESERVED+29) ;end_internal #define HSE_REQ_IS_IN_PROCESS (HSE_REQ_END_RESERVED+30) ;begin_internal #define HSE_REQ_GET_UNICODE_VIRTUAL_PATH_TOKEN (HSE_REQ_END_RESERVED+31) ;end_internal // // Bit Flags for TerminateExtension // // HSE_TERM_ADVISORY_UNLOAD - Server wants to unload the extension, // extension can return TRUE if OK, FALSE if the server should not // unload the extension // // HSE_TERM_MUST_UNLOAD - Server indicating the extension is about to be // unloaded, the extension cannot refuse. // #define HSE_TERM_ADVISORY_UNLOAD 0x00000001 #define HSE_TERM_MUST_UNLOAD 0x00000002 // // Flags for IO Functions, supported for IO Funcs. // TF means ServerSupportFunction( HSE_REQ_TRANSMIT_FILE) // # define HSE_IO_SYNC 0x00000001 // for WriteClient # define HSE_IO_ASYNC 0x00000002 // for WriteClient/TF/EU # define HSE_IO_DISCONNECT_AFTER_SEND 0x00000004 // for TF # define HSE_IO_SEND_HEADERS 0x00000008 // for TF # define HSE_IO_NODELAY 0x00001000 // turn off nagling ;begin_internal // will be public in IIS 5.0 // // Flags for HSE_REQ_EXECUTE_CHILD function // # define HSE_EXEC_NO_HEADERS 0x00000001 // Don't send any // headers of child # define HSE_EXEC_REDIRECT_ONLY 0x00000002 // Don't send any // headers of child // but send redirect // message # define HSE_EXEC_COMMAND 0x00000004 // Treat as shell // command instead of // URL # define HSE_EXEC_NO_ISA_WILDCARDS 0x00000010 // Ignore wildcards in // ISAPI mapping when // executing child # define HSE_EXEC_CUSTOM_ERROR 0x00000020 // URL being sent is a // custom error ;end_internal /************************************************************ * Type Definitions ************************************************************/ typedef LPVOID HCONN; // // structure passed to GetExtensionVersion() // typedef struct _HSE_VERSION_INFO { DWORD dwExtensionVersion; CHAR lpszExtensionDesc[HSE_MAX_EXT_DLL_NAME_LEN]; } HSE_VERSION_INFO, *LPHSE_VERSION_INFO; // // structure passed to extension procedure on a new request // typedef struct _EXTENSION_CONTROL_BLOCK { DWORD cbSize; // size of this struct. DWORD dwVersion; // version info of this spec HCONN ConnID; // Context number not to be modified! DWORD dwHttpStatusCode; // HTTP Status code CHAR lpszLogData[HSE_LOG_BUFFER_LEN];// null terminated log info specific to this Extension DLL LPSTR lpszMethod; // REQUEST_METHOD LPSTR lpszQueryString; // QUERY_STRING LPSTR lpszPathInfo; // PATH_INFO LPSTR lpszPathTranslated; // PATH_TRANSLATED DWORD cbTotalBytes; // Total bytes indicated from client DWORD cbAvailable; // Available number of bytes LPBYTE lpbData; // pointer to cbAvailable bytes LPSTR lpszContentType; // Content type of client data BOOL (WINAPI * GetServerVariable) ( HCONN hConn, LPSTR lpszVariableName, LPVOID lpvBuffer, LPDWORD lpdwSize ); BOOL (WINAPI * WriteClient) ( HCONN ConnID, LPVOID Buffer, LPDWORD lpdwBytes, DWORD dwReserved ); BOOL (WINAPI * ReadClient) ( HCONN ConnID, LPVOID lpvBuffer, LPDWORD lpdwSize ); BOOL (WINAPI * ServerSupportFunction)( HCONN hConn, DWORD dwHSERequest, LPVOID lpvBuffer, LPDWORD lpdwSize, LPDWORD lpdwDataType ); } EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK; // // Bit field of flags that can be on a virtual directory // #define HSE_URL_FLAGS_READ 0x00000001 // Allow for Read #define HSE_URL_FLAGS_WRITE 0x00000002 // Allow for Write #define HSE_URL_FLAGS_EXECUTE 0x00000004 // Allow for Execute #define HSE_URL_FLAGS_SSL 0x00000008 // Require SSL #define HSE_URL_FLAGS_DONT_CACHE 0x00000010 // Don't cache (vroot only) #define HSE_URL_FLAGS_NEGO_CERT 0x00000020 // Allow client SSL certs #define HSE_URL_FLAGS_REQUIRE_CERT 0x00000040 // Require client SSL certs #define HSE_URL_FLAGS_MAP_CERT 0x00000080 // Map SSL cert to NT account #define HSE_URL_FLAGS_SSL128 0x00000100 // Require 128 bit SSL #define HSE_URL_FLAGS_SCRIPT 0x00000200 // Allow for Script execution #define HSE_URL_FLAGS_MASK 0x000003ff // // Structure for extended information on a URL mapping // typedef struct _HSE_URL_MAPEX_INFO { CHAR lpszPath[MAX_PATH]; // Physical path root mapped to DWORD dwFlags; // Flags associated with this URL path DWORD cchMatchingPath; // Number of matching characters in physical path DWORD cchMatchingURL; // Number of matching characters in URL DWORD dwReserved1; DWORD dwReserved2; } HSE_URL_MAPEX_INFO, * LPHSE_URL_MAPEX_INFO; typedef struct _HSE_UNICODE_URL_MAPEX_INFO { WCHAR lpszPath[MAX_PATH]; // Physical path root mapped to DWORD dwFlags; // Flags associated with this URL path DWORD cchMatchingPath; // Number of matching characters in physical path DWORD cchMatchingURL; // Number of matching characters in URL } HSE_UNICODE_URL_MAPEX_INFO, * LPHSE_UNICODE_URL_MAPEX_INFO; // // PFN_HSE_IO_COMPLETION - callback function for the Async I/O Completion. // typedef VOID (WINAPI * PFN_HSE_IO_COMPLETION)( IN EXTENSION_CONTROL_BLOCK * pECB, IN PVOID pContext, IN DWORD cbIO, IN DWORD dwError ); // // HSE_TF_INFO defines the type for HTTP SERVER EXTENSION support for // ISAPI applications to send files using TransmitFile. // A pointer to this object should be used with ServerSupportFunction() // for HSE_REQ_TRANSMIT_FILE. // typedef struct _HSE_TF_INFO { // // callback and context information // the callback function will be called when IO is completed. // the context specified will be used during such callback. // // These values (if non-NULL) will override the one set by calling // ServerSupportFunction() with HSE_REQ_IO_COMPLETION // PFN_HSE_IO_COMPLETION pfnHseIO; PVOID pContext; // file should have been opened with FILE_FLAG_SEQUENTIAL_SCAN HANDLE hFile; // // HTTP header and status code // These fields are used only if HSE_IO_SEND_HEADERS is present in dwFlags // LPCSTR pszStatusCode; // HTTP Status Code eg: "200 OK" DWORD BytesToWrite; // special value of "0" means write entire file. DWORD Offset; // offset value within the file to start from PVOID pHead; // Head buffer to be sent before file data DWORD HeadLength; // header length PVOID pTail; // Tail buffer to be sent after file data DWORD TailLength; // tail length DWORD dwFlags; // includes HSE_IO_DISCONNECT_AFTER_SEND, ... } HSE_TF_INFO, * LPHSE_TF_INFO; // // HSE_SEND_HEADER_EX_INFO allows an ISAPI application to send headers // and specify keep-alive behavior in the same call. // typedef struct _HSE_SEND_HEADER_EX_INFO { // // HTTP status code and header // LPCSTR pszStatus; // HTTP status code eg: "200 OK" LPCSTR pszHeader; // HTTP header DWORD cchStatus; // number of characters in status code DWORD cchHeader; // number of characters in header BOOL fKeepConn; // keep client connection alive? } HSE_SEND_HEADER_EX_INFO, * LPHSE_SEND_HEADER_EX_INFO; // // Flags for use with HSE_REQ_EXEC_URL // #define HSE_EXEC_URL_SYNC 0x01 #define HSE_EXEC_URL_NO_HEADERS 0x02 #define HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR 0x04 #define HSE_EXEC_URL_IGNORE_APPPOOL 0x08 #define HSE_EXEC_URL_IGNORE_VALIDATION_AND_RANGE 0x10 #define HSE_EXEC_URL_DISABLE_CUSTOM_ERROR 0x20 #define HSE_EXEC_URL_SSI_CMD 0x40 #define HSE_EXEC_URL_ASYNC 0x80 // // HSE_EXEC_URL_USER_INFO provides a new user content for use with // HSE_REQ_EXEC_URL // typedef struct _HSE_EXEC_URL_USER_INFO { HANDLE hImpersonationToken; LPSTR pszCustomUserName; LPSTR pszCustomAuthType; } HSE_EXEC_URL_USER_INFO, * LPHSE_EXEC_URL_USER_INFO; // // HSE_EXEC_URL_ENTITY_INFO describes the entity body to be provided // to the executed request using HSE_REQ_EXEC_URL // typedef struct _HSE_EXEC_URL_ENTITY_INFO { DWORD cbAvailable; LPVOID lpbData; } HSE_EXEC_URL_ENTITY_INFO, * LPHSE_EXEC_URL_ENTITY_INFO; // // HSE_EXEC_URL_STATUS provides the status of the last HSE_REQ_EXEC_URL // call // typedef struct _HSE_EXEC_URL_STATUS { USHORT uHttpStatusCode; USHORT uHttpSubStatus; DWORD dwWin32Error; } HSE_EXEC_URL_STATUS, * LPHSE_EXEC_URL_STATUS; // // HSE_EXEC_URL_INFO provides a description of the request to execute // on behalf of the ISAPI. // typedef struct _HSE_EXEC_URL_INFO { LPSTR pszUrl; // URL to execute LPSTR pszMethod; // Method LPSTR pszChildHeaders; // Request headers for child LPHSE_EXEC_URL_USER_INFO pUserInfo; // User for new request LPHSE_EXEC_URL_ENTITY_INFO pEntity; // Entity body for new request DWORD dwExecUrlFlags; // Flags } HSE_EXEC_URL_INFO, * LPHSE_EXEC_URL_INFO; // // HSE_CUSTOM_ERROR_INFO structured used in HSE_REQ_SEND_CUSTOM_ERROR // typedef struct _HSE_CUSTOM_ERROR_INFO { CHAR * pszStatus; USHORT uHttpSubError; BOOL fAsync; } HSE_CUSTOM_ERROR_INFO, * LPHSE_CUSTOM_ERROR_INFO; // // structures for the HSE_REQ_VECTOR_SEND ServerSupportFunction // // // element of the vector // typedef struct _HSE_VECTOR_ELEMENT { PVOID pBuffer; // The buffer to be sent HANDLE hFile; // The handle to read the data from // Note: both pBuffer and hFile should not be non-null ULONGLONG cbOffset; // Offset from the start of hFile ULONGLONG cbSize; // Number of bytes to send } HSE_VECTOR_ELEMENT, *LPHSE_VECTOR_ELEMENT; // // The whole vector to be passed to the ServerSupportFunction // typedef struct _HSE_RESPONSE_VECTOR { DWORD dwFlags; // combination of HSE_IO_* flags LPSTR pszStatus; // Status line to send like "200 OK" LPSTR pszHeaders; // Headers to send DWORD nElementCount; // Number of HSE_VECTOR_ELEMENT's LPHSE_VECTOR_ELEMENT lpElementArray; // Pointer to those elements } HSE_RESPONSE_VECTOR, *LPHSE_RESPONSE_VECTOR; #if(_WIN32_WINNT >= 0x400) #include // // CERT_CONTEXT_EX is passed as an an argument to // ServerSupportFunction( HSE_REQ_GET_CERT_INFO_EX ) // typedef struct _CERT_CONTEXT_EX { CERT_CONTEXT CertContext; DWORD cbAllocated; DWORD dwCertificateFlags; } CERT_CONTEXT_EX; #endif ;begin_internal #include typedef struct _HSE_SEND_ENTIRE_RESPONSE_INFO { // // HTTP header info // HSE_SEND_HEADER_EX_INFO HeaderInfo; // // Buffers which will be passed to WSASend // // NOTE: To send an entire response whose data (body) // is contained in N buffers, caller must allocate N+1 buffers // and fill buffers 1 through N with its data buffers. // IIS will fill the extra buffer (buffer 0) with header info. // WSABUF * rgWsaBuf; // array of wsa buffers DWORD cWsaBuf; // count of wsa buffers // // Returned by WSASend // DWORD cbWritten; } HSE_SEND_ENTIRE_RESPONSE_INFO, * LPHSE_SEND_ENTIRE_RESPONSE_INFO; typedef struct _HSE_CUSTOM_ERROR_PAGE_INFO { // // The Error and SubError to look up // DWORD dwError; DWORD dwSubError; // // Buffer info // DWORD dwBufferSize; CHAR * pBuffer; // // On return, this contains the size of the buffer required // DWORD * pdwBufferRequired; // // If TRUE on return, then buffer contains a file name // BOOL * pfIsFileError; } HSE_CUSTOM_ERROR_PAGE_INFO, * LPHSE_CUSTOM_ERROR_PAGE_INFO; ;end_internal // // Flags for determining application type // #define HSE_APP_FLAG_IN_PROCESS 0 #define HSE_APP_FLAG_ISOLATED_OOP 1 #define HSE_APP_FLAG_POOLED_OOP 2 /************************************************************ * Function Prototypes * o for functions exported from the ISAPI Application DLL ************************************************************/ BOOL WINAPI GetExtensionVersion( HSE_VERSION_INFO *pVer ); DWORD WINAPI HttpExtensionProc( EXTENSION_CONTROL_BLOCK *pECB ); BOOL WINAPI TerminateExtension( DWORD dwFlags ); // the following type declarations is for use in the server side typedef BOOL (WINAPI * PFN_GETEXTENSIONVERSION)( HSE_VERSION_INFO *pVer ); typedef DWORD (WINAPI * PFN_HTTPEXTENSIONPROC )( EXTENSION_CONTROL_BLOCK * pECB ); typedef BOOL (WINAPI * PFN_TERMINATEEXTENSION )( DWORD dwFlags ); #ifdef __cplusplus } #endif ;begin_internal #endif // _IISEXTP_H_ ;end_internal #endif // end definition _HTTPEXT_H_