153 lines
5.7 KiB
C++
153 lines
5.7 KiB
C++
/*
|
|
* 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__
|