windows-nt/Source/XPSP1/NT/inetsrv/iis/iisrearc/ul/api/config.c
2020-09-26 16:20:57 +08:00

597 lines
16 KiB
C

/*++
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
config.c
Abstract:
User-mode interface to UL.SYS.
Author:
Keith Moore (keithmo) 15-Dec-1998
Revision History:
--*/
#include "precomp.h"
//
// Private macros.
//
#ifndef DIFF
#define DIFF(x) ((size_t)(x))
#endif
//
// Private prototypes.
//
//
// Public functions.
//
/***************************************************************************++
Routine Description:
Creates a new configuration group.
Arguments:
ControlChannelHandle - Supplies a control channel handle.
pConfigGroupId - Receives an opaque identifier for the new
configuration group.
Return Value:
ULONG - Completion status.
--***************************************************************************/
ULONG
WINAPI
HttpCreateConfigGroup(
IN HANDLE ControlChannelHandle,
OUT PHTTP_CONFIG_GROUP_ID pConfigGroupId
)
{
NTSTATUS status;
HTTP_CONFIG_GROUP_INFO configGroupInfo;
//
// Make the request.
//
status = HttpApiSynchronousDeviceControl(
ControlChannelHandle, // FileHandle
IOCTL_HTTP_CREATE_CONFIG_GROUP, // IoControlCode
NULL, // pInputBuffer
0, // InputBufferLength
&configGroupInfo, // pOutputBuffer
sizeof(configGroupInfo), // OutputBufferLength
NULL // pBytesTransferred
);
if (NT_SUCCESS(status))
{
//
// Retrieve the container ID.
//
*pConfigGroupId = configGroupInfo.ConfigGroupId;
}
return HttpApiNtStatusToWin32Status( status );
} // HttpCreateConfigGroup
/***************************************************************************++
Routine Description:
Deletes an existing configuration group.
Arguments:
ControlChannelHandle - Supplies a control channel handle.
ConfigGroupId - Supplies an identifier as returned by
HttpCreateConfigGroup().
Return Value:
ULONG - Completion status.
--***************************************************************************/
ULONG
WINAPI
HttpDeleteConfigGroup(
IN HANDLE ControlChannelHandle,
IN HTTP_CONFIG_GROUP_ID ConfigGroupId
)
{
NTSTATUS status;
HTTP_CONFIG_GROUP_INFO configGroupInfo;
//
// Initialize the input structure.
//
configGroupInfo.ConfigGroupId = ConfigGroupId;
//
// Make the request.
//
status = HttpApiSynchronousDeviceControl(
ControlChannelHandle, // FileHandle
IOCTL_HTTP_DELETE_CONFIG_GROUP, // IoControlCode
&configGroupInfo, // pInputBuffer
sizeof(configGroupInfo), // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL // pBytesTransferred
);
return HttpApiNtStatusToWin32Status( status );
} // HttpDeleteConfigGroup
/***************************************************************************++
Routine Description:
Adds a fully qualified URL to an configuration group.
Arguments:
ControlChannelHandle - Supplies a control channel handle.
ConfigGroupId - Supplies an identifier as returned by
HttpCreateConfigGroup().
pFullyQualifiedUrl - Supplies the fully qualified URL to add to the
container.
UrlContext - Supplies an uninterpreted context to be associated with
the URL.
Return Value:
ULONG - Completion status.
--***************************************************************************/
ULONG
WINAPI
HttpAddUrlToConfigGroup(
IN HANDLE ControlChannelHandle,
IN HTTP_CONFIG_GROUP_ID ConfigGroupId,
IN PCWSTR pFullyQualifiedUrl,
IN HTTP_URL_CONTEXT UrlContext
)
{
NTSTATUS status;
HTTP_CONFIG_GROUP_URL_INFO urlInfo;
//
// Initialize the input structure.
//
urlInfo.ConfigGroupId = ConfigGroupId;
urlInfo.UrlContext = UrlContext;
RtlInitUnicodeString( &urlInfo.FullyQualifiedUrl, pFullyQualifiedUrl );
//
// Make the request.
//
status = HttpApiSynchronousDeviceControl(
ControlChannelHandle, // FileHandle
IOCTL_HTTP_ADD_URL_TO_CONFIG_GROUP, // IoControlCode
&urlInfo, // pInputBuffer
sizeof(urlInfo), // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL // pBytesTransferred
);
return HttpApiNtStatusToWin32Status( status );
} // HttpAddUrlToConfigGroup
/***************************************************************************++
Routine Description:
Removes a fully qualified URL from an configuration group.
Arguments:
ControlChannelHandle - Supplies a control channel handle.
ConfigGroupId - Supplies an identifier as returned by
HttpCreateConfigGroup().
pFullyQualifiedUrl - Supplies the fully qualified URL to remove from
the container.
Return Value:
ULONG - Completion status.
--***************************************************************************/
ULONG
WINAPI
HttpRemoveUrlFromConfigGroup(
IN HANDLE ControlChannelHandle,
IN HTTP_CONFIG_GROUP_ID ConfigGroupId,
IN PCWSTR pFullyQualifiedUrl
)
{
NTSTATUS status;
HTTP_CONFIG_GROUP_URL_INFO urlInfo;
//
// Initialize the input structure.
//
urlInfo.ConfigGroupId = ConfigGroupId;
RtlInitUnicodeString( &urlInfo.FullyQualifiedUrl, pFullyQualifiedUrl );
//
// Make the request.
//
status = HttpApiSynchronousDeviceControl(
ControlChannelHandle, // FileHandle
IOCTL_HTTP_REMOVE_URL_FROM_CONFIG_GROUP, // IoControlCode
&urlInfo, // pInputBuffer
sizeof(urlInfo), // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL // pBytesTransferred
);
return HttpApiNtStatusToWin32Status( status );
} // HttpRemoveUrlFromConfigGroup
/***************************************************************************++
Routine Description:
Removes all URLs from an configuration group.
Arguments:
ControlChannelHandle - Supplies a control channel handle.
ConfigGroupId - Supplies an identifier as returned by
HttpCreateConfigGroup().
Return Value:
ULONG - Completion status.
--***************************************************************************/
ULONG
WINAPI
HttpRemoveAllUrlsFromConfigGroup(
IN HANDLE ControlChannelHandle,
IN HTTP_CONFIG_GROUP_ID ConfigGroupId
)
{
NTSTATUS status;
HTTP_REMOVE_ALL_URLS_INFO urlInfo;
//
// Initialize the input structure.
//
urlInfo.ConfigGroupId = ConfigGroupId;
//
// Make the request.
//
status = HttpApiSynchronousDeviceControl(
ControlChannelHandle, // FileHandle
IOCTL_HTTP_REMOVE_ALL_URLS_FROM_CONFIG_GROUP, // IoControlCode
&urlInfo, // pInputBuffer
sizeof(urlInfo), // InputBufferLength
NULL, // pOutputBuffer
0, // OutputBufferLength
NULL // pBytesTransferred
);
return HttpApiNtStatusToWin32Status( status );
} // HttpRemoveAllUrlsFromConfigGroup
/***************************************************************************++
Routine Description:
Queries information from an configuration group.
Arguments:
ControlChannelHandle - Supplies a control channel handle.
ConfigGroupId - Supplies an identifier as returned by
HttpCreateConfigGroup().
InformationClass - Supplies the type of information to query.
pConfigGroupInformation - Supplies a buffer for the query.
Length - Supplies the length of pConfigGroupInformation.
pReturnLength - Receives the length of data written to the buffer.
Return Value:
ULONG - Completion status.
--***************************************************************************/
ULONG
WINAPI
HttpQueryConfigGroupInformation(
IN HANDLE ControlChannelHandle,
IN HTTP_CONFIG_GROUP_ID ConfigGroupId,
IN HTTP_CONFIG_GROUP_INFORMATION_CLASS InformationClass,
OUT PVOID pConfigGroupInformation,
IN ULONG Length,
OUT PULONG pReturnLength OPTIONAL
)
{
NTSTATUS status;
HTTP_CONFIG_GROUP_INFO configGroupInfo;
//
// Initialize the input structure.
//
configGroupInfo.ConfigGroupId = ConfigGroupId;
configGroupInfo.InformationClass = InformationClass;
//
// Make the request.
//
status = HttpApiSynchronousDeviceControl(
ControlChannelHandle, // FileHandle
IOCTL_HTTP_QUERY_CONFIG_GROUP, // IoControlCode
&configGroupInfo, // pInputBuffer
sizeof(configGroupInfo), // InputBufferLength
pConfigGroupInformation, // pOutputBuffer
Length, // OutputBufferLength
pReturnLength // pBytesTransferred
);
return HttpApiNtStatusToWin32Status( status );
} // HttpQueryConfigGroupInformation
/***************************************************************************++
Routine Description:
Before passing down the config group information. Make sure that the
directory name in the HttpConfigGroupLogInformation is not pointing back
to local machine if it's a UNC path
Arguments:
pConfigGroupInformation - Supplies the config group info with dir name
Length - Length of the above
Return
STATUS_SUCCESS : If the UNC path doesn't include the local machine name
Or if the path is not UNC path.
STATUS_INVALID_PARAMETER : If the buffer itself is corrupted or something
fatal is preventing us from getting computer
name when path is UNC.
STATUS_NOT_SUPPORTED: If UNC path points back to the local machine.
--***************************************************************************/
NTSTATUS
HttpApiConfigGroupInformationSanityCheck(
IN HTTP_CONFIG_GROUP_INFORMATION_CLASS InformationClass,
IN PVOID pConfigGroupInformation,
IN ULONG Length
)
{
PHTTP_CONFIG_GROUP_LOGGING pLoggingInfo;
WCHAR pwszComputerName[MAX_COMPUTERNAME_LENGTH + 1];
ULONG ulComputerNameLength;
PWCHAR pwsz,pwszT;
ULONG ulSrcUncLength;
ULONG ulDirNameLength;
//
// Only for HttpConfigGroupLogInformation
//
if(InformationClass != HttpConfigGroupLogInformation ||
pConfigGroupInformation == NULL
)
{
return STATUS_SUCCESS;
}
if (Length < sizeof(HTTP_CONFIG_GROUP_LOGGING))
{
return STATUS_INVALID_PARAMETER;
}
//
// Try to check the log dir name if it's a UNC Path
//
__try
{
pLoggingInfo = (PHTTP_CONFIG_GROUP_LOGGING)pConfigGroupInformation;
ulDirNameLength = pLoggingInfo->LogFileDir.Length / sizeof(WCHAR);
if (ulDirNameLength > 2)
{
if (pLoggingInfo->LogFileDir.Buffer[0] == L'\\' &&
pLoggingInfo->LogFileDir.Buffer[1] == L'\\')
{
// UNC Path
ULONG ccLength = MAX_COMPUTERNAME_LENGTH + 1;
if (!GetComputerNameW(pwszComputerName, &ccLength))
{
// This should never fail unless there's really fatal
// system problem. But if it fails then refuse the
// UNC path regardless.
return STATUS_INVALID_PARAMETER;
}
if (ccLength == 0)
{
return STATUS_INVALID_PARAMETER;
}
ulComputerNameLength = ccLength;
// Extract the computername from the full path
pwsz = pwszT = &pLoggingInfo->LogFileDir.Buffer[2];
ulDirNameLength -= 2;
// Forward the temp pointer to the end of the supposed
// computername
while(ulDirNameLength && *pwszT != UNICODE_NULL && *pwszT != L'\\')
{
pwszT++;
ulDirNameLength--;
}
ulSrcUncLength = (ULONG) DIFF(pwszT - pwsz);
// Compare not case sensitive
if(ulComputerNameLength == ulSrcUncLength &&
_wcsnicmp(pwszComputerName, pwsz, ulSrcUncLength) == 0
)
{
return STATUS_NOT_SUPPORTED;
}
}
}
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
return STATUS_INVALID_PARAMETER;
}
return STATUS_SUCCESS;
}
/***************************************************************************++
Routine Description:
Sets information in an configuration group.
Arguments:
ControlChannelHandle - Supplies a control channel handle.
ConfigGroupId - Supplies an identifier as returned by
HttpCreateConfigGroup().
InformationClass - Supplies the type of information to set.
pConfigGroupInformation - Supplies the data to set.
Length - Supplies the length of pConfigGroupInformation.
Return Value:
ULONG - Completion status.
--***************************************************************************/
ULONG
WINAPI
HttpSetConfigGroupInformation(
IN HANDLE ControlChannelHandle,
IN HTTP_CONFIG_GROUP_ID ConfigGroupId,
IN HTTP_CONFIG_GROUP_INFORMATION_CLASS InformationClass,
IN PVOID pConfigGroupInformation,
IN ULONG Length
)
{
NTSTATUS status;
HTTP_CONFIG_GROUP_INFO configGroupInfo;
//
// Initialize the input structure.
//
configGroupInfo.ConfigGroupId = ConfigGroupId;
configGroupInfo.InformationClass = InformationClass;
status = HttpApiConfigGroupInformationSanityCheck(
InformationClass,
pConfigGroupInformation,
Length
);
if (!NT_SUCCESS(status))
{
return HttpApiNtStatusToWin32Status(status);
}
//
// Make the request.
//
status = HttpApiSynchronousDeviceControl(
ControlChannelHandle, // FileHandle
IOCTL_HTTP_SET_CONFIG_GROUP, // IoControlCode
&configGroupInfo, // pInputBuffer
sizeof(configGroupInfo), // InputBufferLength
pConfigGroupInformation, // pOutputBuffer
Length, // OutputBufferLength
NULL // pBytesTransferred
);
return HttpApiNtStatusToWin32Status( status );
} // HttpSetConfigGroupInformation
//
// Private functions.
//