/* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_USB_DRIVER_OBJECT_H__ #define ANDROID_USB_DRIVER_OBJECT_H__ /** \file This file consists of declaration of class AndroidUsbDriverObject that encapsulates our driver object. */ /// Globally accessible pointer to the driver object extern class AndroidUsbDriverObject* global_driver_object; /** AndroidUsbDriverObject class encapsulates driver object and provides overall initialization / cleanup as well as management of globally used resources. We use KMDF framework for this driver because it takes care of most of the USB related "things" (like PnP, power management and other stuff) so we can concentrate more on real functionality. This driver is based on KMDF's usbsamp driver sample available at DDK's src\kmdf\usbsamp directory. Instance of this class (always one) must be allocated from NonPagedPool. */ class AndroidUsbDriverObject { public: /** \brief Driver initialization entry point. This method is a "gate" to our driver class from main DriverEntry routine. Since this method is called from within DriverEntry only it is placed in "INIT" code segment. This method is called at IRQL PASSIVE_LEVEL. @param drv_object[in] Driver object passed to DriverEntry routine @param reg_path[in] Path to the driver's Registry passed to DriverEntry routine @returns STATUS_SUCCESS on success or an appropriate error code. */ static NTSTATUS DriverEntry(PDRIVER_OBJECT drv_object, PUNICODE_STRING reg_path); private: /** \brief Constructs driver object. Constructor for driver class must be as light as possible. All initialization that may fail must be deferred to OnDriverEntry method. Since this method is called from within DriverEntry only it is placed in "INIT" code segment. This method is called at IRQL PASSIVE_LEVEL. @param drv_object[in] Driver object passed to DriverEntry routine @param reg_path[in] Path to the driver's Registry passed to DriverEntry routine */ AndroidUsbDriverObject(PDRIVER_OBJECT drv_object, PUNICODE_STRING reg_path); /** \brief Destructs driver object. Destructor for driver class must be as light as possible. All uninitialization must be done in OnDriverUnload method. This method must be called at PASSIVE IRQL. */ ~AndroidUsbDriverObject(); /** \brief Initializes instance of the driver object. This method is called immediatelly after driver object has been instantiated to perform actual initialization of the driver. Since this method is called from within DriverEntry only it is placed in "INIT" code segment. This method is called at IRQL PASSIVE_LEVEL. @param drv_object[in] Driver object passed to DriverEntry routine @param reg_path[in] Path to the driver's Registry passed to DriverEntry routine @returns STATUS_SUCCESS on success or an appropriate error code. */ NTSTATUS OnDriverEntry(PDRIVER_OBJECT drv_object, PUNICODE_STRING reg_path); /** \brief Actual handler for KMDF's AddDevice event This method is called by the framework in response to AddDevice call from the PnP manager. We create and initialize a device object to represent a new instance of the device. This method is called at IRQL PASSIVE_LEVEL. @param device_init[in] A pointer to a framework-allocated WDFDEVICE_INIT structure. @return If the routine succeeds, it returns STATUS_SUCCESS. Otherwise, it returns one of the error status values defined in ntstatus.h. */ NTSTATUS OnAddDevice(PWDFDEVICE_INIT device_init); /** \brief Actual driver unload event handler. This method is called when driver is being unloaded. This method is called at IRQL PASSIVE_LEVEL. */ void OnDriverUnload(); /** \brief KMDF's DeviceAdd event entry point This callback is called by the framework in response to AddDevice call from the PnP manager. We create and initialize a device object to represent a new instance of the device. All the software resources should be allocated in this callback. This method is called at IRQL PASSIVE_LEVEL. @param wdf_drv[in] WDF driver handle. @param device_init[in] A pointer to a framework-allocated WDFDEVICE_INIT structure. @return If the routine succeeds, it returns STATUS_SUCCESS. Otherwise, it returns one of the error status values defined in ntstatus.h. */ static NTSTATUS EvtDeviceAddEntry(WDFDRIVER wdf_drv, PWDFDEVICE_INIT device_init); /** \brief Driver unload event entry point. Framework calls this callback when driver is being unloaded. This method is called at IRQL PASSIVE_LEVEL. */ static VOID EvtDriverUnloadEntry(WDFDRIVER wdf_drv); public: /// Gets this driver's DRIVER_OBJECT __forceinline PDRIVER_OBJECT driver_object() const { return driver_object_; } /// Gets KMDF driver handle __forceinline WDFDRIVER wdf_driver() const { return wdf_driver_; } private: /// This driver's driver object PDRIVER_OBJECT driver_object_; /// KMDF driver handle WDFDRIVER wdf_driver_; }; #endif // ANDROID_USB_DRIVER_OBJECT_H__