/*++ Copyright (c) 1998-1999 Microsoft Corporation Module Name: control.c Abstract: User-mode interface to UL.SYS. Author: Keith Moore (keithmo) 15-Dec-1998 Revision History: --*/ #include "precomp.h" // // Private macros. // // // Private prototypes. // // // Public functions. // /***************************************************************************++ Routine Description: Opens a control channel to UL.SYS. Arguments: pControlChannel - Receives a handle to the control channel if successful. Options - Supplies zero or more HTTP_OPTION_* flags. Return Value: ULONG - Completion status. --***************************************************************************/ ULONG WINAPI HttpOpenControlChannel( OUT PHANDLE pControlChannel, IN ULONG Options ) { NTSTATUS status; // // First, just try to open the driver. // status = HttpApiOpenDriverHelper( pControlChannel, // pHandle GENERIC_READ | // DesiredAccess GENERIC_WRITE | SYNCHRONIZE, HttpApiControlChannelHandleType, // handle type NULL, // pObjectName Options, // Options FILE_OPEN, // CreateDisposition NULL // pSecurityAttributes ); // // If we couldn't open the driver because it's not running, then try // to start the driver & retry the open. // if (status == STATUS_OBJECT_NAME_NOT_FOUND || status == STATUS_OBJECT_PATH_NOT_FOUND) { if (HttpApiTryToStartDriver()) { status = HttpApiOpenDriverHelper( pControlChannel, // pHandle GENERIC_READ | // DesiredAccess GENERIC_WRITE | SYNCHRONIZE, HttpApiControlChannelHandleType, // handle type NULL, // pObjectName Options, // Options FILE_OPEN, // CreateDisposition NULL // pSecurityAttributes ); } } return HttpApiNtStatusToWin32Status( status ); } // HttpOpenControlChannel /***************************************************************************++ Routine Description: Queries information from a control channel. Arguments: ControlChannelHandle - Supplies a UL.SYS control channel handle. InformationClass - Supplies the type of information to query. pControlChannelInformation - Supplies a buffer for the query. Length - Supplies the length of pControlChannelInformation. pReturnLength - Receives the length of data written to the buffer. Return Value: ULONG - Completion status. --***************************************************************************/ ULONG WINAPI HttpQueryControlChannelInformation( IN HANDLE ControlChannelHandle, IN HTTP_CONTROL_CHANNEL_INFORMATION_CLASS InformationClass, OUT PVOID pControlChannelInformation, IN ULONG Length, OUT PULONG pReturnLength OPTIONAL ) { NTSTATUS status; HTTP_CONTROL_CHANNEL_INFO channelInfo; // // Initialize the input structure. // channelInfo.InformationClass = InformationClass; // // Make the request. // status = HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_QUERY_CONTROL_CHANNEL, // IoControlCode &channelInfo, // pInputBuffer sizeof(channelInfo), // InputBufferLength pControlChannelInformation, // pOutputBuffer Length, // OutputBufferLength pReturnLength // pBytesTransferred ); return HttpApiNtStatusToWin32Status( status ); } // HttpQueryControlChannelInformation /***************************************************************************++ Routine Description: Sets information in a control channel. Arguments: ControlChannelHandle - Supplies a UL.SYS control channel handle. InformationClass - Supplies the type of information to set. pControlChannelInformation - Supplies the data to set. Length - Supplies the length of pControlChannelInformation. Return Value: ULONG - Completion status. --***************************************************************************/ ULONG WINAPI HttpSetControlChannelInformation( IN HANDLE ControlChannelHandle, IN HTTP_CONTROL_CHANNEL_INFORMATION_CLASS InformationClass, IN PVOID pControlChannelInformation, IN ULONG Length ) { NTSTATUS status; HTTP_CONTROL_CHANNEL_INFO channelInfo; // // Initialize the input structure. // channelInfo.InformationClass = InformationClass; // // Make the request. // status = HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_SET_CONTROL_CHANNEL, // IoControlCode &channelInfo, // pInputBuffer sizeof(channelInfo), // InputBufferLength pControlChannelInformation, // pOutputBuffer Length, // OutputBufferLength NULL // pBytesTransferred ); return HttpApiNtStatusToWin32Status( status ); } // HttpSetControlChannelInformation // // Private functions. //