/*++ Copyright (c) 1998-1999 Microsoft Corporation Module Name: apppool.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: Creates a new Application Pool. Arguments: pAppPoolHandle - Receives a handle to the new application pool. object. pAppPoolName - Supplies the name of the new application pool. pSecurityAttributes - Optionally supplies security attributes for the new application pool. Options - Supplies creation options. Return Value: ULONG - Completion status. --***************************************************************************/ ULONG WINAPI HttpCreateAppPool( OUT PHANDLE pAppPoolHandle, IN PCWSTR pAppPoolName, IN PSECURITY_ATTRIBUTES pSecurityAttributes OPTIONAL, IN ULONG Options ) { NTSTATUS status; // // Make the request. // status = HttpApiOpenDriverHelper( pAppPoolHandle, // pHandle GENERIC_READ | // DesiredAccess GENERIC_WRITE | SYNCHRONIZE | WRITE_DAC, // WAS needs WRITE DAC permissions // to support different worker process permissions. HttpApiAppPoolHandleType, // HandleType pAppPoolName, // pObjectName Options, // Options FILE_CREATE, // CreateDisposition pSecurityAttributes // 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( pAppPoolHandle, // pHandle GENERIC_READ | // DesiredAccess GENERIC_WRITE | SYNCHRONIZE, HttpApiAppPoolHandleType, // HandleType pAppPoolName, // pObjectName Options, // Options FILE_CREATE, // CreateDisposition pSecurityAttributes // pSecurityAttributes ); } } return HttpApiNtStatusToWin32Status( status ); } // HttpCreateAppPool /***************************************************************************++ Routine Description: Opens an existing application pool. Arguments: pAppPoolHandle - Receives a handle to the existing application pool object. pAppPoolName - Supplies the name of the existing application pool. Options - Supplies open options. Return Value: ULONG - Completion status. --***************************************************************************/ ULONG WINAPI HttpOpenAppPool( OUT PHANDLE pAppPoolHandle, IN PCWSTR pAppPoolName, IN ULONG Options ) { NTSTATUS status; // // Make the request. // status = HttpApiOpenDriverHelper( pAppPoolHandle, // pHandle GENERIC_READ | // DesiredAccess SYNCHRONIZE, HttpApiAppPoolHandleType, // HandleType pAppPoolName, // pObjectName Options, // Options FILE_OPEN, // CreateDisposition NULL // pSecurityAttributes ); return HttpApiNtStatusToWin32Status( status ); } // HttpOpenAppPool /***************************************************************************++ Routine Description: Queries information from a application pool. Arguments: AppPoolHandle - Supplies a handle to a UL.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool(). InformationClass - Supplies the type of information to query. pAppPoolInformation - Supplies a buffer for the query. Length - Supplies the length of pAppPoolInformation. pReturnLength - Receives the length of data written to the buffer. Return Value: ULONG - Completion status. --***************************************************************************/ ULONG WINAPI HttpQueryAppPoolInformation( IN HANDLE AppPoolHandle, IN HTTP_APP_POOL_INFORMATION_CLASS InformationClass, OUT PVOID pAppPoolInformation, IN ULONG Length, OUT PULONG pReturnLength OPTIONAL ) { NTSTATUS status; HTTP_APP_POOL_INFO appPoolInfo; // // Initialize the input structure. // appPoolInfo.InformationClass = InformationClass; // // Make the request. // status = HttpApiSynchronousDeviceControl( AppPoolHandle, // FileHandle IOCTL_HTTP_QUERY_APP_POOL_INFORMATION, // IoControlCode &appPoolInfo, // pInputBuffer sizeof(appPoolInfo), // InputBufferLength pAppPoolInformation, // pOutputBuffer Length, // OutputBufferLength pReturnLength // pBytesTransferred ); return HttpApiNtStatusToWin32Status( status ); } // HttpQueryAppPoolInformation /***************************************************************************++ Routine Description: Sets information in an admin container. Arguments: AppPoolHandle - Supplies a handle to a UL.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool(). InformationClass - Supplies the type of information to set. pAppPoolInformation - Supplies the data to set. Length - Supplies the length of pAppPoolInformation. Return Value: ULONG - Completion status. --***************************************************************************/ ULONG WINAPI HttpSetAppPoolInformation( IN HANDLE AppPoolHandle, IN HTTP_APP_POOL_INFORMATION_CLASS InformationClass, IN PVOID pAppPoolInformation, IN ULONG Length ) { NTSTATUS status; HTTP_APP_POOL_INFO appPoolInfo; // // Initialize the input structure. // appPoolInfo.InformationClass = InformationClass; // // Make the request. // status = HttpApiSynchronousDeviceControl( AppPoolHandle, // FileHandle IOCTL_HTTP_SET_APP_POOL_INFORMATION, // IoControlCode &appPoolInfo, // pInputBuffer sizeof(appPoolInfo), // InputBufferLength pAppPoolInformation, // pOutputBuffer Length, // OutputBufferLength NULL // pBytesTransferred ); return HttpApiNtStatusToWin32Status( status ); } // HttpSetAppPoolInformation /***************************************************************************++ Routine Description: Adds a transient URL prefix. Arguments: AppPoolHandle - Supplies a handle to a UL.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool(). pFullyQualifiedUrl - the URL prefix to add Return Value: Completion status. --***************************************************************************/ ULONG WINAPI HttpAddTransientUrl( IN HANDLE AppPoolHandle, IN PCWSTR pFullyQualifiedUrl ) { NTSTATUS status; HTTP_TRANSIENT_URL_INFO transientUrlInfo; // // Initialize the input structure. // RtlInitUnicodeString( &transientUrlInfo.FullyQualifiedUrl, pFullyQualifiedUrl ); // // Make the request. // status = HttpApiSynchronousDeviceControl( AppPoolHandle, // FileHandle IOCTL_HTTP_ADD_TRANSIENT_URL, // IoControlCode &transientUrlInfo, // pInputBuffer sizeof(transientUrlInfo), // InputBufferLength NULL, // pOutputBuffer 0, // OutputBufferLength NULL // pBytesTransferred ); return HttpApiNtStatusToWin32Status( status ); } // HttpAddTransientUrl /***************************************************************************++ Routine Description: Removes a transient URL prefix. Arguments: AppPoolHandle - Supplies a handle to a UL.SYS application pool as returned from either HttpCreateAppPool() or HttpOpenAppPool(). pFullyQualifiedUrl - the URL prefix to add Return Value: Completion status. --***************************************************************************/ ULONG WINAPI HttpRemoveTransientUrl( IN HANDLE AppPoolHandle, IN PCWSTR pFullyQualifiedUrl ) { NTSTATUS status; HTTP_TRANSIENT_URL_INFO transientUrlInfo; // // Initialize the input structure. // RtlInitUnicodeString( &transientUrlInfo.FullyQualifiedUrl, pFullyQualifiedUrl ); // // Make the request. // status = HttpApiSynchronousDeviceControl( AppPoolHandle, // FileHandle IOCTL_HTTP_REMOVE_TRANSIENT_URL, // IoControlCode &transientUrlInfo, // pInputBuffer sizeof(transientUrlInfo), // InputBufferLength NULL, // pOutputBuffer 0, // OutputBufferLength NULL // pBytesTransferred ); return HttpApiNtStatusToWin32Status( status ); } // HttpRemoveTransientUrl // // Private functions. //