|
|
/*++
Copyright (c) 1998-2001 Microsoft Corporation
Module Name:
devctrl.cxx
Abstract:
This module contains the dispatcher for device control IRPs.
Author:
Keith Moore (keithmo) 10-Jun-1998
Revision History:
--*/
#include "precomp.h"
#ifdef ALLOC_PRAGMA
#endif // ALLOC_PRAGMA
#if 0
NOT PAGEABLE -- UlDeviceControl #endif
//
// Lookup table to verify incoming IOCTL codes.
//
typedef NTSTATUS (NTAPI * PFN_IOCTL_HANDLER)( IN PIRP Irp, IN PIO_STACK_LOCATION IrpSp );
typedef struct _UL_IOCTL_TABLE { ULONG IoControlCode;
#if DBG
PCSTR IoControlName; # define UL_IOCTL(code) IOCTL_HTTP_##code, #code
#else // !DBG
# define UL_IOCTL(code) IOCTL_HTTP_##code
#endif // !DBG
PFN_IOCTL_HANDLER Handler; } UL_IOCTL_TABLE, *PUL_IOCTL_TABLE;
UL_IOCTL_TABLE UlIoctlTable[] = { { UL_IOCTL(QUERY_CONTROL_CHANNEL), &UlQueryControlChannelIoctl }, { UL_IOCTL(SET_CONTROL_CHANNEL), &UlSetControlChannelIoctl }, { UL_IOCTL(CREATE_CONFIG_GROUP), &UlCreateConfigGroupIoctl }, { UL_IOCTL(DELETE_CONFIG_GROUP), &UlDeleteConfigGroupIoctl }, { UL_IOCTL(QUERY_CONFIG_GROUP), &UlQueryConfigGroupIoctl }, { UL_IOCTL(SET_CONFIG_GROUP), &UlSetConfigGroupIoctl }, { UL_IOCTL(ADD_URL_TO_CONFIG_GROUP), &UlAddUrlToConfigGroupIoctl }, { UL_IOCTL(REMOVE_URL_FROM_CONFIG_GROUP), &UlRemoveUrlFromConfigGroupIoctl }, { UL_IOCTL(QUERY_APP_POOL_INFORMATION), &UlQueryAppPoolInformationIoctl }, { UL_IOCTL(SET_APP_POOL_INFORMATION), &UlSetAppPoolInformationIoctl }, { UL_IOCTL(RECEIVE_HTTP_REQUEST), &UlReceiveHttpRequestIoctl }, { UL_IOCTL(RECEIVE_ENTITY_BODY), &UlReceiveEntityBodyIoctl }, { UL_IOCTL(SEND_HTTP_RESPONSE), &UlSendHttpResponseIoctl }, { UL_IOCTL(SEND_ENTITY_BODY), &UlSendEntityBodyIoctl }, { UL_IOCTL(FLUSH_RESPONSE_CACHE), &UlFlushResponseCacheIoctl }, { UL_IOCTL(WAIT_FOR_DEMAND_START), &UlWaitForDemandStartIoctl }, { UL_IOCTL(WAIT_FOR_DISCONNECT), &UlWaitForDisconnectIoctl }, { UL_IOCTL(REMOVE_ALL_URLS_FROM_CONFIG_GROUP), &UlRemoveAllUrlsFromConfigGroupIoctl }, { UL_IOCTL(ADD_TRANSIENT_URL), &UlAddTransientUrlIoctl }, { UL_IOCTL(REMOVE_TRANSIENT_URL), &UlRemoveTransientUrlIoctl }, { UL_IOCTL(FILTER_ACCEPT), &UlFilterAcceptIoctl }, { UL_IOCTL(FILTER_CLOSE), &UlFilterCloseIoctl }, { UL_IOCTL(FILTER_RAW_READ), &UlFilterRawReadIoctl }, { UL_IOCTL(FILTER_RAW_WRITE), &UlFilterRawWriteIoctl }, { UL_IOCTL(FILTER_APP_READ), &UlFilterAppReadIoctl }, { UL_IOCTL(FILTER_APP_WRITE), &UlFilterAppWriteIoctl }, { UL_IOCTL(FILTER_RECEIVE_CLIENT_CERT), &UlReceiveClientCertIoctl }, { UL_IOCTL(GET_COUNTERS), &UlGetCountersIoctl }, };
C_ASSERT( HTTP_NUM_IOCTLS == DIMENSION(UlIoctlTable) );
//
// Public functions.
//
/***************************************************************************++
Routine Description:
This is the dispatch routine for IOCTL IRPs.
Arguments:
pDeviceObject - Pointer to device object for target device.
pIrp - Pointer to IO request packet.
Return Value:
NTSTATUS -- Indicates whether the request was successfully queued.
--***************************************************************************/ NTSTATUS UlDeviceControl( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp ) { ULONG code; ULONG request; NTSTATUS status; PIO_STACK_LOCATION pIrpSp;
UL_ENTER_DRIVER( "UlDeviceControl", pIrp );
//
// Snag the current IRP stack pointer.
//
pIrpSp = IoGetCurrentIrpStackLocation( pIrp );
//
// Extract the IOCTL control code and process the request.
//
code = pIrpSp->Parameters.DeviceIoControl.IoControlCode; request = _HTTP_REQUEST(code);
if (request < HTTP_NUM_IOCTLS && UlIoctlTable[request].IoControlCode == code) { #if DBG
KIRQL oldIrql = KeGetCurrentIrql(); #endif // DBG
UlTrace(IOCTL, ("UlDeviceControl: %-30s code=0x%08lx, " "pIrp=%p, pIrpSp=%p.\n", UlIoctlTable[request].IoControlName, code, pIrp, pIrpSp ));
status = (UlIoctlTable[request].Handler)( pIrp, pIrpSp ); ASSERT( KeGetCurrentIrql() == oldIrql ); } else { //
// If we made it this far, then the ioctl is invalid.
//
KdPrint(( "UlDeviceControl: invalid IOCTL %08lX\n", code ));
status = STATUS_INVALID_DEVICE_REQUEST; pIrp->IoStatus.Status = status;
UlCompleteRequest( pIrp, g_UlPriorityBoost ); }
UL_LEAVE_DRIVER( "UlDeviceControl" );
return status;
} // UlDeviceControl
//
// Private functions.
//
|