| /* |
| * 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__ |