/*++ Copyright (c) 1998-2002 Microsoft Corporation Module Name: Config.c Abstract: User-mode interface to HTTP.SYS: Configuration Group handler. Author: Keith Moore (keithmo) 15-Dec-1998 Revision History: --*/ #include "precomp.h" // // Private macros. // // // Private prototypes. // /***************************************************************************++ Routine Description: Private function to add a URL to a config group. Arguments: UrlType - Type of URL (Reservation or Registration). ControlChannelHandle - Supplies a control channel handle. ConfigGroupId - Supplies an identifier as returned by HttpCreateConfigGroup(). pFullyQualifiedUrl - The URL. UrlContext - URL Context. pSecurityDescriptor - Security Descriptor Return Value: ULONG - Completion status. --***************************************************************************/ ULONG AddUrlToConfigGroup( IN HTTP_URL_OPERATOR_TYPE UrlType, IN HANDLE ControlChannelHandle, IN HTTP_CONFIG_GROUP_ID ConfigGroupId, IN PCWSTR pFullyQualifiedUrl, IN HTTP_URL_CONTEXT UrlContext, IN PSECURITY_DESCRIPTOR pSecurityDescriptor, IN ULONG SecurityDescriptorLength ) { NTSTATUS Status; HTTP_CONFIG_GROUP_URL_INFO urlInfo; // // Initialize the input structure. // urlInfo.UrlType = UrlType; urlInfo.ConfigGroupId = ConfigGroupId; urlInfo.UrlContext = UrlContext; urlInfo.pSecurityDescriptor = pSecurityDescriptor; urlInfo.SecurityDescriptorLength = SecurityDescriptorLength; Status = RtlInitUnicodeStringEx( &urlInfo.FullyQualifiedUrl, pFullyQualifiedUrl ); if ( !NT_SUCCESS(Status) ) { return HttpApiNtStatusToWin32Status( Status ); } // Make the request. return HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_ADD_URL_TO_CONFIG_GROUP, // IoControlCode &urlInfo, // pInputBuffer sizeof(urlInfo), // InputBufferLength NULL, // pOutputBuffer 0, // OutputBufferLength NULL // pBytesTransferred ); } // HttpAddUrlToConfigGroup /***************************************************************************++ Routine Description: Private function to remove a URL to a config group. Arguments: UrlType - Type of URL (Reservation or Registration). ControlChannelHandle - Supplies a control channel handle. ConfigGroupId - Supplies an identifier as returned by HttpCreateConfigGroup(). pFullyQualifiedUrl - The URL. Return Value: ULONG - Completion status. --***************************************************************************/ ULONG RemoveUrlFromConfigGroup( IN HTTP_URL_OPERATOR_TYPE UrlType, 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.UrlType = UrlType; urlInfo.ConfigGroupId = ConfigGroupId; Status = RtlInitUnicodeStringEx( &urlInfo.FullyQualifiedUrl, pFullyQualifiedUrl ); if ( !NT_SUCCESS(Status) ) { return HttpApiNtStatusToWin32Status( Status ); } // Make the request. return HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_REMOVE_URL_FROM_CONFIG_GROUP, // IoControlCode &urlInfo, // pInputBuffer sizeof(urlInfo), // InputBufferLength NULL, // pOutputBuffer 0, // OutputBufferLength NULL // pBytesTransferred ); } // // 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 ) { ULONG result; HTTP_CONFIG_GROUP_INFO configGroupInfo; // // Make the request. // result = HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_CREATE_CONFIG_GROUP, // IoControlCode NULL, // pInputBuffer 0, // InputBufferLength &configGroupInfo, // pOutputBuffer sizeof(configGroupInfo), // OutputBufferLength NULL // pBytesTransferred ); if (result == NO_ERROR) { // // Retrieve the container ID. // *pConfigGroupId = configGroupInfo.ConfigGroupId; } return result; } // 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 ) { HTTP_CONFIG_GROUP_INFO configGroupInfo; // // Initialize the input structure. // configGroupInfo.ConfigGroupId = ConfigGroupId; // // Make the request. // return HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_DELETE_CONFIG_GROUP, // IoControlCode &configGroupInfo, // pInputBuffer sizeof(configGroupInfo), // InputBufferLength NULL, // pOutputBuffer 0, // OutputBufferLength NULL // pBytesTransferred ); } // 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 ) { return AddUrlToConfigGroup( HttpUrlOperatorTypeRegistration, ControlChannelHandle, ConfigGroupId, pFullyQualifiedUrl, UrlContext, NULL, 0 ); } // 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 ) { return RemoveUrlFromConfigGroup( HttpUrlOperatorTypeRegistration, ControlChannelHandle, ConfigGroupId, pFullyQualifiedUrl ); } // 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 ) { HTTP_REMOVE_ALL_URLS_INFO urlInfo; // // Initialize the input structure. // urlInfo.ConfigGroupId = ConfigGroupId; // // Make the request. // return HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_REMOVE_ALL_URLS_FROM_CONFIG_GROUP, // IoControlCode &urlInfo, // pInputBuffer sizeof(urlInfo), // InputBufferLength NULL, // pOutputBuffer 0, // OutputBufferLength NULL // pBytesTransferred ); } // 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 ) { HTTP_CONFIG_GROUP_INFO configGroupInfo; // // Initialize the input structure. // configGroupInfo.ConfigGroupId = ConfigGroupId; configGroupInfo.InformationClass = InformationClass; // // Make the request. // return HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_QUERY_CONFIG_GROUP, // IoControlCode &configGroupInfo, // pInputBuffer sizeof(configGroupInfo), // InputBufferLength pConfigGroupInformation, // pOutputBuffer Length, // OutputBufferLength pReturnLength // pBytesTransferred ); } // 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. // return HttpApiSynchronousDeviceControl( ControlChannelHandle, // FileHandle IOCTL_HTTP_SET_CONFIG_GROUP, // IoControlCode &configGroupInfo, // pInputBuffer sizeof(configGroupInfo), // InputBufferLength pConfigGroupInformation, // pOutputBuffer Length, // OutputBufferLength NULL // pBytesTransferred ); } // HttpSetConfigGroupInformation // // Private functions. //