597 lines
16 KiB
C
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.
|
||
|
//
|
||
|
|
||
|
|
||
|
|