windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/infocomm/atq/atqprocs.hxx
2020-09-26 16:20:57 +08:00

490 lines
11 KiB
C++
Raw 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 Microsoft Corporation
Module Name :
atqprocs.hxx
Abstract:
ATQ function prototypes and externs
Author:
Murali R. Krishnan ( MuraliK ) 1-June-1995
Environment:
User Mode -- Win32
Project:
Internet Services Common DLL
Revision History:
--*/
#ifndef _ATQPROCS_H_
#define _ATQPROCS_H_
/************************************************************
* Data
* for detailed doc on global data, please see atqmain.cxx
************************************************************/
// ------------------------------
// Configuration for ATQ package
// ------------------------------
extern DWORD g_cConcurrency;
extern BOOL g_fUseAcceptEx; // Use AcceptEx if available
extern BOOL g_fUseDriver; // Use NTS kernel driver
extern DWORD g_cbMinKbSec;
extern DWORD g_msThreadTimeout;
extern LONG g_cMaxThreads;
extern LONG g_cMaxThreadLimit;
extern DWORD g_dwNumContextLists;
extern ATQ_THREAD_EXIT_CALLBACK g_pfnExitThreadCallback;
extern BOOL g_fUseFakeCompletionPort;
extern BOOL g_fEnableDebugThreads;
extern BOOL g_fCreateDebugThread;
extern DWORD g_cForceTimeout;
extern BOOL g_fDisableBacklogMonitor;
// ------------------------------
// Current State Information
// ------------------------------
extern DWORD g_cListenBacklog;
extern LONG g_cThreads;
extern LONG g_cAvailableThreads;
extern HANDLE g_hCompPort;
extern HANDLE g_hShutdownEvent;
extern BOOL g_fShutdown;
//
// Win95 specific
//
extern DWORD g_AtqWaitingContextsCount;
// ------------------------------
// Various State/Object Lists
// ------------------------------
extern DWORD AtqGlobalContextCount;
extern DWORD g_AtqCurrentTick;
extern DWORD g_cbXmitBufferSize;
extern ATQ_CONTEXT_LISTHEAD AtqActiveContextList[];
extern LIST_ENTRY AtqEndpointList;
extern CRITICAL_SECTION AtqEndpointLock;
extern PALLOC_CACHE_HANDLER g_pachAtqContexts;
//
// DLL handles
//
extern HINSTANCE g_hMSWsock;
extern HINSTANCE g_hNtdll;
//
// Ensure that initialization/termination don't happen at the same time
//
extern CRITICAL_SECTION g_csInitTermLock;
/************************************************************
* Functions
************************************************************/
VOID AtqValidateProductType( VOID );
//
// ATQ Context alloc/free functions
//
BOOL
I_AtqCheckThreadStatus(
IN PVOID Context = NULL
);
// for adding initial listen socket to the port
// for adding non-AcceptEx() AtqContext()
BOOL
I_AtqAddAsyncHandle(
IN OUT PATQ_CONT * ppatqContext,
IN PATQ_ENDPOINT pEndpoint,
PVOID ClientContext,
ATQ_COMPLETION pfnCompletion,
DWORD TimeOut,
HANDLE hAsyncIO
);
// for adding an AcceptEx atq context to the atq processing
BOOL
I_AtqAddAsyncHandleEx(
PATQ_CONT * ppatqContext,
PATQ_ENDPOINT pEndpoint,
PATQ_CONT pReuseableAtq
);
BOOL
I_AtqPrepareAcceptExSockets(
IN PATQ_ENDPOINT pEndpoint,
IN DWORD nAcceptExSockets
);
BOOL
I_AtqAddAcceptExSocket(
IN PATQ_ENDPOINT pEndpoint,
IN PATQ_CONT patqContext
);
BOOL
I_AtqAddListenEndpointToPort(
IN OUT PATQ_CONT * ppatqContext,
IN PATQ_ENDPOINT pEndpoint
);
VOID
I_AtqProcessPendingListens(
IN PATQ_CONTEXT_LISTHEAD pContextList,
IN PATQ_ENDPOINT pEndpoint,
OUT PDWORD pcForced
);
BOOL
I_AtqStartTimeoutProcessing(
IN PVOID Context
);
BOOL
I_AtqStopTimeoutProcessing(
VOID
);
BOOL
SIOTransmitFile(
IN PATQ_CONT pContext,
IN HANDLE hFile,
IN DWORD dwBytesInFile,
IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers
);
BOOL
I_AtqInitializeNtEntryPoints(
VOID
);
BOOL
I_AtqSpudInitialize(
VOID
);
BOOL
I_AtqSpudTerminate(
VOID
);
BOOL
I_AtqTransmitFileAndRecv(
IN PATQ_CONTEXT patqContext, // pointer to ATQ context
IN HANDLE hFile, // handle of file to read
IN DWORD dwBytesInFile, // Bytes to transmit
IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, // transmit buffer structure
IN DWORD dwTFFlags, // TF Flags
IN LPWSABUF pwsaBuffers, // Buffers for recv
IN DWORD dwBufferCount
);
BOOL
I_AtqSendAndRecv(
IN PATQ_CONTEXT patqContext, // pointer to ATQ context
IN LPWSABUF pwsaSendBuffers, // buffers for send
IN DWORD dwSendBufferCount, // count of buffers for send
IN LPWSABUF pwsaRecvBuffers, // Buffers for recv
IN DWORD dwRecvBufferCount // count of buffers for recv
);
VOID
AtqpReuseOrFreeContext(
IN PATQ_CONT pContext,
IN BOOL fReuseContext
);
VOID
AtqpProcessContext( IN PATQ_CONT pAtqContext,
IN DWORD cbWritten,
IN LPOVERLAPPED lpo,
IN BOOL fRet);
//
// win 95
//
BOOL
SIOGetQueuedCompletionStatus(
IN HANDLE hExistingPort,
OUT LPDWORD lpdwBytesTransferred,
OUT PULONG_PTR lpdwCompletionKey,
OUT LPOVERLAPPED *lplpOverlapped,
IN DWORD msThreadTimeout
);
BOOL
SIOStartAsyncOperation(
IN HANDLE hExistingPort,
IN PATQ_CONTEXT pAtqContext
);
BOOL
SIODestroyCompletionPort(
IN HANDLE hExistingPort
);
HANDLE
SIOCreateCompletionPort(
IN HANDLE hAsyncIO,
IN HANDLE hExistingPort,
IN ULONG_PTR dwCompletionKey,
IN DWORD dwConcurrentThreads
);
BOOL
SIOPostCompletionStatus(
IN HANDLE hExistingPort,
IN DWORD dwBytesTransferred,
IN ULONG_PTR dwCompletionKey,
IN LPOVERLAPPED lpOverlapped
);
BOOL
SIOWSARecv(
IN PATQ_CONT patqContext,
IN LPWSABUF pwsaBuffers,
IN DWORD dwBufferCount,
IN OVERLAPPED * lpo OPTIONAL
);
BOOL
SIOWSASend(
IN PATQ_CONT patqContext,
IN LPWSABUF pwsaBuffers,
IN DWORD dwBufferCount,
IN OVERLAPPED * lpo OPTIONAL
);
BOOL
SIOTransmitFile(
IN PATQ_CONT pContext,
IN HANDLE hFile,
IN DWORD dwBytesInFile,
IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers
);
typedef
HANDLE
(*PFN_CREATE_COMPLETION_PORT) (
IN HANDLE hFile,
IN HANDLE hPort,
IN ULONG_PTR dwKey,
IN DWORD nThreads
);
typedef
BOOL
(*PFN_CLOSE_COMPLETION_PORT) (
IN HANDLE hFile
);
typedef
BOOL
(WINAPI *PFN_GET_QUEUED_COMPLETION_STATUS)(
HANDLE CompletionPort,
LPDWORD lpNumberOfBytesTransferred,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED *lpOverlapped,
DWORD dwMilliseconds
);
typedef
BOOL
(WINAPI *PFN_POST_COMPLETION_STATUS)(
HANDLE CompletionPort,
DWORD dwNumberOfBytesTransferred,
ULONG_PTR dwCompletionKey,
LPOVERLAPPED lpOverlapped
);
typedef
BOOL
(*PFN_ACCEPTEX) (
IN SOCKET sListenSocket,
IN SOCKET sAcceptSocket,
IN PVOID lpOutputBuffer,
IN DWORD dwReceiveDataLength,
IN DWORD dwLocalAddressLength,
IN DWORD dwRemoteAddressLength,
OUT LPDWORD lpdwBytesReceived,
IN LPOVERLAPPED lpOverlapped
);
typedef
VOID
(*PFN_GETACCEPTEXSOCKADDRS) (
IN PVOID lpOutputBuffer,
IN DWORD dwReceiveDataLength,
IN DWORD dwLocalAddressLength,
IN DWORD dwRemoteAddressLength,
OUT struct sockaddr **LocalSockaddr,
OUT LPINT LocalSockaddrLength,
OUT struct sockaddr **RemoteSockaddr,
OUT LPINT RemoteSockaddrLength
);
typedef
BOOL
(*PFN_TRANSMITFILE) (
IN SOCKET hSocket,
IN HANDLE hFile,
IN DWORD nBytesWrite,
IN DWORD nBytesPerSend,
IN LPOVERLAPPED lpo,
IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffer,
IN DWORD dwReserved
);
typedef
BOOL
(WINAPI *PFN_READ_DIR_CHANGES_W)(
HANDLE hDirectory,
LPVOID lpBuffer,
DWORD nBufferLength,
BOOL bWatchSubtree,
DWORD dwNotifyFilter,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
extern PFN_ACCEPTEX g_pfnAcceptEx;
extern PFN_GETACCEPTEXSOCKADDRS g_pfnGetAcceptExSockaddrs;
extern PFN_TRANSMITFILE g_pfnTransmitFile;
extern PFN_READ_DIR_CHANGES_W g_pfnReadDirChangesW;
extern PFN_GET_QUEUED_COMPLETION_STATUS g_pfnGetQueuedCompletionStatus;
extern PFN_CREATE_COMPLETION_PORT g_pfnCreateCompletionPort;
extern PFN_CLOSE_COMPLETION_PORT g_pfnCloseCompletionPort;
extern PFN_POST_COMPLETION_STATUS g_pfnPostCompletionStatus;
//
// ntdll
//
typedef
VOID
(NTAPI *PFN_RTL_INIT_UNICODE_STRING)(
PUNICODE_STRING DestinationString,
PCWSTR SourceString
);
typedef
ULONG
(NTAPI *PFN_RTL_NTSTATUS_TO_DOSERR)(
NTSTATUS Status
);
typedef
VOID
(NTAPI *PFN_RTL_INIT_ANSI_STRING)(
PANSI_STRING DestinationString,
PCSZ SourceString
);
typedef
NTSTATUS
(NTAPI *PFN_RTL_ANSI_STRING_TO_UNICODE_STRING)(
PUNICODE_STRING DestinationString,
PANSI_STRING SourceString,
BOOLEAN AllocateDestinationString
);
typedef
BOOLEAN
(NTAPI *PFN_RTL_FREE_HEAP)(
IN PVOID HeapHandle,
IN ULONG Flags,
IN PVOID BaseAddress
);
typedef
BOOLEAN
(NTAPI *PFN_RTL_DOS_PATHNAME_TO_NT_PATHNAME)(
PCWSTR DosFileName,
PUNICODE_STRING NtFileName,
PWSTR *FilePart OPTIONAL,
PRTL_RELATIVE_NAME RelativeName OPTIONAL
);
typedef
NTSTATUS
(NTAPI *PFN_NT_LOAD_DRIVER)(
PUNICODE_STRING DriverName
);
extern PFN_RTL_INIT_UNICODE_STRING g_pfnRtlInitUnicodeString;
extern PFN_RTL_NTSTATUS_TO_DOSERR g_pfnRtlNtStatusToDosError;
extern PFN_NT_LOAD_DRIVER g_pfnNtLoadDriver;
extern PFN_RTL_INIT_ANSI_STRING g_pfnRtlInitAnsiString;
extern PFN_RTL_ANSI_STRING_TO_UNICODE_STRING g_pfnRtlAnsiStringToUnicodeString;
extern PFN_RTL_DOS_PATHNAME_TO_NT_PATHNAME g_pfnRtlDosPathNameToNtPathName_U;
extern PFN_RTL_FREE_HEAP g_pfnRtlFreeHeap;
//
// inlined functions
//
inline BOOL
I_AddAtqContextToPort(IN PATQ_CONT pAtqContext)
{
ATQ_ASSERT( g_hCompPort );
return (g_pfnCreateCompletionPort(
pAtqContext->hAsyncIO,
g_hCompPort,
(ULONG_PTR)pAtqContext,
g_cConcurrency
) != NULL
);
} // I_AddContextToPort()
inline DWORD CanonTimeout( DWORD Timeout)
// Convert the timeout into normalized ATQ timeout value
{
return ((Timeout == INFINITE) ? ATQ_INFINITE :
((Timeout + ATQ_TIMEOUT_INTERVAL - 1)/ATQ_TIMEOUT_INTERVAL + 1)
);
} // CanonTimeout()
inline DWORD UndoCanonTimeout( DWORD Timeout)
// Convert the timeout from normalized ATQ timeout into values in seconds
{
return ( ((Timeout & ATQ_INFINITE) != 0) ? INFINITE :
((Timeout - 1) * ATQ_TIMEOUT_INTERVAL)
);
} // UndoCanonTimeout()
#endif // _ATQPROCS_H_