windows-nt/Source/XPSP1/NT/inetsrv/iis/iisrearc/ul/api/control.c

233 lines
5.9 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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.
//